OLD | NEW |
---|---|
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 <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 return; | 363 return; |
364 } | 364 } |
365 | 365 |
366 const FileDetails& remote_details = remote_file_metadata.details(); | 366 const FileDetails& remote_details = remote_file_metadata.details(); |
367 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 367 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
368 if (!remote_details.missing() && | 368 if (!remote_details.missing() && |
369 remote_details.file_kind() == FILE_KIND_FOLDER && | 369 remote_details.file_kind() == FILE_KIND_FOLDER && |
370 remote_details.title() == title.AsUTF8Unsafe() && | 370 remote_details.title() == title.AsUTF8Unsafe() && |
371 HasFileAsParent(remote_details, | 371 HasFileAsParent(remote_details, |
372 remote_parent_folder_tracker_->file_id())) { | 372 remote_parent_folder_tracker_->file_id())) { |
373 | |
374 MoveToBackground( | 373 MoveToBackground( |
375 base::Bind(&LocalToRemoteSyncer::UpdateTrackerForReusedFolder, | 374 base::Bind(&LocalToRemoteSyncer::UpdateTrackerForReusedFolder, |
376 weak_ptr_factory_.GetWeakPtr(), | 375 weak_ptr_factory_.GetWeakPtr(), |
377 remote_details), | 376 remote_details), |
378 token.Pass()); | 377 token.Pass()); |
379 return; | 378 return; |
380 } | 379 } |
381 | 380 |
382 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, | 381 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, |
383 weak_ptr_factory_.GetWeakPtr()), | 382 weak_ptr_factory_.GetWeakPtr()), |
384 token.Pass()); | 383 token.Pass()); |
385 } | 384 } |
386 | 385 |
387 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( | 386 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( |
388 const FileDetails& details, | 387 const FileDetails& details, |
389 scoped_ptr<SyncTaskToken> token) { | 388 scoped_ptr<SyncTaskToken> token) { |
390 metadata_database()->UpdateTracker( | 389 SyncStatusCode status = metadata_database()->UpdateTracker( |
391 remote_file_tracker_->tracker_id(), details, | 390 remote_file_tracker_->tracker_id(), details); |
392 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 391 SyncCompleted(token.Pass(), status); |
393 weak_ptr_factory_.GetWeakPtr(), | |
394 base::Passed(&token))); | |
395 } | 392 } |
396 | 393 |
397 void LocalToRemoteSyncer::HandleExistingRemoteFile( | 394 void LocalToRemoteSyncer::HandleExistingRemoteFile( |
398 scoped_ptr<SyncTaskToken> token) { | 395 scoped_ptr<SyncTaskToken> token) { |
399 DCHECK(remote_file_tracker_); | 396 DCHECK(remote_file_tracker_); |
400 DCHECK(!remote_file_tracker_->dirty()); | 397 DCHECK(!remote_file_tracker_->dirty()); |
401 DCHECK(remote_file_tracker_->active()); | 398 DCHECK(remote_file_tracker_->active()); |
402 DCHECK(remote_file_tracker_->has_synced_details()); | 399 DCHECK(remote_file_tracker_->has_synced_details()); |
403 | 400 |
404 if (local_is_missing_) { | 401 if (local_is_missing_) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
475 SyncCompleted(token.Pass(), status); | 472 SyncCompleted(token.Pass(), status); |
476 return; | 473 return; |
477 } | 474 } |
478 | 475 |
479 // Handle NOT_FOUND case as SUCCESS case. | 476 // Handle NOT_FOUND case as SUCCESS case. |
480 // For PRECONDITION / CONFLICT case, the remote file is modified since the | 477 // For PRECONDITION / CONFLICT case, the remote file is modified since the |
481 // last sync completed. As our policy for deletion-modification conflict | 478 // last sync completed. As our policy for deletion-modification conflict |
482 // resolution, ignore the local deletion. | 479 // resolution, ignore the local deletion. |
483 if (status == SYNC_STATUS_OK || | 480 if (status == SYNC_STATUS_OK || |
484 error == google_apis::HTTP_NOT_FOUND) { | 481 error == google_apis::HTTP_NOT_FOUND) { |
485 metadata_database()->UpdateByDeletedRemoteFile( | 482 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile( |
486 remote_file_tracker_->file_id(), | 483 remote_file_tracker_->file_id()); |
487 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 484 SyncCompleted(token.Pass(), status); |
488 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | |
489 return; | 485 return; |
490 } | 486 } |
491 | 487 |
492 SyncCompleted(token.Pass(), SYNC_STATUS_OK); | 488 SyncCompleted(token.Pass(), SYNC_STATUS_OK); |
493 } | 489 } |
494 | 490 |
495 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { | 491 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { |
496 DCHECK(remote_file_tracker_); | 492 DCHECK(remote_file_tracker_); |
497 DCHECK(remote_file_tracker_->has_synced_details()); | 493 DCHECK(remote_file_tracker_->has_synced_details()); |
498 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 494 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
544 return; | 540 return; |
545 } | 541 } |
546 | 542 |
547 if (!entry) { | 543 if (!entry) { |
548 NOTREACHED(); | 544 NOTREACHED(); |
549 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 545 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
550 return; | 546 return; |
551 } | 547 } |
552 | 548 |
553 DCHECK(entry); | 549 DCHECK(entry); |
554 metadata_database()->UpdateByFileResource( | 550 status = metadata_database()->UpdateByFileResource(*entry); |
555 *entry, | 551 DidUpdateDatabaseForUploadExistingFile(token.Pass(), status); |
peria
2014/09/10 00:24:15
Expand DidUpdateDatabaseForUploadExistingFile() he
tzik
2014/09/10 00:56:54
ditto
| |
556 base::Bind(&LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile, | |
557 weak_ptr_factory_.GetWeakPtr(), | |
558 base::Passed(&token))); | |
559 } | 552 } |
560 | 553 |
561 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( | 554 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( |
562 scoped_ptr<SyncTaskToken> token, | 555 scoped_ptr<SyncTaskToken> token, |
563 SyncStatusCode status) { | 556 SyncStatusCode status) { |
564 if (status != SYNC_STATUS_OK) { | 557 if (status != SYNC_STATUS_OK) { |
565 SyncCompleted(token.Pass(), status); | 558 SyncCompleted(token.Pass(), status); |
566 return; | 559 return; |
567 } | 560 } |
568 | 561 |
569 FileMetadata file; | 562 FileMetadata file; |
570 if (!metadata_database()->FindFileByFileID( | 563 if (!metadata_database()->FindFileByFileID( |
571 remote_file_tracker_->file_id(), &file)) { | 564 remote_file_tracker_->file_id(), &file)) { |
572 NOTREACHED(); | 565 NOTREACHED(); |
573 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 566 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
574 return; | 567 return; |
575 } | 568 } |
576 | 569 |
577 const FileDetails& details = file.details(); | 570 const FileDetails& details = file.details(); |
578 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 571 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
579 if (!details.missing() && | 572 if (!details.missing() && |
580 details.file_kind() == FILE_KIND_FILE && | 573 details.file_kind() == FILE_KIND_FILE && |
581 details.title() == title.AsUTF8Unsafe() && | 574 details.title() == title.AsUTF8Unsafe() && |
582 HasFileAsParent(details, | 575 HasFileAsParent(details, |
583 remote_parent_folder_tracker_->file_id())) { | 576 remote_parent_folder_tracker_->file_id())) { |
584 metadata_database()->UpdateTracker( | 577 SyncStatusCode status = metadata_database()->UpdateTracker( |
585 remote_file_tracker_->tracker_id(), | 578 remote_file_tracker_->tracker_id(), file.details()); |
586 file.details(), | 579 SyncCompleted(token.Pass(), status); |
587 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
588 weak_ptr_factory_.GetWeakPtr(), | |
589 base::Passed(&token))); | |
590 return; | 580 return; |
591 } | 581 } |
592 | 582 |
593 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); | 583 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); |
594 } | 584 } |
595 | 585 |
596 void LocalToRemoteSyncer::UpdateRemoteMetadata( | 586 void LocalToRemoteSyncer::UpdateRemoteMetadata( |
597 const std::string& file_id, | 587 const std::string& file_id, |
598 scoped_ptr<SyncTaskToken> token) { | 588 scoped_ptr<SyncTaskToken> token) { |
599 DCHECK(remote_file_tracker_); | 589 DCHECK(remote_file_tracker_); |
600 | 590 |
601 drive_service()->GetFileResource( | 591 drive_service()->GetFileResource( |
602 file_id, | 592 file_id, |
603 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, | 593 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, |
604 weak_ptr_factory_.GetWeakPtr(), | 594 weak_ptr_factory_.GetWeakPtr(), |
605 file_id, base::Passed(&token))); | 595 file_id, base::Passed(&token))); |
606 } | 596 } |
607 | 597 |
608 void LocalToRemoteSyncer::DidGetRemoteMetadata( | 598 void LocalToRemoteSyncer::DidGetRemoteMetadata( |
609 const std::string& file_id, | 599 const std::string& file_id, |
610 scoped_ptr<SyncTaskToken> token, | 600 scoped_ptr<SyncTaskToken> token, |
611 google_apis::GDataErrorCode error, | 601 google_apis::GDataErrorCode error, |
612 scoped_ptr<google_apis::FileResource> entry) { | 602 scoped_ptr<google_apis::FileResource> entry) { |
613 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 603 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
614 | 604 |
615 if (error == google_apis::HTTP_NOT_FOUND) { | 605 if (error == google_apis::HTTP_NOT_FOUND) { |
616 retry_on_success_ = true; | 606 retry_on_success_ = true; |
617 metadata_database()->UpdateByDeletedRemoteFile( | 607 SyncStatusCode status = |
618 file_id, | 608 metadata_database()->UpdateByDeletedRemoteFile(file_id); |
619 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 609 SyncCompleted(token.Pass(), status); |
620 weak_ptr_factory_.GetWeakPtr(), | |
621 base::Passed(&token))); | |
622 return; | 610 return; |
623 } | 611 } |
624 | 612 |
625 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 613 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
626 if (status != SYNC_STATUS_OK) { | 614 if (status != SYNC_STATUS_OK) { |
627 SyncCompleted(token.Pass(), status); | 615 SyncCompleted(token.Pass(), status); |
628 return; | 616 return; |
629 } | 617 } |
630 | 618 |
631 if (!entry) { | 619 if (!entry) { |
632 NOTREACHED(); | 620 NOTREACHED(); |
633 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 621 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
634 return; | 622 return; |
635 } | 623 } |
636 | 624 |
637 retry_on_success_ = true; | 625 retry_on_success_ = true; |
638 metadata_database()->UpdateByFileResource( | 626 status = metadata_database()->UpdateByFileResource(*entry); |
639 *entry, | 627 SyncCompleted(token.Pass(), status); |
640 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
641 weak_ptr_factory_.GetWeakPtr(), | |
642 base::Passed(&token))); | |
643 } | 628 } |
644 | 629 |
645 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { | 630 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { |
646 DCHECK(remote_parent_folder_tracker_); | 631 DCHECK(remote_parent_folder_tracker_); |
647 | 632 |
648 sync_action_ = SYNC_ACTION_ADDED; | 633 sync_action_ = SYNC_ACTION_ADDED; |
649 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 634 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
650 drive_uploader()->UploadNewFile( | 635 drive_uploader()->UploadNewFile( |
651 remote_parent_folder_tracker_->file_id(), | 636 remote_parent_folder_tracker_->file_id(), |
652 local_path_, | 637 local_path_, |
(...skipping 19 matching lines...) Expand all Loading... | |
672 SyncCompleted(token.Pass(), status); | 657 SyncCompleted(token.Pass(), status); |
673 return; | 658 return; |
674 } | 659 } |
675 | 660 |
676 if (!entry) { | 661 if (!entry) { |
677 NOTREACHED(); | 662 NOTREACHED(); |
678 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 663 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
679 return; | 664 return; |
680 } | 665 } |
681 | 666 |
682 metadata_database()->ReplaceActiveTrackerWithNewResource( | 667 status = metadata_database()->ReplaceActiveTrackerWithNewResource( |
683 remote_parent_folder_tracker_->tracker_id(), *entry, | 668 remote_parent_folder_tracker_->tracker_id(), *entry); |
684 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 669 SyncCompleted(token.Pass(), status); |
685 weak_ptr_factory_.GetWeakPtr(), | |
686 base::Passed(&token))); | |
687 } | 670 } |
688 | 671 |
689 void LocalToRemoteSyncer::CreateRemoteFolder( | 672 void LocalToRemoteSyncer::CreateRemoteFolder( |
690 scoped_ptr<SyncTaskToken> token) { | 673 scoped_ptr<SyncTaskToken> token) { |
691 DCHECK(remote_parent_folder_tracker_); | 674 DCHECK(remote_parent_folder_tracker_); |
692 | 675 |
693 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 676 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
694 sync_action_ = SYNC_ACTION_ADDED; | 677 sync_action_ = SYNC_ACTION_ADDED; |
695 | 678 |
696 DCHECK(!folder_creator_); | 679 DCHECK(!folder_creator_); |
(...skipping 13 matching lines...) Expand all Loading... | |
710 SyncStatusCode status) { | 693 SyncStatusCode status) { |
711 if (status == SYNC_FILE_ERROR_NOT_FOUND) | 694 if (status == SYNC_FILE_ERROR_NOT_FOUND) |
712 needs_remote_change_listing_ = true; | 695 needs_remote_change_listing_ = true; |
713 | 696 |
714 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); | 697 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); |
715 if (status != SYNC_STATUS_OK) { | 698 if (status != SYNC_STATUS_OK) { |
716 SyncCompleted(token.Pass(), status); | 699 SyncCompleted(token.Pass(), status); |
717 return; | 700 return; |
718 } | 701 } |
719 | 702 |
703 status = SYNC_STATUS_FAILED; | |
720 MetadataDatabase::ActivationStatus activation_status = | 704 MetadataDatabase::ActivationStatus activation_status = |
721 metadata_database()->TryActivateTracker( | 705 metadata_database()->TryActivateTracker( |
722 remote_parent_folder_tracker_->tracker_id(), | 706 remote_parent_folder_tracker_->tracker_id(), |
723 file_id, | 707 file_id, &status); |
724 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
725 weak_ptr_factory_.GetWeakPtr(), | |
726 base::Passed(token.Pass()))); | |
727 switch (activation_status) { | 708 switch (activation_status) { |
728 case MetadataDatabase::ACTIVATION_PENDING: | 709 case MetadataDatabase::ACTIVATION_PENDING: |
729 // The task will be finalized by the callback passed to MetadataDatabase | 710 SyncCompleted(token.Pass(), status); |
730 // in this case. | |
731 return; | 711 return; |
732 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: | 712 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: |
733 // The activation failed due to another tracker that has another parent. | 713 // The activation failed due to another tracker that has another parent. |
734 // Detach the folder from the current parent to avoid using this folder as | 714 // Detach the folder from the current parent to avoid using this folder as |
735 // active folder. | 715 // active folder. |
736 drive_service()->RemoveResourceFromDirectory( | 716 drive_service()->RemoveResourceFromDirectory( |
737 remote_parent_folder_tracker_->file_id(), file_id, | 717 remote_parent_folder_tracker_->file_id(), file_id, |
738 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, | 718 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, |
739 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 719 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
740 return; | 720 return; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
772 set_used_network(true); | 752 set_used_network(true); |
773 return sync_context_->GetDriveUploader(); | 753 return sync_context_->GetDriveUploader(); |
774 } | 754 } |
775 | 755 |
776 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 756 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
777 return sync_context_->GetMetadataDatabase(); | 757 return sync_context_->GetMetadataDatabase(); |
778 } | 758 } |
779 | 759 |
780 } // namespace drive_backend | 760 } // namespace drive_backend |
781 } // namespace sync_file_system | 761 } // namespace sync_file_system |
OLD | NEW |