| 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 |