OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "chrome/browser/sync_file_system/drive_backend/local_sync_operation_res
olver.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "chrome/browser/sync_file_system/drive_backend/drive_file_sync_service.
h" | |
9 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" | |
10 | |
11 namespace sync_file_system { | |
12 | |
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; | |
20 | |
21 bool is_conflicting = false; | |
22 SyncFileType remote_file_type_in_metadata = SYNC_FILE_TYPE_UNKNOWN; | |
23 if (drive_metadata) { | |
24 is_conflicting = drive_metadata->conflicted(); | |
25 remote_file_type_in_metadata = | |
26 DriveFileSyncService::DriveMetadataResourceTypeToSyncFileType( | |
27 drive_metadata->type()); | |
28 } | |
29 | |
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: | |
34 return is_conflicting | |
35 ? ResolveForAddOrUpdateFileInConflict(remote_file_change) | |
36 : ResolveForAddOrUpdateFile(remote_file_change, | |
37 remote_file_type_in_metadata); | |
38 case SYNC_FILE_TYPE_DIRECTORY: | |
39 return is_conflicting | |
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; | |
46 } | |
47 case FileChange::FILE_CHANGE_DELETE: | |
48 return is_conflicting | |
49 ? ResolveForDeleteInConflict(remote_file_change) | |
50 : ResolveForDelete(remote_file_change, | |
51 remote_file_type_in_metadata); | |
52 } | |
53 NOTREACHED() << "Detected unknown type of change for local file."; | |
54 return SYNC_OPERATION_FAIL; | |
55 } | |
56 | |
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; | |
69 } | |
70 NOTREACHED() << "Detected local add-or-update to" | |
71 << " unknown type of remote file."; | |
72 return SYNC_OPERATION_FAIL; | |
73 } | |
74 | |
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; | |
82 } | |
83 | |
84 NOTREACHED() << "Local add-or-update conflicted to" | |
85 << " unknown type of remote change."; | |
86 return SYNC_OPERATION_FAIL; | |
87 } | |
88 | |
89 SyncOperationType | |
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; | |
101 } | |
102 NOTREACHED() << "Local add-or-update for conflicting file conflicted to" | |
103 << " unknown type of remote change."; | |
104 return SYNC_OPERATION_FAIL; | |
105 } | |
106 | |
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; | |
119 } | |
120 NOTREACHED() << "Local add directory conflicted to" | |
121 << " unknown type of remote file."; | |
122 return SYNC_OPERATION_FAIL; | |
123 } | |
124 | |
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; | |
134 } | |
135 | |
136 NOTREACHED() << "Local add directory conflicted to" | |
137 << " unknown type of remote change."; | |
138 return SYNC_OPERATION_FAIL; | |
139 } | |
140 | |
141 SyncOperationType | |
142 LocalSyncOperationResolver::ResolveForAddDirectoryInConflict() { | |
143 return SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
144 } | |
145 | |
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; | |
151 | |
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; | |
157 } | |
158 | |
159 NOTREACHED() << "Local file deletion conflicted to" | |
160 << " unknown type of remote change."; | |
161 return SYNC_OPERATION_FAIL; | |
162 } | |
163 | |
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; | |
173 } | |
174 NOTREACHED() << "Local file deletion for conflicting file conflicted to" | |
175 << " unknown type of remote change."; | |
176 return SYNC_OPERATION_FAIL; | |
177 } | |
178 | |
179 } // namespace sync_file_system | |
OLD | NEW |