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( |