| 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..631aea9ae998dfc3c69d3ef073f49bcb91d3db58 100644
|
| --- a/chrome/browser/sync_file_system/drive_file_sync_service.cc
|
| +++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc
|
| @@ -27,6 +27,7 @@
|
| #include "chrome/browser/sync_file_system/drive_metadata_store.h"
|
| #include "chrome/browser/sync_file_system/file_status_observer.h"
|
| #include "chrome/browser/sync_file_system/remote_change_processor.h"
|
| +#include "chrome/browser/sync_file_system/remote_sync_operation_resolver.h"
|
| #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -1488,9 +1489,11 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
|
| }
|
| bool missing_local_file = (metadata.file_type == SYNC_FILE_TYPE_UNKNOWN);
|
|
|
| - RemoteSyncOperationType operation =
|
| - ResolveRemoteSyncOperationType(remote_file_change, param.get(),
|
| - local_changes, missing_local_file);
|
| + RemoteSyncOperationResolver::RemoteSyncOperationType operation =
|
| + RemoteSyncOperationResolver::Resolve(remote_file_change,
|
| + local_changes,
|
| + param->local_metadata.file_type,
|
| + param->drive_metadata.conflicted());
|
|
|
| DVLOG(1) << "ProcessRemoteChange for " << url.DebugString()
|
| << (param->drive_metadata.conflicted() ? " (conflicted)" : " ")
|
| @@ -1499,15 +1502,20 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
|
| << " ==> operation: " << operation;
|
|
|
| switch (operation) {
|
| - case REMOTE_SYNC_OPERATION_ADD_FILE:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_ADD_FILE:
|
| param->sync_action = SYNC_ACTION_ADDED;
|
| DownloadForRemoteSync(param.Pass());
|
| return;
|
| - case REMOTE_SYNC_OPERATION_UPDATE_FILE:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_ADD_DIRECTORY:
|
| + // TODO(nhiroki): support directory operations (http://crbug.com/161442).
|
| + NOTIMPLEMENTED();
|
| + AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
|
| + return;
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_UPDATE_FILE:
|
| param->sync_action = SYNC_ACTION_UPDATED;
|
| DownloadForRemoteSync(param.Pass());
|
| return;
|
| - case REMOTE_SYNC_OPERATION_DELETE_FILE: {
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_FILE: {
|
| param->sync_action = SYNC_ACTION_DELETED;
|
| const FileChange& file_change = remote_file_change;
|
| remote_change_processor_->ApplyRemoteChange(
|
| @@ -1516,17 +1524,22 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
|
| base::Passed(¶m)));
|
| return;
|
| }
|
| - case REMOTE_SYNC_OPERATION_NONE:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_DIRECTORY:
|
| + // TODO(nhiroki): support directory operations (http://crbug.com/161442).
|
| + NOTIMPLEMENTED();
|
| + AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
|
| + return;
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_NONE:
|
| param->sync_action = SYNC_ACTION_NONE;
|
| CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK);
|
| return;
|
| - case REMOTE_SYNC_OPERATION_CONFLICT:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_CONFLICT:
|
| HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK);
|
| return;
|
| - case REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL:
|
| ResolveConflictToLocalForRemoteSync(param.Pass());
|
| return;
|
| - case REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE: {
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE: {
|
| const FileSystemURL& url = param->remote_change.url;
|
| param->drive_metadata.set_conflicted(false);
|
| param->drive_metadata.set_to_be_fetched(true);
|
| @@ -1536,14 +1549,14 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
|
| DownloadForRemoteSync(param.Pass());
|
| return;
|
| }
|
| - case REMOTE_SYNC_OPERATION_DELETE_METADATA:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_METADATA:
|
| param->sync_action = SYNC_ACTION_NONE;
|
| if (missing_db_entry)
|
| CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK);
|
| else
|
| DeleteMetadataForRemoteSync(param.Pass());
|
| return;
|
| - case REMOTE_SYNC_OPERATION_FAIL:
|
| + case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_FAIL:
|
| AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
|
| return;
|
| }
|
| @@ -1551,49 +1564,6 @@ void DriveFileSyncService::DidPrepareForProcessRemoteChange(
|
| AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED);
|
| }
|
|
|
| -DriveFileSyncService::RemoteSyncOperationType
|
| -DriveFileSyncService::ResolveRemoteSyncOperationType(
|
| - const FileChange& remote_file_change,
|
| - ProcessRemoteChangeParam* param,
|
| - const FileChangeList& local_changes,
|
| - bool missing_local_file) {
|
| - 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;
|
| - }
|
| - }
|
| -
|
| - 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:
|
| - return REMOTE_SYNC_OPERATION_ADD_FILE;
|
| - }
|
| - }
|
| -
|
| - 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;
|
| - }
|
| - NOTREACHED();
|
| - return REMOTE_SYNC_OPERATION_FAIL;
|
| -}
|
| -
|
| void DriveFileSyncService::DidResolveConflictToLocalChange(
|
| scoped_ptr<ProcessRemoteChangeParam> param,
|
| SyncStatusCode status) {
|
| @@ -1954,6 +1924,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,
|
|
|