summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/base.gypi2
-rw-r--r--base/file_util_proxy.cc245
-rw-r--r--base/file_util_proxy.h (renamed from chrome/browser/file_system_proxy.h)38
-rw-r--r--chrome/browser/chrome_thread_relay.cc26
-rw-r--r--chrome/browser/chrome_thread_relay.h55
-rw-r--r--chrome/browser/file_system_proxy.cc180
-rw-r--r--chrome/browser/renderer_host/redirect_to_file_resource_handler.cc9
-rw-r--r--chrome/chrome_browser.gypi4
8 files changed, 280 insertions, 279 deletions
diff --git a/base/base.gypi b/base/base.gypi
index 1d4fc21..e355172 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -81,6 +81,8 @@
'file_util_mac.mm',
'file_util_posix.cc',
'file_util_win.cc',
+ 'file_util_proxy.cc',
+ 'file_util_proxy.h',
'file_version_info.h',
'file_version_info_mac.h',
'file_version_info_mac.mm',
diff --git a/base/file_util_proxy.cc b/base/file_util_proxy.cc
new file mode 100644
index 0000000..62d150e
--- /dev/null
+++ b/base/file_util_proxy.cc
@@ -0,0 +1,245 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/file_util_proxy.h"
+
+#include "base/file_util.h"
+#include "base/message_loop_proxy.h"
+
+namespace {
+
+class MessageLoopRelay
+ : public base::RefCountedThreadSafe<MessageLoopRelay> {
+ public:
+ MessageLoopRelay()
+ : origin_message_loop_proxy_(
+ base::MessageLoopProxy::CreateForCurrentThread()) {
+ }
+
+ void Start(scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
+ const tracked_objects::Location& from_here) {
+ message_loop_proxy->PostTask(
+ from_here,
+ NewRunnableMethod(this, &MessageLoopRelay::ProcessOnTargetThread));
+ }
+
+ protected:
+ friend class base::RefCountedThreadSafe<MessageLoopRelay>;
+ virtual ~MessageLoopRelay() {}
+
+ // Called to perform work on the FILE thread.
+ virtual void RunWork() = 0;
+
+ // Called to notify the callback on the origin thread.
+ virtual void RunCallback() = 0;
+
+ private:
+ void ProcessOnTargetThread() {
+ RunWork();
+ origin_message_loop_proxy_->PostTask(
+ FROM_HERE,
+ NewRunnableMethod(this, &MessageLoopRelay::RunCallback));
+ }
+
+ scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_;
+};
+
+class RelayCreateOrOpen : public MessageLoopRelay {
+ public:
+ RelayCreateOrOpen(
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path,
+ int file_flags,
+ base::FileUtilProxy::CreateOrOpenCallback* callback)
+ : message_loop_proxy_(message_loop_proxy),
+ file_path_(file_path),
+ file_flags_(file_flags),
+ callback_(callback),
+ file_handle_(base::kInvalidPlatformFileValue),
+ created_(false) {
+ DCHECK(callback);
+ }
+
+ protected:
+ virtual ~RelayCreateOrOpen() {
+ if (file_handle_ != base::kInvalidPlatformFileValue)
+ base::FileUtilProxy::Close(message_loop_proxy_, file_handle_, NULL);
+ }
+
+ virtual void RunWork() {
+ file_handle_ = base::CreatePlatformFile(file_path_, file_flags_, &created_);
+ }
+
+ virtual void RunCallback() {
+ callback_->Run(base::PassPlatformFile(&file_handle_), created_);
+ delete callback_;
+ }
+
+ private:
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
+ FilePath file_path_;
+ int file_flags_;
+ base::FileUtilProxy::CreateOrOpenCallback* callback_;
+ base::PlatformFile file_handle_;
+ bool created_;
+};
+
+class RelayCreateTemporary : public MessageLoopRelay {
+ public:
+ RelayCreateTemporary(
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
+ base::FileUtilProxy::CreateTemporaryCallback* callback)
+ : message_loop_proxy_(message_loop_proxy),
+ callback_(callback),
+ file_handle_(base::kInvalidPlatformFileValue) {
+ DCHECK(callback);
+ }
+
+ protected:
+ virtual ~RelayCreateTemporary() {
+ if (file_handle_ != base::kInvalidPlatformFileValue)
+ base::FileUtilProxy::Close(message_loop_proxy_, file_handle_, NULL);
+ }
+
+ virtual void RunWork() {
+ // TODO(darin): file_util should have a variant of CreateTemporaryFile
+ // that returns a FilePath and a PlatformFile.
+ file_util::CreateTemporaryFile(&file_path_);
+
+ // Use a fixed set of flags that are appropriate for writing to a temporary
+ // file from the IO thread using a net::FileStream.
+ int file_flags =
+ base::PLATFORM_FILE_CREATE_ALWAYS |
+ base::PLATFORM_FILE_WRITE |
+ base::PLATFORM_FILE_ASYNC |
+ base::PLATFORM_FILE_TEMPORARY;
+ file_handle_ = base::CreatePlatformFile(file_path_, file_flags, NULL);
+ }
+
+ virtual void RunCallback() {
+ callback_->Run(base::PassPlatformFile(&file_handle_), file_path_);
+ delete callback_;
+ }
+
+ private:
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
+ base::FileUtilProxy::CreateTemporaryCallback* callback_;
+ base::PlatformFile file_handle_;
+ FilePath file_path_;
+};
+
+class RelayWithStatusCallback : public MessageLoopRelay {
+ public:
+ explicit RelayWithStatusCallback(
+ base::FileUtilProxy::StatusCallback* callback)
+ : callback_(callback),
+ succeeded_(false) {
+ // It is OK for callback to be NULL.
+ }
+
+ protected:
+ virtual void RunCallback() {
+ // The caller may not have been interested in the result.
+ if (callback_) {
+ callback_->Run(succeeded_);
+ delete callback_;
+ }
+ }
+
+ void SetStatus(bool succeeded) { succeeded_ = succeeded; }
+
+ private:
+ base::FileUtilProxy::StatusCallback* callback_;
+ bool succeeded_;
+};
+
+class RelayClose : public RelayWithStatusCallback {
+ public:
+ RelayClose(base::PlatformFile file_handle,
+ base::FileUtilProxy::StatusCallback* callback)
+ : RelayWithStatusCallback(callback),
+ file_handle_(file_handle) {
+ }
+
+ protected:
+ virtual void RunWork() {
+ SetStatus(base::ClosePlatformFile(file_handle_));
+ }
+
+ private:
+ base::PlatformFile file_handle_;
+};
+
+class RelayDelete : public RelayWithStatusCallback {
+ public:
+ RelayDelete(const FilePath& file_path,
+ bool recursive,
+ base::FileUtilProxy::StatusCallback* callback)
+ : RelayWithStatusCallback(callback),
+ file_path_(file_path),
+ recursive_(recursive) {
+ }
+
+ protected:
+ virtual void RunWork() {
+ SetStatus(file_util::Delete(file_path_, recursive_));
+ }
+
+ private:
+ FilePath file_path_;
+ bool recursive_;
+};
+
+void Start(const tracked_objects::Location& from_here,
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
+ scoped_refptr<MessageLoopRelay> relay) {
+ relay->Start(message_loop_proxy, from_here);
+}
+
+} // namespace
+
+namespace base {
+
+// static
+void FileUtilProxy::CreateOrOpen(
+ scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path, int file_flags,
+ CreateOrOpenCallback* callback) {
+ Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen(
+ message_loop_proxy, file_path, file_flags, callback));
+}
+
+// static
+void FileUtilProxy::CreateTemporary(
+ scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ CreateTemporaryCallback* callback) {
+ Start(FROM_HERE, message_loop_proxy,
+ new RelayCreateTemporary(message_loop_proxy, callback));
+}
+
+// static
+void FileUtilProxy::Close(scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ base::PlatformFile file_handle,
+ StatusCallback* callback) {
+ Start(FROM_HERE, message_loop_proxy, new RelayClose(file_handle, callback));
+}
+
+// static
+void FileUtilProxy::Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path,
+ StatusCallback* callback) {
+ Start(FROM_HERE, message_loop_proxy,
+ new RelayDelete(file_path, false, callback));
+}
+
+// static
+void FileUtilProxy::RecursiveDelete(
+ scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path,
+ StatusCallback* callback) {
+ Start(FROM_HERE, message_loop_proxy,
+ new RelayDelete(file_path, true, callback));
+}
+
+} // namespace base
diff --git a/chrome/browser/file_system_proxy.h b/base/file_util_proxy.h
index 6001bfd..cd6b158 100644
--- a/chrome/browser/file_system_proxy.h
+++ b/base/file_util_proxy.h
@@ -2,14 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_FILE_SYSTEM_PROXY_H_
-#define CHROME_BROWSER_FILE_SYSTEM_PROXY_H_
+#ifndef BASE_FILE_SYSTEM_PROXY_H_
+#define BASE_FILE_SYSTEM_PROXY_H_
#include "base/callback.h"
#include "base/platform_file.h"
+#include "base/ref_counted.h"
+#include "base/tracked_objects.h"
+
+namespace base {
+
+class MessageLoopProxy;
// This class provides asynchronous access to common file routines.
-class FileSystemProxy {
+class FileUtilProxy {
public:
// This callback is used by methods that report success with a bool. It is
// valid to pass NULL as the callback parameter to any function that takes a
@@ -20,7 +26,8 @@ class FileSystemProxy {
// for the callback.
typedef Callback2<base::PassPlatformFile, bool /* created */>::Type
CreateOrOpenCallback;
- static void CreateOrOpen(const FilePath& file_path,
+ static void CreateOrOpen(scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path,
int file_flags,
CreateOrOpenCallback* callback);
@@ -28,21 +35,30 @@ class FileSystemProxy {
// are returned. It is invalid to pass NULL for the callback.
typedef Callback2<base::PassPlatformFile, FilePath>::Type
CreateTemporaryCallback;
- static void CreateTemporary(CreateTemporaryCallback* callback);
+ static void CreateTemporary(
+ scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ CreateTemporaryCallback* callback);
// Close the given file handle.
- static void Close(base::PlatformFile, StatusCallback* callback);
+ static void Close(scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ base::PlatformFile,
+ StatusCallback* callback);
// Deletes a file or empty directory.
- static void Delete(const FilePath& file_path,
+ static void Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path,
StatusCallback* callback);
// Deletes a directory and all of its contents.
- static void RecursiveDelete(const FilePath& file_path,
- StatusCallback* callback);
+ static void RecursiveDelete(
+ scoped_refptr<MessageLoopProxy> message_loop_proxy,
+ const FilePath& file_path,
+ StatusCallback* callback);
private:
- DISALLOW_IMPLICIT_CONSTRUCTORS(FileSystemProxy);
+ DISALLOW_IMPLICIT_CONSTRUCTORS(FileUtilProxy);
};
-#endif // CHROME_BROWSER_FILE_SYSTEM_PROXY_H_
+} // namespace base
+
+#endif // BASE_FILE_SYSTEM_PROXY_H_
diff --git a/chrome/browser/chrome_thread_relay.cc b/chrome/browser/chrome_thread_relay.cc
deleted file mode 100644
index e773f1d..0000000
--- a/chrome/browser/chrome_thread_relay.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chrome_thread_relay.h"
-
-ChromeThreadRelay::ChromeThreadRelay() {
- if (!ChromeThread::GetCurrentThreadIdentifier(&origin_thread_id_))
- NOTREACHED() << "Must be created on a valid ChromeThread";
-}
-
-void ChromeThreadRelay::Start(ChromeThread::ID target_thread_id,
- const tracked_objects::Location& from_here) {
- ChromeThread::PostTask(
- target_thread_id,
- from_here,
- NewRunnableMethod(this, &ChromeThreadRelay::ProcessOnTargetThread));
-}
-
-void ChromeThreadRelay::ProcessOnTargetThread() {
- RunWork();
- ChromeThread::PostTask(
- origin_thread_id_,
- FROM_HERE,
- NewRunnableMethod(this, &ChromeThreadRelay::RunCallback));
-}
diff --git a/chrome/browser/chrome_thread_relay.h b/chrome/browser/chrome_thread_relay.h
deleted file mode 100644
index 657e587..0000000
--- a/chrome/browser/chrome_thread_relay.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// ChromeThreadRelay provides a convenient way to bounce work to a specific
-// ChromeThread and then return results back to the originating thread.
-//
-// EXAMPLE:
-//
-// class MyRelay : public ChromeThreadRelay {
-// public:
-// MyRelay(const Params& params) : params_(params) {
-// }
-// protected:
-// virtual void RunWork() {
-// results_ = DoWork(params_);
-// }
-// virtual void RunCallback() {
-// ... use results_ on the originating thread ...
-// }
-// private:
-// Params params_;
-// Results_ results_;
-// };
-
-#ifndef CHROME_BROWSER_CHROME_THREAD_RELAY_H_
-#define CHROME_BROWSER_CHROME_THREAD_RELAY_H_
-
-#include "base/ref_counted.h"
-#include "chrome/browser/chrome_thread.h"
-
-class ChromeThreadRelay
- : public base::RefCountedThreadSafe<ChromeThreadRelay> {
- public:
- ChromeThreadRelay();
-
- void Start(ChromeThread::ID target_thread_id,
- const tracked_objects::Location& from_here);
-
- protected:
- friend class base::RefCountedThreadSafe<ChromeThreadRelay>;
- virtual ~ChromeThreadRelay() {}
-
- // Called to perform work on the FILE thread.
- virtual void RunWork() = 0;
-
- // Called to notify the callback on the origin thread.
- virtual void RunCallback() = 0;
-
- private:
- void ProcessOnTargetThread();
- ChromeThread::ID origin_thread_id_;
-};
-
-#endif // CHROME_BROWSER_CHROME_THREAD_RELAY_H_
diff --git a/chrome/browser/file_system_proxy.cc b/chrome/browser/file_system_proxy.cc
deleted file mode 100644
index 1cf7b55..0000000
--- a/chrome/browser/file_system_proxy.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/file_system_proxy.h"
-
-#include "base/file_util.h"
-#include "chrome/browser/chrome_thread_relay.h"
-
-namespace {
-
-class RelayCreateOrOpen : public ChromeThreadRelay {
- public:
- RelayCreateOrOpen(
- const FilePath& file_path,
- int file_flags,
- FileSystemProxy::CreateOrOpenCallback* callback)
- : file_path_(file_path),
- file_flags_(file_flags),
- callback_(callback),
- file_handle_(base::kInvalidPlatformFileValue),
- created_(false) {
- DCHECK(callback);
- }
-
- protected:
- virtual ~RelayCreateOrOpen() {
- if (file_handle_ != base::kInvalidPlatformFileValue)
- FileSystemProxy::Close(file_handle_, NULL);
- }
-
- virtual void RunWork() {
- file_handle_ = base::CreatePlatformFile(file_path_, file_flags_, &created_);
- }
-
- virtual void RunCallback() {
- callback_->Run(base::PassPlatformFile(&file_handle_), created_);
- delete callback_;
- }
-
- private:
- FilePath file_path_;
- int file_flags_;
- FileSystemProxy::CreateOrOpenCallback* callback_;
- base::PlatformFile file_handle_;
- bool created_;
-};
-
-class RelayCreateTemporary : public ChromeThreadRelay {
- public:
- explicit RelayCreateTemporary(
- FileSystemProxy::CreateTemporaryCallback* callback)
- : callback_(callback),
- file_handle_(base::kInvalidPlatformFileValue) {
- DCHECK(callback);
- }
-
- protected:
- virtual ~RelayCreateTemporary() {
- if (file_handle_ != base::kInvalidPlatformFileValue)
- FileSystemProxy::Close(file_handle_, NULL);
- }
-
- virtual void RunWork() {
- // TODO(darin): file_util should have a variant of CreateTemporaryFile
- // that returns a FilePath and a PlatformFile.
- file_util::CreateTemporaryFile(&file_path_);
-
- // Use a fixed set of flags that are appropriate for writing to a temporary
- // file from the IO thread using a net::FileStream.
- int file_flags =
- base::PLATFORM_FILE_CREATE_ALWAYS |
- base::PLATFORM_FILE_WRITE |
- base::PLATFORM_FILE_ASYNC |
- base::PLATFORM_FILE_TEMPORARY;
- file_handle_ = base::CreatePlatformFile(file_path_, file_flags, NULL);
- }
-
- virtual void RunCallback() {
- callback_->Run(base::PassPlatformFile(&file_handle_), file_path_);
- delete callback_;
- }
-
- private:
- FileSystemProxy::CreateTemporaryCallback* callback_;
- base::PlatformFile file_handle_;
- FilePath file_path_;
-};
-
-class RelayWithStatusCallback : public ChromeThreadRelay {
- public:
- explicit RelayWithStatusCallback(FileSystemProxy::StatusCallback* callback)
- : callback_(callback),
- succeeded_(false) {
- // It is OK for callback to be NULL.
- }
-
- protected:
- virtual void RunCallback() {
- // The caller may not have been interested in the result.
- if (callback_) {
- callback_->Run(succeeded_);
- delete callback_;
- }
- }
-
- void SetStatus(bool succeeded) { succeeded_ = succeeded; }
-
- private:
- FileSystemProxy::StatusCallback* callback_;
- bool succeeded_;
-};
-
-class RelayClose : public RelayWithStatusCallback {
- public:
- RelayClose(base::PlatformFile file_handle,
- FileSystemProxy::StatusCallback* callback)
- : RelayWithStatusCallback(callback),
- file_handle_(file_handle) {
- }
-
- protected:
- virtual void RunWork() {
- SetStatus(base::ClosePlatformFile(file_handle_));
- }
-
- private:
- base::PlatformFile file_handle_;
-};
-
-class RelayDelete : public RelayWithStatusCallback {
- public:
- RelayDelete(const FilePath& file_path,
- bool recursive,
- FileSystemProxy::StatusCallback* callback)
- : RelayWithStatusCallback(callback),
- file_path_(file_path),
- recursive_(recursive) {
- }
-
- protected:
- virtual void RunWork() {
- SetStatus(file_util::Delete(file_path_, recursive_));
- }
-
- private:
- FilePath file_path_;
- bool recursive_;
-};
-
-void Start(const tracked_objects::Location& from_here,
- scoped_refptr<ChromeThreadRelay> relay) {
- relay->Start(ChromeThread::FILE, from_here);
-}
-
-} // namespace
-
-void FileSystemProxy::CreateOrOpen(const FilePath& file_path, int file_flags,
- CreateOrOpenCallback* callback) {
- Start(FROM_HERE, new RelayCreateOrOpen(file_path, file_flags, callback));
-}
-
-void FileSystemProxy::CreateTemporary(CreateTemporaryCallback* callback) {
- Start(FROM_HERE, new RelayCreateTemporary(callback));
-}
-
-void FileSystemProxy::Close(base::PlatformFile file_handle,
- StatusCallback* callback) {
- Start(FROM_HERE, new RelayClose(file_handle, callback));
-}
-
-void FileSystemProxy::Delete(const FilePath& file_path,
- StatusCallback* callback) {
- Start(FROM_HERE, new RelayDelete(file_path, false, callback));
-}
-
-void FileSystemProxy::RecursiveDelete(const FilePath& file_path,
- StatusCallback* callback) {
- Start(FROM_HERE, new RelayDelete(file_path, true, callback));
-}
diff --git a/chrome/browser/renderer_host/redirect_to_file_resource_handler.cc b/chrome/browser/renderer_host/redirect_to_file_resource_handler.cc
index 11beb73..82f19d2 100644
--- a/chrome/browser/renderer_host/redirect_to_file_resource_handler.cc
+++ b/chrome/browser/renderer_host/redirect_to_file_resource_handler.cc
@@ -5,10 +5,10 @@
#include "chrome/browser/renderer_host/redirect_to_file_resource_handler.h"
#include "base/file_util.h"
+#include "base/file_util_proxy.h"
#include "base/logging.h"
#include "base/platform_file.h"
#include "base/task.h"
-#include "chrome/browser/file_system_proxy.h"
#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
#include "chrome/common/resource_response.h"
#include "net/base/file_stream.h"
@@ -70,7 +70,8 @@ bool RedirectToFileResourceHandler::OnWillStart(int request_id,
// TODO(darin): This is sub-optimal. We should not delay starting the
// network request like this.
*defer = true;
- FileSystemProxy::CreateTemporary(
+ base::FileUtilProxy::CreateTemporary(
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::FILE),
callback_factory_.NewCallback(
&RedirectToFileResourceHandler::DidCreateTemporaryFile));
return true;
@@ -142,7 +143,9 @@ void RedirectToFileResourceHandler::OnRequestClosed() {
file_stream_->Close();
file_stream_.reset();
- FileSystemProxy::Delete(file_path_, NULL);
+ base::FileUtilProxy::Delete(
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::FILE),
+ file_path_, NULL);
}
RedirectToFileResourceHandler::~RedirectToFileResourceHandler() {
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index ace895c..e0f3ec6 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -353,8 +353,6 @@
'browser/chrome_plugin_host.h',
'browser/chrome_thread.cc',
'browser/chrome_thread.h',
- 'browser/chrome_thread_relay.cc',
- 'browser/chrome_thread_relay.h',
'browser/chromeos/notifications/balloon_collection_impl.cc',
'browser/chromeos/notifications/balloon_collection_impl.h',
'browser/chromeos/notifications/balloon_view.cc',
@@ -1457,8 +1455,6 @@
'browser/file_path_watcher_inotify.cc',
'browser/file_path_watcher_mac.cc',
'browser/file_path_watcher_win.cc',
- 'browser/file_system_proxy.cc',
- 'browser/file_system_proxy.h',
'browser/find_bar.h',
'browser/find_bar_controller.cc',
'browser/find_bar_controller.h',