diff options
-rw-r--r-- | base/base.gypi | 2 | ||||
-rw-r--r-- | base/file_util_proxy.cc | 245 | ||||
-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.cc | 26 | ||||
-rw-r--r-- | chrome/browser/chrome_thread_relay.h | 55 | ||||
-rw-r--r-- | chrome/browser/file_system_proxy.cc | 180 | ||||
-rw-r--r-- | chrome/browser/renderer_host/redirect_to_file_resource_handler.cc | 9 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 |
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', |