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_->EnableSyncOrigin(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 metadata_store_->DisableSyncOrigin(origin, base::Bind( |
| 456 &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| 457 AsWeakPtr(), base::Passed(&token), callback)); |
| 458 } |
| 459 |
427 void DriveFileSyncService::DeleteOriginDirectory( | 460 void DriveFileSyncService::DeleteOriginDirectory( |
428 const GURL& origin, | 461 const GURL& origin, |
429 const SyncStatusCallback& callback) { | 462 const SyncStatusCallback& callback) { |
430 scoped_ptr<TaskToken> token(GetToken( | 463 scoped_ptr<TaskToken> token(GetToken( |
431 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); | 464 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); |
432 if (!token) { | 465 if (!token) { |
433 pending_tasks_.push_back(base::Bind( | 466 pending_tasks_.push_back(base::Bind( |
434 &DriveFileSyncService::DeleteOriginDirectory, | 467 &DriveFileSyncService::DeleteOriginDirectory, |
435 AsWeakPtr(), origin, callback)); | 468 AsWeakPtr(), origin, callback)); |
436 return; | 469 return; |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 | 879 |
847 void DriveFileSyncService::DidInitializeMetadataStore( | 880 void DriveFileSyncService::DidInitializeMetadataStore( |
848 scoped_ptr<TaskToken> token, | 881 scoped_ptr<TaskToken> token, |
849 SyncStatusCode status, | 882 SyncStatusCode status, |
850 bool created) { | 883 bool created) { |
851 if (status != SYNC_STATUS_OK) { | 884 if (status != SYNC_STATUS_OK) { |
852 NotifyTaskDone(status, token.Pass()); | 885 NotifyTaskDone(status, token.Pass()); |
853 return; | 886 return; |
854 } | 887 } |
855 | 888 |
856 // Remove any origins that are not installed or enabled. | 889 UpdateRegisteredOrigins(); |
857 UnregisterInactiveExtensionsIds(); | |
858 | 890 |
859 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 891 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
860 | 892 |
861 // Mark all the batch sync origins as 'pending' so that we can start | 893 // Mark all the batch sync origins as 'pending' so that we can start |
862 // batch sync when we're ready. | 894 // batch sync when we're ready. |
863 DCHECK(pending_batch_sync_origins_.empty()); | 895 DCHECK(pending_batch_sync_origins_.empty()); |
864 for (std::map<GURL, std::string>::const_iterator itr = | 896 for (std::map<GURL, std::string>::const_iterator itr = |
865 metadata_store_->batch_sync_origins().begin(); | 897 metadata_store_->batch_sync_origins().begin(); |
866 itr != metadata_store_->batch_sync_origins().end(); | 898 itr != metadata_store_->batch_sync_origins().end(); |
867 ++itr) { | 899 ++itr) { |
(...skipping 11 matching lines...) Expand all Loading... |
879 const std::string& resource_id = itr->second; | 911 const std::string& resource_id = itr->second; |
880 AppendFetchChange(url.origin(), url.path(), resource_id); | 912 AppendFetchChange(url.origin(), url.path(), resource_id); |
881 } | 913 } |
882 | 914 |
883 // It's ok to fail, so we pass EmptyResourceIdCallback here. | 915 // It's ok to fail, so we pass EmptyResourceIdCallback here. |
884 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); | 916 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); |
885 | 917 |
886 RegisterDriveNotifications(); | 918 RegisterDriveNotifications(); |
887 } | 919 } |
888 | 920 |
889 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { | 921 void DriveFileSyncService::UpdateRegisteredOrigins() { |
890 ExtensionService* extension_service = | 922 ExtensionService* extension_service = |
891 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 923 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
892 if (!extension_service) | 924 if (!extension_service) |
893 return; | 925 return; |
894 std::vector<GURL> tracked_origins; | |
895 metadata_store_->GetAllOrigins(&tracked_origins); | |
896 | 926 |
897 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); | 927 std::vector<GURL> disabled_origins; |
898 itr != tracked_origins.end(); | 928 metadata_store_->GetDisabledOrigins(&disabled_origins); |
899 ++itr) { | 929 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin(); |
900 // Make sure the registered extension is installed and enabled. | 930 itr != disabled_origins.end(); ++itr) { |
901 std::string extension_id = itr->host(); | 931 std::string extension_id = itr->host(); |
902 const extensions::Extension* installed_extension = | 932 GURL origin = |
903 extension_service->GetExtensionById(extension_id, | 933 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
904 false /* include_disabled */); | 934 |
905 if (installed_extension != NULL) | 935 if (extension_service->GetInstalledExtension(extension_id) == NULL) { |
| 936 // Extension is uninstalled. Unregister origin. |
| 937 metadata_store_->RemoveOrigin( |
| 938 origin, base::Bind(&DidRemoveOrigin, origin)); |
906 continue; | 939 continue; |
| 940 } |
907 | 941 |
908 // Extension is either disabled or uninstalled. Unregister origin. | 942 if (extension_service->IsExtensionEnabled(extension_id)) { |
909 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( | 943 // Extension is enabled. Enable origin. |
910 extension_id); | 944 metadata_store_->EnableSyncOrigin( |
911 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); | 945 origin, base::Bind(&EmptyStatusCallback)); |
| 946 pending_batch_sync_origins_.insert(origin); |
| 947 continue; |
| 948 } |
| 949 |
| 950 // Extension is still disabled. |
| 951 } |
| 952 |
| 953 std::vector<GURL> enabled_origins; |
| 954 metadata_store_->GetEnabledOrigins(&enabled_origins); |
| 955 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin(); |
| 956 itr != enabled_origins.end(); ++itr) { |
| 957 std::string extension_id = itr->host(); |
| 958 GURL origin = |
| 959 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
| 960 |
| 961 if (extension_service->GetInstalledExtension(extension_id) == NULL) { |
| 962 // Extension is uninstalled. Unregister origin. |
| 963 metadata_store_->RemoveOrigin( |
| 964 origin, base::Bind(&DidRemoveOrigin, origin)); |
| 965 continue; |
| 966 } |
| 967 |
| 968 if (!extension_service->IsExtensionEnabled(extension_id)) { |
| 969 // Extension is disabled. Disable origin. |
| 970 metadata_store_->DisableSyncOrigin( |
| 971 origin, base::Bind(&EmptyStatusCallback)); |
| 972 continue; |
| 973 } |
| 974 |
| 975 // Extension is still enabled. |
912 } | 976 } |
913 } | 977 } |
914 | 978 |
915 void DriveFileSyncService::GetSyncRootDirectory( | 979 void DriveFileSyncService::GetSyncRootDirectory( |
916 scoped_ptr<TaskToken> token, | 980 scoped_ptr<TaskToken> token, |
917 const ResourceIdCallback& callback) { | 981 const ResourceIdCallback& callback) { |
918 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); | 982 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); |
919 sync_client_->GetDriveDirectoryForSyncRoot( | 983 sync_client_->GetDriveDirectoryForSyncRoot( |
920 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, | 984 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, |
921 AsWeakPtr(), base::Passed(&token), callback)); | 985 AsWeakPtr(), base::Passed(&token), callback)); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1010 const std::string& resource_id) { | 1074 const std::string& resource_id) { |
1011 if (error != google_apis::HTTP_SUCCESS && | 1075 if (error != google_apis::HTTP_SUCCESS && |
1012 error != google_apis::HTTP_CREATED) { | 1076 error != google_apis::HTTP_CREATED) { |
1013 SyncStatusCode status = | 1077 SyncStatusCode status = |
1014 GDataErrorCodeToSyncStatusCodeWrapper(error); | 1078 GDataErrorCodeToSyncStatusCodeWrapper(error); |
1015 NotifyTaskDone(status, token.Pass()); | 1079 NotifyTaskDone(status, token.Pass()); |
1016 callback.Run(status); | 1080 callback.Run(status); |
1017 return; | 1081 return; |
1018 } | 1082 } |
1019 | 1083 |
1020 metadata_store_->AddBatchSyncOrigin(origin, resource_id); | 1084 if (!metadata_store_->IsDisabledSyncOrigin(origin)) { |
1021 pending_batch_sync_origins_.insert(origin); | 1085 metadata_store_->AddBatchSyncOrigin(origin, resource_id); |
| 1086 pending_batch_sync_origins_.insert(origin); |
| 1087 } |
1022 | 1088 |
1023 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1089 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
1024 callback.Run(SYNC_STATUS_OK); | 1090 callback.Run(SYNC_STATUS_OK); |
1025 } | 1091 } |
1026 | 1092 |
1027 void DriveFileSyncService::DidDeleteOriginDirectory( | 1093 void DriveFileSyncService::DidDeleteOriginDirectory( |
1028 scoped_ptr<TaskToken> token, | 1094 scoped_ptr<TaskToken> token, |
1029 const SyncStatusCallback& callback, | 1095 const SyncStatusCallback& callback, |
1030 google_apis::GDataErrorCode error) { | 1096 google_apis::GDataErrorCode error) { |
1031 SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 1097 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 | 1168 // (indicates that we may have longer polling cycle), trigger the first |
1103 // incremental sync on next task cycle. | 1169 // incremental sync on next task cycle. |
1104 if (pending_batch_sync_origins_.empty() && | 1170 if (pending_batch_sync_origins_.empty() && |
1105 push_notification_enabled_) { | 1171 push_notification_enabled_) { |
1106 may_have_unfetched_changes_ = true; | 1172 may_have_unfetched_changes_ = true; |
1107 } | 1173 } |
1108 | 1174 |
1109 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1175 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
1110 } | 1176 } |
1111 | 1177 |
1112 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( | 1178 void DriveFileSyncService::DidChangeOriginOnMetadataStore( |
1113 scoped_ptr<TaskToken> token, | 1179 scoped_ptr<TaskToken> token, |
1114 const SyncStatusCallback& callback, | 1180 const SyncStatusCallback& callback, |
1115 SyncStatusCode status) { | 1181 SyncStatusCode status) { |
1116 NotifyTaskDone(status, token.Pass()); | 1182 NotifyTaskDone(status, token.Pass()); |
1117 callback.Run(status); | 1183 callback.Run(status); |
1118 } | 1184 } |
1119 | 1185 |
1120 void DriveFileSyncService::DidGetRemoteFileMetadata( | 1186 void DriveFileSyncService::DidGetRemoteFileMetadata( |
1121 const SyncFileMetadataCallback& callback, | 1187 const SyncFileMetadataCallback& callback, |
1122 google_apis::GDataErrorCode error, | 1188 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); | 2343 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); |
2278 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); | 2344 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); |
2279 } | 2345 } |
2280 | 2346 |
2281 FOR_EACH_OBSERVER( | 2347 FOR_EACH_OBSERVER( |
2282 FileStatusObserver, file_status_observers_, | 2348 FileStatusObserver, file_status_observers_, |
2283 OnFileStatusChanged(url, sync_status, action_taken, direction)); | 2349 OnFileStatusChanged(url, sync_status, action_taken, direction)); |
2284 } | 2350 } |
2285 | 2351 |
2286 } // namespace sync_file_system | 2352 } // namespace sync_file_system |
OLD | NEW |