| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "content/child/fileapi/file_system_dispatcher.h" |    5 #include "content/child/fileapi/file_system_dispatcher.h" | 
|    6  |    6  | 
|    7 #include "base/callback.h" |    7 #include "base/callback.h" | 
|    8 #include "base/file_util.h" |    8 #include "base/file_util.h" | 
|    9 #include "base/message_loop/message_loop_proxy.h" |    9 #include "base/message_loop/message_loop_proxy.h" | 
|   10 #include "base/process/process.h" |   10 #include "base/process/process.h" | 
|   11 #include "content/child/child_thread.h" |   11 #include "content/child/child_thread.h" | 
|   12 #include "content/common/fileapi/file_system_messages.h" |   12 #include "content/common/fileapi/file_system_messages.h" | 
 |   13 #include "webkit/common/fileapi/file_system_info.h" | 
|   13  |   14  | 
|   14 namespace content { |   15 namespace content { | 
|   15  |   16  | 
|   16 class FileSystemDispatcher::CallbackDispatcher { |   17 class FileSystemDispatcher::CallbackDispatcher { | 
|   17  public: |   18  public: | 
|   18   typedef CallbackDispatcher self; |   19   typedef CallbackDispatcher self; | 
|   19   typedef FileSystemDispatcher::StatusCallback StatusCallback; |   20   typedef FileSystemDispatcher::StatusCallback StatusCallback; | 
|   20   typedef FileSystemDispatcher::MetadataCallback MetadataCallback; |   21   typedef FileSystemDispatcher::MetadataCallback MetadataCallback; | 
|   21   typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; |   22   typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; | 
|   22   typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; |   23   typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; | 
 |   24   typedef FileSystemDispatcher::ResolveURLCallback ResolveURLCallback; | 
|   23   typedef FileSystemDispatcher::WriteCallback WriteCallback; |   25   typedef FileSystemDispatcher::WriteCallback WriteCallback; | 
|   24   typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; |   26   typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; | 
|   25  |   27  | 
|   26   static CallbackDispatcher* Create(const StatusCallback& callback) { |   28   static CallbackDispatcher* Create(const StatusCallback& callback) { | 
|   27     CallbackDispatcher* dispatcher = new CallbackDispatcher; |   29     CallbackDispatcher* dispatcher = new CallbackDispatcher; | 
|   28     dispatcher->status_callback_ = callback; |   30     dispatcher->status_callback_ = callback; | 
|   29     dispatcher->error_callback_ = callback; |   31     dispatcher->error_callback_ = callback; | 
|   30     return dispatcher; |   32     return dispatcher; | 
|   31   } |   33   } | 
|   32   static CallbackDispatcher* Create(const MetadataCallback& callback, |   34   static CallbackDispatcher* Create(const MetadataCallback& callback, | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|   50     dispatcher->error_callback_ = error_callback; |   52     dispatcher->error_callback_ = error_callback; | 
|   51     return dispatcher; |   53     return dispatcher; | 
|   52   } |   54   } | 
|   53   static CallbackDispatcher* Create(const OpenFileSystemCallback& callback, |   55   static CallbackDispatcher* Create(const OpenFileSystemCallback& callback, | 
|   54                                     const StatusCallback& error_callback) { |   56                                     const StatusCallback& error_callback) { | 
|   55     CallbackDispatcher* dispatcher = new CallbackDispatcher; |   57     CallbackDispatcher* dispatcher = new CallbackDispatcher; | 
|   56     dispatcher->filesystem_callback_ = callback; |   58     dispatcher->filesystem_callback_ = callback; | 
|   57     dispatcher->error_callback_ = error_callback; |   59     dispatcher->error_callback_ = error_callback; | 
|   58     return dispatcher; |   60     return dispatcher; | 
|   59   } |   61   } | 
 |   62   static CallbackDispatcher* Create(const ResolveURLCallback& callback, | 
 |   63                                     const StatusCallback& error_callback) { | 
 |   64     CallbackDispatcher* dispatcher = new CallbackDispatcher; | 
 |   65     dispatcher->resolve_callback_ = callback; | 
 |   66     dispatcher->error_callback_ = error_callback; | 
 |   67     return dispatcher; | 
 |   68   } | 
|   60   static CallbackDispatcher* Create(const WriteCallback& callback, |   69   static CallbackDispatcher* Create(const WriteCallback& callback, | 
|   61                                     const StatusCallback& error_callback) { |   70                                     const StatusCallback& error_callback) { | 
|   62     CallbackDispatcher* dispatcher = new CallbackDispatcher; |   71     CallbackDispatcher* dispatcher = new CallbackDispatcher; | 
|   63     dispatcher->write_callback_ = callback; |   72     dispatcher->write_callback_ = callback; | 
|   64     dispatcher->error_callback_ = error_callback; |   73     dispatcher->error_callback_ = error_callback; | 
|   65     return dispatcher; |   74     return dispatcher; | 
|   66   } |   75   } | 
|   67   static CallbackDispatcher* Create(const OpenFileCallback& callback, |   76   static CallbackDispatcher* Create(const OpenFileCallback& callback, | 
|   68                                     const StatusCallback& error_callback) { |   77                                     const StatusCallback& error_callback) { | 
|   69     CallbackDispatcher* dispatcher = new CallbackDispatcher; |   78     CallbackDispatcher* dispatcher = new CallbackDispatcher; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|   98       const std::vector<fileapi::DirectoryEntry>& entries, |  107       const std::vector<fileapi::DirectoryEntry>& entries, | 
|   99       bool has_more) { |  108       bool has_more) { | 
|  100     directory_callback_.Run(entries, has_more); |  109     directory_callback_.Run(entries, has_more); | 
|  101   } |  110   } | 
|  102  |  111  | 
|  103   void DidOpenFileSystem(const std::string& name, |  112   void DidOpenFileSystem(const std::string& name, | 
|  104                          const GURL& root) { |  113                          const GURL& root) { | 
|  105     filesystem_callback_.Run(name, root); |  114     filesystem_callback_.Run(name, root); | 
|  106   } |  115   } | 
|  107  |  116  | 
 |  117   void DidResolveURL(const fileapi::FileSystemInfo& info, | 
 |  118                      const base::FilePath& file_path, | 
 |  119                      bool is_directory) { | 
 |  120     resolve_callback_.Run(info, file_path, is_directory); | 
 |  121   } | 
 |  122  | 
|  108   void DidWrite(int64 bytes, bool complete) { |  123   void DidWrite(int64 bytes, bool complete) { | 
|  109     write_callback_.Run(bytes, complete); |  124     write_callback_.Run(bytes, complete); | 
|  110   } |  125   } | 
|  111  |  126  | 
|  112   void DidOpenFile(base::PlatformFile file, |  127   void DidOpenFile(base::PlatformFile file, | 
|  113                    int file_open_id, |  128                    int file_open_id, | 
|  114                    quota::QuotaLimitType quota_policy) { |  129                    quota::QuotaLimitType quota_policy) { | 
|  115     open_callback_.Run(file, file_open_id, quota_policy); |  130     open_callback_.Run(file, file_open_id, quota_policy); | 
|  116   } |  131   } | 
|  117  |  132  | 
|  118  private: |  133  private: | 
|  119   CallbackDispatcher() {} |  134   CallbackDispatcher() {} | 
|  120  |  135  | 
|  121   StatusCallback status_callback_; |  136   StatusCallback status_callback_; | 
|  122   MetadataCallback metadata_callback_; |  137   MetadataCallback metadata_callback_; | 
|  123   CreateSnapshotFileCallback snapshot_callback_; |  138   CreateSnapshotFileCallback snapshot_callback_; | 
|  124   ReadDirectoryCallback directory_callback_; |  139   ReadDirectoryCallback directory_callback_; | 
|  125   OpenFileSystemCallback filesystem_callback_; |  140   OpenFileSystemCallback filesystem_callback_; | 
 |  141   ResolveURLCallback resolve_callback_; | 
|  126   WriteCallback write_callback_; |  142   WriteCallback write_callback_; | 
|  127   OpenFileCallback open_callback_; |  143   OpenFileCallback open_callback_; | 
|  128  |  144  | 
|  129   StatusCallback error_callback_; |  145   StatusCallback error_callback_; | 
|  130  |  146  | 
|  131   DISALLOW_COPY_AND_ASSIGN(CallbackDispatcher); |  147   DISALLOW_COPY_AND_ASSIGN(CallbackDispatcher); | 
|  132 }; |  148 }; | 
|  133  |  149  | 
|  134 FileSystemDispatcher::FileSystemDispatcher() { |  150 FileSystemDispatcher::FileSystemDispatcher() { | 
|  135 } |  151 } | 
|  136  |  152  | 
|  137 FileSystemDispatcher::~FileSystemDispatcher() { |  153 FileSystemDispatcher::~FileSystemDispatcher() { | 
|  138   // Make sure we fire all the remaining callbacks. |  154   // Make sure we fire all the remaining callbacks. | 
|  139   for (IDMap<CallbackDispatcher, IDMapOwnPointer>::iterator |  155   for (IDMap<CallbackDispatcher, IDMapOwnPointer>::iterator | 
|  140            iter(&dispatchers_); !iter.IsAtEnd(); iter.Advance()) { |  156            iter(&dispatchers_); !iter.IsAtEnd(); iter.Advance()) { | 
|  141     int request_id = iter.GetCurrentKey(); |  157     int request_id = iter.GetCurrentKey(); | 
|  142     CallbackDispatcher* dispatcher = iter.GetCurrentValue(); |  158     CallbackDispatcher* dispatcher = iter.GetCurrentValue(); | 
|  143     DCHECK(dispatcher); |  159     DCHECK(dispatcher); | 
|  144     dispatcher->DidFail(base::PLATFORM_FILE_ERROR_ABORT); |  160     dispatcher->DidFail(base::PLATFORM_FILE_ERROR_ABORT); | 
|  145     dispatchers_.Remove(request_id); |  161     dispatchers_.Remove(request_id); | 
|  146   } |  162   } | 
|  147 } |  163 } | 
|  148  |  164  | 
|  149 bool FileSystemDispatcher::OnMessageReceived(const IPC::Message& msg) { |  165 bool FileSystemDispatcher::OnMessageReceived(const IPC::Message& msg) { | 
|  150   bool handled = true; |  166   bool handled = true; | 
|  151   IPC_BEGIN_MESSAGE_MAP(FileSystemDispatcher, msg) |  167   IPC_BEGIN_MESSAGE_MAP(FileSystemDispatcher, msg) | 
|  152     IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFileSystem, OnDidOpenFileSystem) |  168     IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFileSystem, OnDidOpenFileSystem) | 
 |  169     IPC_MESSAGE_HANDLER(FileSystemMsg_DidResolveURL, OnDidResolveURL) | 
|  153     IPC_MESSAGE_HANDLER(FileSystemMsg_DidSucceed, OnDidSucceed) |  170     IPC_MESSAGE_HANDLER(FileSystemMsg_DidSucceed, OnDidSucceed) | 
|  154     IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadDirectory, OnDidReadDirectory) |  171     IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadDirectory, OnDidReadDirectory) | 
|  155     IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadMetadata, OnDidReadMetadata) |  172     IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadMetadata, OnDidReadMetadata) | 
|  156     IPC_MESSAGE_HANDLER(FileSystemMsg_DidCreateSnapshotFile, |  173     IPC_MESSAGE_HANDLER(FileSystemMsg_DidCreateSnapshotFile, | 
|  157                         OnDidCreateSnapshotFile) |  174                         OnDidCreateSnapshotFile) | 
|  158     IPC_MESSAGE_HANDLER(FileSystemMsg_DidFail, OnDidFail) |  175     IPC_MESSAGE_HANDLER(FileSystemMsg_DidFail, OnDidFail) | 
|  159     IPC_MESSAGE_HANDLER(FileSystemMsg_DidWrite, OnDidWrite) |  176     IPC_MESSAGE_HANDLER(FileSystemMsg_DidWrite, OnDidWrite) | 
|  160     IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFile, OnDidOpenFile) |  177     IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFile, OnDidOpenFile) | 
|  161     IPC_MESSAGE_UNHANDLED(handled = false) |  178     IPC_MESSAGE_UNHANDLED(handled = false) | 
|  162   IPC_END_MESSAGE_MAP() |  179   IPC_END_MESSAGE_MAP() | 
|  163   return handled; |  180   return handled; | 
|  164 } |  181 } | 
|  165  |  182  | 
|  166 void FileSystemDispatcher::OpenFileSystem( |  183 void FileSystemDispatcher::OpenFileSystem( | 
|  167     const GURL& origin_url, fileapi::FileSystemType type, |  184     const GURL& origin_url, fileapi::FileSystemType type, | 
|  168     long long size, bool create, |  185     long long size, bool create, | 
|  169     const OpenFileSystemCallback& success_callback, |  186     const OpenFileSystemCallback& success_callback, | 
|  170     const StatusCallback& error_callback) { |  187     const StatusCallback& error_callback) { | 
|  171   int request_id = dispatchers_.Add( |  188   int request_id = dispatchers_.Add( | 
|  172       CallbackDispatcher::Create(success_callback, error_callback)); |  189       CallbackDispatcher::Create(success_callback, error_callback)); | 
|  173   ChildThread::current()->Send(new FileSystemHostMsg_Open( |  190   ChildThread::current()->Send(new FileSystemHostMsg_Open( | 
|  174           request_id, origin_url, type, size, create)); |  191           request_id, origin_url, type, size, create)); | 
|  175 } |  192 } | 
|  176  |  193  | 
 |  194 void FileSystemDispatcher::ResolveURL( | 
 |  195     const GURL& filesystem_url, | 
 |  196     const ResolveURLCallback& success_callback, | 
 |  197     const StatusCallback& error_callback) { | 
 |  198   int request_id = dispatchers_.Add( | 
 |  199       CallbackDispatcher::Create(success_callback, error_callback)); | 
 |  200   ChildThread::current()->Send(new FileSystemHostMsg_ResolveURL( | 
 |  201           request_id, filesystem_url)); | 
 |  202 } | 
 |  203  | 
|  177 void FileSystemDispatcher::DeleteFileSystem( |  204 void FileSystemDispatcher::DeleteFileSystem( | 
|  178     const GURL& origin_url, |  205     const GURL& origin_url, | 
|  179     fileapi::FileSystemType type, |  206     fileapi::FileSystemType type, | 
|  180     const StatusCallback& callback) { |  207     const StatusCallback& callback) { | 
|  181   int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback)); |  208   int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback)); | 
|  182   ChildThread::current()->Send(new FileSystemHostMsg_DeleteFileSystem( |  209   ChildThread::current()->Send(new FileSystemHostMsg_DeleteFileSystem( | 
|  183           request_id, origin_url, type)); |  210           request_id, origin_url, type)); | 
|  184 } |  211 } | 
|  185  |  212  | 
|  186 void FileSystemDispatcher::Move( |  213 void FileSystemDispatcher::Move( | 
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  355 void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, |  382 void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, | 
|  356                                                const std::string& name, |  383                                                const std::string& name, | 
|  357                                                const GURL& root) { |  384                                                const GURL& root) { | 
|  358   DCHECK(root.is_valid()); |  385   DCHECK(root.is_valid()); | 
|  359   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |  386   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 
|  360   DCHECK(dispatcher); |  387   DCHECK(dispatcher); | 
|  361   dispatcher->DidOpenFileSystem(name, root); |  388   dispatcher->DidOpenFileSystem(name, root); | 
|  362   dispatchers_.Remove(request_id); |  389   dispatchers_.Remove(request_id); | 
|  363 } |  390 } | 
|  364  |  391  | 
 |  392 void FileSystemDispatcher::OnDidResolveURL(int request_id, | 
 |  393                                            const fileapi::FileSystemInfo& info, | 
 |  394                                            const base::FilePath& file_path, | 
 |  395                                            bool is_directory) { | 
 |  396   DCHECK(info.root_url.is_valid()); | 
 |  397   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 
 |  398   DCHECK(dispatcher); | 
 |  399   dispatcher->DidResolveURL(info, file_path, is_directory); | 
 |  400   dispatchers_.Remove(request_id); | 
 |  401 } | 
 |  402  | 
|  365 void FileSystemDispatcher::OnDidSucceed(int request_id) { |  403 void FileSystemDispatcher::OnDidSucceed(int request_id) { | 
|  366   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |  404   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 
|  367   DCHECK(dispatcher); |  405   DCHECK(dispatcher); | 
|  368   dispatcher->DidSucceed(); |  406   dispatcher->DidSucceed(); | 
|  369   dispatchers_.Remove(request_id); |  407   dispatchers_.Remove(request_id); | 
|  370 } |  408 } | 
|  371  |  409  | 
|  372 void FileSystemDispatcher::OnDidReadMetadata( |  410 void FileSystemDispatcher::OnDidReadMetadata( | 
|  373     int request_id, const base::PlatformFileInfo& file_info) { |  411     int request_id, const base::PlatformFileInfo& file_info) { | 
|  374   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |  412   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  420     quota::QuotaLimitType quota_policy) { |  458     quota::QuotaLimitType quota_policy) { | 
|  421   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |  459   CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 
|  422   DCHECK(dispatcher); |  460   DCHECK(dispatcher); | 
|  423   dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file), |  461   dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file), | 
|  424                           file_open_id, |  462                           file_open_id, | 
|  425                           quota_policy); |  463                           quota_policy); | 
|  426   dispatchers_.Remove(request_id); |  464   dispatchers_.Remove(request_id); | 
|  427 } |  465 } | 
|  428  |  466  | 
|  429 }  // namespace content |  467 }  // namespace content | 
| OLD | NEW |