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

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: add RemoteSyncOperationResolver and unit tests 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 RemoteSyncOperationResolver::RemoteSyncOperationType
12 RemoteSyncOperationResolver::Resolve(const FileChange& remote_file_change,
13 const FileChangeList& local_changes,
14 SyncFileType local_file_type,
15 bool is_conflicting) {
16 if (remote_file_change.IsAddOrUpdate()) {
kinuko 2013/04/24 14:54:50 nit: can we use switch/case instead?
nhiroki 2013/04/25 06:54:43 Done.
17 if (remote_file_change.IsFile())
18 return is_conflicting
19 ? ResolveForAddOrUpdateFileInConflict(local_changes, local_file_type)
20 : ResolveForAddOrUpdateFile(local_changes, local_file_type);
21 DCHECK(remote_file_change.IsDirectory());
22 return is_conflicting
23 ? ResolveForAddDirectoryInConflict(local_changes, local_file_type)
24 : ResolveForAddDirectory(local_changes, local_file_type);
25 }
26
27 if (remote_file_change.IsDelete()) {
28 if (remote_file_change.IsFile())
29 return is_conflicting
30 ? ResolveForDeleteFileInConflict(local_changes, local_file_type)
31 : ResolveForDeleteFile(local_changes, local_file_type);
32 DCHECK(remote_file_change.IsDirectory());
33 return is_conflicting
34 ? ResolveForDeleteDirectoryInConflict(local_changes, local_file_type)
35 : ResolveForDeleteDirectory(local_changes, local_file_type);
36 }
37
38 NOTREACHED();
39 return REMOTE_SYNC_OPERATION_FAIL;
40 }
41
42 RemoteSyncOperationResolver::RemoteSyncOperationType
43 RemoteSyncOperationResolver::ResolveForAddOrUpdateFile(
44 const FileChangeList& local_changes,
45 SyncFileType local_file_type) {
46 switch (local_file_type) {
47 case SYNC_FILE_TYPE_UNKNOWN:
48 if (local_changes.empty() ||
49 local_changes.list().back().IsDelete())
kinuko 2013/04/24 14:54:50 You can add back() method to FileChangeList (we al
nhiroki 2013/04/25 06:54:43 Done.
50 return REMOTE_SYNC_OPERATION_ADD_FILE;
51 break;
52 case SYNC_FILE_TYPE_FILE:
53 if (local_changes.empty())
54 return REMOTE_SYNC_OPERATION_UPDATE_FILE;
55 if (local_changes.list().back().IsAddOrUpdateFile())
56 return REMOTE_SYNC_OPERATION_CONFLICT;
kinuko 2013/04/24 14:54:50 Does it make sense to change line 55-56 to: DCHEC
nhiroki 2013/04/25 06:54:43 Your idea looks good. It enables us to remove help
57 break;
58 case SYNC_FILE_TYPE_DIRECTORY:
59 if (local_changes.empty() ||
60 local_changes.list().back().IsAddDirectory())
61 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
62 break;
63 }
64 return REMOTE_SYNC_OPERATION_FAIL;
65 }
66
67 RemoteSyncOperationResolver::RemoteSyncOperationType
68 RemoteSyncOperationResolver::ResolveForAddOrUpdateFileInConflict(
69 const FileChangeList& local_changes,
70 SyncFileType local_file_type) {
71 switch (local_file_type) {
72 case SYNC_FILE_TYPE_UNKNOWN:
73 if (!local_changes.empty() &&
74 local_changes.list().back().IsDelete())
75 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
76 break;
77 case SYNC_FILE_TYPE_FILE:
78 if (local_changes.empty() ||
79 local_changes.list().back().IsAddOrUpdateFile())
80 return REMOTE_SYNC_OPERATION_CONFLICT;
81 break;
82 case SYNC_FILE_TYPE_DIRECTORY:
83 if (local_changes.empty() ||
84 local_changes.list().back().IsAddDirectory())
85 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
86 break;
87 }
88 return REMOTE_SYNC_OPERATION_FAIL;
89 }
90
91 RemoteSyncOperationResolver::RemoteSyncOperationType
92 RemoteSyncOperationResolver::ResolveForAddDirectory(
93 const FileChangeList& local_changes,
94 SyncFileType local_file_type) {
95 switch (local_file_type) {
96 case SYNC_FILE_TYPE_UNKNOWN:
97 if (local_changes.empty())
98 return REMOTE_SYNC_OPERATION_ADD_DIRECTORY;
99 if (local_changes.list().back().IsDelete())
100 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
101 break;
102 case SYNC_FILE_TYPE_FILE:
103 if (local_changes.empty() ||
104 local_changes.list().back().IsAddOrUpdateFile())
105 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
106 break;
107 case SYNC_FILE_TYPE_DIRECTORY:
108 if (local_changes.empty() ||
109 local_changes.list().back().IsAddDirectory())
110 return REMOTE_SYNC_OPERATION_NONE;
111 break;
112 }
113 return REMOTE_SYNC_OPERATION_FAIL;
114 }
115
116 RemoteSyncOperationResolver::RemoteSyncOperationType
117 RemoteSyncOperationResolver::ResolveForAddDirectoryInConflict(
118 const FileChangeList& local_changes,
119 SyncFileType local_file_type) {
120 switch (local_file_type) {
121 case SYNC_FILE_TYPE_UNKNOWN:
122 if (!local_changes.empty() && local_changes.list().back().IsDelete())
123 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
124 break;
125 case SYNC_FILE_TYPE_FILE:
126 if (local_changes.empty() ||
127 local_changes.list().back().IsAddOrUpdateFile())
128 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE;
129 break;
130 case SYNC_FILE_TYPE_DIRECTORY:
131 if (!local_changes.empty() &&
132 local_changes.list().back().IsAddDirectory())
133 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
134 break;
135 }
136 return REMOTE_SYNC_OPERATION_FAIL;
137 }
138
139 RemoteSyncOperationResolver::RemoteSyncOperationType
140 RemoteSyncOperationResolver::ResolveForDeleteFile(
141 const FileChangeList& local_changes,
142 SyncFileType local_file_type) {
143 switch (local_file_type) {
144 case SYNC_FILE_TYPE_UNKNOWN:
145 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
146 case SYNC_FILE_TYPE_FILE:
147 if (local_changes.empty())
148 return REMOTE_SYNC_OPERATION_DELETE_FILE;
149 if (local_changes.list().back().IsAddOrUpdateFile())
150 return REMOTE_SYNC_OPERATION_NONE;
151 break;
152 case SYNC_FILE_TYPE_DIRECTORY:
153 if (local_changes.empty() ||
154 local_changes.list().back().IsAddDirectory())
155 return REMOTE_SYNC_OPERATION_NONE;
156 break;
157 }
158 return REMOTE_SYNC_OPERATION_FAIL;
159 }
160
161 RemoteSyncOperationResolver::RemoteSyncOperationType
162 RemoteSyncOperationResolver::ResolveForDeleteFileInConflict(
163 const FileChangeList& local_changes,
164 SyncFileType local_file_type) {
165 switch (local_file_type) {
166 case SYNC_FILE_TYPE_UNKNOWN:
167 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
168 case SYNC_FILE_TYPE_FILE:
169 if (local_changes.empty() ||
170 local_changes.list().back().IsAddOrUpdateFile())
171 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
172 break;
173 case SYNC_FILE_TYPE_DIRECTORY:
174 if (local_changes.empty() ||
175 local_changes.list().back().IsAddDirectory())
176 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
177 break;
178 }
179 return REMOTE_SYNC_OPERATION_FAIL;
180 }
181
182 RemoteSyncOperationResolver::RemoteSyncOperationType
183 RemoteSyncOperationResolver::ResolveForDeleteDirectory(
184 const FileChangeList& local_changes,
185 SyncFileType local_file_type) {
186 switch (local_file_type) {
187 case SYNC_FILE_TYPE_UNKNOWN:
188 if (local_changes.empty() ||
189 local_changes.list().back().IsDelete())
190 return REMOTE_SYNC_OPERATION_NONE;
191 break;
192 case SYNC_FILE_TYPE_FILE:
193 if (local_changes.empty() ||
194 local_changes.list().back().IsAddOrUpdateFile())
195 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
196 break;
197 case SYNC_FILE_TYPE_DIRECTORY:
198 if (local_changes.empty())
199 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY;
200 if (local_changes.list().back().IsAddDirectory())
201 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
202 break;
203 }
204 return REMOTE_SYNC_OPERATION_FAIL;
205 }
206
207 RemoteSyncOperationResolver::RemoteSyncOperationType
208 RemoteSyncOperationResolver::ResolveForDeleteDirectoryInConflict(
209 const FileChangeList& local_changes,
210 SyncFileType local_file_type) {
211 switch (local_file_type) {
212 case SYNC_FILE_TYPE_UNKNOWN:
213 return REMOTE_SYNC_OPERATION_DELETE_METADATA;
214 case SYNC_FILE_TYPE_FILE:
215 if (local_changes.empty() ||
216 local_changes.list().back().IsAddOrUpdateFile())
217 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
218 break;
219 case SYNC_FILE_TYPE_DIRECTORY:
220 if (local_changes.empty())
221 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY;
222 if (local_changes.list().back().IsAddDirectory())
223 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL;
224 break;
225 }
226 return REMOTE_SYNC_OPERATION_FAIL;
227 }
228
229 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698