OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_file_sync_service.h" | 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
428 callback.Run(status); | 428 callback.Run(status); |
429 return; | 429 return; |
430 } | 430 } |
431 | 431 |
432 DCHECK(pending_batch_sync_origins_.empty()); | 432 DCHECK(pending_batch_sync_origins_.empty()); |
433 | 433 |
434 UpdateRegisteredOrigins(); | 434 UpdateRegisteredOrigins(); |
435 | 435 |
436 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 436 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
437 | 437 |
438 // Mark all the batch sync origins as 'pending' so that we can start | |
439 // batch sync when we're ready. | |
440 for (std::map<GURL, std::string>::const_iterator itr = | |
441 metadata_store_->batch_sync_origins().begin(); | |
442 itr != metadata_store_->batch_sync_origins().end(); | |
443 ++itr) { | |
444 pending_batch_sync_origins_.insert(itr->first); | |
445 } | |
446 | |
447 DriveMetadataStore::URLAndDriveMetadataList to_be_fetched_files; | 438 DriveMetadataStore::URLAndDriveMetadataList to_be_fetched_files; |
448 status = metadata_store_->GetToBeFetchedFiles(&to_be_fetched_files); | 439 status = metadata_store_->GetToBeFetchedFiles(&to_be_fetched_files); |
449 DCHECK_EQ(SYNC_STATUS_OK, status); | 440 DCHECK_EQ(SYNC_STATUS_OK, status); |
450 typedef DriveMetadataStore::URLAndDriveMetadataList::const_iterator iterator; | 441 typedef DriveMetadataStore::URLAndDriveMetadataList::const_iterator iterator; |
451 for (iterator itr = to_be_fetched_files.begin(); | 442 for (iterator itr = to_be_fetched_files.begin(); |
452 itr != to_be_fetched_files.end(); ++itr) { | 443 itr != to_be_fetched_files.end(); ++itr) { |
453 const FileSystemURL& url = itr->first; | 444 const FileSystemURL& url = itr->first; |
454 const DriveMetadata& metadata = itr->second; | 445 const DriveMetadata& metadata = itr->second; |
455 const std::string& resource_id = metadata.resource_id(); | 446 const std::string& resource_id = metadata.resource_id(); |
456 | 447 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
552 | 543 |
553 void DriveFileSyncService::DoEnableOriginForTrackingChanges( | 544 void DriveFileSyncService::DoEnableOriginForTrackingChanges( |
554 const GURL& origin, | 545 const GURL& origin, |
555 const SyncStatusCallback& callback) { | 546 const SyncStatusCallback& callback) { |
556 if (!metadata_store_->IsOriginDisabled(origin)) { | 547 if (!metadata_store_->IsOriginDisabled(origin)) { |
557 callback.Run(SYNC_STATUS_OK); | 548 callback.Run(SYNC_STATUS_OK); |
558 return; | 549 return; |
559 } | 550 } |
560 | 551 |
561 metadata_store_->EnableOrigin(origin, callback); | 552 metadata_store_->EnableOrigin(origin, callback); |
562 pending_batch_sync_origins_.insert(origin); | 553 pending_batch_sync_origins_.insert(std::make_pair( |
554 origin, metadata_store_->disabled_origins().find(origin)->second)); | |
tzik
2013/05/17 09:36:56
can this be disabled_origins()[origin] for better
calvinlo
2013/05/17 10:02:36
Done. Sorry, I forgot that the map types match so
| |
563 } | 555 } |
564 | 556 |
565 void DriveFileSyncService::DoDisableOriginForTrackingChanges( | 557 void DriveFileSyncService::DoDisableOriginForTrackingChanges( |
566 const GURL& origin, | 558 const GURL& origin, |
567 const SyncStatusCallback& callback) { | 559 const SyncStatusCallback& callback) { |
568 if (!metadata_store_->IsBatchSyncOrigin(origin) && | 560 if (!metadata_store_->IsBatchSyncOrigin(origin) && |
569 !metadata_store_->IsIncrementalSyncOrigin(origin)) { | 561 !metadata_store_->IsIncrementalSyncOrigin(origin)) { |
570 callback.Run(SYNC_STATUS_OK); | 562 callback.Run(SYNC_STATUS_OK); |
571 return; | 563 return; |
572 } | 564 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
695 // Extension has been uninstalled. | 687 // Extension has been uninstalled. |
696 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); | 688 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); |
697 } else if ((metadata_store_->IsBatchSyncOrigin(origin) || | 689 } else if ((metadata_store_->IsBatchSyncOrigin(origin) || |
698 metadata_store_->IsIncrementalSyncOrigin(origin)) && | 690 metadata_store_->IsIncrementalSyncOrigin(origin)) && |
699 !extension_service->IsExtensionEnabled(extension_id)) { | 691 !extension_service->IsExtensionEnabled(extension_id)) { |
700 // Extension has been disabled. | 692 // Extension has been disabled. |
701 metadata_store_->DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 693 metadata_store_->DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
702 } else if (metadata_store_->IsOriginDisabled(origin) && | 694 } else if (metadata_store_->IsOriginDisabled(origin) && |
703 extension_service->IsExtensionEnabled(extension_id)) { | 695 extension_service->IsExtensionEnabled(extension_id)) { |
704 // Extension has been re-enabled. | 696 // Extension has been re-enabled. |
697 std::string resource_id = metadata_store_->disabled_origins().find( | |
698 origin)->second; | |
705 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 699 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
706 pending_batch_sync_origins_.insert(origin); | 700 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
tzik
2013/05/17 09:36:56
ditto
calvinlo
2013/05/17 10:02:36
Done.
| |
707 } | 701 } |
708 } | 702 } |
709 } | 703 } |
710 | 704 |
711 void DriveFileSyncService::StartBatchSync( | 705 void DriveFileSyncService::StartBatchSync( |
712 const SyncStatusCallback& callback) { | 706 const SyncStatusCallback& callback) { |
713 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); | 707 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); |
708 DCHECK(!pending_batch_sync_origins_.empty()); | |
714 | 709 |
715 if (pending_batch_sync_origins_.empty()) { | 710 GURL origin = pending_batch_sync_origins_.begin()->first; |
716 callback.Run(SYNC_STATUS_OK); | 711 std::string resource_id = pending_batch_sync_origins_.find(origin)->second; |
tzik
2013/05/17 09:36:56
can be pending_batch_sync_origins_.begin()->second
calvinlo
2013/05/17 10:02:36
Done.
| |
717 return; | 712 DCHECK(!resource_id.empty()); |
718 } | |
719 | |
720 GURL origin = *pending_batch_sync_origins_.begin(); | |
721 pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin()); | 713 pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin()); |
722 std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin); | |
723 DCHECK(!resource_id.empty()); | |
724 | 714 |
725 DCHECK(!metadata_store_->IsOriginDisabled(origin)); | 715 DCHECK(!metadata_store_->IsOriginDisabled(origin)); |
726 | 716 |
727 DVLOG(1) << "Start batch sync for:" << origin.spec(); | 717 DVLOG(1) << "Start batch sync for:" << origin.spec(); |
728 | 718 |
729 api_util_->GetLargestChangeStamp( | 719 api_util_->GetLargestChangeStamp( |
730 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, | 720 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, |
731 AsWeakPtr(), | 721 AsWeakPtr(), |
732 callback, | 722 callback, |
733 origin, | 723 origin, |
(...skipping 17 matching lines...) Expand all Loading... | |
751 AsWeakPtr(), origin, callback)); | 741 AsWeakPtr(), origin, callback)); |
752 return; | 742 return; |
753 } | 743 } |
754 | 744 |
755 if (status != SYNC_STATUS_OK) { | 745 if (status != SYNC_STATUS_OK) { |
756 callback.Run(status); | 746 callback.Run(status); |
757 return; | 747 return; |
758 } | 748 } |
759 | 749 |
760 // Add this origin to batch sync origin if it hasn't been already. | 750 // Add this origin to batch sync origin if it hasn't been already. |
751 // TODO(calvinlo): Added files to file metadata mapping, this can be removed | |
752 // next when batch_sync_origins is removed from DriveMetadataStore. | |
761 if (!metadata_store_->IsKnownOrigin(origin)) { | 753 if (!metadata_store_->IsKnownOrigin(origin)) { |
762 metadata_store_->AddBatchSyncOrigin(origin, resource_id); | 754 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
763 pending_batch_sync_origins_.insert(origin); | |
764 } | 755 } |
765 | 756 |
766 callback.Run(SYNC_STATUS_OK); | 757 callback.Run(SYNC_STATUS_OK); |
767 } | 758 } |
768 | 759 |
769 void DriveFileSyncService::DidUninstallOrigin( | 760 void DriveFileSyncService::DidUninstallOrigin( |
770 const GURL& origin, | 761 const GURL& origin, |
771 const SyncStatusCallback& callback, | 762 const SyncStatusCallback& callback, |
772 google_apis::GDataErrorCode error) { | 763 google_apis::GDataErrorCode error) { |
773 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 764 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
774 if (status != SYNC_STATUS_OK) { | 765 if (status != SYNC_STATUS_OK) { |
775 callback.Run(status); | 766 callback.Run(status); |
776 return; | 767 return; |
777 } | 768 } |
778 | 769 |
779 // Origin directory has been removed so it's now safe to remove the origin | 770 // Origin directory has been removed so it's now safe to remove the origin |
780 // from the metadata store. | 771 // from the metadata store. |
781 DoUnregisterOriginForTrackingChanges(origin, callback); | 772 DoUnregisterOriginForTrackingChanges(origin, callback); |
782 } | 773 } |
783 | 774 |
784 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( | 775 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( |
785 const SyncStatusCallback& callback, | 776 const SyncStatusCallback& callback, |
786 const GURL& origin, | 777 const GURL& origin, |
787 const std::string& resource_id, | 778 const std::string& resource_id, |
788 google_apis::GDataErrorCode error, | 779 google_apis::GDataErrorCode error, |
789 int64 largest_changestamp) { | 780 int64 largest_changestamp) { |
790 if (error != google_apis::HTTP_SUCCESS) { | 781 if (error != google_apis::HTTP_SUCCESS) { |
791 pending_batch_sync_origins_.insert(origin); | 782 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
792 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); | 783 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
793 return; | 784 return; |
794 } | 785 } |
795 | 786 |
796 if (metadata_store_->incremental_sync_origins().empty()) { | 787 if (metadata_store_->incremental_sync_origins().empty()) { |
797 largest_fetched_changestamp_ = largest_changestamp; | 788 largest_fetched_changestamp_ = largest_changestamp; |
798 metadata_store_->SetLargestChangeStamp( | 789 metadata_store_->SetLargestChangeStamp( |
799 largest_changestamp, | 790 largest_changestamp, |
800 base::Bind(&EmptyStatusCallback)); | 791 base::Bind(&EmptyStatusCallback)); |
801 } | 792 } |
802 | 793 |
803 api_util_->ListFiles( | 794 api_util_->ListFiles( |
804 resource_id, | 795 resource_id, |
805 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 796 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
806 AsWeakPtr(), | 797 AsWeakPtr(), |
807 callback, | 798 callback, |
808 origin, | 799 origin, |
800 resource_id, | |
809 largest_changestamp)); | 801 largest_changestamp)); |
810 } | 802 } |
811 | 803 |
812 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( | 804 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( |
813 const SyncStatusCallback& callback, | 805 const SyncStatusCallback& callback, |
814 const GURL& origin, | 806 const GURL& origin, |
807 const std::string& resource_id, | |
815 int64 largest_changestamp, | 808 int64 largest_changestamp, |
816 google_apis::GDataErrorCode error, | 809 google_apis::GDataErrorCode error, |
817 scoped_ptr<google_apis::ResourceList> feed) { | 810 scoped_ptr<google_apis::ResourceList> feed) { |
818 if (error != google_apis::HTTP_SUCCESS) { | 811 if (error != google_apis::HTTP_SUCCESS) { |
819 pending_batch_sync_origins_.insert(origin); | 812 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
820 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); | 813 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
821 return; | 814 return; |
822 } | 815 } |
823 | 816 |
824 typedef ScopedVector<google_apis::ResourceEntry>::const_iterator iterator; | 817 typedef ScopedVector<google_apis::ResourceEntry>::const_iterator iterator; |
825 for (iterator itr = feed->entries().begin(); | 818 for (iterator itr = feed->entries().begin(); |
826 itr != feed->entries().end(); ++itr) { | 819 itr != feed->entries().end(); ++itr) { |
827 AppendRemoteChange(origin, **itr, largest_changestamp, | 820 const google_apis::ResourceEntry& entry = **itr; |
821 AppendRemoteChange(origin, entry, largest_changestamp, | |
828 RemoteChangeHandler::REMOTE_SYNC_TYPE_BATCH); | 822 RemoteChangeHandler::REMOTE_SYNC_TYPE_BATCH); |
823 | |
824 // Save to be fetched file to DB for restore in case of crash. | |
825 DriveMetadata metadata; | |
826 metadata.set_resource_id(entry.resource_id()); | |
827 metadata.set_md5_checksum(entry.file_md5()); | |
828 metadata.set_conflicted(false); | |
829 metadata.set_to_be_fetched(true); | |
830 | |
831 base::FilePath path = TitleToPath(entry.title()); | |
832 fileapi::FileSystemURL url(CreateSyncableFileSystemURL( | |
833 origin, kServiceName, path)); | |
834 metadata_store_->UpdateEntry(url, metadata, | |
835 base::Bind(&EmptyStatusCallback)); | |
829 } | 836 } |
830 | 837 |
831 GURL next_feed_url; | 838 GURL next_feed_url; |
832 if (feed->GetNextFeedURL(&next_feed_url)) { | 839 if (feed->GetNextFeedURL(&next_feed_url)) { |
833 api_util_->ContinueListing( | 840 api_util_->ContinueListing( |
834 next_feed_url, | 841 next_feed_url, |
835 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 842 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
836 AsWeakPtr(), | 843 AsWeakPtr(), |
837 callback, | 844 callback, |
838 origin, | 845 origin, |
846 resource_id, | |
839 largest_changestamp)); | 847 largest_changestamp)); |
840 return; | 848 return; |
841 } | 849 } |
842 | 850 |
843 // Move |origin| to the incremental sync origin set if the origin has no file. | 851 // TODO(calvinlo): Eliminate batch_sync_origins so |
844 if (metadata_store_->IsBatchSyncOrigin(origin) && | 852 // MoveBatchSyncOriginToIncremental() happens directly. |
845 !remote_change_handler_.HasChangesForOrigin(origin)) { | 853 metadata_store_->AddBatchSyncOrigin(origin, resource_id); |
846 metadata_store_->MoveBatchSyncOriginToIncremental(origin); | 854 metadata_store_->MoveBatchSyncOriginToIncremental(origin); |
847 } | |
848 | |
849 may_have_unfetched_changes_ = true; | 855 may_have_unfetched_changes_ = true; |
850 callback.Run(SYNC_STATUS_OK); | 856 callback.Run(SYNC_STATUS_OK); |
851 } | 857 } |
852 | 858 |
853 void DriveFileSyncService::ApplyLocalChangeInternal( | 859 void DriveFileSyncService::ApplyLocalChangeInternal( |
854 scoped_ptr<ApplyLocalChangeParam> param, | 860 scoped_ptr<ApplyLocalChangeParam> param, |
855 SyncStatusCode status, | 861 SyncStatusCode status, |
856 const std::string& origin_resource_id) { | 862 const std::string& origin_resource_id) { |
857 if (status != SYNC_STATUS_OK) { | 863 if (status != SYNC_STATUS_OK) { |
858 param->callback.Run(status); | 864 param->callback.Run(status); |
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2179 void DriveFileSyncService::DidEnsureOriginRoot( | 2185 void DriveFileSyncService::DidEnsureOriginRoot( |
2180 const GURL& origin, | 2186 const GURL& origin, |
2181 const ResourceIdCallback& callback, | 2187 const ResourceIdCallback& callback, |
2182 google_apis::GDataErrorCode error, | 2188 google_apis::GDataErrorCode error, |
2183 const std::string& resource_id) { | 2189 const std::string& resource_id) { |
2184 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 2190 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
2185 if (status == SYNC_STATUS_OK && | 2191 if (status == SYNC_STATUS_OK && |
2186 metadata_store_->IsKnownOrigin(origin)) { | 2192 metadata_store_->IsKnownOrigin(origin)) { |
2187 metadata_store_->SetOriginRootDirectory(origin, resource_id); | 2193 metadata_store_->SetOriginRootDirectory(origin, resource_id); |
2188 if (metadata_store_->IsBatchSyncOrigin(origin)) | 2194 if (metadata_store_->IsBatchSyncOrigin(origin)) |
2189 pending_batch_sync_origins_.insert(origin); | 2195 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
2190 } | 2196 } |
2191 callback.Run(status, resource_id); | 2197 callback.Run(status, resource_id); |
2192 } | 2198 } |
2193 | 2199 |
2194 std::string DriveFileSyncService::sync_root_resource_id() { | 2200 std::string DriveFileSyncService::sync_root_resource_id() { |
2195 return metadata_store_->sync_root_directory(); | 2201 return metadata_store_->sync_root_directory(); |
2196 } | 2202 } |
2197 | 2203 |
2198 } // namespace sync_file_system | 2204 } // namespace sync_file_system |
OLD | NEW |