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 |
556 base::Bind(&LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile, | 552 // TODO(tzik): Expand this function. |
557 weak_ptr_factory_.GetWeakPtr(), | 553 DidUpdateDatabaseForUploadExistingFile(token.Pass(), status); |
558 base::Passed(&token))); | |
559 } | 554 } |
560 | 555 |
561 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( | 556 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( |
562 scoped_ptr<SyncTaskToken> token, | 557 scoped_ptr<SyncTaskToken> token, |
563 SyncStatusCode status) { | 558 SyncStatusCode status) { |
564 if (status != SYNC_STATUS_OK) { | 559 if (status != SYNC_STATUS_OK) { |
565 SyncCompleted(token.Pass(), status); | 560 SyncCompleted(token.Pass(), status); |
566 return; | 561 return; |
567 } | 562 } |
568 | 563 |
569 FileMetadata file; | 564 FileMetadata file; |
570 if (!metadata_database()->FindFileByFileID( | 565 if (!metadata_database()->FindFileByFileID( |
571 remote_file_tracker_->file_id(), &file)) { | 566 remote_file_tracker_->file_id(), &file)) { |
572 NOTREACHED(); | 567 NOTREACHED(); |
573 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 568 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
574 return; | 569 return; |
575 } | 570 } |
576 | 571 |
577 const FileDetails& details = file.details(); | 572 const FileDetails& details = file.details(); |
578 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 573 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
579 if (!details.missing() && | 574 if (!details.missing() && |
580 details.file_kind() == FILE_KIND_FILE && | 575 details.file_kind() == FILE_KIND_FILE && |
581 details.title() == title.AsUTF8Unsafe() && | 576 details.title() == title.AsUTF8Unsafe() && |
582 HasFileAsParent(details, | 577 HasFileAsParent(details, |
583 remote_parent_folder_tracker_->file_id())) { | 578 remote_parent_folder_tracker_->file_id())) { |
584 metadata_database()->UpdateTracker( | 579 SyncStatusCode status = metadata_database()->UpdateTracker( |
585 remote_file_tracker_->tracker_id(), | 580 remote_file_tracker_->tracker_id(), file.details()); |
586 file.details(), | 581 SyncCompleted(token.Pass(), status); |
587 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
588 weak_ptr_factory_.GetWeakPtr(), | |
589 base::Passed(&token))); | |
590 return; | 582 return; |
591 } | 583 } |
592 | 584 |
593 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); | 585 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); |
594 } | 586 } |
595 | 587 |
596 void LocalToRemoteSyncer::UpdateRemoteMetadata( | 588 void LocalToRemoteSyncer::UpdateRemoteMetadata( |
597 const std::string& file_id, | 589 const std::string& file_id, |
598 scoped_ptr<SyncTaskToken> token) { | 590 scoped_ptr<SyncTaskToken> token) { |
599 DCHECK(remote_file_tracker_); | 591 DCHECK(remote_file_tracker_); |
600 | 592 |
601 drive_service()->GetFileResource( | 593 drive_service()->GetFileResource( |
602 file_id, | 594 file_id, |
603 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, | 595 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, |
604 weak_ptr_factory_.GetWeakPtr(), | 596 weak_ptr_factory_.GetWeakPtr(), |
605 file_id, base::Passed(&token))); | 597 file_id, base::Passed(&token))); |
606 } | 598 } |
607 | 599 |
608 void LocalToRemoteSyncer::DidGetRemoteMetadata( | 600 void LocalToRemoteSyncer::DidGetRemoteMetadata( |
609 const std::string& file_id, | 601 const std::string& file_id, |
610 scoped_ptr<SyncTaskToken> token, | 602 scoped_ptr<SyncTaskToken> token, |
611 google_apis::GDataErrorCode error, | 603 google_apis::GDataErrorCode error, |
612 scoped_ptr<google_apis::FileResource> entry) { | 604 scoped_ptr<google_apis::FileResource> entry) { |
613 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 605 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
614 | 606 |
615 if (error == google_apis::HTTP_NOT_FOUND) { | 607 if (error == google_apis::HTTP_NOT_FOUND) { |
616 retry_on_success_ = true; | 608 retry_on_success_ = true; |
617 metadata_database()->UpdateByDeletedRemoteFile( | 609 SyncStatusCode status = |
618 file_id, | 610 metadata_database()->UpdateByDeletedRemoteFile(file_id); |
619 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 611 SyncCompleted(token.Pass(), status); |
620 weak_ptr_factory_.GetWeakPtr(), | |
621 base::Passed(&token))); | |
622 return; | 612 return; |
623 } | 613 } |
624 | 614 |
625 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 615 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
626 if (status != SYNC_STATUS_OK) { | 616 if (status != SYNC_STATUS_OK) { |
627 SyncCompleted(token.Pass(), status); | 617 SyncCompleted(token.Pass(), status); |
628 return; | 618 return; |
629 } | 619 } |
630 | 620 |
631 if (!entry) { | 621 if (!entry) { |
632 NOTREACHED(); | 622 NOTREACHED(); |
633 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 623 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
634 return; | 624 return; |
635 } | 625 } |
636 | 626 |
637 retry_on_success_ = true; | 627 retry_on_success_ = true; |
638 metadata_database()->UpdateByFileResource( | 628 status = metadata_database()->UpdateByFileResource(*entry); |
639 *entry, | 629 SyncCompleted(token.Pass(), status); |
640 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
641 weak_ptr_factory_.GetWeakPtr(), | |
642 base::Passed(&token))); | |
643 } | 630 } |
644 | 631 |
645 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { | 632 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { |
646 DCHECK(remote_parent_folder_tracker_); | 633 DCHECK(remote_parent_folder_tracker_); |
647 | 634 |
648 sync_action_ = SYNC_ACTION_ADDED; | 635 sync_action_ = SYNC_ACTION_ADDED; |
649 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 636 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
650 drive_uploader()->UploadNewFile( | 637 drive_uploader()->UploadNewFile( |
651 remote_parent_folder_tracker_->file_id(), | 638 remote_parent_folder_tracker_->file_id(), |
652 local_path_, | 639 local_path_, |
(...skipping 19 matching lines...) Expand all Loading... |
672 SyncCompleted(token.Pass(), status); | 659 SyncCompleted(token.Pass(), status); |
673 return; | 660 return; |
674 } | 661 } |
675 | 662 |
676 if (!entry) { | 663 if (!entry) { |
677 NOTREACHED(); | 664 NOTREACHED(); |
678 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 665 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
679 return; | 666 return; |
680 } | 667 } |
681 | 668 |
682 metadata_database()->ReplaceActiveTrackerWithNewResource( | 669 status = metadata_database()->ReplaceActiveTrackerWithNewResource( |
683 remote_parent_folder_tracker_->tracker_id(), *entry, | 670 remote_parent_folder_tracker_->tracker_id(), *entry); |
684 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 671 SyncCompleted(token.Pass(), status); |
685 weak_ptr_factory_.GetWeakPtr(), | |
686 base::Passed(&token))); | |
687 } | 672 } |
688 | 673 |
689 void LocalToRemoteSyncer::CreateRemoteFolder( | 674 void LocalToRemoteSyncer::CreateRemoteFolder( |
690 scoped_ptr<SyncTaskToken> token) { | 675 scoped_ptr<SyncTaskToken> token) { |
691 DCHECK(remote_parent_folder_tracker_); | 676 DCHECK(remote_parent_folder_tracker_); |
692 | 677 |
693 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 678 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
694 sync_action_ = SYNC_ACTION_ADDED; | 679 sync_action_ = SYNC_ACTION_ADDED; |
695 | 680 |
696 DCHECK(!folder_creator_); | 681 DCHECK(!folder_creator_); |
(...skipping 13 matching lines...) Expand all Loading... |
710 SyncStatusCode status) { | 695 SyncStatusCode status) { |
711 if (status == SYNC_FILE_ERROR_NOT_FOUND) | 696 if (status == SYNC_FILE_ERROR_NOT_FOUND) |
712 needs_remote_change_listing_ = true; | 697 needs_remote_change_listing_ = true; |
713 | 698 |
714 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); | 699 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); |
715 if (status != SYNC_STATUS_OK) { | 700 if (status != SYNC_STATUS_OK) { |
716 SyncCompleted(token.Pass(), status); | 701 SyncCompleted(token.Pass(), status); |
717 return; | 702 return; |
718 } | 703 } |
719 | 704 |
| 705 status = SYNC_STATUS_FAILED; |
720 MetadataDatabase::ActivationStatus activation_status = | 706 MetadataDatabase::ActivationStatus activation_status = |
721 metadata_database()->TryActivateTracker( | 707 metadata_database()->TryActivateTracker( |
722 remote_parent_folder_tracker_->tracker_id(), | 708 remote_parent_folder_tracker_->tracker_id(), |
723 file_id, | 709 file_id, &status); |
724 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
725 weak_ptr_factory_.GetWeakPtr(), | |
726 base::Passed(token.Pass()))); | |
727 switch (activation_status) { | 710 switch (activation_status) { |
728 case MetadataDatabase::ACTIVATION_PENDING: | 711 case MetadataDatabase::ACTIVATION_PENDING: |
729 // The task will be finalized by the callback passed to MetadataDatabase | 712 SyncCompleted(token.Pass(), status); |
730 // in this case. | |
731 return; | 713 return; |
732 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: | 714 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: |
733 // The activation failed due to another tracker that has another parent. | 715 // 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 | 716 // Detach the folder from the current parent to avoid using this folder as |
735 // active folder. | 717 // active folder. |
736 drive_service()->RemoveResourceFromDirectory( | 718 drive_service()->RemoveResourceFromDirectory( |
737 remote_parent_folder_tracker_->file_id(), file_id, | 719 remote_parent_folder_tracker_->file_id(), file_id, |
738 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, | 720 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, |
739 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 721 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
740 return; | 722 return; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 set_used_network(true); | 754 set_used_network(true); |
773 return sync_context_->GetDriveUploader(); | 755 return sync_context_->GetDriveUploader(); |
774 } | 756 } |
775 | 757 |
776 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 758 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
777 return sync_context_->GetMetadataDatabase(); | 759 return sync_context_->GetMetadataDatabase(); |
778 } | 760 } |
779 | 761 |
780 } // namespace drive_backend | 762 } // namespace drive_backend |
781 } // namespace sync_file_system | 763 } // namespace sync_file_system |
OLD | NEW |