Chromium Code Reviews| Index: chrome/browser/sync_file_system/drive_file_sync_service.cc |
| diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.cc b/chrome/browser/sync_file_system/drive_file_sync_service.cc |
| index c6ba8b7ece970222020a17794755da2b9f375a9a..6999a5c4a070c3e7841da68afd2855da97c00192 100644 |
| --- a/chrome/browser/sync_file_system/drive_file_sync_service.cc |
| +++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc |
| @@ -1503,6 +1503,11 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange( |
| param->sync_action = SYNC_ACTION_ADDED; |
| DownloadForRemoteSync(param.Pass()); |
| return; |
| + case REMOTE_SYNC_OPERATION_ADD_DIRECTORY: |
| + // TODO(nhiroki): support directory operations (http://crbug.com/161442). |
| + NOTIMPLEMENTED(); |
| + AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); |
| + return; |
| case REMOTE_SYNC_OPERATION_UPDATE_FILE: |
| param->sync_action = SYNC_ACTION_UPDATED; |
| DownloadForRemoteSync(param.Pass()); |
| @@ -1516,6 +1521,11 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange( |
| base::Passed(¶m))); |
| return; |
| } |
| + case REMOTE_SYNC_OPERATION_DELETE_DIRECTORY: |
| + // TODO(nhiroki): support directory operations (http://crbug.com/161442). |
| + NOTIMPLEMENTED(); |
| + AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); |
| + return; |
| case REMOTE_SYNC_OPERATION_NONE: |
| param->sync_action = SYNC_ACTION_NONE; |
| CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); |
| @@ -1557,41 +1567,203 @@ DriveFileSyncService::ResolveRemoteSyncOperationType( |
| ProcessRemoteChangeParam* param, |
| const FileChangeList& local_changes, |
| bool missing_local_file) { |
|
kinuko
2013/04/24 02:32:32
It looks this doesn't need entire ProcessRemoteCha
kinuko
2013/04/24 02:42:29
If this takes too much your time it'd be still nic
nhiroki
2013/04/24 13:29:05
Done.
|
| - if (param->drive_metadata.conflicted()) { |
| - switch (remote_file_change.change()) { |
| - case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| - return missing_local_file ? REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE |
| - : REMOTE_SYNC_OPERATION_CONFLICT; |
| - case FileChange::FILE_CHANGE_DELETE: |
| - return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA |
| - : REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + SyncFileType local_file_type = param->local_metadata.file_type; |
| + |
| + if (remote_file_change.IsAddOrUpdateFile()) { |
| + if (param->drive_metadata.conflicted()) { |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + Delete -> RESOLVE_TO_REMOTE |
| + // File + None/AddOrUpdateFile -> CONFLICT |
| + // Dir + None/AddDir -> RESOLVE_TO_LOCAL |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + DCHECK(!local_changes.empty() && |
| + local_changes.list().back().IsDelete()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| + case SYNC_FILE_TYPE_FILE: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_CONFLICT; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + } |
| } |
| - } |
| - if (remote_file_change.IsAddOrUpdate()) { |
| - if (local_changes.empty()) |
| - return missing_local_file ? REMOTE_SYNC_OPERATION_ADD_FILE |
| - : REMOTE_SYNC_OPERATION_UPDATE_FILE; |
| - switch (local_changes.list().back().change()) { |
| - case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| - return REMOTE_SYNC_OPERATION_CONFLICT; |
| - case FileChange::FILE_CHANGE_DELETE: |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + None/Delete -> ADD_FILE |
| + // File + None -> UPDATE_FILE |
| + // File + AddOrUpdateFile -> CONFLICT |
| + // Dir + None/AddDir -> RESOLVE_TO_LOCAL |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + DCHECK(local_changes.empty() || local_changes.list().back().IsDelete()); |
| return REMOTE_SYNC_OPERATION_ADD_FILE; |
| + case SYNC_FILE_TYPE_FILE: |
| + if (local_changes.empty()) |
| + return REMOTE_SYNC_OPERATION_UPDATE_FILE; |
| + DCHECK(local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_CONFLICT; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| } |
| } |
| - DCHECK(remote_file_change.IsDelete()); |
| - if (local_changes.empty()) |
| - return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA |
| - : REMOTE_SYNC_OPERATION_DELETE_FILE; |
| - switch (local_changes.list().back().change()) { |
| - case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| - return REMOTE_SYNC_OPERATION_NONE; |
| - case FileChange::FILE_CHANGE_DELETE: |
| - return REMOTE_SYNC_OPERATION_DELETE_METADATA; |
| + if (remote_file_change.IsDeleteFile()) { |
| + if (param->drive_metadata.conflicted()) { |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + * -> DELETE_METADATA |
| + // File + None/AddOrUpdateFile -> RESOLVE_TO_LOCAL |
| + // Dir + None/AddDir -> RESOLVE_TO_LOCAL |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + return REMOTE_SYNC_OPERATION_DELETE_METADATA; |
| + case SYNC_FILE_TYPE_FILE: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + } |
| + } |
| + |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + * -> DELETE_METADATA |
| + // File + None -> DELETE_FILE |
| + // File + AddOrUpdateFile -> NONE |
| + // Dir + None/AddDirectory -> NONE |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + return REMOTE_SYNC_OPERATION_DELETE_METADATA; |
| + case SYNC_FILE_TYPE_FILE: |
| + if (local_changes.empty()) |
| + return REMOTE_SYNC_OPERATION_DELETE_FILE; |
| + DCHECK(local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_NONE; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_NONE; |
| + } |
| } |
| - NOTREACHED(); |
| - return REMOTE_SYNC_OPERATION_FAIL; |
| + |
| + if (remote_file_change.IsAddDirectory()) { |
| + if (param->drive_metadata.conflicted()) { |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + Delete -> RESOLVE_TO_REMOTE |
| + // File + None/AddOrUpdateFile -> RESOLVE_TO_REMOTE |
| + // Dir + AddDir -> RESOLVE_TO_LOCAL |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + if (!local_changes.empty() && local_changes.list().back().IsDelete()) |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| + break; |
| + case SYNC_FILE_TYPE_FILE: |
| + if (local_changes.empty()) |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| + if (local_changes.list().back().IsAddDirectory()) |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| + break; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + if (!local_changes.empty() && |
| + local_changes.list().back().IsAddDirectory()) |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + break; |
| + } |
| + NOTREACHED(); |
| + return REMOTE_SYNC_OPERATION_FAIL; |
| + } |
| + |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + None -> ADD_DIR |
| + // None + Delete -> RESOLVE_TO_REMOTE |
| + // File + None/AddOrUpdateFile -> RESOLVE_TO_REMOTE |
| + // Dir + None/AddDir -> NONE |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + if (local_changes.empty()) |
| + return REMOTE_SYNC_OPERATION_ADD_DIRECTORY; |
| + DCHECK(local_changes.list().back().IsDelete()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| + case SYNC_FILE_TYPE_FILE: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_NONE; |
| + } |
| + NOTREACHED(); |
| + return REMOTE_SYNC_OPERATION_FAIL; |
| + } |
| + |
| + if (remote_file_change.IsDeleteDirectory()) { |
| + if (param->drive_metadata.conflicted()) { |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + * -> DELETE_METADATA |
| + // File + None/AddOrUpdateFile -> RESOLVE_TO_LOCAL |
| + // Dir + None -> DELETE_DIRECTORY |
| + // Dir + AddDir -> RESOLVE_TO_LOCAL |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + return REMOTE_SYNC_OPERATION_DELETE_METADATA; |
| + case SYNC_FILE_TYPE_FILE: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + } |
| + } |
| + |
| + // |
| + // (LocalFile) + (LocalChange) -> (OperationType) |
| + // None + None/Delete -> NONE |
| + // File + None/AddOrUpdateFile -> RESOLVE_TO_LOCAL |
| + // Dir + None -> DELETE_DIRECTORY |
| + // Dir + AddDir -> RESOLVE_TO_LOCAL |
| + // |
| + switch (local_file_type) { |
| + case SYNC_FILE_TYPE_UNKNOWN: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsDelete()); |
| + return REMOTE_SYNC_OPERATION_NONE; |
| + case SYNC_FILE_TYPE_FILE: |
| + DCHECK(local_changes.empty() || |
| + local_changes.list().back().IsAddOrUpdateFile()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + case SYNC_FILE_TYPE_DIRECTORY: |
| + if (local_changes.empty()) |
| + return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY; |
| + DCHECK(local_changes.list().back().IsAddDirectory()); |
| + return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| + } |
| + } |
| + |
| + DCHECK(remote_file_change.IsTypeUnknown()); |
| + return REMOTE_SYNC_OPERATION_NONE; |
| } |
| void DriveFileSyncService::DidResolveConflictToLocalChange( |
| @@ -1954,6 +2126,17 @@ bool DriveFileSyncService::AppendRemoteChangeInternal( |
| FileChange file_change(CreateFileChange(is_deleted)); |
| + if (is_deleted) { |
| + // Determine a file type of the deleted change by local metadata. |
| + if (!remote_resource_id.empty() && |
| + !local_resource_id.empty() && |
| + remote_resource_id == local_resource_id) { |
| + DCHECK_EQ(DriveMetadata::RESOURCE_TYPE_FILE, metadata.type()); |
| + file_change = FileChange(FileChange::FILE_CHANGE_DELETE, |
| + SYNC_FILE_TYPE_FILE); |
| + } |
| + } |
| + |
| if (is_deleted && has_db_entry) { |
| metadata.set_resource_id(std::string()); |
| metadata_store_->UpdateEntry(url, metadata, |