• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 DOMFileSystem_h
32 #define DOMFileSystem_h
33 
34 #include "bindings/core/v8/ScriptWrappable.h"
35 #include "core/dom/ActiveDOMObject.h"
36 #include "core/dom/ExecutionContext.h"
37 #include "core/dom/ExecutionContextTask.h"
38 #include "modules/filesystem/DOMFileSystemBase.h"
39 #include "modules/filesystem/EntriesCallback.h"
40 #include "platform/heap/Handle.h"
41 
42 namespace blink {
43 
44 class DirectoryEntry;
45 class File;
46 class FileCallback;
47 class FileEntry;
48 class FileWriterCallback;
49 
50 class DOMFileSystem FINAL : public DOMFileSystemBase, public ScriptWrappable, public ActiveDOMObject {
51     DEFINE_WRAPPERTYPEINFO();
52 public:
53     static DOMFileSystem* create(ExecutionContext*, const String& name, FileSystemType, const KURL& rootURL);
54 
55     // Creates a new isolated file system for the given filesystemId.
56     static DOMFileSystem* createIsolatedFileSystem(ExecutionContext*, const String& filesystemId);
57 
58     DirectoryEntry* root();
59 
60     // DOMFileSystemBase overrides.
61     virtual void addPendingCallbacks() OVERRIDE;
62     virtual void removePendingCallbacks() OVERRIDE;
63     virtual void reportError(ErrorCallback*, PassRefPtrWillBeRawPtr<FileError>) OVERRIDE;
64 
65     // ActiveDOMObject overrides.
66     virtual bool hasPendingActivity() const OVERRIDE;
67 
68     void createWriter(const FileEntry*, FileWriterCallback*, ErrorCallback*);
69     void createFile(const FileEntry*, FileCallback*, ErrorCallback*);
70 
71     // Schedule a callback. This should not cross threads (should be called on the same context thread).
72     // FIXME: move this to a more generic place.
73     template <typename CB, typename CBArg>
74     static void scheduleCallback(ExecutionContext*, CB*, PassRefPtrWillBeRawPtr<CBArg>);
75 
76     template <typename CB, typename CBArg>
77     static void scheduleCallback(ExecutionContext*, CB*, CBArg*);
78 
79     template <typename CB, typename CBArg>
80     static void scheduleCallback(ExecutionContext*, CB*, const HeapVector<CBArg>&);
81 
82     template <typename CB, typename CBArg>
83     static void scheduleCallback(ExecutionContext*, CB*, const CBArg&);
84 
85     template <typename CB>
86     static void scheduleCallback(ExecutionContext*, CB*);
87 
88     template <typename CB, typename CBArg>
scheduleCallback(CB * callback,PassRefPtrWillBeRawPtr<CBArg> callbackArg)89     void scheduleCallback(CB* callback, PassRefPtrWillBeRawPtr<CBArg> callbackArg)
90     {
91         scheduleCallback(executionContext(), callback, callbackArg);
92     }
93 
94     template <typename CB, typename CBArg>
scheduleCallback(CB * callback,CBArg * callbackArg)95     void scheduleCallback(CB* callback, CBArg* callbackArg)
96     {
97         scheduleCallback(executionContext(), callback, callbackArg);
98     }
99 
100     template <typename CB, typename CBArg>
scheduleCallback(CB * callback,const CBArg & callbackArg)101     void scheduleCallback(CB* callback, const CBArg& callbackArg)
102     {
103         scheduleCallback(executionContext(), callback, callbackArg);
104     }
105 
106 private:
107     DOMFileSystem(ExecutionContext*, const String& name, FileSystemType, const KURL& rootURL);
108 
109     class DispatchCallbackTaskBase : public ExecutionContextTask {
110     public:
DispatchCallbackTaskBase()111         DispatchCallbackTaskBase()
112             : m_taskName("FileSystem")
113         {
114         }
115 
taskNameForInstrumentation()116         virtual const String& taskNameForInstrumentation() const OVERRIDE
117         {
118             return m_taskName;
119         }
120 
121     private:
122         const String m_taskName;
123     };
124 
125     // A helper template to schedule a callback task.
126     template <typename CB, typename CBArg>
127     class DispatchCallbackRefPtrArgTask FINAL : public DispatchCallbackTaskBase {
128     public:
DispatchCallbackRefPtrArgTask(CB * callback,PassRefPtrWillBeRawPtr<CBArg> arg)129         DispatchCallbackRefPtrArgTask(CB* callback, PassRefPtrWillBeRawPtr<CBArg> arg)
130             : m_callback(callback)
131             , m_callbackArg(arg)
132         {
133         }
134 
performTask(ExecutionContext *)135         virtual void performTask(ExecutionContext*) OVERRIDE
136         {
137             m_callback->handleEvent(m_callbackArg.get());
138         }
139 
140     private:
141         Persistent<CB> m_callback;
142         RefPtrWillBePersistent<CBArg> m_callbackArg;
143     };
144 
145     template <typename CB, typename CBArg>
146     class DispatchCallbackPtrArgTask FINAL : public DispatchCallbackTaskBase {
147     public:
DispatchCallbackPtrArgTask(CB * callback,CBArg * arg)148         DispatchCallbackPtrArgTask(CB* callback, CBArg* arg)
149             : m_callback(callback)
150             , m_callbackArg(arg)
151         {
152         }
153 
performTask(ExecutionContext *)154         virtual void performTask(ExecutionContext*) OVERRIDE
155         {
156             m_callback->handleEvent(m_callbackArg.get());
157         }
158 
159     private:
160         Persistent<CB> m_callback;
161         Persistent<CBArg> m_callbackArg;
162     };
163 
164     template <typename CB, typename CBArg>
165     class DispatchCallbackNonPtrArgTask FINAL : public DispatchCallbackTaskBase {
166     public:
DispatchCallbackNonPtrArgTask(CB * callback,const CBArg & arg)167         DispatchCallbackNonPtrArgTask(CB* callback, const CBArg& arg)
168             : m_callback(callback)
169             , m_callbackArg(arg)
170         {
171         }
172 
performTask(ExecutionContext *)173         virtual void performTask(ExecutionContext*) OVERRIDE
174         {
175             m_callback->handleEvent(m_callbackArg);
176         }
177 
178     private:
179         Persistent<CB> m_callback;
180         CBArg m_callbackArg;
181     };
182 
183     template <typename CB>
184     class DispatchCallbackNoArgTask FINAL : public DispatchCallbackTaskBase {
185     public:
DispatchCallbackNoArgTask(CB * callback)186         DispatchCallbackNoArgTask(CB* callback)
187             : m_callback(callback)
188         {
189         }
190 
performTask(ExecutionContext *)191         virtual void performTask(ExecutionContext*) OVERRIDE
192         {
193             m_callback->handleEvent();
194         }
195 
196     private:
197         Persistent<CB> m_callback;
198     };
199 
200     int m_numberOfPendingCallbacks;
201 };
202 
203 template <typename CB, typename CBArg>
scheduleCallback(ExecutionContext * executionContext,CB * callback,PassRefPtrWillBeRawPtr<CBArg> arg)204 void DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, PassRefPtrWillBeRawPtr<CBArg> arg)
205 {
206     ASSERT(executionContext->isContextThread());
207     if (callback)
208         executionContext->postTask(adoptPtr(new DispatchCallbackRefPtrArgTask<CB, CBArg>(callback, arg)));
209 }
210 
211 template <typename CB, typename CBArg>
scheduleCallback(ExecutionContext * executionContext,CB * callback,CBArg * arg)212 void DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, CBArg* arg)
213 {
214     ASSERT(executionContext->isContextThread());
215     if (callback)
216         executionContext->postTask(adoptPtr(new DispatchCallbackPtrArgTask<CB, CBArg>(callback, arg)));
217 }
218 
219 template <typename CB, typename CBArg>
scheduleCallback(ExecutionContext * executionContext,CB * callback,const HeapVector<CBArg> & arg)220 void DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, const HeapVector<CBArg>& arg)
221 {
222     ASSERT(executionContext->isContextThread());
223     if (callback)
224         executionContext->postTask(adoptPtr(new DispatchCallbackNonPtrArgTask<CB, PersistentHeapVector<CBArg> >(callback, arg)));
225 }
226 
227 template <typename CB, typename CBArg>
scheduleCallback(ExecutionContext * executionContext,CB * callback,const CBArg & arg)228 void DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, const CBArg& arg)
229 {
230     ASSERT(executionContext->isContextThread());
231     if (callback)
232         executionContext->postTask(adoptPtr(new DispatchCallbackNonPtrArgTask<CB, CBArg>(callback, arg)));
233 }
234 
235 template <typename CB>
scheduleCallback(ExecutionContext * executionContext,CB * callback)236 void DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback)
237 {
238     ASSERT(executionContext->isContextThread());
239     if (callback)
240         executionContext->postTask(adoptPtr(new DispatchCallbackNoArgTask<CB>(callback)));
241 }
242 
243 } // namespace blink
244 
245 #endif // DOMFileSystem_h
246