• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_CHILD_FILEAPI_WEBFILESYSTEM_IMPL_H_
6 #define CONTENT_CHILD_FILEAPI_WEBFILESYSTEM_IMPL_H_
7 
8 #include <map>
9 
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/threading/non_thread_safe.h"
14 #include "content/child/worker_task_runner.h"
15 #include "third_party/WebKit/public/platform/WebFileSystem.h"
16 
17 namespace base {
18 class MessageLoopProxy;
19 class WaitableEvent;
20 }
21 
22 namespace blink {
23 class WebURL;
24 class WebFileWriter;
25 class WebFileWriterClient;
26 }
27 
28 namespace content {
29 
30 class WebFileSystemImpl : public blink::WebFileSystem,
31                           public WorkerTaskRunner::Observer,
32                           public base::NonThreadSafe {
33  public:
34   class WaitableCallbackResults;
35 
36   // Returns thread-specific instance.  If non-null |main_thread_loop|
37   // is given and no thread-specific instance has been created it may
38   // create a new instance.
39   static WebFileSystemImpl* ThreadSpecificInstance(
40       base::MessageLoopProxy* main_thread_loop);
41 
42   // Deletes thread-specific instance (if exists). For workers it deletes
43   // itself in OnWorkerRunLoopStopped(), but for an instance created on the
44   // main thread this method must be called.
45   static void DeleteThreadSpecificInstance();
46 
47   explicit WebFileSystemImpl(base::MessageLoopProxy* main_thread_loop);
48   virtual ~WebFileSystemImpl();
49 
50   // WorkerTaskRunner::Observer implementation.
51   virtual void OnWorkerRunLoopStopped() OVERRIDE;
52 
53   // WebFileSystem implementation.
54   virtual void openFileSystem(
55       const blink::WebURL& storage_partition,
56       const blink::WebFileSystemType type,
57       blink::WebFileSystemCallbacks);
58   virtual void resolveURL(
59       const blink::WebURL& filesystem_url,
60       blink::WebFileSystemCallbacks) OVERRIDE;
61   virtual void deleteFileSystem(
62       const blink::WebURL& storage_partition,
63       const blink::WebFileSystemType type,
64       blink::WebFileSystemCallbacks);
65   virtual void move(
66       const blink::WebURL& src_path,
67       const blink::WebURL& dest_path,
68       blink::WebFileSystemCallbacks) OVERRIDE;
69   virtual void copy(
70       const blink::WebURL& src_path,
71       const blink::WebURL& dest_path,
72       blink::WebFileSystemCallbacks) OVERRIDE;
73   virtual void remove(
74       const blink::WebURL& path,
75       blink::WebFileSystemCallbacks) OVERRIDE;
76   virtual void removeRecursively(
77       const blink::WebURL& path,
78       blink::WebFileSystemCallbacks) OVERRIDE;
79   virtual void readMetadata(
80       const blink::WebURL& path,
81       blink::WebFileSystemCallbacks) OVERRIDE;
82   virtual void createFile(
83       const blink::WebURL& path,
84       bool exclusive,
85       blink::WebFileSystemCallbacks) OVERRIDE;
86   virtual void createDirectory(
87       const blink::WebURL& path,
88       bool exclusive,
89       blink::WebFileSystemCallbacks) OVERRIDE;
90   virtual void fileExists(
91       const blink::WebURL& path,
92       blink::WebFileSystemCallbacks) OVERRIDE;
93   virtual void directoryExists(
94       const blink::WebURL& path,
95       blink::WebFileSystemCallbacks) OVERRIDE;
96   virtual int readDirectory(
97       const blink::WebURL& path,
98       blink::WebFileSystemCallbacks) OVERRIDE;
99   virtual void createFileWriter(
100       const blink::WebURL& path,
101       blink::WebFileWriterClient*,
102       blink::WebFileSystemCallbacks) OVERRIDE;
103   virtual void createSnapshotFileAndReadMetadata(
104       const blink::WebURL& path,
105       blink::WebFileSystemCallbacks);
106   virtual bool waitForAdditionalResult(int callbacksId);
107 
108   int RegisterCallbacks(const blink::WebFileSystemCallbacks& callbacks);
109   blink::WebFileSystemCallbacks GetCallbacks(int callbacks_id);
110   void UnregisterCallbacks(int callbacks_id);
111 
112  private:
113   typedef std::map<int, blink::WebFileSystemCallbacks> CallbacksMap;
114   typedef std::map<int, scoped_refptr<WaitableCallbackResults> >
115       WaitableCallbackResultsMap;
116 
117   WaitableCallbackResults* MaybeCreateWaitableResults(
118       const blink::WebFileSystemCallbacks& callbacks, int callbacks_id);
119 
120   scoped_refptr<base::MessageLoopProxy> main_thread_loop_;
121 
122   CallbacksMap callbacks_;
123   int next_callbacks_id_;
124   WaitableCallbackResultsMap waitable_results_;
125 
126   DISALLOW_COPY_AND_ASSIGN(WebFileSystemImpl);
127 };
128 
129 }  // namespace content
130 
131 #endif  // CONTENT_CHILD_FILEAPI_WEBFILESYSTEM_IMPL_H_
132