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 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 } | |
| 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) { |
|
tzik
2013/03/19 09:24:03
s/== NULL// ?
nhiroki
2013/03/19 09:36:14
Done.
| |
| 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 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 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)) { |
| 994 token->ResetTask(FROM_HERE); | 1078 token->ResetTask(FROM_HERE); |
| 995 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1079 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
| 996 callback.Run(SYNC_STATUS_OK); | 1080 callback.Run(SYNC_STATUS_OK); |
| 997 return; | 1081 return; |
| 998 } | 1082 } |
| 999 | 1083 |
| 1084 if (metadata_store_->IsOriginDisabled(origin)) { | |
| 1085 metadata_store_->EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
| 1086 pending_batch_sync_origins_.insert(origin); | |
| 1087 token->ResetTask(FROM_HERE); | |
| 1088 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | |
| 1089 callback.Run(SYNC_STATUS_OK); | |
| 1090 return; | |
| 1091 } | |
| 1092 | |
| 1000 DCHECK(!sync_root_resource_id.empty()); | 1093 DCHECK(!sync_root_resource_id.empty()); |
| 1001 sync_client_->GetDriveDirectoryForOrigin( | 1094 sync_client_->GetDriveDirectoryForOrigin( |
| 1002 sync_root_resource_id, origin, | 1095 sync_root_resource_id, origin, |
| 1003 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, | 1096 base::Bind(&DriveFileSyncService::DidGetDriveDirectoryForOrigin, |
| 1004 AsWeakPtr(), base::Passed(&token), origin, callback)); | 1097 AsWeakPtr(), base::Passed(&token), origin, callback)); |
| 1005 } | 1098 } |
| 1006 | 1099 |
| 1007 void DriveFileSyncService::DidGetDriveDirectoryForOrigin( | 1100 void DriveFileSyncService::DidGetDriveDirectoryForOrigin( |
| 1008 scoped_ptr<TaskToken> token, | 1101 scoped_ptr<TaskToken> token, |
| 1009 const GURL& origin, | 1102 const GURL& origin, |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1104 // (indicates that we may have longer polling cycle), trigger the first | 1197 // (indicates that we may have longer polling cycle), trigger the first |
| 1105 // incremental sync on next task cycle. | 1198 // incremental sync on next task cycle. |
| 1106 if (pending_batch_sync_origins_.empty() && | 1199 if (pending_batch_sync_origins_.empty() && |
| 1107 push_notification_enabled_) { | 1200 push_notification_enabled_) { |
| 1108 may_have_unfetched_changes_ = true; | 1201 may_have_unfetched_changes_ = true; |
| 1109 } | 1202 } |
| 1110 | 1203 |
| 1111 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); | 1204 NotifyTaskDone(SYNC_STATUS_OK, token.Pass()); |
| 1112 } | 1205 } |
| 1113 | 1206 |
| 1114 void DriveFileSyncService::DidRemoveOriginOnMetadataStore( | 1207 void DriveFileSyncService::DidChangeOriginOnMetadataStore( |
| 1115 scoped_ptr<TaskToken> token, | 1208 scoped_ptr<TaskToken> token, |
| 1116 const SyncStatusCallback& callback, | 1209 const SyncStatusCallback& callback, |
| 1117 SyncStatusCode status) { | 1210 SyncStatusCode status) { |
| 1118 NotifyTaskDone(status, token.Pass()); | 1211 NotifyTaskDone(status, token.Pass()); |
| 1119 callback.Run(status); | 1212 callback.Run(status); |
| 1120 } | 1213 } |
| 1121 | 1214 |
| 1122 void DriveFileSyncService::DidGetRemoteFileMetadata( | 1215 void DriveFileSyncService::DidGetRemoteFileMetadata( |
| 1123 const SyncFileMetadataCallback& callback, | 1216 const SyncFileMetadataCallback& callback, |
| 1124 google_apis::GDataErrorCode error, | 1217 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); | 2373 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); |
| 2281 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); | 2374 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); |
| 2282 } | 2375 } |
| 2283 | 2376 |
| 2284 FOR_EACH_OBSERVER( | 2377 FOR_EACH_OBSERVER( |
| 2285 FileStatusObserver, file_status_observers_, | 2378 FileStatusObserver, file_status_observers_, |
| 2286 OnFileStatusChanged(url, sync_status, action_taken, direction)); | 2379 OnFileStatusChanged(url, sync_status, action_taken, direction)); |
| 2287 } | 2380 } |
| 2288 | 2381 |
| 2289 } // namespace sync_file_system | 2382 } // namespace sync_file_system |
| OLD | NEW |