1e14391e94c850b8bd03680c23b38978db68687a8John Reck/*
2e14391e94c850b8bd03680c23b38978db68687a8John Reck * Copyright (C) 2010 Google Inc.  All rights reserved.
3e14391e94c850b8bd03680c23b38978db68687a8John Reck *
4e14391e94c850b8bd03680c23b38978db68687a8John Reck * Redistribution and use in source and binary forms, with or without
5e14391e94c850b8bd03680c23b38978db68687a8John Reck * modification, are permitted provided that the following conditions are
6e14391e94c850b8bd03680c23b38978db68687a8John Reck * met:
7e14391e94c850b8bd03680c23b38978db68687a8John Reck *
8e14391e94c850b8bd03680c23b38978db68687a8John Reck *     * Redistributions of source code must retain the above copyright
9e14391e94c850b8bd03680c23b38978db68687a8John Reck * notice, this list of conditions and the following disclaimer.
10e14391e94c850b8bd03680c23b38978db68687a8John Reck *     * Redistributions in binary form must reproduce the above
11e14391e94c850b8bd03680c23b38978db68687a8John Reck * copyright notice, this list of conditions and the following disclaimer
12e14391e94c850b8bd03680c23b38978db68687a8John Reck * in the documentation and/or other materials provided with the
13e14391e94c850b8bd03680c23b38978db68687a8John Reck * distribution.
14e14391e94c850b8bd03680c23b38978db68687a8John Reck *     * Neither the name of Google Inc. nor the names of its
15e14391e94c850b8bd03680c23b38978db68687a8John Reck * contributors may be used to endorse or promote products derived from
16e14391e94c850b8bd03680c23b38978db68687a8John Reck * this software without specific prior written permission.
17e14391e94c850b8bd03680c23b38978db68687a8John Reck *
18e14391e94c850b8bd03680c23b38978db68687a8John Reck * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e14391e94c850b8bd03680c23b38978db68687a8John Reck * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e14391e94c850b8bd03680c23b38978db68687a8John Reck * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e14391e94c850b8bd03680c23b38978db68687a8John Reck * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e14391e94c850b8bd03680c23b38978db68687a8John Reck * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e14391e94c850b8bd03680c23b38978db68687a8John Reck * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e14391e94c850b8bd03680c23b38978db68687a8John Reck * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e14391e94c850b8bd03680c23b38978db68687a8John Reck * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e14391e94c850b8bd03680c23b38978db68687a8John Reck * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e14391e94c850b8bd03680c23b38978db68687a8John Reck * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e14391e94c850b8bd03680c23b38978db68687a8John Reck * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e14391e94c850b8bd03680c23b38978db68687a8John Reck */
30e14391e94c850b8bd03680c23b38978db68687a8John Reck
31e14391e94c850b8bd03680c23b38978db68687a8John Reck#ifndef FileReaderLoader_h
32e14391e94c850b8bd03680c23b38978db68687a8John Reck#define FileReaderLoader_h
33e14391e94c850b8bd03680c23b38978db68687a8John Reck
34e14391e94c850b8bd03680c23b38978db68687a8John Reck#if ENABLE(BLOB)
35e14391e94c850b8bd03680c23b38978db68687a8John Reck
36e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "FileError.h"
37e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "KURL.h"
38e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "TextEncoding.h"
39e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "ThreadableLoaderClient.h"
40e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <wtf/Forward.h>
41e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <wtf/text/WTFString.h>
42e14391e94c850b8bd03680c23b38978db68687a8John Reck
43e14391e94c850b8bd03680c23b38978db68687a8John Recknamespace WebCore {
44e14391e94c850b8bd03680c23b38978db68687a8John Reck
45e14391e94c850b8bd03680c23b38978db68687a8John Reckclass ArrayBuffer;
46e14391e94c850b8bd03680c23b38978db68687a8John Reckclass Blob;
47e14391e94c850b8bd03680c23b38978db68687a8John Reckclass FileReaderLoaderClient;
48e14391e94c850b8bd03680c23b38978db68687a8John Reckclass ScriptExecutionContext;
49e14391e94c850b8bd03680c23b38978db68687a8John Reckclass TextResourceDecoder;
50e14391e94c850b8bd03680c23b38978db68687a8John Reckclass ThreadableLoader;
51e14391e94c850b8bd03680c23b38978db68687a8John Reck
52e14391e94c850b8bd03680c23b38978db68687a8John Reckclass FileReaderLoader : public ThreadableLoaderClient {
53e14391e94c850b8bd03680c23b38978db68687a8John Reckpublic:
54e14391e94c850b8bd03680c23b38978db68687a8John Reck    enum ReadType {
55e14391e94c850b8bd03680c23b38978db68687a8John Reck        ReadAsArrayBuffer,
56e14391e94c850b8bd03680c23b38978db68687a8John Reck        ReadAsBinaryString,
57e14391e94c850b8bd03680c23b38978db68687a8John Reck        ReadAsText,
58e14391e94c850b8bd03680c23b38978db68687a8John Reck        ReadAsDataURL
59e14391e94c850b8bd03680c23b38978db68687a8John Reck    };
60e14391e94c850b8bd03680c23b38978db68687a8John Reck
61e14391e94c850b8bd03680c23b38978db68687a8John Reck    // If client is given, do the loading asynchronously. Otherwise, load synchronously.
62e14391e94c850b8bd03680c23b38978db68687a8John Reck    FileReaderLoader(ReadType, FileReaderLoaderClient*);
63e14391e94c850b8bd03680c23b38978db68687a8John Reck    ~FileReaderLoader();
64e14391e94c850b8bd03680c23b38978db68687a8John Reck
65e14391e94c850b8bd03680c23b38978db68687a8John Reck    void start(ScriptExecutionContext*, Blob*);
66e14391e94c850b8bd03680c23b38978db68687a8John Reck    void cancel();
67e14391e94c850b8bd03680c23b38978db68687a8John Reck
68e14391e94c850b8bd03680c23b38978db68687a8John Reck    // ThreadableLoaderClient
69e14391e94c850b8bd03680c23b38978db68687a8John Reck    virtual void didReceiveResponse(const ResourceResponse&);
70e14391e94c850b8bd03680c23b38978db68687a8John Reck    virtual void didReceiveData(const char*, int);
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual void didFinishLoading(unsigned long, double);
72e14391e94c850b8bd03680c23b38978db68687a8John Reck    virtual void didFail(const ResourceError&);
73e14391e94c850b8bd03680c23b38978db68687a8John Reck
74e14391e94c850b8bd03680c23b38978db68687a8John Reck    String stringResult();
75e14391e94c850b8bd03680c23b38978db68687a8John Reck    PassRefPtr<ArrayBuffer> arrayBufferResult() const;
76e14391e94c850b8bd03680c23b38978db68687a8John Reck    unsigned bytesLoaded() const { return m_bytesLoaded; }
77e14391e94c850b8bd03680c23b38978db68687a8John Reck    unsigned totalBytes() const { return m_totalBytes; }
78e14391e94c850b8bd03680c23b38978db68687a8John Reck    int errorCode() const { return m_errorCode; }
79e14391e94c850b8bd03680c23b38978db68687a8John Reck
80e14391e94c850b8bd03680c23b38978db68687a8John Reck    void setEncoding(const String&);
81e14391e94c850b8bd03680c23b38978db68687a8John Reck    void setDataType(const String& dataType) { m_dataType = dataType; }
82e14391e94c850b8bd03680c23b38978db68687a8John Reck
83e14391e94c850b8bd03680c23b38978db68687a8John Reckprivate:
84e14391e94c850b8bd03680c23b38978db68687a8John Reck    void terminate();
85e14391e94c850b8bd03680c23b38978db68687a8John Reck    void cleanup();
86e14391e94c850b8bd03680c23b38978db68687a8John Reck    void failed(int errorCode);
87e14391e94c850b8bd03680c23b38978db68687a8John Reck    void convertToText();
88e14391e94c850b8bd03680c23b38978db68687a8John Reck    void convertToDataURL();
89e14391e94c850b8bd03680c23b38978db68687a8John Reck
90e14391e94c850b8bd03680c23b38978db68687a8John Reck    bool isCompleted() const;
91e14391e94c850b8bd03680c23b38978db68687a8John Reck
92e14391e94c850b8bd03680c23b38978db68687a8John Reck    static FileError::ErrorCode httpStatusCodeToErrorCode(int);
93e14391e94c850b8bd03680c23b38978db68687a8John Reck
94e14391e94c850b8bd03680c23b38978db68687a8John Reck    ReadType m_readType;
95e14391e94c850b8bd03680c23b38978db68687a8John Reck    FileReaderLoaderClient* m_client;
96e14391e94c850b8bd03680c23b38978db68687a8John Reck    TextEncoding m_encoding;
97e14391e94c850b8bd03680c23b38978db68687a8John Reck    String m_dataType;
98e14391e94c850b8bd03680c23b38978db68687a8John Reck
99e14391e94c850b8bd03680c23b38978db68687a8John Reck    KURL m_urlForReading;
100e14391e94c850b8bd03680c23b38978db68687a8John Reck    RefPtr<ThreadableLoader> m_loader;
101e14391e94c850b8bd03680c23b38978db68687a8John Reck
102e14391e94c850b8bd03680c23b38978db68687a8John Reck    RefPtr<ArrayBuffer> m_rawData;
103e14391e94c850b8bd03680c23b38978db68687a8John Reck    bool m_isRawDataConverted;
104e14391e94c850b8bd03680c23b38978db68687a8John Reck
105e14391e94c850b8bd03680c23b38978db68687a8John Reck    String m_stringResult;
106e14391e94c850b8bd03680c23b38978db68687a8John Reck
107e14391e94c850b8bd03680c23b38978db68687a8John Reck    // The decoder used to decode the text data.
108e14391e94c850b8bd03680c23b38978db68687a8John Reck    RefPtr<TextResourceDecoder> m_decoder;
109e14391e94c850b8bd03680c23b38978db68687a8John Reck
110e14391e94c850b8bd03680c23b38978db68687a8John Reck    unsigned m_bytesLoaded;
111e14391e94c850b8bd03680c23b38978db68687a8John Reck    unsigned m_totalBytes;
112e14391e94c850b8bd03680c23b38978db68687a8John Reck    int m_errorCode;
113e14391e94c850b8bd03680c23b38978db68687a8John Reck};
114e14391e94c850b8bd03680c23b38978db68687a8John Reck
115e14391e94c850b8bd03680c23b38978db68687a8John Reck} // namespace WebCore
116e14391e94c850b8bd03680c23b38978db68687a8John Reck
117e14391e94c850b8bd03680c23b38978db68687a8John Reck#endif // ENABLE(BLOB)
118e14391e94c850b8bd03680c23b38978db68687a8John Reck
119e14391e94c850b8bd03680c23b38978db68687a8John Reck#endif // FileReaderLoader_h
120