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