sync_file_system_service.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_system_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/format_macros.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/sync_file_system/extension_sync_event_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_file_sync_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/local_file_sync_service.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/sync_file_system/logger.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_event_observer.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_details.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/syncable/sync_direction.h" 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/syncable/sync_file_metadata.h" 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/syncable/sync_status_code.h" 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::FileSystemURL; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using fileapi::FileSystemURLSet; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int64 kRetryTimerIntervalInSeconds = 20 * 60; // 20 min. 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SyncServiceState RemoteStateToSyncServiceState( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoteServiceState state) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (state) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_OK: 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_RUNNING; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_TEMPORARY_UNAVAILABLE: 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_TEMPORARY_UNAVAILABLE; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_AUTHENTICATION_REQUIRED: 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_AUTHENTICATION_REQUIRED; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_DISABLED: 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_DISABLED; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED() << "Unknown remote service state: " << state; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_DISABLED; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidHandleOriginForExtensionUnloadedEvent( 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::UnloadedExtensionReason reason, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode code) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(chrome::NOTIFICATION_EXTENSION_UNLOADED == type); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(extension_misc::UNLOAD_REASON_DISABLE == reason || 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_misc::UNLOAD_REASON_UNINSTALL == reason); 69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (code != SYNC_STATUS_OK && 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) code != SYNC_STATUS_UNKNOWN_ORIGIN) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (reason) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case extension_misc::UNLOAD_REASON_DISABLE: 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) util::Log(logging::LOG_WARNING, 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FROM_HERE, 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "Disabling origin for UNLOAD(DISABLE) failed: %s", 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) origin.spec().c_str()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case extension_misc::UNLOAD_REASON_UNINSTALL: 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) util::Log(logging::LOG_WARNING, 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FROM_HERE, 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "Uninstall origin for UNLOAD(UNINSTALL) failed: %s", 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) origin.spec().c_str()); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidHandleOriginForExtensionEnabledEvent( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode code) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(chrome::NOTIFICATION_EXTENSION_ENABLED == type); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (code != SYNC_STATUS_OK) 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) util::Log(logging::LOG_WARNING, 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FROM_HERE, 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "Enabling origin for ENABLED failed: %s", 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) origin.spec().c_str()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Gets called repeatedly until every SyncFileStatus has been mapped. 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void DidGetFileSyncStatus( 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const SyncStatusCallback& callback, 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FileMetadata* metadata, 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t expected_results, 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t* num_results, 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SyncStatusCode sync_status_code, 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SyncFileStatus sync_file_status) { 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(metadata); 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(num_results); 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(calvinlo): Unfortunately the sync_status_code will only be OK if 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the app that matches the url.origin() is actually running. Otherwise 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the FileSystemContext isn't loaded into the map in 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // LocalFileSyncService::HasPendingLocalChanges() and the contains key check 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // fails. This causes SYNC_FILE_ERROR_INVALID_URL to be returned. 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // With this check in, the SyncFileStatus will therefore show nothing (for 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // SYNC_FILE_STATUS_UNKNOWN) for syncFS apps which aren't running. 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metadata->sync_status = (sync_status_code == SYNC_STATUS_OK) ? 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sync_file_status : SYNC_FILE_STATUS_UNKNOWN; 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Once all results have been received, run the callback to signal end. 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK_LE(*num_results, expected_results); 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (*num_results)++; 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (*num_results < expected_results) 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback.Run(SYNC_STATUS_OK); 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::Shutdown() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_file_service_->Shutdown(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_file_service_.reset(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remote_file_service_.reset(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service = 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile_); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_sync_service) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_sync_service->RemoveObserver(this); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_ = NULL; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService::~SyncFileSystemService() { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!profile_); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::InitializeForApp( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileapi::FileSystemContext* file_system_context, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& app_origin, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncStatusCallback& callback) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(local_file_service_); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(remote_file_service_); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(app_origin == app_origin.GetOrigin()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Initializing for App: %s", app_origin.spec().c_str()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_file_service_->MaybeInitializeFileSystemContext( 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) app_origin, file_system_context, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidInitializeFileSystem, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), app_origin, callback)); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SyncServiceState SyncFileSystemService::GetSyncServiceState() { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return RemoteStateToSyncServiceState(remote_file_service_->GetCurrentState()); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SyncFileSystemService::GetExtensionStatusMap( 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::map<GURL, std::string>* status_map) { 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(status_map); 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_file_service_->GetOriginStatusMap(status_map); 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SyncFileSystemService::GetFileMetadataMap( 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RemoteFileSyncService::OriginFileMetadataMap* metadata_map, 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t* num_results, 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const SyncStatusCallback& callback) { 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(metadata_map); 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(num_results); 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) remote_file_service_->GetFileMetadataMap(metadata_map); 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Figure out how many results have to be waited on before callback. 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t expected_results = 0; 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RemoteFileSyncService::OriginFileMetadataMap::iterator origin_itr; 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (origin_itr = metadata_map->begin(); 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) origin_itr != metadata_map->end(); 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ++origin_itr) 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) expected_results += origin_itr->second.size(); 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (expected_results == 0) { 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback.Run(SYNC_STATUS_OK); 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // After all metadata loaded, sync status can be added to each entry. 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (origin_itr = metadata_map->begin(); 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) origin_itr != metadata_map->end(); 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ++origin_itr) { 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RemoteFileSyncService::FileMetadataMap::iterator file_path_itr; 2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (file_path_itr = origin_itr->second.begin(); 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_path_itr != origin_itr->second.end(); 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ++file_path_itr) { 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const GURL& origin = origin_itr->first; 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::FilePath& file_path = file_path_itr->first; 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const FileSystemURL url = CreateSyncableFileSystemURL(origin, file_path); 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FileMetadata& metadata = file_path_itr->second; 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSyncStatus(url, base::Bind(&DidGetFileSyncStatus, 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback, 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &metadata, 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) expected_results, 2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) num_results)); 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::GetFileSyncStatus( 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, const SyncFileStatusCallback& callback) { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(local_file_service_); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(remote_file_service_); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It's possible to get an invalid FileEntry. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!url.is_valid()) { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(callback, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_ERROR_INVALID_URL, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_STATUS_UNKNOWN)); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (remote_file_service_->IsConflicting(url)) { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(callback, 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_STATUS_OK, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_STATUS_CONFLICTING)); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->HasPendingLocalChanges( 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidGetLocalChangeStatus, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), callback)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::AddSyncEventObserver(SyncEventObserver* observer) { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.AddObserver(observer); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::RemoveSyncEventObserver( 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncEventObserver* observer) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.RemoveObserver(observer); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ConflictResolutionPolicy 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SyncFileSystemService::GetConflictResolutionPolicy() const { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return remote_file_service_->GetConflictResolutionPolicy(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SyncStatusCode SyncFileSystemService::SetConflictResolutionPolicy( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConflictResolutionPolicy policy) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return remote_file_service_->SetConflictResolutionPolicy(policy); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService::SyncFileSystemService(Profile* profile) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_local_changes_(0), 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_remote_changes_(0), 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_sync_running_(false), 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_sync_running_(false), 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_waiting_remote_sync_enabled_(false), 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_enabled_(true) { 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::Initialize( 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LocalFileSyncService> local_file_service, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RemoteFileSyncService> remote_file_service) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(local_file_service); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(remote_file_service); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile_); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_file_service_ = local_file_service.Pass(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remote_file_service_ = remote_file_service.Pass(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->AddChangeObserver(this); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->SetLocalChangeProcessor( 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->GetLocalChangeProcessor()); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->AddServiceObserver(this); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->AddFileStatusObserver(this); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->SetRemoteChangeProcessor(local_file_service_.get()); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service = 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile_); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_sync_service) { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSyncEnabledStatus(profile_sync_service); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_sync_service->AddObserver(this); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<Profile>(profile_)); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<Profile>(profile_)); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_ENABLED, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<Profile>(profile_)); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidInitializeFileSystem( 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& app_origin, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncStatusCallback& callback, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status) { 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "DidInitializeFileSystem: " 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << app_origin.spec() << " " << status; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status != SYNC_STATUS_OK) { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(status); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Local side of initialization for the app is done. 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Continue on initializing the remote side. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->RegisterOriginForTrackingChanges( 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_origin, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidRegisterOrigin, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), app_origin, callback)); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidRegisterOrigin( 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& app_origin, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncStatusCallback& callback, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status) { 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "DidRegisterOrigin: " << app_origin.spec() << " " << status; 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(status); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::SetSyncEnabledForTesting(bool enabled) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_enabled_ = enabled; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->SetSyncEnabled(sync_enabled_); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::MaybeStartSync() { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile_ || !sync_enabled_) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (pending_local_changes_ + pending_remote_changes_ == 0) 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(2) << "MaybeStartSync() called (remote service state:" 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << remote_file_service_->GetCurrentState() << ")"; 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (remote_file_service_->GetCurrentState()) { 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REMOTE_SERVICE_OK: 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REMOTE_SERVICE_TEMPORARY_UNAVAILABLE: 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (sync_retry_timer_.IsRunning()) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_retry_timer_.Start( 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(kRetryTimerIntervalInSeconds), 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, &SyncFileSystemService::MaybeStartSync); 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REMOTE_SERVICE_AUTHENTICATION_REQUIRED: 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REMOTE_SERVICE_DISABLED: 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No point to run sync. 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartRemoteSync(); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartLocalSync(); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SyncFileSystemService::StartRemoteSync() { 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See if we cannot / should not start a new remote sync. 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (remote_sync_running_ || pending_remote_changes_ == 0) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we have registered a URL for waiting until sync is enabled on a 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // file (and the registerred URL seems to be still valid) it won't be 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // worth trying to start another remote sync. 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_waiting_remote_sync_enabled_) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(sync_enabled_); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Calling ProcessRemoteChange for RemoteSync"); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_sync_running_ = true; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->ProcessRemoteChange( 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidProcessRemoteChange, 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SyncFileSystemService::StartLocalSync() { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See if we cannot / should not start a new local sync. 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (local_sync_running_ || pending_local_changes_ == 0) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(sync_enabled_); 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Calling ProcessLocalChange for LocalSync"); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_sync_running_ = true; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->ProcessLocalChange( 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidProcessLocalChange, 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidProcessRemoteChange( 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status, 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url) { 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ProcessRemoteChange finished with status=%d (%s) for url=%s", 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) status, SyncStatusCodeToString(status), url.DebugString().c_str()); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(remote_sync_running_); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_sync_running_ = false; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status != SYNC_STATUS_NO_CHANGE_TO_SYNC && 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->GetCurrentState() != REMOTE_SERVICE_DISABLED) { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(url.is_valid()); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->ClearSyncFlagForURL(url); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == SYNC_STATUS_NO_CHANGE_TO_SYNC) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We seem to have no changes to work on for now. 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(kinuko): Might be better setting a timer to call MaybeStartSync. 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == SYNC_STATUS_FILE_BUSY) { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_waiting_remote_sync_enabled_ = true; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->RegisterURLForWaitingSync( 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, base::Bind(&SyncFileSystemService::OnSyncEnabledForRemoteSync, 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync, 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidProcessLocalChange( 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status, const FileSystemURL& url) { 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ProcessLocalChange finished with status=%d (%s) for url=%s", 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) status, SyncStatusCodeToString(status), url.DebugString().c_str()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(local_sync_running_); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_sync_running_ = false; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status == SYNC_STATUS_NO_CHANGE_TO_SYNC) { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We seem to have no changes to work on for now. 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(url.is_valid()); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->ClearSyncFlagForURL(url); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync, 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidGetLocalChangeStatus( 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncFileStatusCallback& callback, 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status, 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_pending_local_changes) { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run( 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_pending_local_changes ? 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_STATUS_HAS_PENDING_CHANGES : SYNC_FILE_STATUS_SYNCED); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnSyncEnabledForRemoteSync() { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_waiting_remote_sync_enabled_ = false; 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MaybeStartSync(); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnLocalChangeAvailable(int64 pending_changes) { 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(pending_changes, 0); 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (pending_local_changes_ != pending_changes) { 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "OnLocalChangeAvailable: %" PRId64, pending_changes); 4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_local_changes_ = pending_changes; 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (pending_changes == 0) 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync, 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnRemoteChangeQueueUpdated(int64 pending_changes) { 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(pending_changes, 0); 5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (pending_remote_changes_ != pending_changes) { 5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "OnRemoteChangeAvailable: %" PRId64, pending_changes); 5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_remote_changes_ = pending_changes; 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (pending_changes == 0) 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The smallest change available might have changed from the previous one. 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reset the is_waiting_remote_sync_enabled_ flag so that we can retry. 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_waiting_remote_sync_enabled_ = false; 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnRemoteServiceStateUpdated( 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoteServiceState state, 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& description) { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_INFO, FROM_HERE, 5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "OnRemoteServiceStateChanged: %d %s", state, description.c_str()); 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (state == REMOTE_SERVICE_OK) { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync, 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncEventObserver, observers_, 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSyncStateUpdated(GURL(), 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoteStateToSyncServiceState(state), 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description)); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::Observe( 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Event notification sequence. 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (User action) (Notification type) 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Install: INSTALLED. 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update: INSTALLED. 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Uninstall: UNLOADED(UNINSTALL). 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Launch, Close: No notification. 552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Enable: ENABLED. 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disable: UNLOADED(DISABLE). 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reload, Restart: UNLOADED(DISABLE) -> INSTALLED -> ENABLED. 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_INSTALLED: 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HandleExtensionInstalled(details); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_UNLOADED: 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandleExtensionUnloaded(type, details); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_ENABLED: 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandleExtensionEnabled(type, details); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unknown notification."; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SyncFileSystemService::HandleExtensionInstalled( 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) { 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const extensions::Extension* extension = 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<const extensions::InstalledExtensionInfo>(details)-> 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension; 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL app_origin = 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::Extension::GetBaseURLFromExtensionId(extension->id()); 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Handle extension notification for INSTALLED: " << app_origin; 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NOTE: When an app is uninstalled and re-installed in a sequence, 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |local_file_service_| may still keeps |app_origin| as disabled origin. 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) local_file_service_->SetOriginEnabled(app_origin, true); 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::HandleExtensionUnloaded( 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<const extensions::UnloadedExtensionInfo> info(details); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string extension_id = info->extension->id(); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL app_origin = 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Extension::GetBaseURLFromExtensionId(extension_id); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (info->reason) { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case extension_misc::UNLOAD_REASON_DISABLE: 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Handle extension notification for UNLOAD(DISABLE): " 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << app_origin; 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->DisableOriginForTrackingChanges( 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_origin, 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DidHandleOriginForExtensionUnloadedEvent, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type, info->reason, app_origin)); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->SetOriginEnabled(app_origin, false); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case extension_misc::UNLOAD_REASON_UNINSTALL: 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Handle extension notification for UNLOAD(UNINSTALL): " 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << app_origin; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->UninstallOrigin( 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_origin, 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DidHandleOriginForExtensionUnloadedEvent, 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type, info->reason, app_origin)); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->SetOriginEnabled(app_origin, false); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Nothing to do. 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::HandleExtensionEnabled( 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string extension_id = 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<const extensions::Extension>(details)->id(); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL app_origin = 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Extension::GetBaseURLFromExtensionId(extension_id); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Handle extension notification for ENABLED: " << app_origin; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->EnableOriginForTrackingChanges( 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_origin, 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DidHandleOriginForExtensionEnabledEvent, type, app_origin)); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_file_service_->SetOriginEnabled(app_origin, true); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnStateChanged() { 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service = 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile_); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_sync_service) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSyncEnabledStatus(profile_sync_service); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnFileStatusChanged( 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncFileStatus sync_status, 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncAction action_taken, 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncDirection direction) { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncEventObserver, observers_, 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFileSynced(url, sync_status, action_taken, direction)); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::UpdateSyncEnabledStatus( 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service) { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile_sync_service->HasSyncSetupCompleted()) 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sync_enabled_ = profile_sync_service->GetActiveDataTypes().Has( 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::APPS); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remote_file_service_->SetSyncEnabled(sync_enabled_); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sync_enabled_) { 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&SyncFileSystemService::MaybeStartSync, 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr())); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sync_file_system 664