1e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block/*
2e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
3e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
4e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Redistribution and use in source and binary forms, with or without
5e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * modification, are permitted provided that the following conditions are
6e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * met:
7e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
8e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     * Redistributions of source code must retain the above copyright
9e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * notice, this list of conditions and the following disclaimer.
10e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     * Redistributions in binary form must reproduce the above
11e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * copyright notice, this list of conditions and the following disclaimer
12e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * in the documentation and/or other materials provided with the
13e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * distribution.
14e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     * Neither the name of Google Inc. nor the names of its
15e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * contributors may be used to endorse or promote products derived from
16e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * this software without specific prior written permission.
17e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
18e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block */
30e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
31e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#ifndef BlobResourceHandle_h
32e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#define BlobResourceHandle_h
33e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
34e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(BLOB)
35e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
36e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "FileStreamClient.h"
37e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "PlatformString.h"
38e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "ResourceHandle.h"
39e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/PassRefPtr.h>
40e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/Vector.h>
41e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
42e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocknamespace WebCore {
43e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
44e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass AsyncFileStream;
45e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass BlobStorageData;
46e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass FileStream;
47e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass ResourceHandleClient;
48e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass ResourceRequest;
495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstruct BlobDataItem;
50e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
51e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass BlobResourceHandle : public FileStreamClient, public ResourceHandle  {
52e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockpublic:
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    static PassRefPtr<BlobResourceHandle> create(PassRefPtr<BlobStorageData> blobData, const ResourceRequest& request, ResourceHandleClient* client, bool async = true)
54e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    {
55e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return adoptRef(new BlobResourceHandle(blobData, request, client, async));
56e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
57e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
58e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    static void loadResourceSynchronously(PassRefPtr<BlobStorageData> blobData, const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data);
59e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
60e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // FileStreamClient methods.
61e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void didGetSize(long long);
62e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void didOpen(bool);
63e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void didRead(int);
64e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
65e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // ResourceHandle methods.
66e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void cancel();
67e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
68e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void start();
69e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int readSync(char*, int);
70e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
71e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockprivate:
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    friend void delayedStartBlobResourceHandle(void*);
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
74e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    BlobResourceHandle(PassRefPtr<BlobStorageData>, const ResourceRequest&, ResourceHandleClient*, bool async);
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual ~BlobResourceHandle();
76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void doStart();
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void getSizeForNext();
79e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void seek();
80e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void consumeData(const char* data, int bytesRead);
81e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void failed(int errorCode);
82e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
83e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void readAsync();
84e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void readDataAsync(const BlobDataItem&);
85e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void readFileAsync(const BlobDataItem&);
86e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
87e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int readDataSync(const BlobDataItem&, char*, int);
88e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int readFileSync(const BlobDataItem&, char*, int);
89e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void notifyResponse();
91e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void notifyResponseOnSuccess();
92e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void notifyResponseOnError();
93e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void notifyReceiveData(const char*, int);
94e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void notifyFail(int errorCode);
95e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void notifyFinish();
96e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<BlobStorageData> m_blobData;
98e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool m_async;
99e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<AsyncFileStream> m_asyncStream; // For asynchronous loading.
100e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    RefPtr<FileStream> m_stream; // For synchronous loading.
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    Vector<char> m_buffer;
102e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    Vector<long long> m_itemLengthList;
103e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int m_errorCode;
104e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool m_aborted;
105e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    long long m_rangeOffset;
106e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    long long m_rangeEnd;
107e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    long long m_rangeSuffixLength;
108e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    long long m_totalRemainingSize;
109e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    long long m_currentItemReadSize;
110e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    unsigned m_sizeItemCount;
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    unsigned m_readItemCount;
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool m_fileOpened;
113e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block};
114e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
115e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block} // namespace WebCore
116e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
117e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // ENABLE(BLOB)
118e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
119e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // BlobResourceHandle_h
120