Chromium Code Reviews| Index: chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| index 8b7f3071d6299224c67001924236ceab5bb4dda4..c39be56dfff4045b3a40f259ebf026eabc682c06 100644 |
| --- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| @@ -11,9 +11,11 @@ |
| #include "base/path_service.h" |
| #include "base/posix/eintr_wrapper.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/task_runner_util.h" |
| #include "base/threading/sequenced_worker_pool.h" |
| +#include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chromeos/drive/drive.pb.h" |
| #include "chrome/browser/chromeos/drive/file_system_interface.h" |
| #include "chrome/browser/chromeos/drive/file_system_util.h" |
| @@ -23,6 +25,8 @@ |
| #include "chrome/browser/chromeos/file_manager/fileapi_util.h" |
| #include "chrome/browser/chromeos/fileapi/file_system_backend.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/profiles/profile_manager.h" |
| +#include "chrome/common/extensions/api/file_browser_private.h" |
| #include "chromeos/disks/disk_mount_manager.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/child_process_security_policy.h" |
| @@ -32,6 +36,7 @@ |
| #include "webkit/browser/fileapi/file_system_context.h" |
| #include "webkit/browser/fileapi/file_system_file_util.h" |
| #include "webkit/browser/fileapi/file_system_operation_context.h" |
| +#include "webkit/browser/fileapi/file_system_operation_runner.h" |
| #include "webkit/browser/fileapi/file_system_url.h" |
| #include "webkit/common/fileapi/file_system_types.h" |
| #include "webkit/common/fileapi/file_system_util.h" |
| @@ -175,6 +180,79 @@ bool SetLastModifiedOnBlockingPool(const base::FilePath& local_path, |
| return utime(local_path.value().c_str(), ×) == 0; |
| } |
| +// Notifies the copy completion to extensions via event router. |
| +void NotifyCopyCompletion( |
| + void* profile_id, |
| + fileapi::FileSystemOperationRunner::OperationID operation_id, |
| + const FileSystemURL& dest_url, |
| + base::PlatformFileError error) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + // |profile_id| needs to be checked with ProfileManager::IsValidProfile |
| + // before using it. |
| + Profile* profile = reinterpret_cast<Profile*>(profile_id); |
| + if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
| + return; |
| + |
| + file_manager::EventRouter* event_router = |
| + file_manager::FileBrowserPrivateAPI::Get(profile)->event_router(); |
| + event_router->OnCopyCompleted(operation_id, dest_url.ToGURL(), error); |
| +} |
| + |
| +// Callback invoked upon completion of Copy() (regardless of succeeded or |
| +// failed). |
| +void OnCopyCompleted( |
| + void* profile_id, |
| + fileapi::FileSystemOperationRunner::OperationID* operation_id, |
| + const FileSystemURL& dest_url, |
| + base::PlatformFileError error) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&NotifyCopyCompletion, |
| + profile_id, *operation_id, dest_url, error)); |
| +} |
| + |
| +// Starts the copy operation via FileSystemOperationRunner. |
| +fileapi::FileSystemOperationRunner::OperationID StartCopyOnIOThread( |
| + void* profile_id, |
| + scoped_refptr<fileapi::FileSystemContext> file_system_context, |
| + const FileSystemURL& source_url, |
| + const FileSystemURL& dest_url) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Note: |operation_id| is onwed by the callback for |
|
kinaba
2013/09/09 04:07:49
owned
hidehiko
2013/09/09 04:57:01
Done.
|
| + // FileSystemOperationRunner::Copy(). It is always called in the next message |
| + // loop or later, so at least during this invocation it should alive. |
| + fileapi::FileSystemOperationRunner::OperationID* operation_id = |
| + new fileapi::FileSystemOperationRunner::OperationID; |
| + *operation_id = file_system_context->operation_runner()->Copy( |
| + source_url, dest_url, |
| + base::Bind(&OnCopyCompleted, |
| + profile_id, base::Owned(operation_id), dest_url)); |
| + return *operation_id; |
| +} |
| + |
| +void OnCopyCancelled(base::PlatformFileError error) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // We just ignore the status if the copy is actually cancelled or not, |
| + // because failing cancellation means the operation is not running now. |
| + DLOG_IF(WARNING, error != base::PLATFORM_FILE_OK) |
| + << "Failed to cancel copy: " << error; |
| +} |
| + |
| +// Cancels the running copy operation identified by |operation_id|. |
| +void CancelCopyOnIOThread( |
| + scoped_refptr<fileapi::FileSystemContext> file_system_context, |
| + fileapi::FileSystemOperationRunner::OperationID operation_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + file_system_context->operation_runner()->Cancel( |
| + operation_id, base::Bind(&OnCopyCancelled)); |
| +} |
| + |
| } // namespace |
| FileBrowserPrivateRequestFileSystemFunction:: |
| @@ -631,9 +709,49 @@ FileBrowserPrivateStartCopyFunction::~FileBrowserPrivateStartCopyFunction() { |
| } |
| bool FileBrowserPrivateStartCopyFunction::RunImpl() { |
| - // TODO(hidehiko): Implement startCopy function. |
| - NOTIMPLEMENTED(); |
| - return false; |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + using extensions::api::file_browser_private::StartCopy::Params; |
| + const scoped_ptr<Params> params(Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params); |
| + |
| + if (params->source_url.empty() || params->parent.empty() || |
| + params->new_name.empty()) { |
| + error_ = base::IntToString(fileapi::PlatformFileErrorToWebFileError( |
| + base::PLATFORM_FILE_ERROR_INVALID_URL)); |
| + return false; |
| + } |
| + |
| + scoped_refptr<fileapi::FileSystemContext> file_system_context = |
| + file_manager::util::GetFileSystemContextForRenderViewHost( |
| + profile(), render_view_host()); |
| + |
| + fileapi::FileSystemURL source_url( |
| + file_system_context->CrackURL(GURL(params->source_url))); |
| + fileapi::FileSystemURL dest_url(file_system_context->CrackURL( |
| + GURL(params->parent + "/" + params->new_name))); |
| + |
| + if (!source_url.is_valid() || !dest_url.is_valid()) { |
| + error_ = base::IntToString(fileapi::PlatformFileErrorToWebFileError( |
| + base::PLATFORM_FILE_ERROR_INVALID_URL)); |
| + return false; |
| + } |
| + |
| + return BrowserThread::PostTaskAndReplyWithResult( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&StartCopyOnIOThread, |
| + profile(), file_system_context, source_url, dest_url), |
| + base::Bind(&FileBrowserPrivateStartCopyFunction::RunAfterStartCopy, |
| + this)); |
| +} |
| + |
| +void FileBrowserPrivateStartCopyFunction::RunAfterStartCopy( |
| + int operation_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + SetResult(Value::CreateIntegerValue(operation_id)); |
| + SendResponse(true); |
| } |
| FileBrowserPrivateCancelCopyFunction::FileBrowserPrivateCancelCopyFunction() { |
| @@ -643,9 +761,23 @@ FileBrowserPrivateCancelCopyFunction::~FileBrowserPrivateCancelCopyFunction() { |
| } |
| bool FileBrowserPrivateCancelCopyFunction::RunImpl() { |
| - // TODO(hidehiko): Implement cancelCopy function. |
| - NOTIMPLEMENTED(); |
| - return false; |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + using extensions::api::file_browser_private::CancelCopy::Params; |
| + const scoped_ptr<Params> params(Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params); |
| + |
| + scoped_refptr<fileapi::FileSystemContext> file_system_context = |
| + file_manager::util::GetFileSystemContextForRenderViewHost( |
| + profile(), render_view_host()); |
| + |
| + // We don't much take care about the result of cancellation. |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&CancelCopyOnIOThread, file_system_context, params->copy_id)); |
| + SendResponse(true); |
| + return true; |
| } |
| } // namespace extensions |