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

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 bool is_conflicting) {
16 if (local_changes.empty()) {
17 return !(is_conflicting && local_file_type != SYNC_FILE_TYPE_FILE);
kinuko 2013/04/25 14:07:54 Can you add a comment: // We never leave director
nhiroki 2013/04/26 06:04:00 Done.
18 }
19 switch (local_file_type) {
20 case SYNC_FILE_TYPE_UNKNOWN:
21 return local_changes.back().IsDelete();
22 case SYNC_FILE_TYPE_FILE:
23 case SYNC_FILE_TYPE_DIRECTORY:
24 return !local_changes.back().IsDelete() &&
25 local_changes.back().file_type() == local_file_type;
26 }
27 return false;
28 }
29
30 } // namespace
31
32 RemoteSyncOperationType
33 RemoteSyncOperationResolver::Resolve(const FileChange& remote_file_change,
34 const FileChangeList& local_changes,
35 SyncFileType local_file_type,
36 bool is_conflicting) {
37 switch (remote_file_change.change()) {
38 case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
39 switch (remote_file_change.file_type()) {
40 case SYNC_FILE_TYPE_FILE:
41 return is_conflicting
42 ? ResolveForAddOrUpdateFileInConflict(local_changes,
43 local_file_type)
44 : ResolveForAddOrUpdateFile(local_changes, local_file_type);
45 case SYNC_FILE_TYPE_DIRECTORY:
46 return is_conflicting
47 ? ResolveForAddDirectoryInConflict(local_changes, local_file_type)
48 : ResolveForAddDirectory(local_changes, local_file_type);
49 case SYNC_FILE_TYPE_UNKNOWN:
50 NOTREACHED();
51 return REMOTE_SYNC_OPERATION_FAIL;
52 }
53 break;
54 case FileChange::FILE_CHANGE_DELETE:
55 switch (remote_file_change.file_type()) {
56 case SYNC_FILE_TYPE_FILE:
57 return is_conflicting
58 ? ResolveForDeleteFileInConflict(local_changes, local_file_type)
59 : ResolveForDeleteFile(local_changes, local_file_type);
60 case SYNC_FILE_TYPE_DIRECTORY:
61 return is_conflicting
62 ? ResolveForDeleteDirectoryInConflict(local_changes,
63 local_file_type)
64 : ResolveForDeleteDirectory(local_changes, local_file_type);
65 case SYNC_FILE_TYPE_UNKNOWN:
66 NOTREACHED();
67 return REMOTE_SYNC_OPERATION_FAIL;
68 }
69 break;
70 }
71 NOTREACHED();
72 return REMOTE_SYNC_OPERATION_FAIL;
73 }
74
75 RemoteSyncOperationType
76 RemoteSyncOperationResolver::ResolveForAddOrUpdateFile(
77 const FileChangeList& local_changes,
78 SyncFileType local_file_type) {
79 // Invalid combination should never happen.
80 if (!IsValidCombination(local_changes, local_file_type, false))
81 return REMOTE_SYNC_OPERATION_FAIL;
82
83 switch (local_file_type) {
84 case SYNC_FILE_TYPE_UNKNOWN:
85 return REMOTE_SYNC_OPERATION_ADD_FILE;
86 case SYNC_FILE_TYPE_FILE:
87 if (local_changes.empty())
88 return REMOTE_SYNC_OPERATION_UPDATE_FILE;
89 return REMOTE_SYNC_OPERATION_CONFLICT;
90 case SYNC_FILE_TYPE_DIRECTORY:
91 // Currently we always prioritize directories over files.
92 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
93 }
94 return REMOTE_SYNC_OPERATION_FAIL;
95 }
96
97 RemoteSyncOperationType
98 RemoteSyncOperationResolver::ResolveForAddOrUpdateFileInConflict(
99 const FileChangeList& local_changes,
100 SyncFileType local_file_type) {
101 // Invalid combination should never happen.
102 if (!IsValidCombination(local_changes, local_file_type, true))
103 return REMOTE_SYNC_OPERATION_FAIL;
104
105 switch (local_file_type) {
106 case SYNC_FILE_TYPE_UNKNOWN:
107 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
108 case SYNC_FILE_TYPE_FILE:
109 return REMOTE_SYNC_OPERATION_CONFLICT;
110 case SYNC_FILE_TYPE_DIRECTORY:
111 // We never leave directory entry in a conflicting state.
112 return REMOTE_SYNC_OPERATION_FAIL;
kinuko 2013/04/25 14:07:54 It could be valid when we have local changes-- wha
nhiroki 2013/04/26 06:04:00 Oh... yes, it's correct. Sorry for wrong fixing. D
113 }
114 return REMOTE_SYNC_OPERATION_FAIL;
115 }
116
117 RemoteSyncOperationType
118 RemoteSyncOperationResolver::ResolveForAddDirectory(
119 const FileChangeList& local_changes,
120 SyncFileType local_file_type) {
121 // Invalid combination should never happen.
122 if (!IsValidCombination(local_changes, local_file_type, false))
123 return REMOTE_SYNC_OPERATION_FAIL;
124
125 switch (local_file_type) {
126 case SYNC_FILE_TYPE_UNKNOWN:
127 if (local_changes.empty())
128 return REMOTE_SYNC_OPERATION_ADD_DIRECTORY;
129 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
130 case SYNC_FILE_TYPE_FILE:
131 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
132 case SYNC_FILE_TYPE_DIRECTORY:
133 return REMOTE_SYNC_OPERATION_NONE;
134 }
135 return REMOTE_SYNC_OPERATION_FAIL;
136 }
137
138 RemoteSyncOperationType
139 RemoteSyncOperationResolver::ResolveForAddDirectoryInConflict(
140 const FileChangeList& local_changes,
141 SyncFileType local_file_type) {
142 // Invalid combination should never happen.
143 if (!IsValidCombination(local_changes, local_file_type, true))
144 return REMOTE_SYNC_OPERATION_FAIL;
145
146 switch (local_file_type) {
147 case SYNC_FILE_TYPE_UNKNOWN:
148 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
149 case SYNC_FILE_TYPE_FILE:
150 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
151 case SYNC_FILE_TYPE_DIRECTORY:
152 // We never leave directory entry in a conflicting state.
153 return REMOTE_SYNC_OPERATION_FAIL;
kinuko 2013/04/25 14:07:54 ditto. We just need to clear the conflicting flag
nhiroki 2013/04/26 06:04:00 It'd be ok to return RESOLVE_TO_LOCAL to clear the
154 }
155 return REMOTE_SYNC_OPERATION_FAIL;
156 }
157
158 RemoteSyncOperationType
159 RemoteSyncOperationResolver::ResolveForDeleteFile(
160 const FileChangeList& local_changes,
161 SyncFileType local_file_type) {
162 // Invalid combination should never happen.
163 if (!IsValidCombination(local_changes, local_file_type, false))
164 return REMOTE_SYNC_OPERATION_FAIL;
165
166 switch (local_file_type) {
167 case SYNC_FILE_TYPE_UNKNOWN:
168 if (local_changes.empty())
169 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
170 return REMOTE_SYNC_OPERATION_NONE;
kinuko 2013/04/25 14:07:54 DELETE_METADATA in either case?
nhiroki 2013/04/26 06:04:00 Done.
171 case SYNC_FILE_TYPE_FILE:
172 if (local_changes.empty())
173 return REMOTE_SYNC_OPERATION_DELETE_FILE;
174 return REMOTE_SYNC_OPERATION_NONE;
175 case SYNC_FILE_TYPE_DIRECTORY:
176 return REMOTE_SYNC_OPERATION_NONE;
177 }
178 return REMOTE_SYNC_OPERATION_FAIL;
179 }
180
181 RemoteSyncOperationType
182 RemoteSyncOperationResolver::ResolveForDeleteFileInConflict(
183 const FileChangeList& local_changes,
184 SyncFileType local_file_type) {
185 // Invalid combination should never happen.
186 if (!IsValidCombination(local_changes, local_file_type, true))
187 return REMOTE_SYNC_OPERATION_FAIL;
188
189 switch (local_file_type) {
190 case SYNC_FILE_TYPE_UNKNOWN:
191 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
192 case SYNC_FILE_TYPE_FILE:
193 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
194 case SYNC_FILE_TYPE_DIRECTORY:
195 // We never leave directory entry in a conflicting state.
196 return REMOTE_SYNC_OPERATION_FAIL;
kinuko 2013/04/25 14:07:54 ditto. RESOLVE_TO_LOCAL?
nhiroki 2013/04/26 06:04:00 Done.
197 }
198 return REMOTE_SYNC_OPERATION_FAIL;
199 }
200
201 RemoteSyncOperationType
202 RemoteSyncOperationResolver::ResolveForDeleteDirectory(
203 const FileChangeList& local_changes,
204 SyncFileType local_file_type) {
205 // Invalid combination should never happen.
206 if (!IsValidCombination(local_changes, local_file_type, false))
207 return REMOTE_SYNC_OPERATION_FAIL;
208
209 switch (local_file_type) {
210 case SYNC_FILE_TYPE_UNKNOWN:
211 return REMOTE_SYNC_OPERATION_NONE;
212 case SYNC_FILE_TYPE_FILE:
213 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
214 case SYNC_FILE_TYPE_DIRECTORY:
215 if (local_changes.empty())
216 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY;
217 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
218 }
219 return REMOTE_SYNC_OPERATION_FAIL;
220 }
221
222 RemoteSyncOperationType
223 RemoteSyncOperationResolver::ResolveForDeleteDirectoryInConflict(
224 const FileChangeList& local_changes,
225 SyncFileType local_file_type) {
226 // Invalid combination should never happen.
227 if (!IsValidCombination(local_changes, local_file_type, true))
228 return REMOTE_SYNC_OPERATION_FAIL;
229
230 switch (local_file_type) {
231 case SYNC_FILE_TYPE_UNKNOWN:
232 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
233 case SYNC_FILE_TYPE_FILE:
234 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
235 case SYNC_FILE_TYPE_DIRECTORY:
236 // We never leave directory entry in a conflicting state.
237 return REMOTE_SYNC_OPERATION_FAIL;
kinuko 2013/04/25 14:07:54 ditto. RESOLVE_TO_LOCAL?
nhiroki 2013/04/26 06:04:00 Done.
238 }
239 return REMOTE_SYNC_OPERATION_FAIL;
240 }
241
242 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698