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 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 413 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); | 413 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); |
| 414 if (found != origin_to_changes_map_.end()) { | 414 if (found != origin_to_changes_map_.end()) { |
| 415 for (PathToChangeMap::iterator itr = found->second.begin(); | 415 for (PathToChangeMap::iterator itr = found->second.begin(); |
| 416 itr != found->second.end(); ++itr) | 416 itr != found->second.end(); ++itr) |
| 417 pending_changes_.erase(itr->second.position_in_queue); | 417 pending_changes_.erase(itr->second.position_in_queue); |
| 418 origin_to_changes_map_.erase(found); | 418 origin_to_changes_map_.erase(found); |
| 419 } | 419 } |
| 420 pending_batch_sync_origins_.erase(origin); | 420 pending_batch_sync_origins_.erase(origin); |
| 421 | 421 |
| 422 metadata_store_->RemoveOrigin(origin, base::Bind( | 422 metadata_store_->RemoveOrigin(origin, base::Bind( |
| 423 &DriveFileSyncService::DidRemoveOriginOnMetadataStore, | 423 &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| 424 AsWeakPtr(), base::Passed(&token), callback)); | 424 AsWeakPtr(), base::Passed(&token), callback)); |
| 425 } | 425 } |
| 426 | 426 |
| 427 void DriveFileSyncService::EnableOriginForTrackingChanges( | |
| 428 const GURL& origin, | |
| 429 const SyncStatusCallback& callback) { | |
| 430 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); | |
| 431 if (!token) { | |
| 432 pending_tasks_.push_back(base::Bind( | |
| 433 &DriveFileSyncService::EnableOriginForTrackingChanges, | |
| 434 AsWeakPtr(), origin, callback)); | |
| 435 return; | |
| 436 } | |
| 437 | |
| 438 metadata_store_->EnableOriginSync(origin, base::Bind( | |
| 439 &DriveFileSyncService::DidChangeOriginOnMetadataStore, | |
| 440 AsWeakPtr(), base::Passed(&token), callback)); | |
| 441 pending_batch_sync_origins_.insert(origin); | |
| 442 } | |
| 443 | |
| 444 void DriveFileSyncService::DisableOriginForTrackingChanges( | |
| 445 const GURL& origin, | |
| 446 const SyncStatusCallback& callback) { | |
| 447 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); | |
| 448 if (!token) { | |
| 449 pending_tasks_.push_back(base::Bind( | |
| 450 &DriveFileSyncService::DisableOriginForTrackingChanges, | |
| 451 AsWeakPtr(), origin, callback)); | |
| 452 return; | |
| 453 } | |
| 454 | |
| 455 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); | |
| 456 if (found != origin_to_changes_map_.end()) { | |
| 457 for (PathToChangeMap::iterator itr = found->second.begin(); | |
| 458 itr != found->second.end(); ++itr) | |
| 459 origin_to_changes_map_.erase(found); | |
|
kinuko
2013/03/16 23:16:51
I'm afraid I'm lost here... do we call origin_to_c
nhiroki
2013/03/18 09:40:18
Thanks for pointing out! I mean to erase pending c
| |
| 460 } | |
| 461 pending_batch_sync_origins_.erase(origin); | |
| 462 | |
| 463 metadata_store_->DisableOriginSync(origin, base::Bind( | |
| 464 &DriveFileSyncService::DidChangeOriginOnMetadataStore, | |
| 465 AsWeakPtr(), base::Passed(&token), callback)); | |
| 466 } | |
| 467 | |
| 427 void DriveFileSyncService::DeleteOriginDirectory( | 468 void DriveFileSyncService::DeleteOriginDirectory( |
| 428 const GURL& origin, | 469 const GURL& origin, |
| 429 const SyncStatusCallback& callback) { | 470 const SyncStatusCallback& callback) { |
| 430 scoped_ptr<TaskToken> token(GetToken( | 471 scoped_ptr<TaskToken> token(GetToken( |
| 431 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); | 472 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); |
| 432 if (!token) { | 473 if (!token) { |
| 433 pending_tasks_.push_back(base::Bind( | 474 pending_tasks_.push_back(base::Bind( |
| 434 &DriveFileSyncService::DeleteOriginDirectory, | 475 &DriveFileSyncService::DeleteOriginDirectory, |
| 435 AsWeakPtr(), origin, callback)); | 476 AsWeakPtr(), origin, callback)); |
| 436 return; | 477 return; |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 | 887 |
| 847 void DriveFileSyncService::DidInitializeMetadataStore( | 888 void DriveFileSyncService::DidInitializeMetadataStore( |
| 848 scoped_ptr<TaskToken> token, | 889 scoped_ptr<TaskToken> token, |
| 849 SyncStatusCode status, | 890 SyncStatusCode status, |
| 850 bool created) { | 891 bool created) { |
| 851 if (status != SYNC_STATUS_OK) { | 892 if (status != SYNC_STATUS_OK) { |
| 852 NotifyTaskDone(status, token.Pass()); | 893 NotifyTaskDone(status, token.Pass()); |
| 853 return; | 894 return; |
| 854 } | 895 } |
| 855 | 896 |
| 856 // Remove any origins that are not installed or enabled. | 897 UpdateRegisteredOrigins(); |
| 857 UnregisterInactiveExtensionsIds(); | |
| 858 | 898 |
| 859 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 899 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
| 860 | 900 |
| 861 // Mark all the batch sync origins as 'pending' so that we can start | 901 // Mark all the batch sync origins as 'pending' so that we can start |
| 862 // batch sync when we're ready. | 902 // batch sync when we're ready. |
| 863 DCHECK(pending_batch_sync_origins_.empty()); | 903 DCHECK(pending_batch_sync_origins_.empty()); |
| 864 for (std::map<GURL, std::string>::const_iterator itr = | 904 for (std::map<GURL, std::string>::const_iterator itr = |
| 865 metadata_store_->batch_sync_origins().begin(); | 905 metadata_store_->batch_sync_origins().begin(); |
| 866 itr != metadata_store_->batch_sync_origins().end(); | 906 itr != metadata_store_->batch_sync_origins().end(); |
| 867 ++itr) { | 907 ++itr) { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 879 const std::string& resource_id = itr->second; | 919 const std::string& resource_id = itr->second; |
| 880 AppendFetchChange(url.origin(), url.path(), resource_id); | 920 AppendFetchChange(url.origin(), url.path(), resource_id); |
| 881 } | 921 } |
| 882 | 922 |
| 883 // It's ok to fail, so we pass EmptyResourceIdCallback here. | 923 // It's ok to fail, so we pass EmptyResourceIdCallback here. |
| 884 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); | 924 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); |
| 885 | 925 |
| 886 RegisterDriveNotifications(); | 926 RegisterDriveNotifications(); |
| 887 } | 927 } |
| 888 | 928 |
| 889 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { | 929 void DriveFileSyncService::UpdateRegisteredOrigins() { |
| 890 ExtensionService* extension_service = | 930 ExtensionService* extension_service = |
| 891 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 931 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 892 if (!extension_service) | 932 if (!extension_service) |
| 893 return; | 933 return; |
| 894 std::vector<GURL> tracked_origins; | |
| 895 metadata_store_->GetAllOrigins(&tracked_origins); | |
| 896 | 934 |
| 897 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); | 935 std::vector<GURL> disabled_origins; |
| 898 itr != tracked_origins.end(); | 936 metadata_store_->GetDisabledOrigins(&disabled_origins); |
| 899 ++itr) { | 937 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin(); |
| 900 // Make sure the registered extension is installed and enabled. | 938 itr != disabled_origins.end(); ++itr) { |
| 901 std::string extension_id = itr->host(); | 939 std::string extension_id = itr->host(); |
| 902 const extensions::Extension* installed_extension = | 940 GURL origin = |
| 903 extension_service->GetExtensionById(extension_id, | 941 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
| 904 false /* include_disabled */); | 942 |
| 905 if (installed_extension != NULL) | 943 if (extension_service->GetInstalledExtension(extension_id) == NULL) { |
| 944 // Extension is uninstalled. Unregister origin. | |
| 945 metadata_store_->RemoveOrigin( | |
| 946 origin, base::Bind(&DidRemoveOrigin, origin)); | |
| 906 continue; | 947 continue; |
| 948 } | |
| 907 | 949 |
| 908 // Extension is either disabled or uninstalled. Unregister origin. | 950 if (extension_service->IsExtensionEnabled(extension_id)) { |
| 909 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( | 951 // Extension is enabled. Enable origin. |
| 910 extension_id); | 952 metadata_store_->EnableOriginSync( |
| 911 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); | 953 origin, base::Bind(&EmptyStatusCallback)); |
| 954 pending_batch_sync_origins_.insert(origin); | |
| 955 continue; | |
| 956 } | |
| 957 | |
| 958 // Extension is still disabled. | |
| 959 } | |
| 960 | |
| 961 std::vector<GURL> enabled_origins; | |
| 962 metadata_store_->GetEnabledOrigins(&enabled_origins); | |
| 963 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin(); | |
| 964 itr != enabled_origins.end(); ++itr) { | |
| 965 std::string extension_id = itr->host(); | |
| 966 GURL origin = | |
| 967 extensions::Extension::GetBaseURLFromExtensionId(extension_id); | |
| 968 | |
| 969 if (extension_service->GetInstalledExtension(extension_id) == NULL) { | |
| 970 // Extension is uninstalled. Unregister origin. | |
| 971 metadata_store_->RemoveOrigin( | |
| 972 origin, base::Bind(&DidRemoveOrigin, origin)); | |
| 973 continue; | |
| 974 } | |
| 975 | |
| 976 if (!extension_service->IsExtensionEnabled(extension_id)) { | |
| 977 // Extension is disabled. Disable origin. | |
| 978 metadata_store_->DisableOriginSync( | |
| 979 origin, base::Bind(&EmptyStatusCallback)); | |
| 980 continue; | |
| 981 } | |
| 982 | |
| 983 // Extension is still enabled. | |
| 912 } | 984 } |
| 913 } | 985 } |
| 914 | 986 |
| 915 void DriveFileSyncService::GetSyncRootDirectory( | 987 void DriveFileSyncService::GetSyncRootDirectory( |
| 916 scoped_ptr<TaskToken> token, | 988 scoped_ptr<TaskToken> token, |
| 917 const ResourceIdCallback& callback) { | 989 const ResourceIdCallback& callback) { |
| 918 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); | 990 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); |
| 919 sync_client_->GetDriveDirectoryForSyncRoot( | 991 sync_client_->GetDriveDirectoryForSyncRoot( |
| 920 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, | 992 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, |
| 921 AsWeakPtr(), base::Passed(&token), callback)); | 993 AsWeakPtr(), base::Passed(&token), callback)); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1010 const std::string& resource_id) { | 1082 const std::string& resource_id) { |
| 1011 if (error != google_apis::HTTP_SUCCESS && | 1083 if (error != google_apis::HTTP_SUCCESS && |
| 1012 error != google_apis::HTTP_CREATED) { | 1084 error != google_apis::HTTP_CREATED) { |
| 1013 SyncStatusCode status = | 1085 SyncStatusCode status = |
| 1014 GDataErrorCodeToSyncStatusCodeWrapper(error); | 1086 GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 1015 NotifyTaskDone(status, token.Pass()); | 1087 NotifyTaskDone(status, token.Pass()); |
| 1016 callback.Run(status); | 1088 callback.Run(status); |
| 1017 return; | 1089 return; |
| 1018 } | 1090 } |
| 1019 | 1091 |
| 1020 metadata_store_->AddBatchSyncOrigin(origin, resource_id); | 1092 if (!metadata_store_->IsDisabledSyncOrigin(origin)) { |
| 1021 pending_batch_sync_origins_.insert(origin); | 1093 metadata_store_->AddBatchSyncOrigin(origin, resource_id); |
| 1094 pending_batch_sync_origins_.insert(origin); | |
| 1095 } | |
| 1022 | 1096 |
| 1023 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1097 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
| 1024 callback.Run(SYNC_STATUS_OK); | 1098 callback.Run(SYNC_STATUS_OK); |
| 1025 } | 1099 } |
| 1026 | 1100 |
| 1027 void DriveFileSyncService::DidDeleteOriginDirectory( | 1101 void DriveFileSyncService::DidDeleteOriginDirectory( |
| 1028 scoped_ptr<TaskToken> token, | 1102 scoped_ptr<TaskToken> token, |
| 1029 const SyncStatusCallback& callback, | 1103 const SyncStatusCallback& callback, |
| 1030 google_apis::GDataErrorCode error) { | 1104 google_apis::GDataErrorCode error) { |
| 1031 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 1105 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1102 // (indicates that we may have longer polling cycle), trigger the first | 1176 // (indicates that we may have longer polling cycle), trigger the first |
| 1103 // incremental sync on next task cycle. | 1177 // incremental sync on next task cycle. |
| 1104 if (pending_batch_sync_origins_.empty() && | 1178 if (pending_batch_sync_origins_.empty() && |
| 1105 push_notification_enabled_) { | 1179 push_notification_enabled_) { |
| 1106 may_have_unfetched_changes_ = true; | 1180 may_have_unfetched_changes_ = true; |
| 1107 } | 1181 } |
| 1108 | 1182 |
| 1109 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1183 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
| 1110 } | 1184 } |
| 1111 | 1185 |
| 1112 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( | 1186 void DriveFileSyncService::DidChangeOriginOnMetadataStore( |
| 1113 scoped_ptr<TaskToken> token, | 1187 scoped_ptr<TaskToken> token, |
| 1114 const SyncStatusCallback& callback, | 1188 const SyncStatusCallback& callback, |
| 1115 SyncStatusCode status) { | 1189 SyncStatusCode status) { |
| 1116 NotifyTaskDone(status, token.Pass()); | 1190 NotifyTaskDone(status, token.Pass()); |
| 1117 callback.Run(status); | 1191 callback.Run(status); |
| 1118 } | 1192 } |
| 1119 | 1193 |
| 1120 void DriveFileSyncService::DidGetRemoteFileMetadata( | 1194 void DriveFileSyncService::DidGetRemoteFileMetadata( |
| 1121 const SyncFileMetadataCallback& callback, | 1195 const SyncFileMetadataCallback& callback, |
| 1122 google_apis::GDataErrorCode error, | 1196 google_apis::GDataErrorCode error, |
| (...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2277 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); | 2351 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); |
| 2278 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); | 2352 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); |
| 2279 } | 2353 } |
| 2280 | 2354 |
| 2281 FOR_EACH_OBSERVER( | 2355 FOR_EACH_OBSERVER( |
| 2282 FileStatusObserver, file_status_observers_, | 2356 FileStatusObserver, file_status_observers_, |
| 2283 OnFileStatusChanged(url, sync_status, action_taken, direction)); | 2357 OnFileStatusChanged(url, sync_status, action_taken, direction)); |
| 2284 } | 2358 } |
| 2285 | 2359 |
| 2286 } // namespace sync_file_system | 2360 } // namespace sync_file_system |
| OLD | NEW |