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 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
415 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); | 415 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); |
416 if (found != origin_to_changes_map_.end()) { | 416 if (found != origin_to_changes_map_.end()) { |
417 for (PathToChangeMap::iterator itr = found->second.begin(); | 417 for (PathToChangeMap::iterator itr = found->second.begin(); |
418 itr != found->second.end(); ++itr) | 418 itr != found->second.end(); ++itr) |
419 pending_changes_.erase(itr->second.position_in_queue); | 419 pending_changes_.erase(itr->second.position_in_queue); |
420 origin_to_changes_map_.erase(found); | 420 origin_to_changes_map_.erase(found); |
421 } | 421 } |
422 pending_batch_sync_origins_.erase(origin); | 422 pending_batch_sync_origins_.erase(origin); |
423 | 423 |
424 metadata_store_->RemoveOrigin(origin, base::Bind( | 424 metadata_store_->RemoveOrigin(origin, base::Bind( |
425 &DriveFileSyncService::DidRemoveOriginOnMetadataStore, | 425 &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
426 AsWeakPtr(), base::Passed(&token), callback)); | 426 AsWeakPtr(), base::Passed(&token), callback)); |
427 } | 427 } |
428 | 428 |
429 void DriveFileSyncService::EnableOriginForTrackingChanges( | |
430 const GURL& origin, | |
431 const SyncStatusCallback& callback) { | |
432 if (!metadata_store_->IsOriginDisabled(origin)) | |
433 return; | |
434 | |
435 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); | |
436 if (!token) { | |
437 pending_tasks_.push_back(base::Bind( | |
438 &DriveFileSyncService::EnableOriginForTrackingChanges, | |
439 AsWeakPtr(), origin, callback)); | |
440 return; | |
441 } | |
442 | |
443 metadata_store_->EnableOrigin(origin, base::Bind( | |
444 &DriveFileSyncService::DidChangeOriginOnMetadataStore, | |
445 AsWeakPtr(), base::Passed(&token), callback)); | |
446 pending_batch_sync_origins_.insert(origin); | |
447 } | |
448 | |
449 void DriveFileSyncService::DisableOriginForTrackingChanges( | |
450 const GURL& origin, | |
451 const SyncStatusCallback& callback) { | |
452 if (!metadata_store_->IsBatchSyncOrigin(origin) && | |
453 !metadata_store_->IsIncrementalSyncOrigin(origin)) | |
454 return; | |
455 | |
456 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); | |
457 if (!token) { | |
458 pending_tasks_.push_back(base::Bind( | |
459 &DriveFileSyncService::DisableOriginForTrackingChanges, | |
460 AsWeakPtr(), origin, callback)); | |
461 return; | |
462 } | |
463 | |
464 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); | |
465 if (found != origin_to_changes_map_.end()) { | |
466 for (PathToChangeMap::iterator itr = found->second.begin(); | |
467 itr != found->second.end(); ++itr) | |
468 pending_changes_.erase(itr->second.position_in_queue); | |
469 origin_to_changes_map_.erase(found); | |
470 } | |
kinuko
2013/03/19 04:01:49
nit: it may look nicer if we define a sub method (
nhiroki
2013/03/19 09:36:13
Added TODO comment.
| |
471 pending_batch_sync_origins_.erase(origin); | |
472 | |
473 metadata_store_->DisableOrigin(origin, base::Bind( | |
474 &DriveFileSyncService::DidChangeOriginOnMetadataStore, | |
475 AsWeakPtr(), base::Passed(&token), callback)); | |
476 } | |
477 | |
429 void DriveFileSyncService::DeleteOriginDirectory( | 478 void DriveFileSyncService::DeleteOriginDirectory( |
430 const GURL& origin, | 479 const GURL& origin, |
431 const SyncStatusCallback& callback) { | 480 const SyncStatusCallback& callback) { |
432 scoped_ptr<TaskToken> token(GetToken( | 481 scoped_ptr<TaskToken> token(GetToken( |
433 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); | 482 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); |
434 if (!token) { | 483 if (!token) { |
435 pending_tasks_.push_back(base::Bind( | 484 pending_tasks_.push_back(base::Bind( |
436 &DriveFileSyncService::DeleteOriginDirectory, | 485 &DriveFileSyncService::DeleteOriginDirectory, |
437 AsWeakPtr(), origin, callback)); | 486 AsWeakPtr(), origin, callback)); |
438 return; | 487 return; |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
848 | 897 |
849 void DriveFileSyncService::DidInitializeMetadataStore( | 898 void DriveFileSyncService::DidInitializeMetadataStore( |
850 scoped_ptr<TaskToken> token, | 899 scoped_ptr<TaskToken> token, |
851 SyncStatusCode status, | 900 SyncStatusCode status, |
852 bool created) { | 901 bool created) { |
853 if (status != SYNC_STATUS_OK) { | 902 if (status != SYNC_STATUS_OK) { |
854 NotifyTaskDone(status, token.Pass()); | 903 NotifyTaskDone(status, token.Pass()); |
855 return; | 904 return; |
856 } | 905 } |
857 | 906 |
858 // Remove any origins that are not installed or enabled. | 907 UpdateRegisteredOrigins(); |
859 UnregisterInactiveExtensionsIds(); | |
860 | 908 |
861 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 909 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
862 | 910 |
863 // Mark all the batch sync origins as 'pending' so that we can start | 911 // Mark all the batch sync origins as 'pending' so that we can start |
864 // batch sync when we're ready. | 912 // batch sync when we're ready. |
865 DCHECK(pending_batch_sync_origins_.empty()); | 913 DCHECK(pending_batch_sync_origins_.empty()); |
866 for (std::map<GURL, std::string>::const_iterator itr = | 914 for (std::map<GURL, std::string>::const_iterator itr = |
867 metadata_store_->batch_sync_origins().begin(); | 915 metadata_store_->batch_sync_origins().begin(); |
868 itr != metadata_store_->batch_sync_origins().end(); | 916 itr != metadata_store_->batch_sync_origins().end(); |
869 ++itr) { | 917 ++itr) { |
(...skipping 11 matching lines...) Expand all Loading... | |
881 const std::string& resource_id = itr->second; | 929 const std::string& resource_id = itr->second; |
882 AppendFetchChange(url.origin(), url.path(), resource_id); | 930 AppendFetchChange(url.origin(), url.path(), resource_id); |
883 } | 931 } |
884 | 932 |
885 // It's ok to fail, so we pass EmptyResourceIdCallback here. | 933 // It's ok to fail, so we pass EmptyResourceIdCallback here. |
886 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); | 934 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); |
887 | 935 |
888 RegisterDriveNotifications(); | 936 RegisterDriveNotifications(); |
889 } | 937 } |
890 | 938 |
891 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { | 939 void DriveFileSyncService::UpdateRegisteredOrigins() { |
892 ExtensionService* extension_service = | 940 ExtensionService* extension_service = |
893 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 941 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
894 if (!extension_service) | 942 if (!extension_service) |
895 return; | 943 return; |
896 std::vector<GURL> tracked_origins; | |
897 metadata_store_->GetAllOrigins(&tracked_origins); | |
898 | 944 |
899 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); | 945 // TODO(nhiroki): clean up these loops with similar bodies. |
900 itr != tracked_origins.end(); | 946 // http://crbug.com/211600 |
901 ++itr) { | 947 |
902 // Make sure the registered extension is installed and enabled. | 948 std::vector<GURL> disabled_origins; |
949 metadata_store_->GetDisabledOrigins(&disabled_origins); | |
950 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin(); | |
951 itr != disabled_origins.end(); ++itr) { | |
903 std::string extension_id = itr->host(); | 952 std::string extension_id = itr->host(); |
904 const extensions::Extension* installed_extension = | 953 GURL origin = |
905 extension_service->GetExtensionById(extension_id, | 954 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
906 false /* include_disabled */); | 955 |
907 if (installed_extension != NULL) | 956 if (extension_service->GetInstalledExtension(extension_id) == NULL) { |
957 // Extension is uninstalled. Unregister origin. | |
958 metadata_store_->RemoveOrigin( | |
959 origin, base::Bind(&DidRemoveOrigin, origin)); | |
908 continue; | 960 continue; |
961 } | |
909 | 962 |
910 // Extension is either disabled or uninstalled. Unregister origin. | 963 if (extension_service->IsExtensionEnabled(extension_id)) { |
911 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( | 964 // Extension is enabled. Enable origin. |
912 extension_id); | 965 metadata_store_->EnableOrigin( |
913 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); | 966 origin, base::Bind(&EmptyStatusCallback)); |
967 pending_batch_sync_origins_.insert(origin); | |
968 continue; | |
969 } | |
970 | |
971 // Extension is still disabled. | |
972 } | |
973 | |
974 std::vector<GURL> enabled_origins; | |
975 metadata_store_->GetEnabledOrigins(&enabled_origins); | |
976 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin(); | |
977 itr != enabled_origins.end(); ++itr) { | |
978 std::string extension_id = itr->host(); | |
979 GURL origin = | |
980 extensions::Extension::GetBaseURLFromExtensionId(extension_id); | |
981 | |
982 if (extension_service->GetInstalledExtension(extension_id) == NULL) { | |
983 // Extension is uninstalled. Unregister origin. | |
984 metadata_store_->RemoveOrigin( | |
985 origin, base::Bind(&DidRemoveOrigin, origin)); | |
986 continue; | |
987 } | |
988 | |
989 if (!extension_service->IsExtensionEnabled(extension_id)) { | |
990 // Extension is disabled. Disable origin. | |
991 metadata_store_->DisableOrigin( | |
992 origin, base::Bind(&EmptyStatusCallback)); | |
993 continue; | |
994 } | |
995 | |
996 // Extension is still enabled. | |
914 } | 997 } |
915 } | 998 } |
916 | 999 |
917 void DriveFileSyncService::GetSyncRootDirectory( | 1000 void DriveFileSyncService::GetSyncRootDirectory( |
918 scoped_ptr<TaskToken> token, | 1001 scoped_ptr<TaskToken> token, |
919 const ResourceIdCallback& callback) { | 1002 const ResourceIdCallback& callback) { |
920 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); | 1003 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); |
921 sync_client_->GetDriveDirectoryForSyncRoot( | 1004 sync_client_->GetDriveDirectoryForSyncRoot( |
922 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, | 1005 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, |
923 AsWeakPtr(), base::Passed(&token), callback)); | 1006 AsWeakPtr(), base::Passed(&token), callback)); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
959 GetDriveDirectoryForOrigin(origin, callback, sync_root_resource_id); | 1042 GetDriveDirectoryForOrigin(origin, callback, sync_root_resource_id); |
960 } | 1043 } |
961 | 1044 |
962 void DriveFileSyncService::StartBatchSyncForOrigin( | 1045 void DriveFileSyncService::StartBatchSyncForOrigin( |
963 const GURL& origin, | 1046 const GURL& origin, |
964 const std::string& resource_id) { | 1047 const std::string& resource_id) { |
965 scoped_ptr<TaskToken> token( | 1048 scoped_ptr<TaskToken> token( |
966 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); | 1049 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); |
967 DCHECK(token); | 1050 DCHECK(token); |
968 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); | 1051 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); |
1052 DCHECK(!metadata_store_->IsOriginDisabled(origin)); | |
969 | 1053 |
970 DVLOG(1) << "Start batch sync for:" << origin.spec(); | 1054 DVLOG(1) << "Start batch sync for:" << origin.spec(); |
971 | 1055 |
972 sync_client_->GetLargestChangeStamp( | 1056 sync_client_->GetLargestChangeStamp( |
973 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, | 1057 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, |
974 AsWeakPtr(), base::Passed(&token), origin, resource_id)); | 1058 AsWeakPtr(), base::Passed(&token), origin, resource_id)); |
975 | 1059 |
976 may_have_unfetched_changes_ = false; | 1060 may_have_unfetched_changes_ = false; |
977 } | 1061 } |
978 | 1062 |
979 void DriveFileSyncService::GetDriveDirectoryForOrigin( | 1063 void DriveFileSyncService::GetDriveDirectoryForOrigin( |
980 const GURL& origin, | 1064 const GURL& origin, |
981 const SyncStatusCallback& callback, | 1065 const SyncStatusCallback& callback, |
982 const std::string& sync_root_resource_id) { | 1066 const std::string& sync_root_resource_id) { |
983 scoped_ptr<TaskToken> token(GetToken( | 1067 scoped_ptr<TaskToken> token(GetToken( |
984 FROM_HERE, TASK_TYPE_DRIVE, "Retrieving origin metadata")); | 1068 FROM_HERE, TASK_TYPE_DRIVE, "Retrieving origin metadata")); |
985 if (!token) { | 1069 if (!token) { |
986 pending_tasks_.push_back(base::Bind( | 1070 pending_tasks_.push_back(base::Bind( |
987 &DriveFileSyncService::GetDriveDirectoryForOrigin, | 1071 &DriveFileSyncService::GetDriveDirectoryForOrigin, |
988 AsWeakPtr(), origin, callback, sync_root_resource_id)); | 1072 AsWeakPtr(), origin, callback, sync_root_resource_id)); |
989 return; | 1073 return; |
990 } | 1074 } |
991 | 1075 |
992 if (metadata_store_->IsIncrementalSyncOrigin(origin) || | 1076 if (metadata_store_->IsIncrementalSyncOrigin(origin) || |
993 metadata_store_->IsBatchSyncOrigin(origin)) { | 1077 metadata_store_->IsBatchSyncOrigin(origin) || |
1078 metadata_store_->IsOriginDisabled(origin)) { | |
994 token->ResetTask(FROM_HERE); | 1079 token->ResetTask(FROM_HERE); |
995 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1080 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
996 callback.Run(SYNC_STATUS_OK); | 1081 callback.Run(SYNC_STATUS_OK); |
997 return; | 1082 return; |
998 } | 1083 } |
999 | 1084 |
1000 DCHECK(!sync_root_resource_id.empty()); | 1085 DCHECK(!sync_root_resource_id.empty()); |
1001 sync_client_->GetDriveDirectoryForOrigin( | 1086 sync_client_->GetDriveDirectoryForOrigin( |
1002 sync_root_resource_id, origin, | 1087 sync_root_resource_id, origin, |
1003 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, | 1088 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1104 // (indicates that we may have longer polling cycle), trigger the first | 1189 // (indicates that we may have longer polling cycle), trigger the first |
1105 // incremental sync on next task cycle. | 1190 // incremental sync on next task cycle. |
1106 if (pending_batch_sync_origins_.empty() && | 1191 if (pending_batch_sync_origins_.empty() && |
1107 push_notification_enabled_) { | 1192 push_notification_enabled_) { |
1108 may_have_unfetched_changes_ = true; | 1193 may_have_unfetched_changes_ = true; |
1109 } | 1194 } |
1110 | 1195 |
1111 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1196 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
1112 } | 1197 } |
1113 | 1198 |
1114 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( | 1199 void DriveFileSyncService::DidChangeOriginOnMetadataStore( |
1115 scoped_ptr<TaskToken> token, | 1200 scoped_ptr<TaskToken> token, |
1116 const SyncStatusCallback& callback, | 1201 const SyncStatusCallback& callback, |
1117 SyncStatusCode status) { | 1202 SyncStatusCode status) { |
1118 NotifyTaskDone(status, token.Pass()); | 1203 NotifyTaskDone(status, token.Pass()); |
1119 callback.Run(status); | 1204 callback.Run(status); |
1120 } | 1205 } |
1121 | 1206 |
1122 void DriveFileSyncService::DidGetRemoteFileMetadata( | 1207 void DriveFileSyncService::DidGetRemoteFileMetadata( |
1123 const SyncFileMetadataCallback& callback, | 1208 const SyncFileMetadataCallback& callback, |
1124 google_apis::GDataErrorCode error, | 1209 google_apis::GDataErrorCode error, |
(...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2280 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); | 2365 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); |
2281 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); | 2366 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); |
2282 } | 2367 } |
2283 | 2368 |
2284 FOR_EACH_OBSERVER( | 2369 FOR_EACH_OBSERVER( |
2285 FileStatusObserver, file_status_observers_, | 2370 FileStatusObserver, file_status_observers_, |
2286 OnFileStatusChanged(url, sync_status, action_taken, direction)); | 2371 OnFileStatusChanged(url, sync_status, action_taken, direction)); |
2287 } | 2372 } |
2288 | 2373 |
2289 } // namespace sync_file_system | 2374 } // namespace sync_file_system |
OLD | NEW |