| Index: chrome/browser/chromeos/file_system_provider/provided_file_system.cc
|
| diff --git a/chrome/browser/chromeos/file_system_provider/provided_file_system.cc b/chrome/browser/chromeos/file_system_provider/provided_file_system.cc
|
| index 4f8ff7d200fff3dbe8623ab76c3c7680e9b02f85..55a2c025338eb44272ebf39116f490dff338bc14 100644
|
| --- a/chrome/browser/chromeos/file_system_provider/provided_file_system.cc
|
| +++ b/chrome/browser/chromeos/file_system_provider/provided_file_system.cc
|
| @@ -4,9 +4,12 @@
|
|
|
| #include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
|
|
|
| +#include <vector>
|
| +
|
| #include "base/debug/trace_event.h"
|
| #include "base/files/file.h"
|
| #include "chrome/browser/chromeos/file_system_provider/notification_manager.h"
|
| +#include "chrome/browser/chromeos/file_system_provider/operations/abort.h"
|
| #include "chrome/browser/chromeos/file_system_provider/operations/close_file.h"
|
| #include "chrome/browser/chromeos/file_system_provider/operations/copy_entry.h"
|
| #include "chrome/browser/chromeos/file_system_provider/operations/create_directory.h"
|
| @@ -31,6 +34,13 @@ class IOBuffer;
|
|
|
| namespace chromeos {
|
| namespace file_system_provider {
|
| +namespace {
|
| +
|
| +// Dicards the result of Abort() when called from the destructor.
|
| +void EmptyStatusCallback(base::File::Error /* result */) {
|
| +}
|
| +
|
| +} // namespace
|
|
|
| ProvidedFileSystem::ProvidedFileSystem(
|
| Profile* profile,
|
| @@ -44,156 +54,203 @@ ProvidedFileSystem::ProvidedFileSystem(
|
| weak_ptr_factory_(this) {
|
| }
|
|
|
| -ProvidedFileSystem::~ProvidedFileSystem() {}
|
| +ProvidedFileSystem::~ProvidedFileSystem() {
|
| + const std::vector<int> request_ids = request_manager_.GetActiveRequestIds();
|
| + for (size_t i = 0; i < request_ids.size(); ++i) {
|
| + Abort(request_ids[i], base::Bind(&EmptyStatusCallback));
|
| + }
|
| +}
|
|
|
| -void ProvidedFileSystem::RequestUnmount(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::RequestUnmount(
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - REQUEST_UNMOUNT,
|
| - scoped_ptr<RequestManager::HandlerInterface>(new operations::Unmount(
|
| - event_router_, file_system_info_, callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + REQUEST_UNMOUNT,
|
| + scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::Unmount(event_router_, file_system_info_, callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::GetMetadata(const base::FilePath& entry_path,
|
| - const GetMetadataCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - GET_METADATA,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::GetMetadata(
|
| - event_router_, file_system_info_, entry_path, callback)))) {
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::GetMetadata(
|
| + const base::FilePath& entry_path,
|
| + const GetMetadataCallback& callback) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + GET_METADATA,
|
| + scoped_ptr<RequestManager::HandlerInterface>(new operations::GetMetadata(
|
| + event_router_, file_system_info_, entry_path, callback)));
|
| + if (!request_id) {
|
| callback.Run(EntryMetadata(), base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::ReadDirectory(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::ReadDirectory(
|
| const base::FilePath& directory_path,
|
| const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - READ_DIRECTORY,
|
| - scoped_ptr<
|
| - RequestManager::HandlerInterface>(new operations::ReadDirectory(
|
| - event_router_, file_system_info_, directory_path, callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + READ_DIRECTORY,
|
| + scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::ReadDirectory(
|
| + event_router_, file_system_info_, directory_path, callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY,
|
| fileapi::AsyncFileUtil::EntryList(),
|
| false /* has_more */);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::ReadFile(int file_handle,
|
| - net::IOBuffer* buffer,
|
| - int64 offset,
|
| - int length,
|
| - const ReadChunkReceivedCallback& callback) {
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::ReadFile(
|
| + int file_handle,
|
| + net::IOBuffer* buffer,
|
| + int64 offset,
|
| + int length,
|
| + const ReadChunkReceivedCallback& callback) {
|
| TRACE_EVENT1(
|
| "file_system_provider", "ProvidedFileSystem::ReadFile", "length", length);
|
| - if (!request_manager_.CreateRequest(
|
| - READ_FILE,
|
| - make_scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::ReadFile(event_router_,
|
| - file_system_info_,
|
| - file_handle,
|
| - buffer,
|
| - offset,
|
| - length,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + READ_FILE,
|
| + make_scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::ReadFile(event_router_,
|
| + file_system_info_,
|
| + file_handle,
|
| + buffer,
|
| + offset,
|
| + length,
|
| + callback)));
|
| + if (!request_id) {
|
| callback.Run(0 /* chunk_length */,
|
| false /* has_more */,
|
| base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::OpenFile(const base::FilePath& file_path,
|
| - OpenFileMode mode,
|
| - const OpenFileCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - OPEN_FILE,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::OpenFile(event_router_,
|
| - file_system_info_,
|
| - file_path,
|
| - mode,
|
| - callback)))) {
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::OpenFile(
|
| + const base::FilePath& file_path,
|
| + OpenFileMode mode,
|
| + const OpenFileCallback& callback) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + OPEN_FILE,
|
| + scoped_ptr<RequestManager::HandlerInterface>(new operations::OpenFile(
|
| + event_router_, file_system_info_, file_path, mode, callback)));
|
| + if (!request_id) {
|
| callback.Run(0 /* file_handle */, base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::CloseFile(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::CloseFile(
|
| int file_handle,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - CLOSE_FILE,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::CloseFile(
|
| - event_router_, file_system_info_, file_handle, callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + CLOSE_FILE,
|
| + scoped_ptr<RequestManager::HandlerInterface>(new operations::CloseFile(
|
| + event_router_, file_system_info_, file_handle, callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::CreateDirectory(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::CreateDirectory(
|
| const base::FilePath& directory_path,
|
| bool exclusive,
|
| bool recursive,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - CREATE_DIRECTORY,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::CreateDirectory(event_router_,
|
| - file_system_info_,
|
| - directory_path,
|
| - exclusive,
|
| - recursive,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + CREATE_DIRECTORY,
|
| + scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::CreateDirectory(event_router_,
|
| + file_system_info_,
|
| + directory_path,
|
| + exclusive,
|
| + recursive,
|
| + callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::DeleteEntry(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::DeleteEntry(
|
| const base::FilePath& entry_path,
|
| bool recursive,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - DELETE_ENTRY,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::DeleteEntry(event_router_,
|
| - file_system_info_,
|
| - entry_path,
|
| - recursive,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + DELETE_ENTRY,
|
| + scoped_ptr<RequestManager::HandlerInterface>(new operations::DeleteEntry(
|
| + event_router_, file_system_info_, entry_path, recursive, callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::CreateFile(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::CreateFile(
|
| const base::FilePath& file_path,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - CREATE_FILE,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::CreateFile(
|
| - event_router_, file_system_info_, file_path, callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + CREATE_FILE,
|
| + scoped_ptr<RequestManager::HandlerInterface>(new operations::CreateFile(
|
| + event_router_, file_system_info_, file_path, callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::CopyEntry(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::CopyEntry(
|
| const base::FilePath& source_path,
|
| const base::FilePath& target_path,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - COPY_ENTRY,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::CopyEntry(event_router_,
|
| - file_system_info_,
|
| - source_path,
|
| - target_path,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + COPY_ENTRY,
|
| + scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::CopyEntry(event_router_,
|
| + file_system_info_,
|
| + source_path,
|
| + target_path,
|
| + callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::WriteFile(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::WriteFile(
|
| int file_handle,
|
| net::IOBuffer* buffer,
|
| int64 offset,
|
| @@ -203,50 +260,61 @@ void ProvidedFileSystem::WriteFile(
|
| "ProvidedFileSystem::WriteFile",
|
| "length",
|
| length);
|
| - if (!request_manager_.CreateRequest(
|
| - WRITE_FILE,
|
| - make_scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::WriteFile(event_router_,
|
| - file_system_info_,
|
| - file_handle,
|
| - make_scoped_refptr(buffer),
|
| - offset,
|
| - length,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + WRITE_FILE,
|
| + make_scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::WriteFile(event_router_,
|
| + file_system_info_,
|
| + file_handle,
|
| + make_scoped_refptr(buffer),
|
| + offset,
|
| + length,
|
| + callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::MoveEntry(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::MoveEntry(
|
| const base::FilePath& source_path,
|
| const base::FilePath& target_path,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - MOVE_ENTRY,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::MoveEntry(event_router_,
|
| - file_system_info_,
|
| - source_path,
|
| - target_path,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + MOVE_ENTRY,
|
| + scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::MoveEntry(event_router_,
|
| + file_system_info_,
|
| + source_path,
|
| + target_path,
|
| + callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| -void ProvidedFileSystem::Truncate(
|
| +ProvidedFileSystem::AbortCallback ProvidedFileSystem::Truncate(
|
| const base::FilePath& file_path,
|
| int64 length,
|
| const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| - if (!request_manager_.CreateRequest(
|
| - TRUNCATE,
|
| - scoped_ptr<RequestManager::HandlerInterface>(
|
| - new operations::Truncate(event_router_,
|
| - file_system_info_,
|
| - file_path,
|
| - length,
|
| - callback)))) {
|
| + const int request_id = request_manager_.CreateRequest(
|
| + TRUNCATE,
|
| + scoped_ptr<RequestManager::HandlerInterface>(new operations::Truncate(
|
| + event_router_, file_system_info_, file_path, length, callback)));
|
| + if (!request_id) {
|
| callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + return AbortCallback();
|
| }
|
| +
|
| + return base::Bind(
|
| + &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
|
| }
|
|
|
| const ProvidedFileSystemInfo& ProvidedFileSystem::GetFileSystemInfo() const {
|
| @@ -261,5 +329,22 @@ base::WeakPtr<ProvidedFileSystemInterface> ProvidedFileSystem::GetWeakPtr() {
|
| return weak_ptr_factory_.GetWeakPtr();
|
| }
|
|
|
| +void ProvidedFileSystem::Abort(
|
| + int operation_request_id,
|
| + const fileapi::AsyncFileUtil::StatusCallback& callback) {
|
| + request_manager_.RejectRequest(operation_request_id,
|
| + make_scoped_ptr(new RequestValue()),
|
| + base::File::FILE_ERROR_ABORT);
|
| + if (!request_manager_.CreateRequest(
|
| + ABORT,
|
| + scoped_ptr<RequestManager::HandlerInterface>(
|
| + new operations::Abort(event_router_,
|
| + file_system_info_,
|
| + operation_request_id,
|
| + callback)))) {
|
| + callback.Run(base::File::FILE_ERROR_SECURITY);
|
| + }
|
| +}
|
| +
|
| } // namespace file_system_provider
|
| } // namespace chromeos
|
|
|