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 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 const GURL& origin, | 405 const GURL& origin, |
406 const SyncStatusCallback& callback) { | 406 const SyncStatusCallback& callback) { |
407 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); | 407 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); |
408 if (!token) { | 408 if (!token) { |
409 pending_tasks_.push_back(base::Bind( | 409 pending_tasks_.push_back(base::Bind( |
410 &DriveFileSyncService::UnregisterOriginForTrackingChanges, | 410 &DriveFileSyncService::UnregisterOriginForTrackingChanges, |
411 AsWeakPtr(), origin, callback)); | 411 AsWeakPtr(), origin, callback)); |
412 return; | 412 return; |
413 } | 413 } |
414 | 414 |
| 415 // TODO(nhiroki): Add helper function to forget remote changes for the given |
| 416 // origin like "ForgetRemoteChangesForOrigin(origin)". |
| 417 // http://crbug.com/211600 |
415 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); | 418 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); |
416 if (found != origin_to_changes_map_.end()) { | 419 if (found != origin_to_changes_map_.end()) { |
417 for (PathToChangeMap::iterator itr = found->second.begin(); | 420 for (PathToChangeMap::iterator itr = found->second.begin(); |
418 itr != found->second.end(); ++itr) | 421 itr != found->second.end(); ++itr) |
419 pending_changes_.erase(itr->second.position_in_queue); | 422 pending_changes_.erase(itr->second.position_in_queue); |
420 origin_to_changes_map_.erase(found); | 423 origin_to_changes_map_.erase(found); |
421 } | 424 } |
422 pending_batch_sync_origins_.erase(origin); | 425 pending_batch_sync_origins_.erase(origin); |
423 | 426 |
424 metadata_store_->RemoveOrigin(origin, base::Bind( | 427 metadata_store_->RemoveOrigin(origin, base::Bind( |
425 &DriveFileSyncService::DidRemoveOriginOnMetadataStore, | 428 &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
426 AsWeakPtr(), base::Passed(&token), callback)); | 429 AsWeakPtr(), base::Passed(&token), callback)); |
427 } | 430 } |
428 | 431 |
| 432 void DriveFileSyncService::EnableOriginForTrackingChanges( |
| 433 const GURL& origin, |
| 434 const SyncStatusCallback& callback) { |
| 435 if (!metadata_store_->IsOriginDisabled(origin)) |
| 436 return; |
| 437 |
| 438 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); |
| 439 if (!token) { |
| 440 pending_tasks_.push_back(base::Bind( |
| 441 &DriveFileSyncService::EnableOriginForTrackingChanges, |
| 442 AsWeakPtr(), origin, callback)); |
| 443 return; |
| 444 } |
| 445 |
| 446 metadata_store_->EnableOrigin(origin, base::Bind( |
| 447 &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| 448 AsWeakPtr(), base::Passed(&token), callback)); |
| 449 pending_batch_sync_origins_.insert(origin); |
| 450 } |
| 451 |
| 452 void DriveFileSyncService::DisableOriginForTrackingChanges( |
| 453 const GURL& origin, |
| 454 const SyncStatusCallback& callback) { |
| 455 if (!metadata_store_->IsBatchSyncOrigin(origin) && |
| 456 !metadata_store_->IsIncrementalSyncOrigin(origin)) |
| 457 return; |
| 458 |
| 459 scoped_ptr<TaskToken> token(GetToken(FROM_HERE, TASK_TYPE_DATABASE, "")); |
| 460 if (!token) { |
| 461 pending_tasks_.push_back(base::Bind( |
| 462 &DriveFileSyncService::DisableOriginForTrackingChanges, |
| 463 AsWeakPtr(), origin, callback)); |
| 464 return; |
| 465 } |
| 466 |
| 467 // TODO(nhiroki): Add helper function to forget remote changes for the given |
| 468 // origin like "ForgetRemoteChangesForOrigin(origin)". |
| 469 // http://crbug.com/211600 |
| 470 OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin); |
| 471 if (found != origin_to_changes_map_.end()) { |
| 472 for (PathToChangeMap::iterator itr = found->second.begin(); |
| 473 itr != found->second.end(); ++itr) |
| 474 pending_changes_.erase(itr->second.position_in_queue); |
| 475 origin_to_changes_map_.erase(found); |
| 476 } |
| 477 pending_batch_sync_origins_.erase(origin); |
| 478 |
| 479 metadata_store_->DisableOrigin(origin, base::Bind( |
| 480 &DriveFileSyncService::DidChangeOriginOnMetadataStore, |
| 481 AsWeakPtr(), base::Passed(&token), callback)); |
| 482 } |
| 483 |
429 void DriveFileSyncService::DeleteOriginDirectory( | 484 void DriveFileSyncService::DeleteOriginDirectory( |
430 const GURL& origin, | 485 const GURL& origin, |
431 const SyncStatusCallback& callback) { | 486 const SyncStatusCallback& callback) { |
432 scoped_ptr<TaskToken> token(GetToken( | 487 scoped_ptr<TaskToken> token(GetToken( |
433 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); | 488 FROM_HERE, TASK_TYPE_DATABASE, "Delete Origin Directory")); |
434 if (!token) { | 489 if (!token) { |
435 pending_tasks_.push_back(base::Bind( | 490 pending_tasks_.push_back(base::Bind( |
436 &DriveFileSyncService::DeleteOriginDirectory, | 491 &DriveFileSyncService::DeleteOriginDirectory, |
437 AsWeakPtr(), origin, callback)); | 492 AsWeakPtr(), origin, callback)); |
438 return; | 493 return; |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 | 903 |
849 void DriveFileSyncService::DidInitializeMetadataStore( | 904 void DriveFileSyncService::DidInitializeMetadataStore( |
850 scoped_ptr<TaskToken> token, | 905 scoped_ptr<TaskToken> token, |
851 SyncStatusCode status, | 906 SyncStatusCode status, |
852 bool created) { | 907 bool created) { |
853 if (status != SYNC_STATUS_OK) { | 908 if (status != SYNC_STATUS_OK) { |
854 NotifyTaskDone(status, token.Pass()); | 909 NotifyTaskDone(status, token.Pass()); |
855 return; | 910 return; |
856 } | 911 } |
857 | 912 |
858 // Remove any origins that are not installed or enabled. | 913 UpdateRegisteredOrigins(); |
859 UnregisterInactiveExtensionsIds(); | |
860 | 914 |
861 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); | 915 largest_fetched_changestamp_ = metadata_store_->GetLargestChangeStamp(); |
862 | 916 |
863 // Mark all the batch sync origins as 'pending' so that we can start | 917 // Mark all the batch sync origins as 'pending' so that we can start |
864 // batch sync when we're ready. | 918 // batch sync when we're ready. |
865 DCHECK(pending_batch_sync_origins_.empty()); | 919 DCHECK(pending_batch_sync_origins_.empty()); |
866 for (std::map<GURL, std::string>::const_iterator itr = | 920 for (std::map<GURL, std::string>::const_iterator itr = |
867 metadata_store_->batch_sync_origins().begin(); | 921 metadata_store_->batch_sync_origins().begin(); |
868 itr != metadata_store_->batch_sync_origins().end(); | 922 itr != metadata_store_->batch_sync_origins().end(); |
869 ++itr) { | 923 ++itr) { |
(...skipping 11 matching lines...) Expand all Loading... |
881 const std::string& resource_id = itr->second; | 935 const std::string& resource_id = itr->second; |
882 AppendFetchChange(url.origin(), url.path(), resource_id); | 936 AppendFetchChange(url.origin(), url.path(), resource_id); |
883 } | 937 } |
884 | 938 |
885 // It's ok to fail, so we pass EmptyResourceIdCallback here. | 939 // It's ok to fail, so we pass EmptyResourceIdCallback here. |
886 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); | 940 GetSyncRootDirectory(token.Pass(), base::Bind(&EmptyResourceIdCallback)); |
887 | 941 |
888 RegisterDriveNotifications(); | 942 RegisterDriveNotifications(); |
889 } | 943 } |
890 | 944 |
891 void DriveFileSyncService::UnregisterInactiveExtensionsIds() { | 945 void DriveFileSyncService::UpdateRegisteredOrigins() { |
892 ExtensionService* extension_service = | 946 ExtensionService* extension_service = |
893 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 947 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
894 if (!extension_service) | 948 if (!extension_service) |
895 return; | 949 return; |
896 std::vector<GURL> tracked_origins; | |
897 metadata_store_->GetAllOrigins(&tracked_origins); | |
898 | 950 |
899 for (std::vector<GURL>::const_iterator itr = tracked_origins.begin(); | 951 // TODO(nhiroki): clean up these loops with similar bodies. |
900 itr != tracked_origins.end(); | 952 // http://crbug.com/211600 |
901 ++itr) { | 953 |
902 // Make sure the registered extension is installed and enabled. | 954 std::vector<GURL> disabled_origins; |
| 955 metadata_store_->GetDisabledOrigins(&disabled_origins); |
| 956 for (std::vector<GURL>::const_iterator itr = disabled_origins.begin(); |
| 957 itr != disabled_origins.end(); ++itr) { |
903 std::string extension_id = itr->host(); | 958 std::string extension_id = itr->host(); |
904 const extensions::Extension* installed_extension = | 959 GURL origin = |
905 extension_service->GetExtensionById(extension_id, | 960 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
906 false /* include_disabled */); | 961 |
907 if (installed_extension != NULL) | 962 if (!extension_service->GetInstalledExtension(extension_id)) { |
| 963 // Extension is uninstalled. Unregister origin. |
| 964 metadata_store_->RemoveOrigin( |
| 965 origin, base::Bind(&DidRemoveOrigin, origin)); |
908 continue; | 966 continue; |
| 967 } |
909 | 968 |
910 // Extension is either disabled or uninstalled. Unregister origin. | 969 if (extension_service->IsExtensionEnabled(extension_id)) { |
911 GURL origin = extensions::Extension::GetBaseURLFromExtensionId( | 970 // Extension is enabled. Enable origin. |
912 extension_id); | 971 metadata_store_->EnableOrigin( |
913 metadata_store_->RemoveOrigin(origin, base::Bind(&DidRemoveOrigin, origin)); | 972 origin, base::Bind(&EmptyStatusCallback)); |
| 973 pending_batch_sync_origins_.insert(origin); |
| 974 continue; |
| 975 } |
| 976 |
| 977 // Extension is still disabled. |
| 978 } |
| 979 |
| 980 std::vector<GURL> enabled_origins; |
| 981 metadata_store_->GetEnabledOrigins(&enabled_origins); |
| 982 for (std::vector<GURL>::const_iterator itr = enabled_origins.begin(); |
| 983 itr != enabled_origins.end(); ++itr) { |
| 984 std::string extension_id = itr->host(); |
| 985 GURL origin = |
| 986 extensions::Extension::GetBaseURLFromExtensionId(extension_id); |
| 987 |
| 988 if (!extension_service->GetInstalledExtension(extension_id)) { |
| 989 // Extension is uninstalled. Unregister origin. |
| 990 metadata_store_->RemoveOrigin( |
| 991 origin, base::Bind(&DidRemoveOrigin, origin)); |
| 992 continue; |
| 993 } |
| 994 |
| 995 if (!extension_service->IsExtensionEnabled(extension_id)) { |
| 996 // Extension is disabled. Disable origin. |
| 997 metadata_store_->DisableOrigin( |
| 998 origin, base::Bind(&EmptyStatusCallback)); |
| 999 continue; |
| 1000 } |
| 1001 |
| 1002 // Extension is still enabled. |
914 } | 1003 } |
915 } | 1004 } |
916 | 1005 |
917 void DriveFileSyncService::GetSyncRootDirectory( | 1006 void DriveFileSyncService::GetSyncRootDirectory( |
918 scoped_ptr<TaskToken> token, | 1007 scoped_ptr<TaskToken> token, |
919 const ResourceIdCallback& callback) { | 1008 const ResourceIdCallback& callback) { |
920 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); | 1009 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving drive root"); |
921 sync_client_->GetDriveDirectoryForSyncRoot( | 1010 sync_client_->GetDriveDirectoryForSyncRoot( |
922 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, | 1011 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, |
923 AsWeakPtr(), base::Passed(&token), callback)); | 1012 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); | 1048 GetDriveDirectoryForOrigin(origin, callback, sync_root_resource_id); |
960 } | 1049 } |
961 | 1050 |
962 void DriveFileSyncService::StartBatchSyncForOrigin( | 1051 void DriveFileSyncService::StartBatchSyncForOrigin( |
963 const GURL& origin, | 1052 const GURL& origin, |
964 const std::string& resource_id) { | 1053 const std::string& resource_id) { |
965 scoped_ptr<TaskToken> token( | 1054 scoped_ptr<TaskToken> token( |
966 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); | 1055 GetToken(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving largest changestamp")); |
967 DCHECK(token); | 1056 DCHECK(token); |
968 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); | 1057 DCHECK(GetCurrentState() == REMOTE_SERVICE_OK || may_have_unfetched_changes_); |
| 1058 DCHECK(!metadata_store_->IsOriginDisabled(origin)); |
969 | 1059 |
970 DVLOG(1) << "Start batch sync for:" << origin.spec(); | 1060 DVLOG(1) << "Start batch sync for:" << origin.spec(); |
971 | 1061 |
972 sync_client_->GetLargestChangeStamp( | 1062 sync_client_->GetLargestChangeStamp( |
973 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, | 1063 base::Bind(&DriveFileSyncService::DidGetLargestChangeStampForBatchSync, |
974 AsWeakPtr(), base::Passed(&token), origin, resource_id)); | 1064 AsWeakPtr(), base::Passed(&token), origin, resource_id)); |
975 | 1065 |
976 may_have_unfetched_changes_ = false; | 1066 may_have_unfetched_changes_ = false; |
977 } | 1067 } |
978 | 1068 |
(...skipping 10 matching lines...) Expand all Loading... |
989 return; | 1079 return; |
990 } | 1080 } |
991 | 1081 |
992 if (metadata_store_->IsIncrementalSyncOrigin(origin) || | 1082 if (metadata_store_->IsIncrementalSyncOrigin(origin) || |
993 metadata_store_->IsBatchSyncOrigin(origin)) { | 1083 metadata_store_->IsBatchSyncOrigin(origin)) { |
994 token->ResetTask(FROM_HERE); | 1084 token->ResetTask(FROM_HERE); |
995 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1085 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
996 callback.Run(SYNC_STATUS_OK); | 1086 callback.Run(SYNC_STATUS_OK); |
997 return; | 1087 return; |
998 } | 1088 } |
| 1089 DCHECK(!metadata_store_->IsOriginDisabled(origin)); |
999 | 1090 |
1000 DCHECK(!sync_root_resource_id.empty()); | 1091 DCHECK(!sync_root_resource_id.empty()); |
1001 sync_client_->GetDriveDirectoryForOrigin( | 1092 sync_client_->GetDriveDirectoryForOrigin( |
1002 sync_root_resource_id, origin, | 1093 sync_root_resource_id, origin, |
1003 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, | 1094 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, |
1004 AsWeakPtr(), base::Passed(&token), origin, callback)); | 1095 AsWeakPtr(), base::Passed(&token), origin, callback)); |
1005 } | 1096 } |
1006 | 1097 |
1007 void DriveFileSyncService::DidGetDriveDirectoryForOrigin( | 1098 void DriveFileSyncService::DidGetDriveDirectoryForOrigin( |
1008 scoped_ptr<TaskToken> token, | 1099 scoped_ptr<TaskToken> token, |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 // (indicates that we may have longer polling cycle), trigger the first | 1195 // (indicates that we may have longer polling cycle), trigger the first |
1105 // incremental sync on next task cycle. | 1196 // incremental sync on next task cycle. |
1106 if (pending_batch_sync_origins_.empty() && | 1197 if (pending_batch_sync_origins_.empty() && |
1107 push_notification_enabled_) { | 1198 push_notification_enabled_) { |
1108 may_have_unfetched_changes_ = true; | 1199 may_have_unfetched_changes_ = true; |
1109 } | 1200 } |
1110 | 1201 |
1111 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1202 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
1112 } | 1203 } |
1113 | 1204 |
1114 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( | 1205 void DriveFileSyncService::DidChangeOriginOnMetadataStore( |
1115 scoped_ptr<TaskToken> token, | 1206 scoped_ptr<TaskToken> token, |
1116 const SyncStatusCallback& callback, | 1207 const SyncStatusCallback& callback, |
1117 SyncStatusCode status) { | 1208 SyncStatusCode status) { |
1118 NotifyTaskDone(status, token.Pass()); | 1209 NotifyTaskDone(status, token.Pass()); |
1119 callback.Run(status); | 1210 callback.Run(status); |
1120 } | 1211 } |
1121 | 1212 |
1122 void DriveFileSyncService::DidGetRemoteFileMetadata( | 1213 void DriveFileSyncService::DidGetRemoteFileMetadata( |
1123 const SyncFileMetadataCallback& callback, | 1214 const SyncFileMetadataCallback& callback, |
1124 google_apis::GDataErrorCode error, | 1215 google_apis::GDataErrorCode error, |
(...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2300 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); | 2391 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); |
2301 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); | 2392 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); |
2302 } | 2393 } |
2303 | 2394 |
2304 FOR_EACH_OBSERVER( | 2395 FOR_EACH_OBSERVER( |
2305 FileStatusObserver, file_status_observers_, | 2396 FileStatusObserver, file_status_observers_, |
2306 OnFileStatusChanged(url, sync_status, action_taken, direction)); | 2397 OnFileStatusChanged(url, sync_status, action_taken, direction)); |
2307 } | 2398 } |
2308 | 2399 |
2309 } // namespace sync_file_system | 2400 } // namespace sync_file_system |
OLD | NEW |