Index: chrome/browser/chromeos/drive/sync/entry_update_performer.cc |
diff --git a/chrome/browser/chromeos/drive/sync/entry_update_performer.cc b/chrome/browser/chromeos/drive/sync/entry_update_performer.cc |
index 566ff7cf0d15dd8b85d86e87309825b73f112939..ec25ef6131048fb4f8c0f071bab59a1dd28b654d 100644 |
--- a/chrome/browser/chromeos/drive/sync/entry_update_performer.cc |
+++ b/chrome/browser/chromeos/drive/sync/entry_update_performer.cc |
@@ -47,20 +47,20 @@ FileError PrepareUpdate(ResourceMetadata* metadata, |
} |
FileError FinishUpdate(ResourceMetadata* metadata, |
- const std::string& local_id) { |
- ResourceEntry entry; |
- FileError error = metadata->GetResourceEntryById(local_id, &entry); |
+ const std::string& local_id, |
+ ResourceEntry* entry) { |
+ FileError error = metadata->GetResourceEntryById(local_id, entry); |
if (error != FILE_ERROR_OK) |
return error; |
- switch (entry.metadata_edit_state()) { |
+ switch (entry->metadata_edit_state()) { |
case ResourceEntry::CLEAN: // Nothing to do. |
case ResourceEntry::DIRTY: // Entry was edited again during the update. |
break; |
case ResourceEntry::SYNCING: |
- entry.set_metadata_edit_state(ResourceEntry::CLEAN); |
- error = metadata->RefreshEntry(entry); |
+ entry->set_metadata_edit_state(ResourceEntry::CLEAN); |
+ error = metadata->RefreshEntry(*entry); |
if (error != FILE_ERROR_OK) |
return error; |
break; |
@@ -132,12 +132,16 @@ void EntryUpdatePerformer::UpdateEntryAfterPrepare( |
return; |
} |
+ std::string parent_resource_id; |
+ if (!util::IsSpecialResourceId(parent_entry->resource_id())) |
+ parent_resource_id = parent_entry->resource_id(); |
+ |
base::Time last_modified = |
base::Time::FromInternalValue(entry->file_info().last_modified()); |
base::Time last_accessed = |
base::Time::FromInternalValue(entry->file_info().last_accessed()); |
scheduler_->UpdateResource( |
- entry->resource_id(), parent_entry->resource_id(), |
+ entry->resource_id(), parent_resource_id, |
entry->title(), last_modified, last_accessed, |
base::Bind(&EntryUpdatePerformer::UpdateEntryAfterUpdateResource, |
weak_ptr_factory_.GetWeakPtr(), callback, entry->local_id())); |
@@ -156,11 +160,31 @@ void EntryUpdatePerformer::UpdateEntryAfterUpdateResource( |
return; |
} |
+ ResourceEntry* entry = new ResourceEntry; |
base::PostTaskAndReplyWithResult( |
blocking_task_runner_.get(), |
FROM_HERE, |
- base::Bind(&FinishUpdate, metadata_, local_id), |
- callback); |
+ base::Bind(&FinishUpdate, metadata_, local_id, entry), |
+ base::Bind(&EntryUpdatePerformer::UpdateEntryAfterFinish, |
+ weak_ptr_factory_.GetWeakPtr(), callback, base::Owned(entry))); |
+} |
+ |
+void EntryUpdatePerformer::UpdateEntryAfterFinish( |
+ const FileOperationCallback& callback, |
+ const ResourceEntry* entry, |
+ FileError error) { |
+ if (error != FILE_ERROR_OK) { |
+ callback.Run(error); |
+ return; |
+ } |
+ |
+ if (entry->metadata_edit_state() == ResourceEntry::DIRTY) { |
+ // The entry was edited during the update. Update again. |
+ UpdateEntry(entry->local_id(), callback); |
+ return; |
+ } |
+ |
+ callback.Run(FILE_ERROR_OK); |
} |
} // namespace internal |