Chromium Code Reviews| Index: base/file_util_proxy.cc |
| diff --git a/base/file_util_proxy.cc b/base/file_util_proxy.cc |
| index 4ca68f14b63c1fcf77083a1f4c51358f778074e1..1bbf5253ba0edea6e8058ea607f67d92757d1e1a 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), |
| -// CallbackWithReturn(Bind(&Callback), Owned(result))); |
| +// RelayHelper(Bind(&Callback), Owned(result))); |
| // |
| // Or just use PostTaskAndReplyWithStatus helper template (see the code below). |
| template <typename R1, typename R2> |
| @@ -60,6 +60,18 @@ 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); |
| @@ -89,28 +101,24 @@ bool PostTaskAndReplyWithStatus( |
| // Helper classes or routines for individual methods. |
| class CreateOrOpenHelper { |
| public: |
| - CreateOrOpenHelper(MessageLoopProxy* message_loop_proxy) |
| + CreateOrOpenHelper(MessageLoopProxy* message_loop_proxy, |
| + const FileUtilProxy::CloseTask& close_task) |
| : message_loop_proxy_(message_loop_proxy), |
| + close_task_(close_task), |
| file_handle_(kInvalidPlatformFileValue), |
| created_(false), |
| error_(PLATFORM_FILE_OK) {} |
| ~CreateOrOpenHelper() { |
| if (file_handle_ != kInvalidPlatformFileValue) { |
| - FileUtilProxy::Close(message_loop_proxy_, file_handle_, |
| - FileUtilProxy::StatusCallback()); |
| + FileUtilProxy::RelayClose(message_loop_proxy_, |
| + close_task_, file_handle_, |
| + FileUtilProxy::StatusCallback()); |
|
willchan no longer on Chromium
2011/11/01 22:57:37
Why do we use FileUtilProxy here? Shouldn't we jus
kinuko
2011/11/02 05:48:22
Good point... I think simple PostTask will be enou
|
| } |
| } |
| - 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 RunWork(const FileUtilProxy::CreateOrOpenTask& task) { |
| + error_ = task.Run(&file_handle_, &created_); |
| } |
| void Reply(const FileUtilProxy::CreateOrOpenCallback& callback) { |
| @@ -120,6 +128,7 @@ class CreateOrOpenHelper { |
| private: |
| scoped_refptr<MessageLoopProxy> message_loop_proxy_; |
| + FileUtilProxy::CloseTask close_task_; |
| PlatformFile file_handle_; |
| bool created_; |
| PlatformFileError error_; |
| @@ -267,6 +276,28 @@ 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 |
| @@ -274,12 +305,11 @@ bool FileUtilProxy::CreateOrOpen( |
| scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| const FilePath& file_path, int file_flags, |
| const CreateOrOpenCallback& 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)); |
| + return RelayCreateOrOpen( |
| + message_loop_proxy, |
| + base::Bind(&CreateOrOpenAdapter, file_path, file_flags), |
| + base::Bind(&CloseAdapter), |
| + callback); |
| } |
| // static |
| @@ -296,13 +326,14 @@ bool FileUtilProxy::CreateTemporary( |
| } |
| // static |
| -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); |
| +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); |
| } |
| // Retrieves the information about a file. It is invalid to pass NULL for the |
| @@ -441,4 +472,31 @@ 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 |