| Index: chrome/browser/chromeos/drive/file_system/copy_operation.cc
|
| diff --git a/chrome/browser/chromeos/drive/file_system/copy_operation.cc b/chrome/browser/chromeos/drive/file_system/copy_operation.cc
|
| index 0e42f7be4dfcdcfbcf95c9790baa24b5623030d6..a0055f86936660aeb9daf26cef5e171f86a07d10 100644
|
| --- a/chrome/browser/chromeos/drive/file_system/copy_operation.cc
|
| +++ b/chrome/browser/chromeos/drive/file_system/copy_operation.cc
|
| @@ -351,21 +351,66 @@ void CopyOperation::CopyAfterTryToCopyLocally(
|
| return;
|
| }
|
|
|
| - base::FilePath new_title = params->dest_file_path.BaseName();
|
| - if (params->src_entry.file_specific_info().is_hosted_document()) {
|
| + if (params->parent_entry.resource_id().empty()) {
|
| + // Parent entry may be being synced.
|
| + const bool waiting = observer_->WaitForSyncComplete(
|
| + params->parent_entry.local_id(),
|
| + base::Bind(&CopyOperation::CopyAfterParentSync,
|
| + weak_ptr_factory_.GetWeakPtr(), *params));
|
| + if (!waiting)
|
| + params->callback.Run(FILE_ERROR_NOT_FOUND);
|
| + } else {
|
| + CopyAfterGetParentResourceId(*params, ¶ms->parent_entry, FILE_ERROR_OK);
|
| + }
|
| +}
|
| +
|
| +void CopyOperation::CopyAfterParentSync(const CopyParams& params,
|
| + FileError error) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!params.callback.is_null());
|
| +
|
| + if (error != FILE_ERROR_OK) {
|
| + params.callback.Run(error);
|
| + return;
|
| + }
|
| +
|
| + ResourceEntry* parent = new ResourceEntry;
|
| + base::PostTaskAndReplyWithResult(
|
| + blocking_task_runner_,
|
| + FROM_HERE,
|
| + base::Bind(&internal::ResourceMetadata::GetResourceEntryById,
|
| + base::Unretained(metadata_),
|
| + params.parent_entry.local_id(), parent),
|
| + base::Bind(&CopyOperation::CopyAfterGetParentResourceId,
|
| + weak_ptr_factory_.GetWeakPtr(), params, base::Owned(parent)));
|
| +}
|
| +
|
| +void CopyOperation::CopyAfterGetParentResourceId(const CopyParams& params,
|
| + const ResourceEntry* parent,
|
| + FileError error) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!params.callback.is_null());
|
| +
|
| + if (error != FILE_ERROR_OK) {
|
| + params.callback.Run(error);
|
| + return;
|
| + }
|
| +
|
| + base::FilePath new_title = params.dest_file_path.BaseName();
|
| + if (params.src_entry.file_specific_info().is_hosted_document()) {
|
| // Drop the document extension, which should not be in the title.
|
| // TODO(yoshiki): Remove this code with crbug.com/223304.
|
| new_title = new_title.RemoveExtension();
|
| }
|
|
|
| base::Time last_modified =
|
| - params->preserve_last_modified ?
|
| + params.preserve_last_modified ?
|
| base::Time::FromInternalValue(
|
| - params->src_entry.file_info().last_modified()) : base::Time();
|
| + params.src_entry.file_info().last_modified()) : base::Time();
|
|
|
| CopyResourceOnServer(
|
| - params->src_entry.resource_id(), params->parent_entry.resource_id(),
|
| - new_title.AsUTF8Unsafe(), last_modified, params->callback);
|
| + params.src_entry.resource_id(), parent->resource_id(),
|
| + new_title.AsUTF8Unsafe(), last_modified, params.callback);
|
| }
|
|
|
| void CopyOperation::TransferFileFromLocalToRemote(
|
|
|