diff options
author | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-02 12:14:18 +0000 |
---|---|---|
committer | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-02 12:14:18 +0000 |
commit | e1514f400c33e31b42cd6fc6f6dfbe8dd9970a9a (patch) | |
tree | d174f1597de79c06ef7e6e8d47e0c5948a55bd35 | |
parent | 510fbf797525f0389fe9ce4fd2f234922960b206 (diff) | |
download | chromium_src-e1514f400c33e31b42cd6fc6f6dfbe8dd9970a9a.zip chromium_src-e1514f400c33e31b42cd6fc6f6dfbe8dd9970a9a.tar.gz chromium_src-e1514f400c33e31b42cd6fc6f6dfbe8dd9970a9a.tar.bz2 |
Revert 108258 - broke Mac LayoutTests.
Merge FileUtilProxy and FileSystemFileUtilProxy using PostTaskAndReply: CreateOrOpen/Close
Deprecating MessageProxyRelay class and getting rid of duplicated code.
BUG=none
TEST=test_shell_tests:\*FileSystem\*
Review URL: http://codereview.chromium.org/8424006
TBR=kinuko@chromium.org
Review URL: http://codereview.chromium.org/8423041
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@108274 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/file_util_proxy.cc | 109 | ||||
-rw-r--r-- | base/file_util_proxy.h | 18 | ||||
-rw-r--r-- | webkit/fileapi/file_system_file_util_proxy.cc | 83 | ||||
-rw-r--r-- | webkit/fileapi/file_system_file_util_proxy.h | 18 | ||||
-rw-r--r-- | webkit/fileapi/file_system_operation.cc | 41 |
5 files changed, 138 insertions, 131 deletions
diff --git a/base/file_util_proxy.cc b/base/file_util_proxy.cc index 4c79465..4ca68f1 100644 --- a/base/file_util_proxy.cc +++ b/base/file_util_proxy.cc @@ -26,7 +26,7 @@ namespace { // message_loop_proxy->PostTaskAndReply( // from_here, // ReturnAsParam<R>(Bind(&DoWorkAndReturn), result), -// RelayHelper(Bind(&Callback), Owned(result))); +// CallbackWithReturn(Bind(&Callback), Owned(result))); // // Or just use PostTaskAndReplyWithStatus helper template (see the code below). template <typename R1, typename R2> @@ -60,18 +60,6 @@ Closure ReturnAsParam(const Callback<R1(void)>& func, R2* result) { return Bind(&ReturnAsParamAdapter<R1, R2>, func, result); } -template <typename R, typename A1> -void ReturnAsParamAdapter1(const Callback<R(A1)>& func, A1 a1, R* result) { - if (!func.is_null()) - *result = func.Run(a1); -} - -template <typename R, typename A1> -Closure ReturnAsParam(const Callback<R(A1)>& func, A1 a1, R* result) { - DCHECK(result); - return Bind(&ReturnAsParamAdapter1<R, A1>, func, a1, result); -} - template <typename R> void ReplyAdapter(const Callback<void(R)>& callback, R* result) { DCHECK(result); @@ -101,23 +89,28 @@ bool PostTaskAndReplyWithStatus( // Helper classes or routines for individual methods. class CreateOrOpenHelper { public: - CreateOrOpenHelper(MessageLoopProxy* message_loop_proxy, - const FileUtilProxy::CloseTask& close_task) + CreateOrOpenHelper(MessageLoopProxy* message_loop_proxy) : message_loop_proxy_(message_loop_proxy), - close_task_(close_task), file_handle_(kInvalidPlatformFileValue), created_(false), error_(PLATFORM_FILE_OK) {} ~CreateOrOpenHelper() { if (file_handle_ != kInvalidPlatformFileValue) { - message_loop_proxy_->PostTask( - FROM_HERE, base::Bind(close_task_, file_handle_)); + FileUtilProxy::Close(message_loop_proxy_, file_handle_, + FileUtilProxy::StatusCallback()); } } - void RunWork(const FileUtilProxy::CreateOrOpenTask& task) { - error_ = task.Run(&file_handle_, &created_); + void RunWork(const FilePath& file_path, int file_flags) { + if (!file_util::DirectoryExists(file_path.DirName())) { + // If its parent does not exist, should return NOT_FOUND error. + error_ = PLATFORM_FILE_ERROR_NOT_FOUND; + return; + } + error_ = PLATFORM_FILE_OK; + file_handle_ = CreatePlatformFile(file_path, file_flags, + &created_, &error_); } void Reply(const FileUtilProxy::CreateOrOpenCallback& callback) { @@ -127,7 +120,6 @@ class CreateOrOpenHelper { private: scoped_refptr<MessageLoopProxy> message_loop_proxy_; - FileUtilProxy::CloseTask close_task_; PlatformFile file_handle_; bool created_; PlatformFileError error_; @@ -275,28 +267,6 @@ class WriteHelper { DISALLOW_COPY_AND_ASSIGN(WriteHelper); }; - -PlatformFileError CreateOrOpenAdapter( - const FilePath& file_path, int file_flags, - PlatformFile* file_handle, bool* created) { - DCHECK(file_handle); - DCHECK(created); - if (!file_util::DirectoryExists(file_path.DirName())) { - // If its parent does not exist, should return NOT_FOUND error. - return PLATFORM_FILE_ERROR_NOT_FOUND; - } - PlatformFileError error = PLATFORM_FILE_OK; - *file_handle = CreatePlatformFile(file_path, file_flags, created, &error); - return error; -} - -PlatformFileError CloseAdapter(PlatformFile file_handle) { - if (!ClosePlatformFile(file_handle)) { - return PLATFORM_FILE_ERROR_FAILED; - } - return PLATFORM_FILE_OK; -} - } // namespace // static @@ -304,11 +274,12 @@ bool FileUtilProxy::CreateOrOpen( scoped_refptr<MessageLoopProxy> message_loop_proxy, const FilePath& file_path, int file_flags, const CreateOrOpenCallback& callback) { - return RelayCreateOrOpen( - message_loop_proxy, - base::Bind(&CreateOrOpenAdapter, file_path, file_flags), - base::Bind(&CloseAdapter), - callback); + CreateOrOpenHelper* helper = new CreateOrOpenHelper(message_loop_proxy); + return message_loop_proxy->PostTaskAndReply( + FROM_HERE, + Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), + file_path, file_flags), + Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback)); } // static @@ -325,14 +296,13 @@ bool FileUtilProxy::CreateTemporary( } // static -bool FileUtilProxy::Close( - scoped_refptr<MessageLoopProxy> message_loop_proxy, - base::PlatformFile file_handle, - const StatusCallback& callback) { - return RelayClose( - message_loop_proxy, - base::Bind(&CloseAdapter), - file_handle, callback); +bool FileUtilProxy::Close(scoped_refptr<MessageLoopProxy> message_loop_proxy, + PlatformFile file_handle, + const StatusCallback& callback) { + return PostTaskAndReplyWithStatus<bool>( + message_loop_proxy, FROM_HERE, + Bind(&ClosePlatformFile, file_handle), callback, + new PlatformFileError); } // Retrieves the information about a file. It is invalid to pass NULL for the @@ -471,31 +441,4 @@ bool FileUtilProxy::Flush( new PlatformFileError); } -// static -bool FileUtilProxy::RelayCreateOrOpen( - scoped_refptr<MessageLoopProxy> message_loop_proxy, - const CreateOrOpenTask& open_task, - const CloseTask& close_task, - const CreateOrOpenCallback& callback) { - CreateOrOpenHelper* helper = new CreateOrOpenHelper( - message_loop_proxy, close_task); - return message_loop_proxy->PostTaskAndReply( - FROM_HERE, - Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task), - Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback)); -} - -// static -bool FileUtilProxy::RelayClose( - scoped_refptr<MessageLoopProxy> message_loop_proxy, - const CloseTask& close_task, - PlatformFile file_handle, - const StatusCallback& callback) { - PlatformFileError* result = new PlatformFileError; - return message_loop_proxy->PostTaskAndReply( - FROM_HERE, - ReturnAsParam(close_task, file_handle, result), - ReplyHelper(callback, Owned(result))); -} - } // namespace base diff --git a/base/file_util_proxy.h b/base/file_util_proxy.h index 15a3e82..eb1d144 100644 --- a/base/file_util_proxy.h +++ b/base/file_util_proxy.h @@ -32,7 +32,7 @@ class BASE_EXPORT FileUtilProxy { }; // This callback is used by methods that report only an error code. It is - // valid to pass a null callback to any function that takes a StatusCallback, + // valid to pass StatusCallback() to any function that takes a StatusCallback, // in which case the operation will complete silently. typedef Callback<void(PlatformFileError)> StatusCallback; @@ -51,9 +51,6 @@ class BASE_EXPORT FileUtilProxy { typedef Callback<void(PlatformFileError, int /* bytes written */)> WriteCallback; - typedef Callback<PlatformFileError(PlatformFile*, bool*)> CreateOrOpenTask; - typedef Callback<PlatformFileError(PlatformFile)> CloseTask; - // Creates or opens a file with the given flags. It is invalid to pass a null // callback. If PLATFORM_FILE_CREATE is set in |file_flags| it always tries to // create a new file at the given |file_path| and calls back with @@ -167,19 +164,6 @@ class BASE_EXPORT FileUtilProxy { PlatformFile file, const StatusCallback& callback); - // Relay helpers. - static bool RelayCreateOrOpen( - scoped_refptr<MessageLoopProxy> message_loop_proxy, - const CreateOrOpenTask& open_task, - const CloseTask& close_task, - const CreateOrOpenCallback& callback); - - static bool RelayClose( - scoped_refptr<MessageLoopProxy> message_loop_proxy, - const CloseTask& close_task, - PlatformFile, - const StatusCallback& callback); - private: DISALLOW_IMPLICIT_CONSTRUCTORS(FileUtilProxy); }; diff --git a/webkit/fileapi/file_system_file_util_proxy.cc b/webkit/fileapi/file_system_file_util_proxy.cc index 6c54cdc..01af4b9 100644 --- a/webkit/fileapi/file_system_file_util_proxy.cc +++ b/webkit/fileapi/file_system_file_util_proxy.cc @@ -71,6 +71,51 @@ class MessageLoopRelay fileapi::FileSystemFileUtil* file_util_; }; +class RelayCreateOrOpen : public MessageLoopRelay { + public: + RelayCreateOrOpen( + const fileapi::FileSystemOperationContext& context, + scoped_refptr<base::MessageLoopProxy> message_loop_proxy, + const FilePath& file_path, + int file_flags, + const fileapi::FileSystemFileUtilProxy::CreateOrOpenCallback& callback) + : MessageLoopRelay(context), + message_loop_proxy_(message_loop_proxy), + file_path_(file_path), + file_flags_(file_flags), + callback_(callback), + file_handle_(base::kInvalidPlatformFileValue), + created_(false) { + DCHECK_EQ(false, callback.is_null()); + } + + protected: + virtual ~RelayCreateOrOpen() { + if (file_handle_ != base::kInvalidPlatformFileValue) + fileapi::FileSystemFileUtilProxy::Close( + *context(), message_loop_proxy_, file_handle_, + fileapi::FileSystemFileUtilProxy::StatusCallback()); + } + + virtual void RunWork() { + set_error_code(file_util()->CreateOrOpen( + context(), file_path_, file_flags_, &file_handle_, &created_)); + } + + virtual void RunCallback() { + callback_.Run(error_code(), base::PassPlatformFile(&file_handle_), + created_); + } + + private: + scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; + FilePath file_path_; + int file_flags_; + fileapi::FileSystemFileUtilProxy::CreateOrOpenCallback callback_; + base::PlatformFile file_handle_; + bool created_; +}; + class RelayWithStatusCallback : public MessageLoopRelay { public: RelayWithStatusCallback( @@ -92,6 +137,24 @@ class RelayWithStatusCallback : public MessageLoopRelay { fileapi::FileSystemFileUtilProxy::StatusCallback callback_; }; +class RelayClose : public RelayWithStatusCallback { + public: + RelayClose(const fileapi::FileSystemOperationContext& context, + base::PlatformFile file_handle, + const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) + : RelayWithStatusCallback(context, callback), + file_handle_(file_handle) { + } + + protected: + virtual void RunWork() { + set_error_code(file_util()->Close(context(), file_handle_)); + } + + private: + base::PlatformFile file_handle_; +}; + class RelayEnsureFileExists : public MessageLoopRelay { public: RelayEnsureFileExists( @@ -362,6 +425,26 @@ bool Start(const tracked_objects::Location& from_here, namespace fileapi { // static +bool FileSystemFileUtilProxy::CreateOrOpen( + const FileSystemOperationContext& context, + scoped_refptr<MessageLoopProxy> message_loop_proxy, + const FilePath& file_path, int file_flags, + const CreateOrOpenCallback& callback) { + return Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen(context, + message_loop_proxy, file_path, file_flags, callback)); +} + +// static +bool FileSystemFileUtilProxy::Close( + const FileSystemOperationContext& context, + scoped_refptr<MessageLoopProxy> message_loop_proxy, + base::PlatformFile file_handle, + const StatusCallback& callback) { + return Start(FROM_HERE, message_loop_proxy, + new RelayClose(context, file_handle, callback)); +} + +// static bool FileSystemFileUtilProxy::EnsureFileExists( const FileSystemOperationContext& context, scoped_refptr<MessageLoopProxy> message_loop_proxy, diff --git a/webkit/fileapi/file_system_file_util_proxy.h b/webkit/fileapi/file_system_file_util_proxy.h index b6a9ada..a3e85e5 100644 --- a/webkit/fileapi/file_system_file_util_proxy.h +++ b/webkit/fileapi/file_system_file_util_proxy.h @@ -36,6 +36,7 @@ class FileSystemFileUtilProxy { typedef base::FileUtilProxy::Entry Entry; typedef base::FileUtilProxy::StatusCallback StatusCallback; + typedef base::FileUtilProxy::CreateOrOpenCallback CreateOrOpenCallback; typedef base::Callback<void(PlatformFileError, bool /* created */ )> EnsureFileExistsCallback; @@ -51,6 +52,23 @@ class FileSystemFileUtilProxy { const FilePath& /* local_path, where possible */ >::Type GetLocalPathCallback; + // Creates or opens a file with the given flags. It is invalid to pass NULL + // for the callback. + // If PLATFORM_FILE_CREATE is set in |file_flags| it always tries to create + // a new file at the given |file_path| and calls back with + // PLATFORM_FILE_ERROR_FILE_EXISTS if the |file_path| already exists. + static bool CreateOrOpen(const FileSystemOperationContext& context, + scoped_refptr<MessageLoopProxy> message_loop_proxy, + const FilePath& file_path, + int file_flags, + const CreateOrOpenCallback& callback); + + // Close the given file handle. + static bool Close(const FileSystemOperationContext& context, + scoped_refptr<MessageLoopProxy> message_loop_proxy, + PlatformFile, + const StatusCallback& callback); + // Ensures that the given |file_path| exist. This creates a empty new file // at |file_path| if the |file_path| does not exist. // If a new file han not existed and is created at the |file_path|, diff --git a/webkit/fileapi/file_system_operation.cc b/webkit/fileapi/file_system_operation.cc index 84f66eb..7c504a6 100644 --- a/webkit/fileapi/file_system_operation.cc +++ b/webkit/fileapi/file_system_operation.cc @@ -71,17 +71,10 @@ FileSystemOperation::FileSystemOperation( } FileSystemOperation::~FileSystemOperation() { - if (file_writer_delegate_.get()) { - FileSystemOperationContext* c = - new FileSystemOperationContext(operation_context_); - base::FileUtilProxy::RelayClose( - proxy_, - base::Bind(&FileSystemFileUtil::Close, - base::Unretained(c->src_file_util()), - base::Owned(c)), - file_writer_delegate_->file(), + if (file_writer_delegate_.get()) + FileSystemFileUtilProxy::Close( + operation_context_, proxy_, file_writer_delegate_->file(), FileSystemFileUtilProxy::StatusCallback()); - } } void FileSystemOperation::OpenFileSystem( @@ -373,19 +366,12 @@ void FileSystemOperation::DelayedWriteForQuota(quota::QuotaStatusCode status, operation_context_.src_origin_url(), operation_context_.src_type())); - int file_flags = base::PLATFORM_FILE_OPEN | - base::PLATFORM_FILE_WRITE | - base::PLATFORM_FILE_ASYNC; - - base::FileUtilProxy::RelayCreateOrOpen( + FileSystemFileUtilProxy::CreateOrOpen( + operation_context_, proxy_, - base::Bind(&FileSystemFileUtil::CreateOrOpen, - base::Unretained(operation_context_.src_file_util()), - base::Unretained(&operation_context_), - src_virtual_path_, file_flags), - base::Bind(&FileSystemFileUtil::Close, - base::Unretained(operation_context_.src_file_util()), - base::Unretained(&operation_context_)), + src_virtual_path_, + base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE | + base::PLATFORM_FILE_ASYNC, base::Bind(&FileSystemOperation::OnFileOpenedForWrite, weak_factory_.GetWeakPtr())); } @@ -492,15 +478,8 @@ void FileSystemOperation::DelayedOpenFileForQuota(quota::QuotaStatusCode status, operation_context_.src_origin_url(), operation_context_.src_type())); - base::FileUtilProxy::RelayCreateOrOpen( - proxy_, - base::Bind(&FileSystemFileUtil::CreateOrOpen, - base::Unretained(operation_context_.src_file_util()), - base::Unretained(&operation_context_), - src_virtual_path_, file_flags_), - base::Bind(&FileSystemFileUtil::Close, - base::Unretained(operation_context_.src_file_util()), - base::Unretained(&operation_context_)), + FileSystemFileUtilProxy::CreateOrOpen( + operation_context_, proxy_, src_virtual_path_, file_flags_, base::Bind(&FileSystemOperation::DidOpenFile, weak_factory_.GetWeakPtr())); } |