1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/sync_file_system/drive_backend_v1/local_sync_operation_resolver.h"
7 #include "base/logging.h"
8 #include "chrome/browser/sync_file_system/drive_backend_v1/drive_file_sync_service.h"
9 #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
11 namespace sync_file_system {
13 SyncOperationType LocalSyncOperationResolver::Resolve(
14 const FileChange& local_file_change,
15 const FileChange* remote_file_change,
16 const DriveMetadata* drive_metadata) {
17 // Invalid combination should never happen.
18 if (remote_file_change && remote_file_change->IsTypeUnknown())
19 return SYNC_OPERATION_FAIL;
21 bool is_conflicting = false;
22 SyncFileType remote_file_type_in_metadata = SYNC_FILE_TYPE_UNKNOWN;
24 is_conflicting = drive_metadata->conflicted();
25 remote_file_type_in_metadata =
26 DriveFileSyncService::DriveMetadataResourceTypeToSyncFileType(
27 drive_metadata->type());
30 switch (local_file_change.change()) {
31 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
32 switch (local_file_change.file_type()) {
33 case SYNC_FILE_TYPE_FILE:
35 ? ResolveForAddOrUpdateFileInConflict(remote_file_change)
36 : ResolveForAddOrUpdateFile(remote_file_change,
37 remote_file_type_in_metadata);
38 case SYNC_FILE_TYPE_DIRECTORY:
40 ? ResolveForAddDirectoryInConflict()
41 : ResolveForAddDirectory(remote_file_change,
42 remote_file_type_in_metadata);
43 case SYNC_FILE_TYPE_UNKNOWN:
44 NOTREACHED() << "Adding unknown type of local file.";
45 return SYNC_OPERATION_FAIL;
47 case FileChange::FILE_CHANGE_DELETE:
49 ? ResolveForDeleteInConflict(remote_file_change)
50 : ResolveForDelete(remote_file_change,
51 remote_file_type_in_metadata);
53 NOTREACHED() << "Detected unknown type of change for local file.";
54 return SYNC_OPERATION_FAIL;
57 SyncOperationType LocalSyncOperationResolver::ResolveForAddOrUpdateFile(
58 const FileChange* remote_file_change,
59 SyncFileType remote_file_type_in_metadata) {
60 if (!remote_file_change) {
61 switch (remote_file_type_in_metadata) {
62 case SYNC_FILE_TYPE_UNKNOWN:
63 // Remote file or directory may not exist.
64 return SYNC_OPERATION_ADD_FILE;
65 case SYNC_FILE_TYPE_FILE:
66 return SYNC_OPERATION_UPDATE_FILE;
67 case SYNC_FILE_TYPE_DIRECTORY:
68 return SYNC_OPERATION_RESOLVE_TO_REMOTE;
70 NOTREACHED() << "Detected local add-or-update to"
71 << " unknown type of remote file.";
72 return SYNC_OPERATION_FAIL;
75 switch (remote_file_change->change()) {
76 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
77 if (remote_file_change->IsFile())
78 return SYNC_OPERATION_CONFLICT;
79 return SYNC_OPERATION_RESOLVE_TO_REMOTE;
80 case FileChange::FILE_CHANGE_DELETE:
81 return SYNC_OPERATION_RESOLVE_TO_LOCAL;
84 NOTREACHED() << "Local add-or-update conflicted to"
85 << " unknown type of remote change.";
86 return SYNC_OPERATION_FAIL;
90 LocalSyncOperationResolver::ResolveForAddOrUpdateFileInConflict(
91 const FileChange* remote_file_change) {
92 if (!remote_file_change)
93 return SYNC_OPERATION_CONFLICT;
94 switch (remote_file_change->change()) {
95 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
96 if (remote_file_change->IsFile())
97 return SYNC_OPERATION_CONFLICT;
98 return SYNC_OPERATION_RESOLVE_TO_REMOTE;
99 case FileChange::FILE_CHANGE_DELETE:
100 return SYNC_OPERATION_RESOLVE_TO_LOCAL;
102 NOTREACHED() << "Local add-or-update for conflicting file conflicted to"
103 << " unknown type of remote change.";
104 return SYNC_OPERATION_FAIL;
107 SyncOperationType LocalSyncOperationResolver::ResolveForAddDirectory(
108 const FileChange* remote_file_change,
109 SyncFileType remote_file_type_in_metadata) {
110 if (!remote_file_change) {
111 switch (remote_file_type_in_metadata) {
112 case SYNC_FILE_TYPE_UNKNOWN:
113 // Remote file or directory may not exist.
114 return SYNC_OPERATION_ADD_DIRECTORY;
115 case SYNC_FILE_TYPE_FILE:
116 return SYNC_OPERATION_RESOLVE_TO_LOCAL;
117 case SYNC_FILE_TYPE_DIRECTORY:
118 return SYNC_OPERATION_NONE;
120 NOTREACHED() << "Local add directory conflicted to"
121 << " unknown type of remote file.";
122 return SYNC_OPERATION_FAIL;
125 switch (remote_file_change->change()) {
126 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
127 if (remote_file_change->IsFile())
128 return SYNC_OPERATION_RESOLVE_TO_LOCAL;
129 return SYNC_OPERATION_NONE;
130 case FileChange::FILE_CHANGE_DELETE:
131 if (remote_file_change->IsFile())
132 return SYNC_OPERATION_ADD_DIRECTORY;
133 return SYNC_OPERATION_RESOLVE_TO_LOCAL;
136 NOTREACHED() << "Local add directory conflicted to"
137 << " unknown type of remote change.";
138 return SYNC_OPERATION_FAIL;
142 LocalSyncOperationResolver::ResolveForAddDirectoryInConflict() {
143 return SYNC_OPERATION_RESOLVE_TO_LOCAL;
146 SyncOperationType LocalSyncOperationResolver::ResolveForDelete(
147 const FileChange* remote_file_change,
148 SyncFileType remote_file_type_in_metadata) {
149 if (!remote_file_change)
150 return SYNC_OPERATION_DELETE;
152 switch (remote_file_change->change()) {
153 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
154 return SYNC_OPERATION_RESOLVE_TO_REMOTE;
155 case FileChange::FILE_CHANGE_DELETE:
156 return SYNC_OPERATION_DELETE_METADATA;
159 NOTREACHED() << "Local file deletion conflicted to"
160 << " unknown type of remote change.";
161 return SYNC_OPERATION_FAIL;
164 SyncOperationType LocalSyncOperationResolver::ResolveForDeleteInConflict(
165 const FileChange* remote_file_change) {
166 if (!remote_file_change)
167 return SYNC_OPERATION_RESOLVE_TO_REMOTE;
168 switch (remote_file_change->change()) {
169 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
170 return SYNC_OPERATION_RESOLVE_TO_REMOTE;
171 case FileChange::FILE_CHANGE_DELETE:
172 return SYNC_OPERATION_DELETE_METADATA;
174 NOTREACHED() << "Local file deletion for conflicting file conflicted to"
175 << " unknown type of remote change.";
176 return SYNC_OPERATION_FAIL;
179 } // namespace sync_file_system