| Index: content/common/fileapi/file_system_dispatcher.cc
|
| diff --git a/content/common/fileapi/file_system_dispatcher.cc b/content/common/fileapi/file_system_dispatcher.cc
|
| index c9726dc1d7b159c37a7c70920ddd3701ffb13027..9f725a6af7849f4e0185fe10e65a91ecce13bc09 100644
|
| --- a/content/common/fileapi/file_system_dispatcher.cc
|
| +++ b/content/common/fileapi/file_system_dispatcher.cc
|
| @@ -4,21 +4,133 @@
|
|
|
| #include "content/common/fileapi/file_system_dispatcher.h"
|
|
|
| +#include "base/callback.h"
|
| +#include "base/file_util.h"
|
| #include "base/process.h"
|
| #include "content/common/child_thread.h"
|
| #include "content/common/fileapi/file_system_messages.h"
|
|
|
| namespace content {
|
|
|
| +class FileSystemDispatcher::CallbackDispatcher {
|
| + public:
|
| + typedef CallbackDispatcher self;
|
| + typedef FileSystemDispatcher::StatusCallback StatusCallback;
|
| + typedef FileSystemDispatcher::MetadataCallback MetadataCallback;
|
| + typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback;
|
| + typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback;
|
| + typedef FileSystemDispatcher::WriteCallback WriteCallback;
|
| + typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback;
|
| +
|
| + static CallbackDispatcher* Create(const StatusCallback& callback) {
|
| + CallbackDispatcher* dispatcher = new CallbackDispatcher;
|
| + dispatcher->status_callback_ = callback;
|
| + dispatcher->error_callback_ = callback;
|
| + return dispatcher;
|
| + }
|
| + static CallbackDispatcher* Create(const MetadataCallback& callback,
|
| + const StatusCallback& error_callback) {
|
| + CallbackDispatcher* dispatcher = new CallbackDispatcher;
|
| + dispatcher->metadata_callback_ = callback;
|
| + dispatcher->error_callback_ = error_callback;
|
| + return dispatcher;
|
| + }
|
| + static CallbackDispatcher* Create(const ReadDirectoryCallback& callback,
|
| + const StatusCallback& error_callback) {
|
| + CallbackDispatcher* dispatcher = new CallbackDispatcher;
|
| + dispatcher->directory_callback_ = callback;
|
| + dispatcher->error_callback_ = error_callback;
|
| + return dispatcher;
|
| + }
|
| + static CallbackDispatcher* Create(const OpenFileSystemCallback& callback,
|
| + const StatusCallback& error_callback) {
|
| + CallbackDispatcher* dispatcher = new CallbackDispatcher;
|
| + dispatcher->filesystem_callback_ = callback;
|
| + dispatcher->error_callback_ = error_callback;
|
| + return dispatcher;
|
| + }
|
| + static CallbackDispatcher* Create(const WriteCallback& callback,
|
| + const StatusCallback& error_callback) {
|
| + CallbackDispatcher* dispatcher = new CallbackDispatcher;
|
| + dispatcher->write_callback_ = callback;
|
| + dispatcher->error_callback_ = error_callback;
|
| + return dispatcher;
|
| + }
|
| + static CallbackDispatcher* Create(const OpenFileCallback& callback,
|
| + const StatusCallback& error_callback) {
|
| + CallbackDispatcher* dispatcher = new CallbackDispatcher;
|
| + dispatcher->open_callback_ = callback;
|
| + dispatcher->error_callback_ = error_callback;
|
| + return dispatcher;
|
| + }
|
| +
|
| + ~CallbackDispatcher() {}
|
| +
|
| + void DidSucceed() {
|
| + status_callback_.Run(base::PLATFORM_FILE_OK);
|
| + }
|
| +
|
| + void DidFail(base::PlatformFileError error_code) {
|
| + error_callback_.Run(error_code);
|
| + }
|
| +
|
| + void DidReadMetadata(
|
| + const base::PlatformFileInfo& file_info,
|
| + const base::FilePath& platform_path) {
|
| + metadata_callback_.Run(file_info, platform_path);
|
| + }
|
| +
|
| + void DidCreateSnapshotFile(
|
| + const base::PlatformFileInfo& file_info,
|
| + const base::FilePath& platform_path) {
|
| + metadata_callback_.Run(file_info, platform_path);
|
| + }
|
| +
|
| + void DidReadDirectory(
|
| + const std::vector<base::FileUtilProxy::Entry>& entries,
|
| + bool has_more) {
|
| + directory_callback_.Run(entries, has_more);
|
| + }
|
| +
|
| + void DidOpenFileSystem(const std::string& name,
|
| + const GURL& root) {
|
| + filesystem_callback_.Run(name, root);
|
| + }
|
| +
|
| + void DidWrite(int64 bytes, bool complete) {
|
| + write_callback_.Run(bytes, complete);
|
| + }
|
| +
|
| + void DidOpenFile(base::PlatformFile file,
|
| + int file_open_id,
|
| + quota::QuotaLimitType quota_policy) {
|
| + open_callback_.Run(file, file_open_id, quota_policy);
|
| + }
|
| +
|
| + private:
|
| + CallbackDispatcher() {}
|
| +
|
| + StatusCallback status_callback_;
|
| + MetadataCallback metadata_callback_;
|
| + ReadDirectoryCallback directory_callback_;
|
| + OpenFileSystemCallback filesystem_callback_;
|
| + WriteCallback write_callback_;
|
| + OpenFileCallback open_callback_;
|
| +
|
| + StatusCallback error_callback_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CallbackDispatcher);
|
| +};
|
| +
|
| FileSystemDispatcher::FileSystemDispatcher() {
|
| }
|
|
|
| FileSystemDispatcher::~FileSystemDispatcher() {
|
| // Make sure we fire all the remaining callbacks.
|
| - for (IDMap<fileapi::FileSystemCallbackDispatcher, IDMapOwnPointer>::iterator
|
| + for (IDMap<CallbackDispatcher, IDMapOwnPointer>::iterator
|
| iter(&dispatchers_); !iter.IsAtEnd(); iter.Advance()) {
|
| int request_id = iter.GetCurrentKey();
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher = iter.GetCurrentValue();
|
| + CallbackDispatcher* dispatcher = iter.GetCurrentValue();
|
| DCHECK(dispatcher);
|
| dispatcher->DidFail(base::PLATFORM_FILE_ERROR_ABORT);
|
| dispatchers_.Remove(request_id);
|
| @@ -45,8 +157,10 @@ bool FileSystemDispatcher::OnMessageReceived(const IPC::Message& msg) {
|
| bool FileSystemDispatcher::OpenFileSystem(
|
| const GURL& origin_url, fileapi::FileSystemType type,
|
| long long size, bool create,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const OpenFileSystemCallback& success_callback,
|
| + const StatusCallback& error_callback) {
|
| + int request_id = dispatchers_.Add(
|
| + CallbackDispatcher::Create(success_callback, error_callback));
|
| if (!ChildThread::current()->Send(new FileSystemHostMsg_Open(
|
| request_id, origin_url, type, size, create))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -59,8 +173,8 @@ bool FileSystemDispatcher::OpenFileSystem(
|
| bool FileSystemDispatcher::DeleteFileSystem(
|
| const GURL& origin_url,
|
| fileapi::FileSystemType type,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(new FileSystemHostMsg_DeleteFileSystem(
|
| request_id, origin_url, type))) {
|
| dispatchers_.Remove(request_id);
|
| @@ -72,8 +186,8 @@ bool FileSystemDispatcher::DeleteFileSystem(
|
| bool FileSystemDispatcher::Move(
|
| const GURL& src_path,
|
| const GURL& dest_path,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(new FileSystemHostMsg_Move(
|
| request_id, src_path, dest_path))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -86,8 +200,8 @@ bool FileSystemDispatcher::Move(
|
| bool FileSystemDispatcher::Copy(
|
| const GURL& src_path,
|
| const GURL& dest_path,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(new FileSystemHostMsg_Copy(
|
| request_id, src_path, dest_path))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -100,8 +214,8 @@ bool FileSystemDispatcher::Copy(
|
| bool FileSystemDispatcher::Remove(
|
| const GURL& path,
|
| bool recursive,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemMsg_Remove(request_id, path, recursive))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -113,8 +227,10 @@ bool FileSystemDispatcher::Remove(
|
|
|
| bool FileSystemDispatcher::ReadMetadata(
|
| const GURL& path,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const MetadataCallback& success_callback,
|
| + const StatusCallback& error_callback) {
|
| + int request_id = dispatchers_.Add(
|
| + CallbackDispatcher::Create(success_callback, error_callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_ReadMetadata(request_id, path))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -129,8 +245,8 @@ bool FileSystemDispatcher::Create(
|
| bool exclusive,
|
| bool is_directory,
|
| bool recursive,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(new FileSystemHostMsg_Create(
|
| request_id, path, exclusive, is_directory, recursive))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -143,8 +259,8 @@ bool FileSystemDispatcher::Create(
|
| bool FileSystemDispatcher::Exists(
|
| const GURL& path,
|
| bool is_directory,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_Exists(request_id, path, is_directory))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -156,8 +272,10 @@ bool FileSystemDispatcher::Exists(
|
|
|
| bool FileSystemDispatcher::ReadDirectory(
|
| const GURL& path,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const ReadDirectoryCallback& success_callback,
|
| + const StatusCallback& error_callback) {
|
| + int request_id = dispatchers_.Add(
|
| + CallbackDispatcher::Create(success_callback, error_callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_ReadDirectory(request_id, path))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -171,8 +289,8 @@ bool FileSystemDispatcher::Truncate(
|
| const GURL& path,
|
| int64 offset,
|
| int* request_id_out,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_Truncate(request_id, path, offset))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -189,8 +307,10 @@ bool FileSystemDispatcher::Write(
|
| const GURL& blob_url,
|
| int64 offset,
|
| int* request_id_out,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const WriteCallback& success_callback,
|
| + const StatusCallback& error_callback) {
|
| + int request_id = dispatchers_.Add(
|
| + CallbackDispatcher::Create(success_callback, error_callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_Write(request_id, path, blob_url, offset))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -204,8 +324,8 @@ bool FileSystemDispatcher::Write(
|
|
|
| bool FileSystemDispatcher::Cancel(
|
| int request_id_to_cancel,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(new FileSystemHostMsg_CancelWrite(
|
| request_id, request_id_to_cancel))) {
|
| dispatchers_.Remove(request_id); // destroys |dispatcher|
|
| @@ -219,8 +339,8 @@ bool FileSystemDispatcher::TouchFile(
|
| const GURL& path,
|
| const base::Time& last_access_time,
|
| const base::Time& last_modified_time,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const StatusCallback& callback) {
|
| + int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_TouchFile(
|
| request_id, path, last_access_time, last_modified_time))) {
|
| @@ -234,8 +354,10 @@ bool FileSystemDispatcher::TouchFile(
|
| bool FileSystemDispatcher::OpenFile(
|
| const GURL& file_path,
|
| int file_flags,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const OpenFileCallback& success_callback,
|
| + const StatusCallback& error_callback) {
|
| + int request_id = dispatchers_.Add(
|
| + CallbackDispatcher::Create(success_callback, error_callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_OpenFile(
|
| request_id, file_path, file_flags))) {
|
| @@ -253,8 +375,10 @@ bool FileSystemDispatcher::NotifyCloseFile(int file_open_id) {
|
|
|
| bool FileSystemDispatcher::CreateSnapshotFile(
|
| const GURL& file_path,
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher) {
|
| - int request_id = dispatchers_.Add(dispatcher);
|
| + const CreateSnapshotFileCallback& success_callback,
|
| + const StatusCallback& error_callback) {
|
| + int request_id = dispatchers_.Add(
|
| + CallbackDispatcher::Create(success_callback, error_callback));
|
| if (!ChildThread::current()->Send(
|
| new FileSystemHostMsg_CreateSnapshotFile(
|
| request_id, file_path))) {
|
| @@ -268,16 +392,14 @@ void FileSystemDispatcher::OnDidOpenFileSystem(int request_id,
|
| const std::string& name,
|
| const GURL& root) {
|
| DCHECK(root.is_valid());
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidOpenFileSystem(name, root);
|
| dispatchers_.Remove(request_id);
|
| }
|
|
|
| void FileSystemDispatcher::OnDidSucceed(int request_id) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidSucceed();
|
| dispatchers_.Remove(request_id);
|
| @@ -286,8 +408,7 @@ void FileSystemDispatcher::OnDidSucceed(int request_id) {
|
| void FileSystemDispatcher::OnDidReadMetadata(
|
| int request_id, const base::PlatformFileInfo& file_info,
|
| const base::FilePath& platform_path) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidReadMetadata(file_info, platform_path);
|
| dispatchers_.Remove(request_id);
|
| @@ -296,8 +417,7 @@ void FileSystemDispatcher::OnDidReadMetadata(
|
| void FileSystemDispatcher::OnDidCreateSnapshotFile(
|
| int request_id, const base::PlatformFileInfo& file_info,
|
| const base::FilePath& platform_path) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidCreateSnapshotFile(file_info, platform_path);
|
| dispatchers_.Remove(request_id);
|
| @@ -309,8 +429,7 @@ void FileSystemDispatcher::OnDidReadDirectory(
|
| int request_id,
|
| const std::vector<base::FileUtilProxy::Entry>& entries,
|
| bool has_more) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidReadDirectory(entries, has_more);
|
| dispatchers_.Remove(request_id);
|
| @@ -318,8 +437,7 @@ void FileSystemDispatcher::OnDidReadDirectory(
|
|
|
| void FileSystemDispatcher::OnDidFail(
|
| int request_id, base::PlatformFileError error_code) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidFail(error_code);
|
| dispatchers_.Remove(request_id);
|
| @@ -327,8 +445,7 @@ void FileSystemDispatcher::OnDidFail(
|
|
|
| void FileSystemDispatcher::OnDidWrite(
|
| int request_id, int64 bytes, bool complete) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidWrite(bytes, complete);
|
| if (complete)
|
| @@ -340,8 +457,7 @@ void FileSystemDispatcher::OnDidOpenFile(
|
| IPC::PlatformFileForTransit file,
|
| int file_open_id,
|
| quota::QuotaLimitType quota_policy) {
|
| - fileapi::FileSystemCallbackDispatcher* dispatcher =
|
| - dispatchers_.Lookup(request_id);
|
| + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id);
|
| DCHECK(dispatcher);
|
| dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file),
|
| file_open_id,
|
|
|