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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.cc

Issue 58953003: [SyncFS] Refine RemoteToLocalSyncer resolver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: buildfix Created 7 years, 1 month 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
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h " 5 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h "
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 21 matching lines...) Expand all
32 tracker.tracker_id(), &path)) 32 tracker.tracker_id(), &path))
33 return false; 33 return false;
34 34
35 GURL origin = 35 GURL origin =
36 extensions::Extension::GetBaseURLFromExtensionId(tracker.app_id()); 36 extensions::Extension::GetBaseURLFromExtensionId(tracker.app_id());
37 *url = sync_file_system::CreateSyncableFileSystemURL(origin, path); 37 *url = sync_file_system::CreateSyncableFileSystemURL(origin, path);
38 38
39 return true; 39 return true;
40 } 40 }
41 41
42 bool HasFolderAsParent(const FileDetails& details,
43 const std::string& folder_id) {
44 for (int i = 0; i < details.parent_folder_ids_size(); ++i) {
45 if (details.parent_folder_ids(i) == folder_id)
46 return true;
47 }
48 return false;
49 }
50
51 bool HasDisabledAppRoot(MetadataDatabase* database,
52 const FileTracker& tracker) {
53 DCHECK(tracker.active());
54 FileTracker app_root_tracker;
55 if (database->FindAppRootTracker(tracker.app_id(), &app_root_tracker)) {
56 DCHECK(app_root_tracker.tracker_kind() == TRACKER_KIND_APP_ROOT ||
57 app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT);
58 return app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT;
59 }
60 return false;
61 }
62
63 scoped_ptr<FileMetadata> GetFileMetadata(MetadataDatabase* database,
64 const std::string& file_id) {
65 scoped_ptr<FileMetadata> metadata(new FileMetadata);
66 if (!database->FindFileByFileID(file_id, metadata.get()))
67 metadata.reset();
68 return metadata.Pass();
69 }
70
42 } // namespace 71 } // namespace
43 72
44 RemoteToLocalSyncer::RemoteToLocalSyncer(SyncEngineContext* sync_context, 73 RemoteToLocalSyncer::RemoteToLocalSyncer(SyncEngineContext* sync_context,
45 int priorities) 74 int priorities)
46 : sync_context_(sync_context), 75 : sync_context_(sync_context),
47 priorities_(priorities), 76 priorities_(priorities),
48 missing_remote_details_(false),
49 missing_synced_details_(false),
50 deleted_remote_details_(false),
51 deleted_synced_details_(false),
52 title_changed_(false),
53 content_changed_(false),
54 needs_folder_listing_(false),
55 missing_parent_(false),
56 sync_root_modification_(false),
57 weak_ptr_factory_(this) { 77 weak_ptr_factory_(this) {
58 } 78 }
59 79
60 RemoteToLocalSyncer::~RemoteToLocalSyncer() { 80 RemoteToLocalSyncer::~RemoteToLocalSyncer() {
61 NOTIMPLEMENTED(); 81 NOTIMPLEMENTED();
62 } 82 }
63 83
64 void RemoteToLocalSyncer::Run(const SyncStatusCallback& callback) { 84 void RemoteToLocalSyncer::Run(const SyncStatusCallback& callback) {
65 if (priorities_ & PRIORITY_NORMAL) { 85 if (priorities_ & PRIORITY_NORMAL) {
66 if (metadata_database()->GetNormalPriorityDirtyTracker(&dirty_tracker_)) { 86 dirty_tracker_ = make_scoped_ptr(new FileTracker);
87 if (metadata_database()->GetNormalPriorityDirtyTracker(
88 dirty_tracker_.get())) {
67 ResolveRemoteChange(callback); 89 ResolveRemoteChange(callback);
68 return; 90 return;
69 } 91 }
70 } 92 }
71 93
72 if (priorities_ & PRIORITY_LOW) { 94 if (priorities_ & PRIORITY_LOW) {
73 if (metadata_database()->GetLowPriorityDirtyTracker(&dirty_tracker_)) { 95 dirty_tracker_ = make_scoped_ptr(new FileTracker);
96 if (metadata_database()->GetLowPriorityDirtyTracker(dirty_tracker_.get())) {
74 ResolveRemoteChange(callback); 97 ResolveRemoteChange(callback);
75 return; 98 return;
76 } 99 }
77 } 100 }
78 101
79 base::MessageLoopProxy::current()->PostTask( 102 base::MessageLoopProxy::current()->PostTask(
80 FROM_HERE, 103 FROM_HERE,
81 base::Bind(callback, SYNC_STATUS_NO_CHANGE_TO_SYNC)); 104 base::Bind(callback, SYNC_STATUS_NO_CHANGE_TO_SYNC));
82 } 105 }
83 106
84 void RemoteToLocalSyncer::AnalyzeCurrentDirtyTracker() {
85 if (!metadata_database()->FindFileByFileID(
86 dirty_tracker_.file_id(), &remote_metadata_)) {
87 missing_remote_details_ = true;
88 return;
89 }
90 missing_remote_details_ = false;
91
92 if (dirty_tracker_.has_synced_details() &&
93 !dirty_tracker_.synced_details().title().empty()) { // Just in case
94 missing_synced_details_ = true;
95 return;
96 }
97 missing_synced_details_ = false;
98
99 const FileDetails& synced_details = dirty_tracker_.synced_details();
100 const FileDetails& remote_details = remote_metadata_.details();
101
102 deleted_remote_details_ = remote_details.deleted();
103 deleted_synced_details_ = synced_details.deleted();
104 title_changed_ = synced_details.title() != remote_details.title();
105
106 switch (dirty_tracker_.synced_details().file_kind()) {
107 case FILE_KIND_UNSUPPORTED:
108 break;
109 case FILE_KIND_FILE:
110 content_changed_ = synced_details.md5() != remote_details.md5();
111 break;
112 case FILE_KIND_FOLDER:
113 needs_folder_listing_ = dirty_tracker_.needs_folder_listing();
114 break;
115 }
116
117 bool unknown_parent = !metadata_database()->FindTrackerByTrackerID(
118 dirty_tracker_.parent_tracker_id(), &parent_tracker_);
119 if (unknown_parent) {
120 DCHECK_EQ(metadata_database()->GetSyncRootTrackerID(),
121 dirty_tracker_.tracker_id());
122 sync_root_modification_ = true;
123 } else {
124 missing_parent_ = true;
125 std::string parent_folder_id = parent_tracker_.file_id();
126 for (int i = 0; i < remote_details.parent_folder_ids_size(); ++i) {
127 if (remote_details.parent_folder_ids(i) == parent_folder_id) {
128 missing_parent_ = false;
129 break;
130 }
131 }
132 }
133 }
134
135 void RemoteToLocalSyncer::ResolveRemoteChange( 107 void RemoteToLocalSyncer::ResolveRemoteChange(
136 const SyncStatusCallback& callback) { 108 const SyncStatusCallback& callback) {
137 AnalyzeCurrentDirtyTracker(); 109 DCHECK(dirty_tracker_);
110 remote_metadata_ = GetFileMetadata(
111 metadata_database(), dirty_tracker_->file_id());
138 112
139 if (missing_remote_details_) { 113 if (!remote_metadata_ || !remote_metadata_->has_details()) {
140 GetRemoteResource(callback); 114 if (remote_metadata_ && !remote_metadata_->has_details()) {
115 LOG(ERROR) << "Missing details of a remote file: "
116 << remote_metadata_->file_id();
117 NOTREACHED();
118 }
119 HandleMissingRemoteMetadata(callback);
141 return; 120 return;
142 } 121 }
143 122
144 if (missing_synced_details_) { 123 DCHECK(remote_metadata_);
145 if (deleted_remote_details_) { 124 DCHECK(remote_metadata_->has_details());
125 const FileDetails& remote_details = remote_metadata_->details();
126
127 if (!dirty_tracker_->active() ||
128 HasDisabledAppRoot(metadata_database(), *dirty_tracker_)) {
129 HandleInactiveTracker(callback);
130 return;
131 }
132 DCHECK(dirty_tracker_->active());
133 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
134
135 if (!dirty_tracker_->has_synced_details() ||
136 dirty_tracker_->synced_details().deleted()) {
137 if (remote_details.deleted()) {
138 if (dirty_tracker_->has_synced_details() &&
139 dirty_tracker_->synced_details().deleted()) {
140 // This should be handled by MetadataDatabase.
141 // MetadataDatabase should drop a tracker that marked as deleted if
142 // corresponding file metadata is marked as deleted.
143 LOG(ERROR) << "Found a stray deleted tracker: "
144 << dirty_tracker_->file_id();
145 NOTREACHED();
146 }
146 SyncCompleted(callback); 147 SyncCompleted(callback);
147 return; 148 return;
148 } 149 }
149 HandleNewFile(callback); 150 DCHECK(!remote_details.deleted());
150 return;
151 }
152 151
153 if (!dirty_tracker_.active()) { 152 if (remote_details.file_kind() == FILE_KIND_UNSUPPORTED) {
154 HandleOfflineSolvable(callback); 153 // All unsupported file must be inactive.
155 return; 154 LOG(ERROR) << "Found an unsupported active file: "
156 } 155 << remote_metadata_->file_id();
156 NOTREACHED();
157 callback.Run(SYNC_STATUS_FAILED);
158 return;
159 }
160 DCHECK(remote_details.file_kind() == FILE_KIND_FILE ||
161 remote_details.file_kind() == FILE_KIND_FOLDER);
157 162
158 if (deleted_synced_details_) { 163 if (remote_details.file_kind() == FILE_KIND_FILE) {
159 if (deleted_remote_details_) { 164 HandleNewFile(callback);
160 SyncCompleted(callback);
161 return; 165 return;
162 } 166 }
163 167
164 HandleNewFile(callback); 168 DCHECK(remote_details.file_kind() == FILE_KIND_FOLDER);
169 HandleNewFolder(callback);
165 return; 170 return;
166 } 171 }
172 DCHECK(dirty_tracker_->has_synced_details());
173 DCHECK(!dirty_tracker_->synced_details().deleted());
174 const FileDetails& synced_details = dirty_tracker_->synced_details();
167 175
168 if (deleted_remote_details_) { 176 if (remote_details.deleted()) {
169 HandleDeletion(callback); 177 HandleDeletion(callback);
170 return; 178 return;
171 } 179 }
172 180
173 if (title_changed_) { 181 // Most of remote_details field is valid from here.
182 DCHECK(!remote_details.deleted());
183
184 if (synced_details.file_kind() != remote_details.file_kind()) {
185 LOG(ERROR) << "Found type mismatch between remote and local file: "
186 << dirty_tracker_->file_id()
187 << " type: (local) " << synced_details.file_kind()
188 << " vs (remote) " << remote_details.file_kind();
189 NOTREACHED();
190 callback.Run(SYNC_STATUS_FAILED);
191 return;
192 }
193 DCHECK_EQ(synced_details.file_kind(), remote_details.file_kind());
194
195 if (synced_details.file_kind() == FILE_KIND_UNSUPPORTED) {
196 LOG(ERROR) << "Found an unsupported active file: "
197 << remote_metadata_->file_id();
198 NOTREACHED();
199 callback.Run(SYNC_STATUS_FAILED);
200 return;
201 }
202 DCHECK(remote_details.file_kind() == FILE_KIND_FILE ||
203 remote_details.file_kind() == FILE_KIND_FOLDER);
204
205 if (synced_details.title() != remote_details.title()) {
174 HandleRename(callback); 206 HandleRename(callback);
175 return; 207 return;
176 } 208 }
209 DCHECK_EQ(synced_details.title(), remote_details.title());
177 210
178 if (content_changed_) { 211 if (dirty_tracker_->tracker_id() !=
179 HandleContentUpdate(callback); 212 metadata_database()->GetSyncRootTrackerID()) {
180 return; 213 FileTracker parent_tracker;
214 if (!metadata_database()->FindTrackerByTrackerID(
215 dirty_tracker_->parent_tracker_id(), &parent_tracker)) {
216 LOG(ERROR) << "Missing parent tracker for a non sync-root tracker: "
217 << dirty_tracker_->file_id();
218 NOTREACHED();
219 callback.Run(SYNC_STATUS_FAILED);
220 return;
221 }
222
223 if (!HasFolderAsParent(remote_details, parent_tracker.file_id())) {
224 HandleReorganize(callback);
225 return;
226 }
181 } 227 }
182 228
183 if (needs_folder_listing_) { 229 if (synced_details.file_kind() == FILE_KIND_FILE) {
184 ListFolderContent(callback); 230 if (synced_details.md5() != remote_details.md5()) {
185 return; 231 HandleContentUpdate(callback);
186 } 232 return;
187 233 }
188 if (missing_parent_) { 234 } else {
189 HandleReorganize(callback); 235 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind());
190 return; 236 if (dirty_tracker_->needs_folder_listing()) {
237 HandleFolderContentListing(callback);
238 return;
239 }
191 } 240 }
192 241
193 HandleOfflineSolvable(callback); 242 HandleOfflineSolvable(callback);
194 } 243 }
195 244
196 void RemoteToLocalSyncer::GetRemoteResource( 245 void RemoteToLocalSyncer::HandleMissingRemoteMetadata(
197 const SyncStatusCallback& callback) { 246 const SyncStatusCallback& callback) {
247 DCHECK(dirty_tracker_);
248
198 drive_service()->GetResourceEntry( 249 drive_service()->GetResourceEntry(
199 dirty_tracker_.file_id(), 250 dirty_tracker_->file_id(),
200 base::Bind(&RemoteToLocalSyncer::DidGetRemoteResource, 251 base::Bind(&RemoteToLocalSyncer::DidGetRemoteMetadata,
201 weak_ptr_factory_.GetWeakPtr(), 252 weak_ptr_factory_.GetWeakPtr(),
202 callback, 253 callback,
203 metadata_database()->GetLargestKnownChangeID())); 254 metadata_database()->GetLargestKnownChangeID()));
204 } 255 }
205 256
206 void RemoteToLocalSyncer::DidGetRemoteResource( 257 void RemoteToLocalSyncer::DidGetRemoteMetadata(
207 const SyncStatusCallback& callback, 258 const SyncStatusCallback& callback,
208 int64 change_id, 259 int64 change_id,
209 google_apis::GDataErrorCode error, 260 google_apis::GDataErrorCode error,
210 scoped_ptr<google_apis::ResourceEntry> entry) { 261 scoped_ptr<google_apis::ResourceEntry> entry) {
211 metadata_database()->UpdateByFileResource( 262 metadata_database()->UpdateByFileResource(
212 change_id, 263 change_id,
213 *drive::util::ConvertResourceEntryToFileResource(*entry), 264 *drive::util::ConvertResourceEntryToFileResource(*entry),
214 callback); 265 base::Bind(&RemoteToLocalSyncer::DidUpdateDatabaseForRemoteMetadata,
266 weak_ptr_factory_.GetWeakPtr(), callback));
267 }
268
269 void RemoteToLocalSyncer::DidUpdateDatabaseForRemoteMetadata(
270 const SyncStatusCallback& callback,
271 SyncStatusCode status) {
272 if (status != SYNC_STATUS_OK) {
273 callback.Run(status);
274 return;
275 }
276 SyncCompleted(callback);
277 }
278
279 void RemoteToLocalSyncer::HandleInactiveTracker(
280 const SyncStatusCallback& callback) {
281 DCHECK(dirty_tracker_);
282 DCHECK(!dirty_tracker_->active() ||
283 HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
284
285 DCHECK(remote_metadata_);
286 DCHECK(remote_metadata_->has_details());
287
288 NOTIMPLEMENTED();
289 callback.Run(SYNC_STATUS_FAILED);
290 }
291
292 void RemoteToLocalSyncer::HandleNewFile(
293 const SyncStatusCallback& callback) {
294 DCHECK(dirty_tracker_);
295 DCHECK(dirty_tracker_->active());
296 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
297 DCHECK(!dirty_tracker_->has_synced_details() ||
298 dirty_tracker_->synced_details().deleted());
299
300 DCHECK(remote_metadata_);
301 DCHECK(remote_metadata_->has_details());
302 DCHECK(!remote_metadata_->details().deleted());
303 DCHECK_EQ(FILE_KIND_FILE, remote_metadata_->details().file_kind());
304
305 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForNewFile,
306 weak_ptr_factory_.GetWeakPtr(), callback));
307 }
308
309 void RemoteToLocalSyncer::DidPrepareForNewFile(
310 const SyncStatusCallback& callback,
311 SyncStatusCode status) {
312 NOTIMPLEMENTED();
313 callback.Run(SYNC_STATUS_FAILED);
314 }
315
316 void RemoteToLocalSyncer::HandleNewFolder(const SyncStatusCallback& callback) {
317 DCHECK(dirty_tracker_);
318 DCHECK(dirty_tracker_->active());
319 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
320
321 DCHECK(remote_metadata_);
322 DCHECK(remote_metadata_->has_details());
323 DCHECK(!remote_metadata_->details().deleted());
324 DCHECK_EQ(FILE_KIND_FOLDER, remote_metadata_->details().file_kind());
325
326 NOTIMPLEMENTED();
327 callback.Run(SYNC_STATUS_FAILED);
215 } 328 }
216 329
217 void RemoteToLocalSyncer::HandleDeletion( 330 void RemoteToLocalSyncer::HandleDeletion(
218 const SyncStatusCallback& callback) { 331 const SyncStatusCallback& callback) {
332 DCHECK(dirty_tracker_);
333 DCHECK(dirty_tracker_->active());
334 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
335 DCHECK(dirty_tracker_->has_synced_details());
336 DCHECK(!dirty_tracker_->synced_details().deleted());
337
338 DCHECK(remote_metadata_);
339 DCHECK(remote_metadata_->has_details());
340 DCHECK(remote_metadata_->details().deleted());
341
219 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForDeletion, 342 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForDeletion,
220 weak_ptr_factory_.GetWeakPtr(), callback)); 343 weak_ptr_factory_.GetWeakPtr(), callback));
221 } 344 }
222 345
223 void RemoteToLocalSyncer::DidPrepareForDeletion( 346 void RemoteToLocalSyncer::DidPrepareForDeletion(
224 const SyncStatusCallback& callback, 347 const SyncStatusCallback& callback,
225 SyncStatusCode status) { 348 SyncStatusCode status) {
226 if (status != SYNC_STATUS_OK) { 349 if (status != SYNC_STATUS_OK) {
227 callback.Run(status); 350 callback.Run(status);
228 return; 351 return;
229 } 352 }
230 353
231 if (local_changes_.empty()) { 354 if (local_changes_.empty()) {
232 DeleteLocalFile(callback); 355 DeleteLocalFile(callback);
233 return; 356 return;
234 } 357 }
235 358
236 // File is locally deleted or locally updated. 359 // File is locally deleted or locally updated.
237 SyncCompleted(callback); 360 SyncCompleted(callback);
238 } 361 }
239 362
240 void RemoteToLocalSyncer::HandleNewFile( 363 void RemoteToLocalSyncer::HandleRename(
241 const SyncStatusCallback& callback) { 364 const SyncStatusCallback& callback) {
242 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForNewFile, 365 DCHECK(dirty_tracker_);
243 weak_ptr_factory_.GetWeakPtr(), callback)); 366 DCHECK(dirty_tracker_->active());
367 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
368 DCHECK(dirty_tracker_->has_synced_details());
369 DCHECK(!dirty_tracker_->synced_details().deleted());
370
371 DCHECK(remote_metadata_);
372 DCHECK(remote_metadata_->has_details());
373 DCHECK(!remote_metadata_->details().deleted());
374
375 DCHECK_EQ(dirty_tracker_->synced_details().file_kind(),
376 remote_metadata_->details().file_kind());
377 DCHECK_NE(dirty_tracker_->synced_details().title(),
378 remote_metadata_->details().title());
379
380 NOTIMPLEMENTED();
381 callback.Run(SYNC_STATUS_FAILED);
244 } 382 }
245 383
246 void RemoteToLocalSyncer::DidPrepareForNewFile( 384 void RemoteToLocalSyncer::HandleReorganize(
247 const SyncStatusCallback& callback, 385 const SyncStatusCallback& callback) {
248 SyncStatusCode status) { 386 DCHECK(dirty_tracker_);
387 DCHECK(dirty_tracker_->active());
388 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
389 DCHECK(dirty_tracker_->has_synced_details());
390 DCHECK(!dirty_tracker_->synced_details().deleted());
391
392 DCHECK(remote_metadata_);
393 DCHECK(remote_metadata_->has_details());
394 DCHECK(!remote_metadata_->details().deleted());
395
249 NOTIMPLEMENTED(); 396 NOTIMPLEMENTED();
250 callback.Run(SYNC_STATUS_FAILED); 397 callback.Run(SYNC_STATUS_FAILED);
251 } 398 }
252 399
253 void RemoteToLocalSyncer::HandleContentUpdate( 400 void RemoteToLocalSyncer::HandleContentUpdate(
254 const SyncStatusCallback& callback) { 401 const SyncStatusCallback& callback) {
402 DCHECK(dirty_tracker_);
403 DCHECK(dirty_tracker_->active());
404 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
405 DCHECK(dirty_tracker_->has_synced_details());
406 DCHECK(!dirty_tracker_->synced_details().deleted());
407 DCHECK_EQ(FILE_KIND_FILE, dirty_tracker_->synced_details().file_kind());
408
409 DCHECK(remote_metadata_);
410 DCHECK(remote_metadata_->has_details());
411 DCHECK(!remote_metadata_->details().deleted());
412
413 DCHECK_NE(dirty_tracker_->synced_details().md5(),
414 remote_metadata_->details().md5());
415
255 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForContentUpdate, 416 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForContentUpdate,
256 weak_ptr_factory_.GetWeakPtr(), callback)); 417 weak_ptr_factory_.GetWeakPtr(), callback));
257 } 418 }
258 419
259 void RemoteToLocalSyncer::DidPrepareForContentUpdate( 420 void RemoteToLocalSyncer::DidPrepareForContentUpdate(
260 const SyncStatusCallback& callback, 421 const SyncStatusCallback& callback,
261 SyncStatusCode status) { 422 SyncStatusCode status) {
262 NOTIMPLEMENTED(); 423 NOTIMPLEMENTED();
263 callback.Run(SYNC_STATUS_FAILED); 424 callback.Run(SYNC_STATUS_FAILED);
264 } 425 }
265 426
266 void RemoteToLocalSyncer::ListFolderContent( 427 void RemoteToLocalSyncer::HandleFolderContentListing(
267 const SyncStatusCallback& callback) { 428 const SyncStatusCallback& callback) {
429 DCHECK(dirty_tracker_);
430 DCHECK(dirty_tracker_->active());
431 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
432 DCHECK(dirty_tracker_->has_synced_details());
433 DCHECK(!dirty_tracker_->synced_details().deleted());
434 DCHECK_EQ(FILE_KIND_FOLDER, dirty_tracker_->synced_details().file_kind());
435 DCHECK(dirty_tracker_->needs_folder_listing());
436
437 DCHECK(remote_metadata_);
438 DCHECK(remote_metadata_->has_details());
439 DCHECK(!remote_metadata_->details().deleted());
440
268 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForFolderListing, 441 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForFolderListing,
269 weak_ptr_factory_.GetWeakPtr(), callback)); 442 weak_ptr_factory_.GetWeakPtr(), callback));
270 } 443 }
271 444
272 void RemoteToLocalSyncer::DidPrepareForFolderListing( 445 void RemoteToLocalSyncer::DidPrepareForFolderListing(
273 const SyncStatusCallback& callback, 446 const SyncStatusCallback& callback,
274 SyncStatusCode status) { 447 SyncStatusCode status) {
275 NOTIMPLEMENTED(); 448 NOTIMPLEMENTED();
276 callback.Run(SYNC_STATUS_FAILED); 449 callback.Run(SYNC_STATUS_FAILED);
277 } 450 }
278 451
279 void RemoteToLocalSyncer::HandleRename(
280 const SyncStatusCallback& callback) {
281 NOTIMPLEMENTED();
282 callback.Run(SYNC_STATUS_FAILED);
283 }
284
285 void RemoteToLocalSyncer::HandleReorganize(
286 const SyncStatusCallback& callback) {
287 NOTIMPLEMENTED();
288 callback.Run(SYNC_STATUS_FAILED);
289 }
290
291 void RemoteToLocalSyncer::HandleOfflineSolvable( 452 void RemoteToLocalSyncer::HandleOfflineSolvable(
292 const SyncStatusCallback& callback) { 453 const SyncStatusCallback& callback) {
454 DCHECK(dirty_tracker_);
455 DCHECK(dirty_tracker_->active());
456 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_));
457 DCHECK(dirty_tracker_->has_synced_details());
458 DCHECK(!dirty_tracker_->synced_details().deleted());
459
460 DCHECK((dirty_tracker_->synced_details().file_kind() == FILE_KIND_FOLDER &&
461 !dirty_tracker_->needs_folder_listing()) ||
462 (dirty_tracker_->synced_details().file_kind() == FILE_KIND_FILE &&
463 dirty_tracker_->synced_details().md5() ==
464 remote_metadata_->details().md5()));
465
466 DCHECK(remote_metadata_);
467 DCHECK(remote_metadata_->has_details());
468 DCHECK(!remote_metadata_->details().deleted());
469
293 NOTIMPLEMENTED(); 470 NOTIMPLEMENTED();
294 callback.Run(SYNC_STATUS_FAILED); 471 callback.Run(SYNC_STATUS_FAILED);
295 } 472 }
296 473
297 void RemoteToLocalSyncer::SyncCompleted( 474 void RemoteToLocalSyncer::SyncCompleted(
298 const SyncStatusCallback& callback) { 475 const SyncStatusCallback& callback) {
299 NOTIMPLEMENTED(); 476 NOTIMPLEMENTED();
300 callback.Run(SYNC_STATUS_FAILED); 477 callback.Run(SYNC_STATUS_FAILED);
301 478
302 // TODO(tzik): Clear dirty mark of the |dirty_tracker|, report operation log 479 // TODO(tzik): Clear dirty mark of the |dirty_tracker|, report operation log
303 // the observer. 480 // the observer.
304 } 481 }
305 482
306 void RemoteToLocalSyncer::Prepare(const SyncStatusCallback& callback) { 483 void RemoteToLocalSyncer::Prepare(const SyncStatusCallback& callback) {
307 bool should_success = BuildFileSystemURL( 484 bool should_success = BuildFileSystemURL(
308 metadata_database(), dirty_tracker_, &url_); 485 metadata_database(), *dirty_tracker_, &url_);
309 DCHECK(should_success); 486 DCHECK(should_success);
310 remote_change_processor()->PrepareForProcessRemoteChange( 487 remote_change_processor()->PrepareForProcessRemoteChange(
311 url_, 488 url_,
312 base::Bind(&RemoteToLocalSyncer::DidPrepare, 489 base::Bind(&RemoteToLocalSyncer::DidPrepare,
313 weak_ptr_factory_.GetWeakPtr(), 490 weak_ptr_factory_.GetWeakPtr(),
314 callback)); 491 callback));
315 } 492 }
316 493
317 void RemoteToLocalSyncer::DidPrepare(const SyncStatusCallback& callback, 494 void RemoteToLocalSyncer::DidPrepare(const SyncStatusCallback& callback,
318 SyncStatusCode status, 495 SyncStatusCode status,
319 const SyncFileMetadata& local_metadata, 496 const SyncFileMetadata& local_metadata,
320 const FileChangeList& local_changes) { 497 const FileChangeList& local_changes) {
321 if (status != SYNC_STATUS_OK) { 498 if (status != SYNC_STATUS_OK) {
322 callback.Run(status); 499 callback.Run(status);
323 return; 500 return;
324 } 501 }
325 502
326 local_metadata_ = local_metadata; 503 local_metadata_ = local_metadata;
327 local_changes_ = local_changes; 504 local_changes_ = local_changes;
328 505
329 callback.Run(status); 506 callback.Run(status);
330 } 507 }
331 508
332 void RemoteToLocalSyncer::DeleteLocalFile(const SyncStatusCallback& callback) { 509 void RemoteToLocalSyncer::DeleteLocalFile(const SyncStatusCallback& callback) {
333 if (sync_root_modification_) { 510 if (dirty_tracker_->tracker_id() ==
511 metadata_database()->GetSyncRootTrackerID()) {
334 // TODO(tzik): Sync-root is deleted. Needs special handling. 512 // TODO(tzik): Sync-root is deleted. Needs special handling.
335 NOTIMPLEMENTED(); 513 NOTIMPLEMENTED();
336 callback.Run(SYNC_STATUS_FAILED); 514 callback.Run(SYNC_STATUS_FAILED);
337 return; 515 return;
338 } 516 }
339 517
340 if (dirty_tracker_.tracker_kind() == TRACKER_KIND_APP_ROOT) { 518 if (dirty_tracker_->tracker_kind() == TRACKER_KIND_APP_ROOT) {
341 // TODO(tzik): Active app-root is deleted. Needs special handling. 519 // TODO(tzik): Active app-root is deleted. Needs special handling.
342 NOTIMPLEMENTED(); 520 NOTIMPLEMENTED();
343 callback.Run(SYNC_STATUS_FAILED); 521 callback.Run(SYNC_STATUS_FAILED);
344 return; 522 return;
345 } 523 }
346 524
347 remote_change_processor()->ApplyRemoteChange( 525 remote_change_processor()->ApplyRemoteChange(
348 FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_UNKNOWN), 526 FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_UNKNOWN),
349 base::FilePath(), 527 base::FilePath(),
350 url_, 528 url_,
(...skipping 20 matching lines...) Expand all
371 return sync_context_->GetMetadataDatabase(); 549 return sync_context_->GetMetadataDatabase();
372 } 550 }
373 551
374 RemoteChangeProcessor* RemoteToLocalSyncer::remote_change_processor() { 552 RemoteChangeProcessor* RemoteToLocalSyncer::remote_change_processor() {
375 DCHECK(sync_context_->GetRemoteChangeProcessor()); 553 DCHECK(sync_context_->GetRemoteChangeProcessor());
376 return sync_context_->GetRemoteChangeProcessor(); 554 return sync_context_->GetRemoteChangeProcessor();
377 } 555 }
378 556
379 } // namespace drive_backend 557 } // namespace drive_backend
380 } // namespace sync_file_system 558 } // namespace sync_file_system
OLDNEW
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698