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

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

Issue 1873683002: Convert //chrome/browser/sync_file_system from scoped_ptr to std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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
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/local_to_remote_syncer.h " 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h "
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 19 matching lines...) Expand all
30 #include "components/drive/service/drive_service_interface.h" 30 #include "components/drive/service/drive_service_interface.h"
31 #include "google_apis/drive/drive_api_parser.h" 31 #include "google_apis/drive/drive_api_parser.h"
32 #include "net/base/mime_util.h" 32 #include "net/base/mime_util.h"
33 #include "storage/common/fileapi/file_system_util.h" 33 #include "storage/common/fileapi/file_system_util.h"
34 34
35 namespace sync_file_system { 35 namespace sync_file_system {
36 namespace drive_backend { 36 namespace drive_backend {
37 37
38 namespace { 38 namespace {
39 39
40 scoped_ptr<FileTracker> FindTrackerByID(MetadataDatabase* metadata_database, 40 std::unique_ptr<FileTracker> FindTrackerByID(
41 int64_t tracker_id) { 41 MetadataDatabase* metadata_database,
42 scoped_ptr<FileTracker> tracker(new FileTracker); 42 int64_t tracker_id) {
43 std::unique_ptr<FileTracker> tracker(new FileTracker);
43 if (metadata_database->FindTrackerByTrackerID(tracker_id, tracker.get())) 44 if (metadata_database->FindTrackerByTrackerID(tracker_id, tracker.get()))
44 return tracker; 45 return tracker;
45 return scoped_ptr<FileTracker>(); 46 return std::unique_ptr<FileTracker>();
46 } 47 }
47 48
48 bool GetKnownChangeID(MetadataDatabase* metadata_database, 49 bool GetKnownChangeID(MetadataDatabase* metadata_database,
49 const std::string& file_id, 50 const std::string& file_id,
50 int64_t* change_id) { 51 int64_t* change_id) {
51 FileMetadata remote_file_metadata; 52 FileMetadata remote_file_metadata;
52 if (!metadata_database->FindFileByFileID(file_id, &remote_file_metadata)) 53 if (!metadata_database->FindFileByFileID(file_id, &remote_file_metadata))
53 return false; 54 return false;
54 *change_id = remote_file_metadata.details().change_id(); 55 *change_id = remote_file_metadata.details().change_id();
55 return true; 56 return true;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 needs_remote_change_listing_(false), 90 needs_remote_change_listing_(false),
90 weak_ptr_factory_(this) { 91 weak_ptr_factory_(this) {
91 DCHECK(local_is_missing_ || 92 DCHECK(local_is_missing_ ||
92 local_change.file_type() == local_metadata.file_type) 93 local_change.file_type() == local_metadata.file_type)
93 << local_change.DebugString() << " metadata:" << local_metadata.file_type; 94 << local_change.DebugString() << " metadata:" << local_metadata.file_type;
94 } 95 }
95 96
96 LocalToRemoteSyncer::~LocalToRemoteSyncer() { 97 LocalToRemoteSyncer::~LocalToRemoteSyncer() {
97 } 98 }
98 99
99 void LocalToRemoteSyncer::RunPreflight(scoped_ptr<SyncTaskToken> token) { 100 void LocalToRemoteSyncer::RunPreflight(std::unique_ptr<SyncTaskToken> token) {
100 token->InitializeTaskLog("Local -> Remote"); 101 token->InitializeTaskLog("Local -> Remote");
101 102
102 if (!IsContextReady()) { 103 if (!IsContextReady()) {
103 token->RecordLog("Context not ready."); 104 token->RecordLog("Context not ready.");
104 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED); 105 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED);
105 return; 106 return;
106 } 107 }
107 108
108 token->RecordLog(base::StringPrintf( 109 token->RecordLog(base::StringPrintf(
109 "Start: %s on %s@%s %s", 110 "Start: %s on %s@%s %s",
110 local_change_.DebugString().c_str(), 111 local_change_.DebugString().c_str(),
111 url_.path().AsUTF8Unsafe().c_str(), 112 url_.path().AsUTF8Unsafe().c_str(),
112 url_.origin().host().c_str(), 113 url_.origin().host().c_str(),
113 local_is_missing_ ? "(missing)" : "")); 114 local_is_missing_ ? "(missing)" : ""));
114 115
115 if (local_is_missing_ && !local_change_.IsDelete()) { 116 if (local_is_missing_ && !local_change_.IsDelete()) {
116 // Stray file, we can just return. 117 // Stray file, we can just return.
117 token->RecordLog("Missing file for non-delete change."); 118 token->RecordLog("Missing file for non-delete change.");
118 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); 119 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK);
119 return; 120 return;
120 } 121 }
121 122
122 std::string app_id = url_.origin().host(); 123 std::string app_id = url_.origin().host();
123 base::FilePath path = url_.path(); 124 base::FilePath path = url_.path();
124 125
125 scoped_ptr<FileTracker> active_ancestor_tracker(new FileTracker); 126 std::unique_ptr<FileTracker> active_ancestor_tracker(new FileTracker);
126 base::FilePath active_ancestor_path; 127 base::FilePath active_ancestor_path;
127 if (!metadata_database()->FindNearestActiveAncestor( 128 if (!metadata_database()->FindNearestActiveAncestor(
128 app_id, path, 129 app_id, path,
129 active_ancestor_tracker.get(), &active_ancestor_path)) { 130 active_ancestor_tracker.get(), &active_ancestor_path)) {
130 // The app is disabled or not registered. 131 // The app is disabled or not registered.
131 token->RecordLog("App is disabled or not registered"); 132 token->RecordLog("App is disabled or not registered");
132 SyncTaskManager::NotifyTaskDone(std::move(token), 133 SyncTaskManager::NotifyTaskDone(std::move(token),
133 SYNC_STATUS_UNKNOWN_ORIGIN); 134 SYNC_STATUS_UNKNOWN_ORIGIN);
134 return; 135 return;
135 } 136 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 std::move(token)); 244 std::move(token));
244 return; 245 return;
245 } 246 }
246 247
247 token->RecordLog("Detected a new folder."); 248 token->RecordLog("Detected a new folder.");
248 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, 249 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder,
249 weak_ptr_factory_.GetWeakPtr()), 250 weak_ptr_factory_.GetWeakPtr()),
250 std::move(token)); 251 std::move(token));
251 } 252 }
252 253
253 void LocalToRemoteSyncer::MoveToBackground(const Continuation& continuation, 254 void LocalToRemoteSyncer::MoveToBackground(
254 scoped_ptr<SyncTaskToken> token) { 255 const Continuation& continuation,
255 scoped_ptr<TaskBlocker> blocker(new TaskBlocker); 256 std::unique_ptr<SyncTaskToken> token) {
257 std::unique_ptr<TaskBlocker> blocker(new TaskBlocker);
256 blocker->app_id = url_.origin().host(); 258 blocker->app_id = url_.origin().host();
257 blocker->paths.push_back(target_path_); 259 blocker->paths.push_back(target_path_);
258 260
259 if (remote_file_tracker_) { 261 if (remote_file_tracker_) {
260 if (!GetKnownChangeID(metadata_database(), 262 if (!GetKnownChangeID(metadata_database(),
261 remote_file_tracker_->file_id(), 263 remote_file_tracker_->file_id(),
262 &remote_file_change_id_)) { 264 &remote_file_change_id_)) {
263 NOTREACHED(); 265 NOTREACHED();
264 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); 266 SyncCompleted(std::move(token), SYNC_STATUS_FAILED);
265 return; 267 return;
266 } 268 }
267 269
268 blocker->tracker_ids.push_back(remote_file_tracker_->tracker_id()); 270 blocker->tracker_ids.push_back(remote_file_tracker_->tracker_id());
269 blocker->file_ids.push_back(remote_file_tracker_->file_id()); 271 blocker->file_ids.push_back(remote_file_tracker_->file_id());
270 } 272 }
271 273
272 // Run current task as a background task with |blocker|. 274 // Run current task as a background task with |blocker|.
273 // After the invocation of ContinueAsBackgroundTask 275 // After the invocation of ContinueAsBackgroundTask
274 SyncTaskManager::UpdateTaskBlocker( 276 SyncTaskManager::UpdateTaskBlocker(
275 std::move(token), std::move(blocker), 277 std::move(token), std::move(blocker),
276 base::Bind(&LocalToRemoteSyncer::ContinueAsBackgroundTask, 278 base::Bind(&LocalToRemoteSyncer::ContinueAsBackgroundTask,
277 weak_ptr_factory_.GetWeakPtr(), continuation)); 279 weak_ptr_factory_.GetWeakPtr(), continuation));
278 } 280 }
279 281
280 void LocalToRemoteSyncer::ContinueAsBackgroundTask( 282 void LocalToRemoteSyncer::ContinueAsBackgroundTask(
281 const Continuation& continuation, 283 const Continuation& continuation,
282 scoped_ptr<SyncTaskToken> token) { 284 std::unique_ptr<SyncTaskToken> token) {
283 // The SyncTask runs as a background task beyond this point. 285 // The SyncTask runs as a background task beyond this point.
284 // Note that any task can run between MoveToBackground() and 286 // Note that any task can run between MoveToBackground() and
285 // ContinueAsBackgroundTask(), so we need to make sure other tasks didn't 287 // ContinueAsBackgroundTask(), so we need to make sure other tasks didn't
286 // affect to the current LocalToRemoteSyncer task. 288 // affect to the current LocalToRemoteSyncer task.
287 // 289 //
288 // - For RemoteToLocalSyncer, it doesn't actually run beyond 290 // - For RemoteToLocalSyncer, it doesn't actually run beyond
289 // PrepareForProcessRemoteChange() since it should be blocked in 291 // PrepareForProcessRemoteChange() since it should be blocked in
290 // LocalFileSyncService. 292 // LocalFileSyncService.
291 // - For ListChangesTask, it may update FileMetatada together with |change_id| 293 // - For ListChangesTask, it may update FileMetatada together with |change_id|
292 // and may delete FileTracker. So, ensure |change_id| is not changed and 294 // and may delete FileTracker. So, ensure |change_id| is not changed and
(...skipping 15 matching lines...) Expand all
308 if (!metadata_database()->FindTrackerByTrackerID( 310 if (!metadata_database()->FindTrackerByTrackerID(
309 remote_file_tracker_->tracker_id(), nullptr)) { 311 remote_file_tracker_->tracker_id(), nullptr)) {
310 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); 312 SyncCompleted(std::move(token), SYNC_STATUS_RETRY);
311 return; 313 return;
312 } 314 }
313 } 315 }
314 316
315 continuation.Run(std::move(token)); 317 continuation.Run(std::move(token));
316 } 318 }
317 319
318 void LocalToRemoteSyncer::SyncCompleted(scoped_ptr<SyncTaskToken> token, 320 void LocalToRemoteSyncer::SyncCompleted(std::unique_ptr<SyncTaskToken> token,
319 SyncStatusCode status) { 321 SyncStatusCode status) {
320 if (status == SYNC_STATUS_OK && retry_on_success_) 322 if (status == SYNC_STATUS_OK && retry_on_success_)
321 status = SYNC_STATUS_RETRY; 323 status = SYNC_STATUS_RETRY;
322 324
323 if (needs_remote_change_listing_) 325 if (needs_remote_change_listing_)
324 status = SYNC_STATUS_FILE_BUSY; 326 status = SYNC_STATUS_FILE_BUSY;
325 327
326 token->RecordLog(base::StringPrintf( 328 token->RecordLog(base::StringPrintf(
327 "Finished: action=%s, status=%s for %s@%s", 329 "Finished: action=%s, status=%s for %s@%s",
328 SyncActionToString(sync_action_), 330 SyncActionToString(sync_action_),
329 SyncStatusCodeToString(status), 331 SyncStatusCodeToString(status),
330 target_path_.AsUTF8Unsafe().c_str(), 332 target_path_.AsUTF8Unsafe().c_str(),
331 url_.origin().host().c_str())); 333 url_.origin().host().c_str()));
332 334
333 SyncTaskManager::NotifyTaskDone(std::move(token), status); 335 SyncTaskManager::NotifyTaskDone(std::move(token), status);
334 } 336 }
335 337
336 void LocalToRemoteSyncer::HandleConflict(scoped_ptr<SyncTaskToken> token) { 338 void LocalToRemoteSyncer::HandleConflict(std::unique_ptr<SyncTaskToken> token) {
337 DCHECK(remote_file_tracker_); 339 DCHECK(remote_file_tracker_);
338 DCHECK(remote_file_tracker_->has_synced_details()); 340 DCHECK(remote_file_tracker_->has_synced_details());
339 DCHECK(remote_file_tracker_->active()); 341 DCHECK(remote_file_tracker_->active());
340 DCHECK(remote_file_tracker_->dirty()); 342 DCHECK(remote_file_tracker_->dirty());
341 343
342 if (local_is_missing_) { 344 if (local_is_missing_) {
343 SyncCompleted(std::move(token), SYNC_STATUS_OK); 345 SyncCompleted(std::move(token), SYNC_STATUS_OK);
344 return; 346 return;
345 } 347 }
346 348
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 return; 381 return;
380 } 382 }
381 383
382 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, 384 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder,
383 weak_ptr_factory_.GetWeakPtr()), 385 weak_ptr_factory_.GetWeakPtr()),
384 std::move(token)); 386 std::move(token));
385 } 387 }
386 388
387 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( 389 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder(
388 const FileDetails& details, 390 const FileDetails& details,
389 scoped_ptr<SyncTaskToken> token) { 391 std::unique_ptr<SyncTaskToken> token) {
390 SyncStatusCode status = metadata_database()->UpdateTracker( 392 SyncStatusCode status = metadata_database()->UpdateTracker(
391 remote_file_tracker_->tracker_id(), details); 393 remote_file_tracker_->tracker_id(), details);
392 SyncCompleted(std::move(token), status); 394 SyncCompleted(std::move(token), status);
393 } 395 }
394 396
395 void LocalToRemoteSyncer::HandleExistingRemoteFile( 397 void LocalToRemoteSyncer::HandleExistingRemoteFile(
396 scoped_ptr<SyncTaskToken> token) { 398 std::unique_ptr<SyncTaskToken> token) {
397 DCHECK(remote_file_tracker_); 399 DCHECK(remote_file_tracker_);
398 DCHECK(!remote_file_tracker_->dirty()); 400 DCHECK(!remote_file_tracker_->dirty());
399 DCHECK(remote_file_tracker_->active()); 401 DCHECK(remote_file_tracker_->active());
400 DCHECK(remote_file_tracker_->has_synced_details()); 402 DCHECK(remote_file_tracker_->has_synced_details());
401 403
402 if (local_is_missing_) { 404 if (local_is_missing_) {
403 // Local file deletion for existing remote file. 405 // Local file deletion for existing remote file.
404 MoveToBackground(base::Bind(&LocalToRemoteSyncer::DeleteRemoteFile, 406 MoveToBackground(base::Bind(&LocalToRemoteSyncer::DeleteRemoteFile,
405 weak_ptr_factory_.GetWeakPtr()), 407 weak_ptr_factory_.GetWeakPtr()),
406 std::move(token)); 408 std::move(token));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 weak_ptr_factory_.GetWeakPtr()), 445 weak_ptr_factory_.GetWeakPtr()),
444 std::move(token)); 446 std::move(token));
445 return; 447 return;
446 } 448 }
447 449
448 // Non-conflicting local folder creation to existing remote folder. 450 // Non-conflicting local folder creation to existing remote folder.
449 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind()); 451 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind());
450 SyncCompleted(std::move(token), SYNC_STATUS_OK); 452 SyncCompleted(std::move(token), SYNC_STATUS_OK);
451 } 453 }
452 454
453 void LocalToRemoteSyncer::DeleteRemoteFile(scoped_ptr<SyncTaskToken> token) { 455 void LocalToRemoteSyncer::DeleteRemoteFile(
456 std::unique_ptr<SyncTaskToken> token) {
454 DCHECK(remote_file_tracker_); 457 DCHECK(remote_file_tracker_);
455 DCHECK(remote_file_tracker_->has_synced_details()); 458 DCHECK(remote_file_tracker_->has_synced_details());
456 459
457 switch (remote_file_tracker_->synced_details().file_kind()) { 460 switch (remote_file_tracker_->synced_details().file_kind()) {
458 case FILE_KIND_UNSUPPORTED: 461 case FILE_KIND_UNSUPPORTED:
459 NOTREACHED(); 462 NOTREACHED();
460 file_type_ = SYNC_FILE_TYPE_UNKNOWN; 463 file_type_ = SYNC_FILE_TYPE_UNKNOWN;
461 break; 464 break;
462 case FILE_KIND_FILE: 465 case FILE_KIND_FILE:
463 file_type_ = SYNC_FILE_TYPE_FILE; 466 file_type_ = SYNC_FILE_TYPE_FILE;
464 break; 467 break;
465 case FILE_KIND_FOLDER: 468 case FILE_KIND_FOLDER:
466 file_type_ = SYNC_FILE_TYPE_DIRECTORY; 469 file_type_ = SYNC_FILE_TYPE_DIRECTORY;
467 break; 470 break;
468 } 471 }
469 sync_action_ = SYNC_ACTION_DELETED; 472 sync_action_ = SYNC_ACTION_DELETED;
470 drive_service()->DeleteResource( 473 drive_service()->DeleteResource(
471 remote_file_tracker_->file_id(), 474 remote_file_tracker_->file_id(),
472 remote_file_tracker_->synced_details().etag(), 475 remote_file_tracker_->synced_details().etag(),
473 base::Bind(&LocalToRemoteSyncer::DidDeleteRemoteFile, 476 base::Bind(&LocalToRemoteSyncer::DidDeleteRemoteFile,
474 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); 477 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
475 } 478 }
476 479
477 void LocalToRemoteSyncer::DidDeleteRemoteFile( 480 void LocalToRemoteSyncer::DidDeleteRemoteFile(
478 scoped_ptr<SyncTaskToken> token, 481 std::unique_ptr<SyncTaskToken> token,
479 google_apis::DriveApiErrorCode error) { 482 google_apis::DriveApiErrorCode error) {
480 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 483 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
481 if (status != SYNC_STATUS_OK && 484 if (status != SYNC_STATUS_OK &&
482 error != google_apis::HTTP_NOT_FOUND && 485 error != google_apis::HTTP_NOT_FOUND &&
483 error != google_apis::HTTP_PRECONDITION && 486 error != google_apis::HTTP_PRECONDITION &&
484 error != google_apis::HTTP_CONFLICT) { 487 error != google_apis::HTTP_CONFLICT) {
485 SyncCompleted(std::move(token), status); 488 SyncCompleted(std::move(token), status);
486 return; 489 return;
487 } 490 }
488 491
489 // Handle NOT_FOUND case as SUCCESS case. 492 // Handle NOT_FOUND case as SUCCESS case.
490 // For PRECONDITION / CONFLICT case, the remote file is modified since the 493 // For PRECONDITION / CONFLICT case, the remote file is modified since the
491 // last sync completed. As our policy for deletion-modification conflict 494 // last sync completed. As our policy for deletion-modification conflict
492 // resolution, ignore the local deletion. 495 // resolution, ignore the local deletion.
493 if (status == SYNC_STATUS_OK || 496 if (status == SYNC_STATUS_OK ||
494 error == google_apis::HTTP_NOT_FOUND) { 497 error == google_apis::HTTP_NOT_FOUND) {
495 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile( 498 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile(
496 remote_file_tracker_->file_id()); 499 remote_file_tracker_->file_id());
497 SyncCompleted(std::move(token), status); 500 SyncCompleted(std::move(token), status);
498 return; 501 return;
499 } 502 }
500 503
501 SyncCompleted(std::move(token), SYNC_STATUS_OK); 504 SyncCompleted(std::move(token), SYNC_STATUS_OK);
502 } 505 }
503 506
504 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { 507 void LocalToRemoteSyncer::UploadExistingFile(
508 std::unique_ptr<SyncTaskToken> token) {
505 DCHECK(remote_file_tracker_); 509 DCHECK(remote_file_tracker_);
506 DCHECK(remote_file_tracker_->has_synced_details()); 510 DCHECK(remote_file_tracker_->has_synced_details());
507 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); 511 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread());
508 512
509 const std::string local_file_md5 = drive::util::GetMd5Digest(local_path_, 513 const std::string local_file_md5 = drive::util::GetMd5Digest(local_path_,
510 nullptr); 514 nullptr);
511 if (local_file_md5 == remote_file_tracker_->synced_details().md5()) { 515 if (local_file_md5 == remote_file_tracker_->synced_details().md5()) {
512 // Local file is not changed. 516 // Local file is not changed.
513 SyncCompleted(std::move(token), SYNC_STATUS_OK); 517 SyncCompleted(std::move(token), SYNC_STATUS_OK);
514 return; 518 return;
515 } 519 }
516 520
517 file_type_ = SYNC_FILE_TYPE_FILE; 521 file_type_ = SYNC_FILE_TYPE_FILE;
518 sync_action_ = SYNC_ACTION_UPDATED; 522 sync_action_ = SYNC_ACTION_UPDATED;
519 523
520 drive::UploadExistingFileOptions options; 524 drive::UploadExistingFileOptions options;
521 options.etag = remote_file_tracker_->synced_details().etag(); 525 options.etag = remote_file_tracker_->synced_details().etag();
522 drive_uploader()->UploadExistingFile( 526 drive_uploader()->UploadExistingFile(
523 remote_file_tracker_->file_id(), 527 remote_file_tracker_->file_id(),
524 local_path_, 528 local_path_,
525 "application/octet_stream", 529 "application/octet_stream",
526 options, 530 options,
527 base::Bind(&LocalToRemoteSyncer::DidUploadExistingFile, 531 base::Bind(&LocalToRemoteSyncer::DidUploadExistingFile,
528 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)), 532 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)),
529 google_apis::ProgressCallback()); 533 google_apis::ProgressCallback());
530 } 534 }
531 535
532 void LocalToRemoteSyncer::DidUploadExistingFile( 536 void LocalToRemoteSyncer::DidUploadExistingFile(
533 scoped_ptr<SyncTaskToken> token, 537 std::unique_ptr<SyncTaskToken> token,
534 google_apis::DriveApiErrorCode error, 538 google_apis::DriveApiErrorCode error,
535 const GURL&, 539 const GURL&,
536 scoped_ptr<google_apis::FileResource> entry) { 540 std::unique_ptr<google_apis::FileResource> entry) {
537 if (error == google_apis::HTTP_PRECONDITION || 541 if (error == google_apis::HTTP_PRECONDITION ||
538 error == google_apis::HTTP_CONFLICT || 542 error == google_apis::HTTP_CONFLICT ||
539 error == google_apis::HTTP_NOT_FOUND) { 543 error == google_apis::HTTP_NOT_FOUND) {
540 // The remote file has unfetched remote change. Fetch latest metadata and 544 // The remote file has unfetched remote change. Fetch latest metadata and
541 // update database with it. 545 // update database with it.
542 // TODO(tzik): Consider adding local side low-priority dirtiness handling to 546 // TODO(tzik): Consider adding local side low-priority dirtiness handling to
543 // handle this as ListChangesTask. 547 // handle this as ListChangesTask.
544 548
545 needs_remote_change_listing_ = true; 549 needs_remote_change_listing_ = true;
546 UpdateRemoteMetadata(remote_file_tracker_->file_id(), std::move(token)); 550 UpdateRemoteMetadata(remote_file_tracker_->file_id(), std::move(token));
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 remote_file_tracker_->tracker_id(), file.details()); 589 remote_file_tracker_->tracker_id(), file.details());
586 SyncCompleted(std::move(token), status); 590 SyncCompleted(std::move(token), status);
587 return; 591 return;
588 } 592 }
589 593
590 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); 594 SyncCompleted(std::move(token), SYNC_STATUS_RETRY);
591 } 595 }
592 596
593 void LocalToRemoteSyncer::UpdateRemoteMetadata( 597 void LocalToRemoteSyncer::UpdateRemoteMetadata(
594 const std::string& file_id, 598 const std::string& file_id,
595 scoped_ptr<SyncTaskToken> token) { 599 std::unique_ptr<SyncTaskToken> token) {
596 DCHECK(remote_file_tracker_); 600 DCHECK(remote_file_tracker_);
597 601
598 drive_service()->GetFileResource( 602 drive_service()->GetFileResource(
599 file_id, 603 file_id,
600 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, 604 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata,
601 weak_ptr_factory_.GetWeakPtr(), 605 weak_ptr_factory_.GetWeakPtr(),
602 file_id, base::Passed(&token))); 606 file_id, base::Passed(&token)));
603 } 607 }
604 608
605 void LocalToRemoteSyncer::DidGetRemoteMetadata( 609 void LocalToRemoteSyncer::DidGetRemoteMetadata(
606 const std::string& file_id, 610 const std::string& file_id,
607 scoped_ptr<SyncTaskToken> token, 611 std::unique_ptr<SyncTaskToken> token,
608 google_apis::DriveApiErrorCode error, 612 google_apis::DriveApiErrorCode error,
609 scoped_ptr<google_apis::FileResource> entry) { 613 std::unique_ptr<google_apis::FileResource> entry) {
610 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); 614 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread());
611 615
612 if (error == google_apis::HTTP_NOT_FOUND) { 616 if (error == google_apis::HTTP_NOT_FOUND) {
613 retry_on_success_ = true; 617 retry_on_success_ = true;
614 SyncStatusCode status = 618 SyncStatusCode status =
615 metadata_database()->UpdateByDeletedRemoteFile(file_id); 619 metadata_database()->UpdateByDeletedRemoteFile(file_id);
616 SyncCompleted(std::move(token), status); 620 SyncCompleted(std::move(token), status);
617 return; 621 return;
618 } 622 }
619 623
620 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 624 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
621 if (status != SYNC_STATUS_OK) { 625 if (status != SYNC_STATUS_OK) {
622 SyncCompleted(std::move(token), status); 626 SyncCompleted(std::move(token), status);
623 return; 627 return;
624 } 628 }
625 629
626 if (!entry) { 630 if (!entry) {
627 NOTREACHED(); 631 NOTREACHED();
628 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); 632 SyncCompleted(std::move(token), SYNC_STATUS_FAILED);
629 return; 633 return;
630 } 634 }
631 635
632 retry_on_success_ = true; 636 retry_on_success_ = true;
633 status = metadata_database()->UpdateByFileResource(*entry); 637 status = metadata_database()->UpdateByFileResource(*entry);
634 SyncCompleted(std::move(token), status); 638 SyncCompleted(std::move(token), status);
635 } 639 }
636 640
637 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { 641 void LocalToRemoteSyncer::UploadNewFile(std::unique_ptr<SyncTaskToken> token) {
638 DCHECK(remote_parent_folder_tracker_); 642 DCHECK(remote_parent_folder_tracker_);
639 643
640 file_type_ = SYNC_FILE_TYPE_FILE; 644 file_type_ = SYNC_FILE_TYPE_FILE;
641 sync_action_ = SYNC_ACTION_ADDED; 645 sync_action_ = SYNC_ACTION_ADDED;
642 base::FilePath title = storage::VirtualPath::BaseName(target_path_); 646 base::FilePath title = storage::VirtualPath::BaseName(target_path_);
643 drive_uploader()->UploadNewFile( 647 drive_uploader()->UploadNewFile(
644 remote_parent_folder_tracker_->file_id(), local_path_, 648 remote_parent_folder_tracker_->file_id(), local_path_,
645 title.AsUTF8Unsafe(), GetMimeTypeFromTitle(title), 649 title.AsUTF8Unsafe(), GetMimeTypeFromTitle(title),
646 drive::UploadNewFileOptions(), 650 drive::UploadNewFileOptions(),
647 base::Bind(&LocalToRemoteSyncer::DidUploadNewFile, 651 base::Bind(&LocalToRemoteSyncer::DidUploadNewFile,
648 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)), 652 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)),
649 google_apis::ProgressCallback()); 653 google_apis::ProgressCallback());
650 } 654 }
651 655
652 void LocalToRemoteSyncer::DidUploadNewFile( 656 void LocalToRemoteSyncer::DidUploadNewFile(
653 scoped_ptr<SyncTaskToken> token, 657 std::unique_ptr<SyncTaskToken> token,
654 google_apis::DriveApiErrorCode error, 658 google_apis::DriveApiErrorCode error,
655 const GURL& upload_location, 659 const GURL& upload_location,
656 scoped_ptr<google_apis::FileResource> entry) { 660 std::unique_ptr<google_apis::FileResource> entry) {
657 if (error == google_apis::HTTP_NOT_FOUND) 661 if (error == google_apis::HTTP_NOT_FOUND)
658 needs_remote_change_listing_ = true; 662 needs_remote_change_listing_ = true;
659 663
660 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 664 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
661 if (status != SYNC_STATUS_OK) { 665 if (status != SYNC_STATUS_OK) {
662 SyncCompleted(std::move(token), status); 666 SyncCompleted(std::move(token), status);
663 return; 667 return;
664 } 668 }
665 669
666 if (!entry) { 670 if (!entry) {
667 NOTREACHED(); 671 NOTREACHED();
668 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); 672 SyncCompleted(std::move(token), SYNC_STATUS_FAILED);
669 return; 673 return;
670 } 674 }
671 675
672 status = metadata_database()->ReplaceActiveTrackerWithNewResource( 676 status = metadata_database()->ReplaceActiveTrackerWithNewResource(
673 remote_parent_folder_tracker_->tracker_id(), *entry); 677 remote_parent_folder_tracker_->tracker_id(), *entry);
674 SyncCompleted(std::move(token), status); 678 SyncCompleted(std::move(token), status);
675 } 679 }
676 680
677 void LocalToRemoteSyncer::CreateRemoteFolder(scoped_ptr<SyncTaskToken> token) { 681 void LocalToRemoteSyncer::CreateRemoteFolder(
682 std::unique_ptr<SyncTaskToken> token) {
678 DCHECK(remote_parent_folder_tracker_); 683 DCHECK(remote_parent_folder_tracker_);
679 684
680 base::FilePath title = storage::VirtualPath::BaseName(target_path_); 685 base::FilePath title = storage::VirtualPath::BaseName(target_path_);
681 file_type_ = SYNC_FILE_TYPE_DIRECTORY; 686 file_type_ = SYNC_FILE_TYPE_DIRECTORY;
682 sync_action_ = SYNC_ACTION_ADDED; 687 sync_action_ = SYNC_ACTION_ADDED;
683 688
684 DCHECK(!folder_creator_); 689 DCHECK(!folder_creator_);
685 folder_creator_.reset(new FolderCreator( 690 folder_creator_.reset(new FolderCreator(
686 drive_service(), metadata_database(), 691 drive_service(), metadata_database(),
687 remote_parent_folder_tracker_->file_id(), 692 remote_parent_folder_tracker_->file_id(),
688 title.AsUTF8Unsafe())); 693 title.AsUTF8Unsafe()));
689 folder_creator_->Run(base::Bind( 694 folder_creator_->Run(base::Bind(
690 &LocalToRemoteSyncer::DidCreateRemoteFolder, 695 &LocalToRemoteSyncer::DidCreateRemoteFolder,
691 weak_ptr_factory_.GetWeakPtr(), 696 weak_ptr_factory_.GetWeakPtr(),
692 base::Passed(&token))); 697 base::Passed(&token)));
693 } 698 }
694 699
695 void LocalToRemoteSyncer::DidCreateRemoteFolder( 700 void LocalToRemoteSyncer::DidCreateRemoteFolder(
696 scoped_ptr<SyncTaskToken> token, 701 std::unique_ptr<SyncTaskToken> token,
697 const std::string& file_id, 702 const std::string& file_id,
698 SyncStatusCode status) { 703 SyncStatusCode status) {
699 if (status == SYNC_FILE_ERROR_NOT_FOUND) 704 if (status == SYNC_FILE_ERROR_NOT_FOUND)
700 needs_remote_change_listing_ = true; 705 needs_remote_change_listing_ = true;
701 706
702 scoped_ptr<FolderCreator> deleter = std::move(folder_creator_); 707 std::unique_ptr<FolderCreator> deleter = std::move(folder_creator_);
703 if (status != SYNC_STATUS_OK) { 708 if (status != SYNC_STATUS_OK) {
704 SyncCompleted(std::move(token), status); 709 SyncCompleted(std::move(token), status);
705 return; 710 return;
706 } 711 }
707 712
708 status = SYNC_STATUS_FAILED; 713 status = SYNC_STATUS_FAILED;
709 MetadataDatabase::ActivationStatus activation_status = 714 MetadataDatabase::ActivationStatus activation_status =
710 metadata_database()->TryActivateTracker( 715 metadata_database()->TryActivateTracker(
711 remote_parent_folder_tracker_->tracker_id(), 716 remote_parent_folder_tracker_->tracker_id(),
712 file_id, &status); 717 file_id, &status);
(...skipping 11 matching lines...) Expand all
724 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); 729 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
725 return; 730 return;
726 } 731 }
727 732
728 NOTREACHED(); 733 NOTREACHED();
729 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); 734 SyncCompleted(std::move(token), SYNC_STATUS_FAILED);
730 return; 735 return;
731 } 736 }
732 737
733 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict( 738 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict(
734 scoped_ptr<SyncTaskToken> token, 739 std::unique_ptr<SyncTaskToken> token,
735 google_apis::DriveApiErrorCode error) { 740 google_apis::DriveApiErrorCode error) {
736 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); 741 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error);
737 if (status != SYNC_STATUS_OK) { 742 if (status != SYNC_STATUS_OK) {
738 SyncCompleted(std::move(token), status); 743 SyncCompleted(std::move(token), status);
739 return; 744 return;
740 } 745 }
741 746
742 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); 747 SyncCompleted(std::move(token), SYNC_STATUS_RETRY);
743 } 748 }
744 749
(...skipping 12 matching lines...) Expand all
757 set_used_network(true); 762 set_used_network(true);
758 return sync_context_->GetDriveUploader(); 763 return sync_context_->GetDriveUploader();
759 } 764 }
760 765
761 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { 766 MetadataDatabase* LocalToRemoteSyncer::metadata_database() {
762 return sync_context_->GetMetadataDatabase(); 767 return sync_context_->GetMetadataDatabase();
763 } 768 }
764 769
765 } // namespace drive_backend 770 } // namespace drive_backend
766 } // namespace sync_file_system 771 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698