Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7099)

Unified Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 13986011: SyncFS: Introduce RemoteSyncOperationResolver for directory operation support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(&param)));
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,

Powered by Google App Engine
This is Rietveld 408576698