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 |