Chromium Code Reviews| 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 |