summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-02 12:14:18 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-02 12:14:18 +0000
commite1514f400c33e31b42cd6fc6f6dfbe8dd9970a9a (patch)
treed174f1597de79c06ef7e6e8d47e0c5948a55bd35
parent510fbf797525f0389fe9ce4fd2f234922960b206 (diff)
downloadchromium_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.cc109
-rw-r--r--base/file_util_proxy.h18
-rw-r--r--webkit/fileapi/file_system_file_util_proxy.cc83
-rw-r--r--webkit/fileapi/file_system_file_util_proxy.h18
-rw-r--r--webkit/fileapi/file_system_operation.cc41
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()));
}