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

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

Powered by Google App Engine
This is Rietveld 408576698