1/*
2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef FileSystemCallbacks_h
32#define FileSystemCallbacks_h
33
34#if ENABLE(FILE_SYSTEM)
35
36#include "AsyncFileSystemCallbacks.h"
37#include "PlatformString.h"
38#include <wtf/PassRefPtr.h>
39#include <wtf/Vector.h>
40
41namespace WebCore {
42
43class AsyncFileWriter;
44class DOMFileSystemBase;
45class DirectoryReaderBase;
46class EntriesCallback;
47class EntryArray;
48class EntryCallback;
49class ErrorCallback;
50struct FileMetadata;
51class FileSystemCallback;
52class FileWriterBase;
53class FileWriterBaseCallback;
54class MetadataCallback;
55class ScriptExecutionContext;
56class VoidCallback;
57
58class FileSystemCallbacksBase : public AsyncFileSystemCallbacks {
59public:
60    virtual ~FileSystemCallbacksBase();
61
62    // For EntryCallbacks and VoidCallbacks.
63    virtual void didSucceed();
64
65    // For FileSystemCallbacks.
66    virtual void didOpenFileSystem(const String& name, PassOwnPtr<AsyncFileSystem>);
67
68    // For MetadataCallbacks.
69    virtual void didReadMetadata(const FileMetadata&);
70
71    // For EntriesCallbacks. didReadDirectoryEntry is called each time the API reads an entry, and didReadDirectoryDone is called when a chunk of entries have been read (i.e. good time to call back to the application).  If hasMore is true there can be more chunks.
72    virtual void didReadDirectoryEntry(const String& name, bool isDirectory);
73    virtual void didReadDirectoryEntries(bool hasMore);
74
75    // For createFileWriter.
76    virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long length);
77
78    // For ErrorCallback.
79    virtual void didFail(int code);
80
81protected:
82    FileSystemCallbacksBase(PassRefPtr<ErrorCallback> errorCallback);
83    RefPtr<ErrorCallback> m_errorCallback;
84};
85
86// Subclasses ----------------------------------------------------------------
87
88class EntryCallbacks : public FileSystemCallbacksBase {
89public:
90    static PassOwnPtr<EntryCallbacks> create(PassRefPtr<EntryCallback>, PassRefPtr<ErrorCallback>, PassRefPtr<DOMFileSystemBase>, const String& expectedPath, bool isDirectory);
91    virtual void didSucceed();
92
93private:
94    EntryCallbacks(PassRefPtr<EntryCallback>, PassRefPtr<ErrorCallback>, PassRefPtr<DOMFileSystemBase>, const String& expectedPath, bool isDirectory);
95    RefPtr<EntryCallback> m_successCallback;
96    RefPtr<DOMFileSystemBase> m_fileSystem;
97    String m_expectedPath;
98    bool m_isDirectory;
99};
100
101class EntriesCallbacks : public FileSystemCallbacksBase {
102public:
103    static PassOwnPtr<EntriesCallbacks> create(PassRefPtr<EntriesCallback>, PassRefPtr<ErrorCallback>, PassRefPtr<DirectoryReaderBase>, const String& basePath);
104    virtual void didReadDirectoryEntry(const String& name, bool isDirectory);
105    virtual void didReadDirectoryEntries(bool hasMore);
106
107private:
108    EntriesCallbacks(PassRefPtr<EntriesCallback>, PassRefPtr<ErrorCallback>, PassRefPtr<DirectoryReaderBase>, const String& basePath);
109    RefPtr<EntriesCallback> m_successCallback;
110    RefPtr<DirectoryReaderBase> m_directoryReader;
111    String m_basePath;
112    RefPtr<EntryArray> m_entries;
113};
114
115class FileSystemCallbacks : public FileSystemCallbacksBase {
116public:
117    static PassOwnPtr<FileSystemCallbacks> create(PassRefPtr<FileSystemCallback>, PassRefPtr<ErrorCallback>, ScriptExecutionContext*);
118    virtual void didOpenFileSystem(const String& name, PassOwnPtr<AsyncFileSystem>);
119
120private:
121    FileSystemCallbacks(PassRefPtr<FileSystemCallback>, PassRefPtr<ErrorCallback>, ScriptExecutionContext*);
122    RefPtr<FileSystemCallback> m_successCallback;
123    RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
124};
125
126class ResolveURICallbacks : public FileSystemCallbacksBase {
127public:
128    static PassOwnPtr<ResolveURICallbacks> create(PassRefPtr<EntryCallback>, PassRefPtr<ErrorCallback>, ScriptExecutionContext*, const String& filePath);
129    virtual void didOpenFileSystem(const String& name, PassOwnPtr<AsyncFileSystem>);
130
131private:
132    ResolveURICallbacks(PassRefPtr<EntryCallback>, PassRefPtr<ErrorCallback>, ScriptExecutionContext*, const String& filePath);
133    RefPtr<EntryCallback> m_successCallback;
134    RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
135    String m_filePath;
136};
137
138class MetadataCallbacks : public FileSystemCallbacksBase {
139public:
140    static PassOwnPtr<MetadataCallbacks> create(PassRefPtr<MetadataCallback>, PassRefPtr<ErrorCallback>);
141    virtual void didReadMetadata(const FileMetadata&);
142
143private:
144    MetadataCallbacks(PassRefPtr<MetadataCallback>, PassRefPtr<ErrorCallback>);
145    RefPtr<MetadataCallback> m_successCallback;
146};
147
148class FileWriterBaseCallbacks : public FileSystemCallbacksBase {
149public:
150    static PassOwnPtr<FileWriterBaseCallbacks> create(PassRefPtr<FileWriterBase>, PassRefPtr<FileWriterBaseCallback>, PassRefPtr<ErrorCallback>);
151    virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long length);
152
153private:
154    FileWriterBaseCallbacks(PassRefPtr<FileWriterBase>, PassRefPtr<FileWriterBaseCallback>, PassRefPtr<ErrorCallback>);
155    RefPtr<FileWriterBase> m_fileWriter;
156    RefPtr<FileWriterBaseCallback> m_successCallback;
157};
158
159class VoidCallbacks : public FileSystemCallbacksBase {
160public:
161    static PassOwnPtr<VoidCallbacks> create(PassRefPtr<VoidCallback>, PassRefPtr<ErrorCallback>);
162    virtual void didSucceed();
163
164private:
165    VoidCallbacks(PassRefPtr<VoidCallback>, PassRefPtr<ErrorCallback>);
166    RefPtr<VoidCallback> m_successCallback;
167};
168
169} // namespace
170
171#endif // ENABLE(FILE_SYSTEM)
172
173#endif // FileSystemCallbacks_h
174