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 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 373 | 373 |
| 374 void DriveFileSyncService::DidInitializeMetadataStore( | 374 void DriveFileSyncService::DidInitializeMetadataStore( |
| 375 const SyncStatusCallback& callback, | 375 const SyncStatusCallback& callback, |
| 376 SyncStatusCode status, | 376 SyncStatusCode status, |
| 377 bool created) { | 377 bool created) { |
| 378 if (status != SYNC_STATUS_OK) { | 378 if (status != SYNC_STATUS_OK) { |
| 379 callback.Run(status); | 379 callback.Run(status); |
| 380 return; | 380 return; |
| 381 } | 381 } |
| 382 | 382 |
| 383 // Guarantee that metadata_store_->batch_sync_origins is not used. | |
| 384 std::vector<GURL> batch_origins_to_delete; | |
| 385 typedef std::map<GURL, std::string>::const_iterator origin_itr; | |
| 386 for (origin_itr itr = metadata_store_->batch_sync_origins().begin(); | |
| 387 itr != metadata_store_->batch_sync_origins().end(); ++itr) { | |
| 388 batch_origins_to_delete.push_back(itr->first); | |
| 389 } | |
| 390 for (std::vector<GURL>::const_iterator itr = batch_origins_to_delete.begin(); | |
| 391 itr != batch_origins_to_delete.end(); ++itr) { | |
| 392 metadata_store_->RemoveOrigin(*itr, base::Bind(&EmptyStatusCallback)); | |
| 393 } | |
| 394 | |
| 383 DCHECK(pending_batch_sync_origins_.empty()); | 395 DCHECK(pending_batch_sync_origins_.empty()); |
| 384 | 396 |
| 385 UpdateRegisteredOrigins(); | 397 UpdateRegisteredOrigins(); |
| 386 | 398 |
| 387 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 399 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
| 388 | 400 |
| 389 // Mark all the batch sync origins as 'pending' so that we can start | |
| 390 // batch sync when we're ready. | |
| 391 for (std::map<GURL, std::string>::const_iterator itr = | |
| 392 metadata_store_->batch_sync_origins().begin(); | |
| 393 itr != metadata_store_->batch_sync_origins().end(); | |
| 394 ++itr) { | |
| 395 pending_batch_sync_origins_.insert(itr->first); | |
| 396 } | |
| 397 | |
| 398 DriveMetadataStore::URLAndDriveMetadataList to_be_fetched_files; | 401 DriveMetadataStore::URLAndDriveMetadataList to_be_fetched_files; |
| 399 status = metadata_store_->GetToBeFetchedFiles(&to_be_fetched_files); | 402 status = metadata_store_->GetToBeFetchedFiles(&to_be_fetched_files); |
| 400 DCHECK_EQ(SYNC_STATUS_OK, status); | 403 DCHECK_EQ(SYNC_STATUS_OK, status); |
| 401 typedef DriveMetadataStore::URLAndDriveMetadataList::const_iterator iterator; | 404 typedef DriveMetadataStore::URLAndDriveMetadataList::const_iterator iterator; |
| 402 for (iterator itr = to_be_fetched_files.begin(); | 405 for (iterator itr = to_be_fetched_files.begin(); |
| 403 itr != to_be_fetched_files.end(); ++itr) { | 406 itr != to_be_fetched_files.end(); ++itr) { |
| 404 const FileSystemURL& url = itr->first; | 407 const FileSystemURL& url = itr->first; |
| 405 const DriveMetadata& metadata = itr->second; | 408 const DriveMetadata& metadata = itr->second; |
| 406 const std::string& resource_id = metadata.resource_id(); | 409 const std::string& resource_id = metadata.resource_id(); |
| 407 | 410 |
| 408 SyncFileType file_type = SYNC_FILE_TYPE_FILE; | 411 SyncFileType file_type = SYNC_FILE_TYPE_FILE; |
| 409 if (metadata.type() == DriveMetadata::RESOURCE_TYPE_FOLDER) | 412 if (metadata.type() == DriveMetadata::RESOURCE_TYPE_FOLDER) |
| 410 file_type = SYNC_FILE_TYPE_DIRECTORY; | 413 file_type = SYNC_FILE_TYPE_DIRECTORY; |
| 414 if (!metadata_store_->IsIncrementalSyncOrigin(url.origin())) { | |
| 415 metadata_store_->DeleteEntry(url, base::Bind(&EmptyStatusCallback)); | |
| 416 continue; | |
| 417 } | |
| 411 AppendFetchChange(url.origin(), url.path(), resource_id, file_type); | 418 AppendFetchChange(url.origin(), url.path(), resource_id, file_type); |
| 412 } | 419 } |
| 413 | 420 |
| 414 if (!sync_root_resource_id().empty()) | 421 if (!sync_root_resource_id().empty()) |
| 415 api_util_->EnsureSyncRootIsNotInMyDrive(sync_root_resource_id()); | 422 api_util_->EnsureSyncRootIsNotInMyDrive(sync_root_resource_id()); |
| 416 | 423 |
| 417 callback.Run(status); | 424 callback.Run(status); |
| 418 may_have_unfetched_changes_ = true; | 425 may_have_unfetched_changes_ = true; |
| 419 | 426 |
| 420 google_apis::DriveNotificationManager* drive_notification_manager = | 427 google_apis::DriveNotificationManager* drive_notification_manager = |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 503 | 510 |
| 504 void DriveFileSyncService::DoEnableOriginForTrackingChanges( | 511 void DriveFileSyncService::DoEnableOriginForTrackingChanges( |
| 505 const GURL& origin, | 512 const GURL& origin, |
| 506 const SyncStatusCallback& callback) { | 513 const SyncStatusCallback& callback) { |
| 507 if (!metadata_store_->IsOriginDisabled(origin)) { | 514 if (!metadata_store_->IsOriginDisabled(origin)) { |
| 508 callback.Run(SYNC_STATUS_OK); | 515 callback.Run(SYNC_STATUS_OK); |
| 509 return; | 516 return; |
| 510 } | 517 } |
| 511 | 518 |
| 512 metadata_store_->EnableOrigin(origin, callback); | 519 metadata_store_->EnableOrigin(origin, callback); |
| 513 pending_batch_sync_origins_.insert(origin); | 520 pending_batch_sync_origins_.insert( |
| 521 *metadata_store_->disabled_origins().find(origin)); | |
| 514 } | 522 } |
| 515 | 523 |
| 516 void DriveFileSyncService::DoDisableOriginForTrackingChanges( | 524 void DriveFileSyncService::DoDisableOriginForTrackingChanges( |
| 517 const GURL& origin, | 525 const GURL& origin, |
| 518 const SyncStatusCallback& callback) { | 526 const SyncStatusCallback& callback) { |
| 519 if (!metadata_store_->IsBatchSyncOrigin(origin) && | 527 if (!metadata_store_->IsBatchSyncOrigin(origin) && |
|
kinuko
2013/05/20 15:31:50
This line could be removed too?
calvinlo
2013/05/21 07:12:26
Done.
| |
| 520 !metadata_store_->IsIncrementalSyncOrigin(origin)) { | 528 !metadata_store_->IsIncrementalSyncOrigin(origin)) { |
| 521 callback.Run(SYNC_STATUS_OK); | 529 callback.Run(SYNC_STATUS_OK); |
| 522 return; | 530 return; |
| 523 } | 531 } |
| 524 | 532 |
| 525 remote_change_handler_.RemoveChangesForOrigin(origin); | 533 remote_change_handler_.RemoveChangesForOrigin(origin); |
| 526 pending_batch_sync_origins_.erase(origin); | 534 pending_batch_sync_origins_.erase(origin); |
| 527 metadata_store_->DisableOrigin(origin, callback); | 535 metadata_store_->DisableOrigin(origin, callback); |
| 528 } | 536 } |
| 529 | 537 |
| 530 void DriveFileSyncService::DoUninstallOrigin( | 538 void DriveFileSyncService::DoUninstallOrigin( |
| 531 const GURL& origin, | 539 const GURL& origin, |
| 532 const SyncStatusCallback& callback) { | 540 const SyncStatusCallback& callback) { |
| 541 // Because origin management is now split between DriveFileSyncService and | |
| 542 // DriveMetadataStore, it must be checked for in two places. | |
| 533 std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin); | 543 std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin); |
| 544 if (resource_id.empty()) { | |
| 545 std::map<GURL, std::string>::const_iterator iterator = | |
| 546 pending_batch_sync_origins_.find(origin); | |
| 547 if (iterator != pending_batch_sync_origins_.end()) | |
| 548 resource_id = iterator->second; | |
| 549 } | |
| 534 | 550 |
| 535 // An empty resource_id indicates either one of following two cases: | 551 // An empty resource_id indicates either one of following two cases: |
| 536 // 1) origin is not in metadata_store_ because the extension was never | 552 // 1) origin is not in metadata_store_ because the extension was never |
| 537 // run or it's not managed by this service, and thus no | 553 // run or it's not managed by this service, and thus no |
| 538 // origin directory on the remote drive was created. | 554 // origin directory on the remote drive was created. |
| 539 // 2) origin or sync root folder is deleted on Drive. | 555 // 2) origin or sync root folder is deleted on Drive. |
| 540 if (resource_id.empty()) { | 556 if (resource_id.empty()) { |
| 541 callback.Run(SYNC_STATUS_UNKNOWN_ORIGIN); | 557 callback.Run(SYNC_STATUS_UNKNOWN_ORIGIN); |
| 542 return; | 558 return; |
| 543 } | 559 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 614 running_local_sync_task_->Run(base::Bind( | 630 running_local_sync_task_->Run(base::Bind( |
| 615 &DriveFileSyncService::DidApplyLocalChange, AsWeakPtr(), callback)); | 631 &DriveFileSyncService::DidApplyLocalChange, AsWeakPtr(), callback)); |
| 616 } | 632 } |
| 617 | 633 |
| 618 void DriveFileSyncService::UpdateRegisteredOrigins() { | 634 void DriveFileSyncService::UpdateRegisteredOrigins() { |
| 619 ExtensionService* extension_service = | 635 ExtensionService* extension_service = |
| 620 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 636 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 621 if (!extension_service) | 637 if (!extension_service) |
| 622 return; | 638 return; |
| 623 | 639 |
| 640 // Must combine batch sync origins with incremental and disabled origins since | |
| 641 // batch origins are tracked in DriveFileSyncService but the others are in | |
| 642 // DriveMetaDataStore. | |
| 624 std::vector<GURL> origins; | 643 std::vector<GURL> origins; |
| 625 metadata_store_->GetAllOrigins(&origins); | 644 metadata_store_->GetAllOrigins(&origins); |
| 645 typedef std::map<GURL, std::string>::const_iterator iterator; | |
| 646 for (iterator itr = pending_batch_sync_origins_.begin(); | |
| 647 itr != pending_batch_sync_origins_.end(); ++itr) { | |
| 648 DCHECK(!metadata_store_->IsKnownOrigin(itr->first)); | |
| 649 origins.push_back(itr->first); | |
| 650 } | |
|
kinuko
2013/05/20 15:31:50
We seem to be checking pending_batch_sync_origins_
calvinlo
2013/05/21 07:12:26
Thanks for catching this. I have removed the error
| |
| 651 | |
| 652 // Update the status of every origin using status from ExtensionService. | |
| 626 for (std::vector<GURL>::const_iterator itr = origins.begin(); | 653 for (std::vector<GURL>::const_iterator itr = origins.begin(); |
| 627 itr != origins.end(); ++itr) { | 654 itr != origins.end(); ++itr) { |
| 628 std::string extension_id = itr->host(); | 655 std::string extension_id = itr->host(); |
| 629 GURL origin = | 656 GURL origin = |
| 630 extensions::Extension::GetBaseURLFromExtensionId(extension_id); | 657 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
| 658 bool is_pending_batch_sync_origin = (pending_batch_sync_origins_.find( | |
| 659 origin) != pending_batch_sync_origins_.end()); | |
| 631 | 660 |
| 632 if (!extension_service->GetInstalledExtension(extension_id)) { | 661 if (!extension_service->GetInstalledExtension(extension_id)) { |
| 633 // Extension has been uninstalled. | 662 // Extension has been uninstalled. |
| 663 pending_batch_sync_origins_.erase(origin); | |
| 634 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); | 664 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 635 } else if ((metadata_store_->IsBatchSyncOrigin(origin) || | 665 } else if ((is_pending_batch_sync_origin || |
| 636 metadata_store_->IsIncrementalSyncOrigin(origin)) && | 666 metadata_store_->IsBatchSyncOrigin(origin)) && |
|
kinuko
2013/05/20 15:31:50
IsBatchSyncOrigin(origin) is always false, right?
calvinlo
2013/05/21 07:12:26
I have added DCHECKS at the beginning to ensure th
| |
| 637 !extension_service->IsExtensionEnabled(extension_id)) { | 667 !extension_service->IsExtensionEnabled(extension_id)) { |
| 638 // Extension has been disabled. | 668 // pending batch sync origin has been disabled |
| 669 pending_batch_sync_origins_.erase(origin); | |
| 670 UninstallOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
| 671 } else if (metadata_store_->IsIncrementalSyncOrigin(origin) && | |
| 672 !extension_service->IsExtensionEnabled(extension_id)) { | |
| 673 // Incremental Extension has been disabled. | |
| 639 metadata_store_->DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 674 metadata_store_->DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 640 } else if (metadata_store_->IsOriginDisabled(origin) && | 675 } else if (metadata_store_->IsOriginDisabled(origin) && |
| 641 extension_service->IsExtensionEnabled(extension_id)) { | 676 extension_service->IsExtensionEnabled(extension_id)) { |
| 642 // Extension has been re-enabled. | 677 // Extension has been re-enabled. |
| 678 pending_batch_sync_origins_.insert( | |
| 679 *metadata_store_->disabled_origins().find(origin)); | |
| 643 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 680 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 644 pending_batch_sync_origins_.insert(origin); | |
| 645 } | 681 } |
| 646 } | 682 } |
| 647 } | 683 } |
| 648 | 684 |
| 649 void DriveFileSyncService::StartBatchSync( | 685 void DriveFileSyncService::StartBatchSync( |
| 650 const SyncStatusCallback& callback) { | 686 const SyncStatusCallback& callback) { |
| 651 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); | 687 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); |
| 688 DCHECK(!pending_batch_sync_origins_.empty()); | |
| 652 | 689 |
| 653 if (pending_batch_sync_origins_.empty()) { | 690 GURL origin = pending_batch_sync_origins_.begin()->first; |
| 654 callback.Run(SYNC_STATUS_OK); | 691 std::string resource_id = pending_batch_sync_origins_.begin()->second; |
| 655 return; | 692 DCHECK(!resource_id.empty()); |
| 656 } | |
| 657 | |
| 658 GURL origin = *pending_batch_sync_origins_.begin(); | |
| 659 pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin()); | 693 pending_batch_sync_origins_.erase(pending_batch_sync_origins_.begin()); |
| 660 std::string resource_id = metadata_store_->GetResourceIdForOrigin(origin); | |
| 661 DCHECK(!resource_id.empty()); | |
| 662 | 694 |
| 663 DCHECK(!metadata_store_->IsOriginDisabled(origin)); | 695 DCHECK(!metadata_store_->IsOriginDisabled(origin)); |
| 664 | 696 |
| 665 DVLOG(1) << "Start batch sync for:" << origin.spec(); | 697 DVLOG(1) << "Start batch sync for:" << origin.spec(); |
| 666 | 698 |
| 667 api_util_->GetLargestChangeStamp( | 699 api_util_->GetLargestChangeStamp( |
| 668 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, | 700 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, |
| 669 AsWeakPtr(), | 701 AsWeakPtr(), |
| 670 callback, | 702 callback, |
| 671 origin, | 703 origin, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 689 AsWeakPtr(), origin, callback)); | 721 AsWeakPtr(), origin, callback)); |
| 690 return; | 722 return; |
| 691 } | 723 } |
| 692 | 724 |
| 693 if (status != SYNC_STATUS_OK) { | 725 if (status != SYNC_STATUS_OK) { |
| 694 callback.Run(status); | 726 callback.Run(status); |
| 695 return; | 727 return; |
| 696 } | 728 } |
| 697 | 729 |
| 698 // Add this origin to batch sync origin if it hasn't been already. | 730 // Add this origin to batch sync origin if it hasn't been already. |
| 731 // TODO(calvinlo): Added files to file metadata mapping, this can be removed | |
| 732 // next when batch_sync_origins is removed from DriveMetadataStore. | |
| 699 if (!metadata_store_->IsKnownOrigin(origin)) { | 733 if (!metadata_store_->IsKnownOrigin(origin)) { |
| 700 metadata_store_->AddBatchSyncOrigin(origin, resource_id); | 734 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 701 pending_batch_sync_origins_.insert(origin); | |
| 702 } | 735 } |
|
kinuko
2013/05/20 15:31:50
nit: no { } for one-line body
calvinlo
2013/05/21 07:12:26
Done.
| |
| 703 | 736 |
| 704 callback.Run(SYNC_STATUS_OK); | 737 callback.Run(SYNC_STATUS_OK); |
| 705 } | 738 } |
| 706 | 739 |
| 707 void DriveFileSyncService::DidUninstallOrigin( | 740 void DriveFileSyncService::DidUninstallOrigin( |
| 708 const GURL& origin, | 741 const GURL& origin, |
| 709 const SyncStatusCallback& callback, | 742 const SyncStatusCallback& callback, |
| 710 google_apis::GDataErrorCode error) { | 743 google_apis::GDataErrorCode error) { |
| 711 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 744 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 712 if (status != SYNC_STATUS_OK) { | 745 if (status != SYNC_STATUS_OK) { |
| 713 callback.Run(status); | 746 callback.Run(status); |
| 714 return; | 747 return; |
| 715 } | 748 } |
| 716 | 749 |
| 717 // Origin directory has been removed so it's now safe to remove the origin | 750 // Origin directory has been removed so it's now safe to remove the origin |
| 718 // from the metadata store. | 751 // from the metadata store. |
| 719 DoUnregisterOriginForTrackingChanges(origin, callback); | 752 DoUnregisterOriginForTrackingChanges(origin, callback); |
| 720 } | 753 } |
| 721 | 754 |
| 722 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( | 755 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( |
| 723 const SyncStatusCallback& callback, | 756 const SyncStatusCallback& callback, |
| 724 const GURL& origin, | 757 const GURL& origin, |
| 725 const std::string& resource_id, | 758 const std::string& resource_id, |
| 726 google_apis::GDataErrorCode error, | 759 google_apis::GDataErrorCode error, |
| 727 int64 largest_changestamp) { | 760 int64 largest_changestamp) { |
| 728 if (error != google_apis::HTTP_SUCCESS) { | 761 if (error != google_apis::HTTP_SUCCESS) { |
| 729 pending_batch_sync_origins_.insert(origin); | 762 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 730 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); | 763 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
| 731 return; | 764 return; |
| 732 } | 765 } |
| 733 | 766 |
| 734 if (metadata_store_->incremental_sync_origins().empty()) { | 767 if (metadata_store_->incremental_sync_origins().empty()) { |
| 735 largest_fetched_changestamp_ = largest_changestamp; | 768 largest_fetched_changestamp_ = largest_changestamp; |
| 736 metadata_store_->SetLargestChangeStamp( | 769 metadata_store_->SetLargestChangeStamp( |
| 737 largest_changestamp, | 770 largest_changestamp, |
| 738 base::Bind(&EmptyStatusCallback)); | 771 base::Bind(&EmptyStatusCallback)); |
| 739 } | 772 } |
| 740 | 773 |
| 741 api_util_->ListFiles( | 774 api_util_->ListFiles( |
| 742 resource_id, | 775 resource_id, |
| 743 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 776 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
| 744 AsWeakPtr(), | 777 AsWeakPtr(), |
| 745 callback, | 778 callback, |
| 746 origin, | 779 origin, |
| 780 resource_id, | |
| 747 largest_changestamp)); | 781 largest_changestamp)); |
| 748 } | 782 } |
| 749 | 783 |
| 750 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( | 784 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( |
| 751 const SyncStatusCallback& callback, | 785 const SyncStatusCallback& callback, |
| 752 const GURL& origin, | 786 const GURL& origin, |
| 787 const std::string& resource_id, | |
| 753 int64 largest_changestamp, | 788 int64 largest_changestamp, |
| 754 google_apis::GDataErrorCode error, | 789 google_apis::GDataErrorCode error, |
| 755 scoped_ptr<google_apis::ResourceList> feed) { | 790 scoped_ptr<google_apis::ResourceList> feed) { |
| 756 if (error != google_apis::HTTP_SUCCESS) { | 791 if (error != google_apis::HTTP_SUCCESS) { |
| 757 pending_batch_sync_origins_.insert(origin); | 792 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 758 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); | 793 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
| 759 return; | 794 return; |
| 760 } | 795 } |
| 761 | 796 |
| 762 typedef ScopedVector<google_apis::ResourceEntry>::const_iterator iterator; | 797 typedef ScopedVector<google_apis::ResourceEntry>::const_iterator iterator; |
| 763 for (iterator itr = feed->entries().begin(); | 798 for (iterator itr = feed->entries().begin(); |
| 764 itr != feed->entries().end(); ++itr) { | 799 itr != feed->entries().end(); ++itr) { |
| 765 AppendRemoteChange(origin, **itr, largest_changestamp, | 800 const google_apis::ResourceEntry& entry = **itr; |
| 801 AppendRemoteChange(origin, entry, largest_changestamp, | |
| 766 RemoteChangeHandler::REMOTE_SYNC_TYPE_BATCH); | 802 RemoteChangeHandler::REMOTE_SYNC_TYPE_BATCH); |
| 803 | |
| 804 // Save to be fetched file to DB for restore in case of crash. | |
| 805 DriveMetadata metadata; | |
| 806 metadata.set_resource_id(entry.resource_id()); | |
| 807 metadata.set_md5_checksum(entry.file_md5()); | |
| 808 metadata.set_conflicted(false); | |
| 809 metadata.set_to_be_fetched(true); | |
| 810 | |
| 811 base::FilePath path = TitleToPath(entry.title()); | |
| 812 fileapi::FileSystemURL url(CreateSyncableFileSystemURL( | |
| 813 origin, kServiceName, path)); | |
| 814 // TODO(calvinlo): Write metadata and origin data as single batch command | |
| 815 // so it's not possible for the DB to contain a DriveMetadata with an | |
| 816 // unknown origin. | |
| 817 metadata_store_->UpdateEntry(url, metadata, | |
| 818 base::Bind(&EmptyStatusCallback)); | |
| 767 } | 819 } |
| 768 | 820 |
| 769 GURL next_feed_url; | 821 GURL next_feed_url; |
| 770 if (feed->GetNextFeedURL(&next_feed_url)) { | 822 if (feed->GetNextFeedURL(&next_feed_url)) { |
| 771 api_util_->ContinueListing( | 823 api_util_->ContinueListing( |
| 772 next_feed_url, | 824 next_feed_url, |
| 773 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 825 base::Bind(&DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
| 774 AsWeakPtr(), | 826 AsWeakPtr(), |
| 775 callback, | 827 callback, |
| 776 origin, | 828 origin, |
| 829 resource_id, | |
| 777 largest_changestamp)); | 830 largest_changestamp)); |
| 778 return; | 831 return; |
| 779 } | 832 } |
| 780 | 833 |
| 781 // Move |origin| to the incremental sync origin set if the origin has no file. | 834 // TODO(calvinlo): Eliminate batch_sync_origins so |
| 782 if (metadata_store_->IsBatchSyncOrigin(origin) && | 835 // MoveBatchSyncOriginToIncremental() happens directly. |
| 783 !remote_change_handler_.HasChangesForOrigin(origin)) { | 836 metadata_store_->AddBatchSyncOrigin(origin, resource_id); |
| 784 metadata_store_->MoveBatchSyncOriginToIncremental(origin); | 837 metadata_store_->MoveBatchSyncOriginToIncremental(origin); |
| 785 } | |
| 786 | |
| 787 may_have_unfetched_changes_ = true; | 838 may_have_unfetched_changes_ = true; |
| 788 callback.Run(SYNC_STATUS_OK); | 839 callback.Run(SYNC_STATUS_OK); |
| 789 } | 840 } |
| 790 | 841 |
| 791 // TODO(tzik): Factor out this conflict resolution function. | 842 // TODO(tzik): Factor out this conflict resolution function. |
| 792 ConflictResolutionResult DriveFileSyncService::ResolveConflictForLocalSync( | 843 ConflictResolutionResult DriveFileSyncService::ResolveConflictForLocalSync( |
| 793 SyncFileType local_file_type, | 844 SyncFileType local_file_type, |
| 794 const base::Time& local_updated_time, | 845 const base::Time& local_updated_time, |
| 795 SyncFileType remote_file_type, | 846 SyncFileType remote_file_type, |
| 796 const base::Time& remote_updated_time) { | 847 const base::Time& remote_updated_time) { |
| (...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1364 return true; | 1415 return true; |
| 1365 } | 1416 } |
| 1366 | 1417 |
| 1367 void DriveFileSyncService::RemoveRemoteChange( | 1418 void DriveFileSyncService::RemoveRemoteChange( |
| 1368 const FileSystemURL& url) { | 1419 const FileSystemURL& url) { |
| 1369 if (!remote_change_handler_.RemoveChangeForURL(url)) | 1420 if (!remote_change_handler_.RemoveChangeForURL(url)) |
| 1370 return; | 1421 return; |
| 1371 if (metadata_store_->IsBatchSyncOrigin(url.origin()) && | 1422 if (metadata_store_->IsBatchSyncOrigin(url.origin()) && |
| 1372 !remote_change_handler_.HasChangesForOrigin(url.origin())) { | 1423 !remote_change_handler_.HasChangesForOrigin(url.origin())) { |
| 1373 metadata_store_->MoveBatchSyncOriginToIncremental(url.origin()); | 1424 metadata_store_->MoveBatchSyncOriginToIncremental(url.origin()); |
| 1374 } | 1425 } |
|
kinuko
2013/05/20 15:31:50
These lines could be removed too?
calvinlo
2013/05/21 07:12:26
Done. I think it's ok to delete these because we m
| |
| 1375 } | 1426 } |
| 1376 | 1427 |
| 1377 void DriveFileSyncService::MarkConflict( | 1428 void DriveFileSyncService::MarkConflict( |
| 1378 const fileapi::FileSystemURL& url, | 1429 const fileapi::FileSystemURL& url, |
| 1379 DriveMetadata* drive_metadata, | 1430 DriveMetadata* drive_metadata, |
| 1380 const SyncStatusCallback& callback) { | 1431 const SyncStatusCallback& callback) { |
| 1381 DCHECK(drive_metadata); | 1432 DCHECK(drive_metadata); |
| 1382 if (drive_metadata->resource_id().empty()) { | 1433 if (drive_metadata->resource_id().empty()) { |
| 1383 // If the file does not have valid drive_metadata in the metadata store | 1434 // If the file does not have valid drive_metadata in the metadata store |
| 1384 // we must have a pending remote change entry. | 1435 // we must have a pending remote change entry. |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1702 void DriveFileSyncService::DidEnsureOriginRoot( | 1753 void DriveFileSyncService::DidEnsureOriginRoot( |
| 1703 const GURL& origin, | 1754 const GURL& origin, |
| 1704 const ResourceIdCallback& callback, | 1755 const ResourceIdCallback& callback, |
| 1705 google_apis::GDataErrorCode error, | 1756 google_apis::GDataErrorCode error, |
| 1706 const std::string& resource_id) { | 1757 const std::string& resource_id) { |
| 1707 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 1758 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 1708 if (status == SYNC_STATUS_OK && | 1759 if (status == SYNC_STATUS_OK && |
| 1709 metadata_store_->IsKnownOrigin(origin)) { | 1760 metadata_store_->IsKnownOrigin(origin)) { |
| 1710 metadata_store_->SetOriginRootDirectory(origin, resource_id); | 1761 metadata_store_->SetOriginRootDirectory(origin, resource_id); |
| 1711 if (metadata_store_->IsBatchSyncOrigin(origin)) | 1762 if (metadata_store_->IsBatchSyncOrigin(origin)) |
| 1712 pending_batch_sync_origins_.insert(origin); | 1763 pending_batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
|
kinuko
2013/05/20 15:31:50
These 2 lines are not needed anymore?
calvinlo
2013/05/21 07:12:26
Done.
| |
| 1713 } | 1764 } |
| 1714 callback.Run(status, resource_id); | 1765 callback.Run(status, resource_id); |
| 1715 } | 1766 } |
| 1716 | 1767 |
| 1717 std::string DriveFileSyncService::sync_root_resource_id() { | 1768 std::string DriveFileSyncService::sync_root_resource_id() { |
| 1718 return metadata_store_->sync_root_directory(); | 1769 return metadata_store_->sync_root_directory(); |
| 1719 } | 1770 } |
| 1720 | 1771 |
| 1721 } // namespace sync_file_system | 1772 } // namespace sync_file_system |
| OLD | NEW |