| 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 |