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

Side by Side Diff: chrome/browser/sync_file_system/remote_sync_operation_resolver.cc

Issue 13986011: SyncFS: Introduce RemoteSyncOperationResolver for directory operation support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review fix 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 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/remote_sync_operation_resolver.h"
6
7 #include "base/logging.h"
8
9 namespace sync_file_system {
10
11 namespace {
12
13 bool IsValidCombination(const FileChangeList& local_changes,
14 SyncFileType local_file_type) {
15 if (local_file_type == SYNC_FILE_TYPE_UNKNOWN ||
kinuko 2013/04/25 08:34:10 I think this one can be probably more improved. Lo
nhiroki 2013/04/25 10:29:27 Done! I found some wrong expectations in the desig
16 local_changes.empty() ||
17 local_file_type == local_changes.back().file_type())
18 return true;
19 return false;
20 }
21
22 } // namespace
23
24 RemoteSyncOperationType
25 RemoteSyncOperationResolver::Resolve(const FileChange& remote_file_change,
26 const FileChangeList& local_changes,
27 SyncFileType local_file_type,
28 bool is_conflicting) {
29 DCHECK(IsValidCombination(local_changes, local_file_type));
kinuko 2013/04/25 08:34:10 Hmm, maybe this one's a bit too verbose... sorry c
nhiroki 2013/04/25 10:29:27 Done.
30
31 switch (remote_file_change.change()) {
32 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
33 switch (remote_file_change.file_type()) {
34 case SYNC_FILE_TYPE_FILE:
35 return is_conflicting
36 ? ResolveForAddOrUpdateFileInConflict(local_changes,
37 local_file_type)
38 : ResolveForAddOrUpdateFile(local_changes, local_file_type);
39 case SYNC_FILE_TYPE_DIRECTORY:
40 return is_conflicting
41 ? ResolveForAddDirectoryInConflict(local_changes, local_file_type)
42 : ResolveForAddDirectory(local_changes, local_file_type);
43 case SYNC_FILE_TYPE_UNKNOWN:
44 NOTREACHED();
45 return REMOTE_SYNC_OPERATION_FAIL;
46 }
47 break;
48 case FileChange::FILE_CHANGE_DELETE:
49 switch (remote_file_change.file_type()) {
50 case SYNC_FILE_TYPE_FILE:
51 return is_conflicting
52 ? ResolveForDeleteFileInConflict(local_changes, local_file_type)
53 : ResolveForDeleteFile(local_changes, local_file_type);
54 case SYNC_FILE_TYPE_DIRECTORY:
55 return is_conflicting
56 ? ResolveForDeleteDirectoryInConflict(local_changes,
57 local_file_type)
58 : ResolveForDeleteDirectory(local_changes, local_file_type);
59 case SYNC_FILE_TYPE_UNKNOWN:
60 NOTREACHED();
61 return REMOTE_SYNC_OPERATION_FAIL;
62 }
63 break;
64 }
65 NOTREACHED();
66 return REMOTE_SYNC_OPERATION_FAIL;
67 }
68
69 RemoteSyncOperationType
70 RemoteSyncOperationResolver::ResolveForAddOrUpdateFile(
71 const FileChangeList& local_changes,
72 SyncFileType local_file_type) {
73 // Invalid combination should never happen.
74 if (!IsValidCombination(local_changes, local_file_type))
75 return REMOTE_SYNC_OPERATION_FAIL;
76
77 switch (local_file_type) {
78 case SYNC_FILE_TYPE_UNKNOWN:
79 if (local_changes.empty() || local_changes.back().IsDelete())
80 return REMOTE_SYNC_OPERATION_ADD_FILE;
81 break;
82 case SYNC_FILE_TYPE_FILE:
83 if (local_changes.empty())
84 return REMOTE_SYNC_OPERATION_UPDATE_FILE;
85 if (local_changes.back().IsAddOrUpdate())
86 return REMOTE_SYNC_OPERATION_CONFLICT;
87 break;
88 case SYNC_FILE_TYPE_DIRECTORY:
89 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
90 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
kinuko 2013/04/25 08:34:10 Can we add a comment: // Currently we always prior
nhiroki 2013/04/25 10:29:27 Done.
91 break;
92 }
93 return REMOTE_SYNC_OPERATION_FAIL;
94 }
95
96 RemoteSyncOperationType
97 RemoteSyncOperationResolver::ResolveForAddOrUpdateFileInConflict(
98 const FileChangeList& local_changes,
99 SyncFileType local_file_type) {
100 // Invalid combination should never happen.
101 if (!IsValidCombination(local_changes, local_file_type))
102 return REMOTE_SYNC_OPERATION_FAIL;
103
104 switch (local_file_type) {
105 case SYNC_FILE_TYPE_UNKNOWN:
106 if (!local_changes.empty() && local_changes.back().IsDelete())
107 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
108 break;
109 case SYNC_FILE_TYPE_FILE:
110 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
111 return REMOTE_SYNC_OPERATION_CONFLICT;
112 break;
113 case SYNC_FILE_TYPE_DIRECTORY:
114 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
115 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
116 break;
117 }
118 return REMOTE_SYNC_OPERATION_FAIL;
119 }
120
121 RemoteSyncOperationType
122 RemoteSyncOperationResolver::ResolveForAddDirectory(
123 const FileChangeList& local_changes,
124 SyncFileType local_file_type) {
125 // Invalid combination should never happen.
126 if (!IsValidCombination(local_changes, local_file_type))
127 return REMOTE_SYNC_OPERATION_FAIL;
128
129 switch (local_file_type) {
130 case SYNC_FILE_TYPE_UNKNOWN:
131 if (local_changes.empty())
132 return REMOTE_SYNC_OPERATION_ADD_DIRECTORY;
133 if (local_changes.back().IsDelete())
134 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
135 break;
136 case SYNC_FILE_TYPE_FILE:
137 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
138 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
139 break;
140 case SYNC_FILE_TYPE_DIRECTORY:
141 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
142 return REMOTE_SYNC_OPERATION_NONE;
143 break;
144 }
145 return REMOTE_SYNC_OPERATION_FAIL;
146 }
147
148 RemoteSyncOperationType
149 RemoteSyncOperationResolver::ResolveForAddDirectoryInConflict(
150 const FileChangeList& local_changes,
151 SyncFileType local_file_type) {
152 // Invalid combination should never happen.
153 if (!IsValidCombination(local_changes, local_file_type))
154 return REMOTE_SYNC_OPERATION_FAIL;
155
156 switch (local_file_type) {
157 case SYNC_FILE_TYPE_UNKNOWN:
158 if (!local_changes.empty() && local_changes.back().IsDelete())
159 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
160 break;
161 case SYNC_FILE_TYPE_FILE:
162 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
163 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
164 break;
165 case SYNC_FILE_TYPE_DIRECTORY:
166 if (!local_changes.empty() && local_changes.back().IsAddOrUpdate())
167 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
168 break;
169 }
170 return REMOTE_SYNC_OPERATION_FAIL;
171 }
172
173 RemoteSyncOperationType
174 RemoteSyncOperationResolver::ResolveForDeleteFile(
175 const FileChangeList& local_changes,
176 SyncFileType local_file_type) {
177 // Invalid combination should never happen.
178 if (!IsValidCombination(local_changes, local_file_type))
179 return REMOTE_SYNC_OPERATION_FAIL;
180
181 switch (local_file_type) {
182 case SYNC_FILE_TYPE_UNKNOWN:
183 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
184 case SYNC_FILE_TYPE_FILE:
185 if (local_changes.empty())
186 return REMOTE_SYNC_OPERATION_DELETE_FILE;
187 if (local_changes.back().IsAddOrUpdate())
188 return REMOTE_SYNC_OPERATION_NONE;
189 break;
190 case SYNC_FILE_TYPE_DIRECTORY:
191 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
192 return REMOTE_SYNC_OPERATION_NONE;
193 break;
194 }
195 return REMOTE_SYNC_OPERATION_FAIL;
196 }
197
198 RemoteSyncOperationType
199 RemoteSyncOperationResolver::ResolveForDeleteFileInConflict(
200 const FileChangeList& local_changes,
201 SyncFileType local_file_type) {
202 // Invalid combination should never happen.
203 if (!IsValidCombination(local_changes, local_file_type))
204 return REMOTE_SYNC_OPERATION_FAIL;
205
206 switch (local_file_type) {
207 case SYNC_FILE_TYPE_UNKNOWN:
208 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
209 case SYNC_FILE_TYPE_FILE:
210 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
211 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
212 break;
213 case SYNC_FILE_TYPE_DIRECTORY:
214 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
215 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
216 break;
217 }
218 return REMOTE_SYNC_OPERATION_FAIL;
219 }
220
221 RemoteSyncOperationType
222 RemoteSyncOperationResolver::ResolveForDeleteDirectory(
223 const FileChangeList& local_changes,
224 SyncFileType local_file_type) {
225 // Invalid combination should never happen.
226 if (!IsValidCombination(local_changes, local_file_type))
227 return REMOTE_SYNC_OPERATION_FAIL;
228
229 switch (local_file_type) {
230 case SYNC_FILE_TYPE_UNKNOWN:
231 if (local_changes.empty() || local_changes.back().IsDelete())
232 return REMOTE_SYNC_OPERATION_NONE;
233 break;
234 case SYNC_FILE_TYPE_FILE:
235 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
236 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
237 break;
238 case SYNC_FILE_TYPE_DIRECTORY:
239 if (local_changes.empty())
240 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY;
241 if (local_changes.back().IsAddOrUpdate())
242 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
243 break;
244 }
245 return REMOTE_SYNC_OPERATION_FAIL;
246 }
247
248 RemoteSyncOperationType
249 RemoteSyncOperationResolver::ResolveForDeleteDirectoryInConflict(
250 const FileChangeList& local_changes,
251 SyncFileType local_file_type) {
252 // Invalid combination should never happen.
253 if (!IsValidCombination(local_changes, local_file_type))
254 return REMOTE_SYNC_OPERATION_FAIL;
255
256 switch (local_file_type) {
257 case SYNC_FILE_TYPE_UNKNOWN:
258 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
259 case SYNC_FILE_TYPE_FILE:
260 if (local_changes.empty() || local_changes.back().IsAddOrUpdate())
261 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
262 break;
263 case SYNC_FILE_TYPE_DIRECTORY:
264 if (local_changes.empty())
265 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY;
266 if (local_changes.back().IsAddOrUpdate())
267 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
268 break;
269 }
270 return REMOTE_SYNC_OPERATION_FAIL;
271 }
272
273 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698