sync_file_system_service.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/metrics/histogram.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/single_thread_task_runner.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/thread_task_runner_handle.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/sync_file_system/extension_sync_event_observer.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/extensions/api/sync_file_system/sync_file_system_api_helpers.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_file_sync_service.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/sync_file_system/logger.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/sync_file_system/sync_direction.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_event_observer.h" 262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_file_metadata.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_process_runner.h" 282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_status_code.h" 292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/storage_partition.h" 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h" 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "extensions/common/manifest_constants.h" 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using extensions::Extension; 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using extensions::ExtensionPrefs; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing extensions::ExtensionRegistry; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::FileSystemURL; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using fileapi::FileSystemURLSet; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kLocalSyncName[] = "Local sync"; 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kRemoteSyncName[] = "Remote sync"; 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kRemoteSyncNameV2[] = "Remote sync (v2)"; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SyncServiceState RemoteStateToSyncServiceState( 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoteServiceState state) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (state) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_OK: 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_RUNNING; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_TEMPORARY_UNAVAILABLE: 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_TEMPORARY_UNAVAILABLE; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_AUTHENTICATION_REQUIRED: 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_AUTHENTICATION_REQUIRED; 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) case REMOTE_SERVICE_ACCESS_FORBIDDEN: 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return SYNC_SERVICE_TEMPORARY_UNAVAILABLE; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case REMOTE_SERVICE_DISABLED: 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_DISABLED; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case REMOTE_SERVICE_STATE_MAX: 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED(); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED() << "Unknown remote service state: " << state; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SYNC_SERVICE_DISABLED; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DidHandleUninstalledEvent(const GURL& origin, SyncStatusCode code) { 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (code != SYNC_STATUS_OK && code != SYNC_STATUS_UNKNOWN_ORIGIN) { 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::Log(logging::LOG_WARNING, FROM_HERE, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "Failed to uninstall origin for uninstall event: %s", 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch origin.spec().c_str()); 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DidHandleUnloadedEvent(const GURL& origin, SyncStatusCode code) { 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (code != SYNC_STATUS_OK && code != SYNC_STATUS_UNKNOWN_ORIGIN) { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::Log(logging::LOG_WARNING, FROM_HERE, 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "Failed to disable origin for unload event: %s", 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch origin.spec().c_str()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DidHandleLoadEvent( 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& origin, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode code) { 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (code != SYNC_STATUS_OK) { 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch util::Log(logging::LOG_WARNING, FROM_HERE, 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "Failed to enable origin for load event: %s", 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) origin.spec().c_str()); 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string SyncFileStatusToString(SyncFileStatus sync_file_status) { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return extensions::api::sync_file_system::ToString( 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extensions::SyncFileStatusToExtensionEnum(sync_file_status)); 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Gets called repeatedly until every SyncFileStatus has been mapped. 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DidGetFileSyncStatusForDump( 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::ListValue* files, 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t* num_results, 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const SyncFileSystemService::DumpFilesCallback& callback, 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DictionaryValue* file, 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SyncStatusCode sync_status_code, 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SyncFileStatus sync_file_status) { 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(files); 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(num_results); 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (file) 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file->SetString("status", SyncFileStatusToString(sync_file_status)); 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Once all results have been received, run the callback to signal end. 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_LE(*num_results, files->GetSize()); 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (++*num_results < files->GetSize()) 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(*files); 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// We need this indirection because WeakPtr can only be bound to methods 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// without a return value. 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)LocalChangeProcessor* GetLocalChangeProcessorAdapter( 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtr<SyncFileSystemService> service, 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& origin) { 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!service) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return service->GetLocalChangeProcessor(origin); 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//--------------------------------------------------------------------------- 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// SyncProcessRunner's. 142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// SyncProcessRunner implementation for LocalSync. 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LocalSyncRunner : public SyncProcessRunner, 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public LocalFileSyncService::Observer { 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LocalSyncRunner(const std::string& name, 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncFileSystemService* sync_service) 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : SyncProcessRunner(name, sync_service, 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<SyncProcessRunner::TimerHelper>(), 1), 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) factory_(this) {} 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void StartSync(const SyncStatusCallback& callback) OVERRIDE { 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetSyncService()->local_service_->ProcessLocalChange( 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&LocalSyncRunner::DidProcessLocalChange, 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) factory_.GetWeakPtr(), callback)); 157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // LocalFileSyncService::Observer overrides. 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnLocalChangeAvailable(int64 pending_changes) OVERRIDE { 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnChangesUpdated(pending_changes); 164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Kick other sync runners just in case they're not running. 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetSyncService()->RunForEachSyncRunners(&SyncProcessRunner::Schedule); 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void DidProcessLocalChange( 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const SyncStatusCallback& callback, 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncStatusCode status, 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const FileSystemURL& url) { 174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "ProcessLocalChange finished with status=%d (%s) for url=%s", 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status, SyncStatusCodeToString(status), 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url.DebugString().c_str()); 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback.Run(status); 179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtrFactory<LocalSyncRunner> factory_; 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LocalSyncRunner); 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// SyncProcessRunner implementation for RemoteSync. 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class RemoteSyncRunner : public SyncProcessRunner, 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public RemoteFileSyncService::Observer { 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RemoteSyncRunner(const std::string& name, 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncFileSystemService* sync_service, 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RemoteFileSyncService* remote_service) 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : SyncProcessRunner(name, sync_service, 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<SyncProcessRunner::TimerHelper>(), 1), 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_(remote_service), 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) last_state_(REMOTE_SERVICE_OK), 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) factory_(this) {} 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void StartSync(const SyncStatusCallback& callback) OVERRIDE { 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_->ProcessRemoteChange( 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&RemoteSyncRunner::DidProcessRemoteChange, 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) factory_.GetWeakPtr(), callback)); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual SyncServiceState GetServiceState() OVERRIDE { 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return RemoteStateToSyncServiceState(last_state_); 206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RemoteFileSyncService::Observer overrides. 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnRemoteChangeQueueUpdated(int64 pending_changes) OVERRIDE { 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnChangesUpdated(pending_changes); 213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Kick other sync runners just in case they're not running. 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetSyncService()->RunForEachSyncRunners(&SyncProcessRunner::Schedule); 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnRemoteServiceStateUpdated( 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RemoteServiceState state, 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& description) OVERRIDE { 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Just forward to SyncFileSystemService. 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetSyncService()->OnRemoteServiceStateUpdated(state, description); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) last_state_ = state; 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void DidProcessRemoteChange( 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const SyncStatusCallback& callback, 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncStatusCode status, 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const FileSystemURL& url) { 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "ProcessRemoteChange finished with status=%d (%s) for url=%s", 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status, SyncStatusCodeToString(status), 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url.DebugString().c_str()); 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (status == SYNC_STATUS_FILE_BUSY) { 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetSyncService()->local_service_->RegisterURLForWaitingSync( 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url, base::Bind(&RemoteSyncRunner::Schedule, 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) factory_.GetWeakPtr())); 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback.Run(status); 242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RemoteFileSyncService* remote_service_; 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RemoteServiceState last_state_; 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtrFactory<RemoteSyncRunner> factory_; 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RemoteSyncRunner); 248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//----------------------------------------------------------------------------- 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// SyncFileSystemService 252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::Shutdown() { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch local_sync_runners_.clear(); 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch remote_sync_runners_.clear(); 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->Shutdown(); 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_.reset(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_.reset(); 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_.reset(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service = 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile_); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_sync_service) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_sync_service->RemoveObserver(this); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry::Get(profile_)->RemoveObserver(this); 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_ = NULL; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService::~SyncFileSystemService() { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!profile_); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::InitializeForApp( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& app_origin, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncStatusCallback& callback) { 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(local_service_); 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(remote_service_); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(app_origin == app_origin.GetOrigin()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Initializing for App: %s", app_origin.spec().c_str()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->MaybeInitializeFileSystemContext( 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) app_origin, file_system_context, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidInitializeFileSystem, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), app_origin, callback)); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SyncFileSystemService::GetExtensionStatusMap( 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ExtensionStatusMapCallback& callback) { 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) remote_service_->GetOriginStatusMap( 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&SyncFileSystemService::DidGetExtensionStatusMap, 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AsWeakPtr(), callback)); 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SyncFileSystemService::DumpFiles(const GURL& origin, 3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DumpFilesCallback& callback) { 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!origin.is_empty()); 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::StoragePartition* storage_partition = 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext::GetStoragePartitionForSite(profile_, origin); 3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fileapi::FileSystemContext* file_system_context = 3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch storage_partition->GetFileSystemContext(); 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->MaybeInitializeFileSystemContext( 3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch origin, file_system_context, 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&SyncFileSystemService::DidInitializeFileSystemForDump, 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AsWeakPtr(), origin, callback)); 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncFileSystemService::DumpDatabase(const DumpFilesCallback& callback) { 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) remote_service_->DumpDatabase( 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&SyncFileSystemService::DidDumpDatabase, 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AsWeakPtr(), callback)); 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::GetFileSyncStatus( 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, const SyncFileStatusCallback& callback) { 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(local_service_); 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(GetRemoteService(url.origin())); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It's possible to get an invalid FileEntry. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!url.is_valid()) { 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ThreadTaskRunnerHandle::Get()->PostTask( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(callback, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_ERROR_INVALID_URL, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_STATUS_UNKNOWN)); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->HasPendingLocalChanges( 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidGetLocalChangeStatus, 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), callback)); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::AddSyncEventObserver(SyncEventObserver* observer) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.AddObserver(observer); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::RemoveSyncEventObserver( 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncEventObserver* observer) { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_.RemoveObserver(observer); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)LocalChangeProcessor* SyncFileSystemService::GetLocalChangeProcessor( 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& origin) { 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetRemoteService(origin)->GetLocalChangeProcessor(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SyncFileSystemService::OnSyncIdle() { 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 remote_changes = 0; 361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (ScopedVector<SyncProcessRunner>::iterator iter = 362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch remote_sync_runners_.begin(); 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter != remote_sync_runners_.end(); ++iter) 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch remote_changes += (*iter)->pending_changes(); 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (remote_changes == 0) 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) local_service_->PromoteDemotedChanges(NoopClosure()); 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 local_changes = 0; 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (ScopedVector<SyncProcessRunner>::iterator iter = 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch local_sync_runners_.begin(); 371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter != local_sync_runners_.end(); ++iter) 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch local_changes += (*iter)->pending_changes(); 3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (local_changes == 0) { 3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remote_service_->PromoteDemotedChanges(NoopClosure()); 3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (v2_remote_service_) 3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) v2_remote_service_->PromoteDemotedChanges(NoopClosure()); 3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 380116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSyncServiceState SyncFileSystemService::GetSyncServiceState() { 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // For now we always query the state from the main RemoteFileSyncService. 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return RemoteStateToSyncServiceState(remote_service_->GetCurrentState()); 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 385116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSyncFileSystemService* SyncFileSystemService::GetSyncService() { 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return this; 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService::SyncFileSystemService(Profile* profile) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile), 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_enabled_(true) { 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::Initialize( 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<LocalFileSyncService> local_service, 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<RemoteFileSyncService> remote_service) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(local_service); 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(remote_service); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile_); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_ = local_service.Pass(); 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_ = remote_service.Pass(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<LocalSyncRunner> local_syncer( 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new LocalSyncRunner(kLocalSyncName, this)); 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<RemoteSyncRunner> remote_syncer( 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new RemoteSyncRunner(kRemoteSyncName, this, remote_service_.get())); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->AddChangeObserver(local_syncer.get()); 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->SetLocalChangeProcessorCallback( 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&GetLocalChangeProcessorAdapter, AsWeakPtr())); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_->AddServiceObserver(remote_syncer.get()); 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_->AddFileStatusObserver(this); 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_->SetRemoteChangeProcessor(local_service_.get()); 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_sync_runners_.push_back(local_syncer.release()); 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) remote_sync_runners_.push_back(remote_syncer.release()); 420d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service = 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile_); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_sync_service) { 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSyncEnabledStatus(profile_sync_service); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_sync_service->AddObserver(this); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry::Get(profile_)->AddObserver(this); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidInitializeFileSystem( 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& app_origin, 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncStatusCallback& callback, 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status) { 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "DidInitializeFileSystem: " 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << app_origin.spec() << " " << status; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status != SYNC_STATUS_OK) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(status); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Local side of initialization for the app is done. 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Continue on initializing the remote side. 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRemoteService(app_origin)->RegisterOrigin( 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_origin, 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SyncFileSystemService::DidRegisterOrigin, 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), app_origin, callback)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidRegisterOrigin( 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& app_origin, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncStatusCallback& callback, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status) { 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "DidInitializeForApp (registered the origin): %s: %s", 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) app_origin.spec().c_str(), 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SyncStatusCodeToString(status)); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("SyncFileSystem.RegisterOriginResult", 461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRemoteService(app_origin)->GetCurrentState(), 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) REMOTE_SERVICE_STATE_MAX); 463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (status == SYNC_STATUS_FAILED) { 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If we got generic error return the service status information. 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (GetRemoteService(app_origin)->GetCurrentState()) { 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case REMOTE_SERVICE_AUTHENTICATION_REQUIRED: 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback.Run(SYNC_STATUS_AUTHENTICATION_FAILED); 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case REMOTE_SERVICE_TEMPORARY_UNAVAILABLE: 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback.Run(SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE); 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(status); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SyncFileSystemService::DidInitializeFileSystemForDump( 4827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& origin, 4837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DumpFilesCallback& callback, 4847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SyncStatusCode status) { 4857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!origin.is_empty()); 4867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (status != SYNC_STATUS_OK) { 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::ListValue()); 4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRemoteService(origin)->DumpFiles( 493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin, 494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind( 495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &SyncFileSystemService::DidDumpFiles, 496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AsWeakPtr(), 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin, 498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback)); 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncFileSystemService::DidDumpFiles( 502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& origin, 503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const DumpFilesCallback& callback, 504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> dump_files) { 505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!dump_files || !dump_files->GetSize()) { 506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::ListValue()); 5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::ListValue* files = dump_files.get(); 511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Callback<void(base::DictionaryValue*, 512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SyncStatusCode, 513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SyncFileStatus)> completion_callback = 514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&DidGetFileSyncStatusForDump, 515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Owned(dump_files.release()), 516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Owned(new size_t(0)), 517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback); 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // After all metadata loaded, sync status can be added to each entry. 5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < files->GetSize(); ++i) { 5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DictionaryValue* file = NULL; 5227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string path_string; 5237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!files->GetDictionary(i, &file) || 5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !file->GetString("path", &path_string)) { 5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NOTREACHED(); 5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch completion_callback.Run( 5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NULL, SYNC_FILE_ERROR_FAILED, SYNC_FILE_STATUS_UNKNOWN); 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch continue; 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath file_path = base::FilePath::FromUTF8Unsafe(path_string); 5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FileSystemURL url = CreateSyncableFileSystemURL(origin, file_path); 5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetFileSyncStatus(url, base::Bind(completion_callback, file)); 5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncFileSystemService::DidDumpDatabase( 538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const DumpFilesCallback& callback, scoped_ptr<base::ListValue> list) { 539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!list) 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) list = make_scoped_ptr(new base::ListValue); 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v2_remote_service_) { 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(*list); 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v2_remote_service_->DumpDatabase( 548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&SyncFileSystemService::DidDumpV2Database, 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AsWeakPtr(), callback, base::Passed(&list))); 550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncFileSystemService::DidDumpV2Database( 553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const DumpFilesCallback& callback, 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> v1list, 555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> v2list) { 5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!v1list) 5576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) v1list = make_scoped_ptr(new base::ListValue); 558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v2list) { 560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (base::ListValue::iterator itr = v2list->begin(); 561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) itr != v2list->end();) { 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::Value> item; 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) itr = v2list->Erase(itr, &item); 564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v1list->Append(item.release()); 565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(*v1list); 569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncFileSystemService::DidGetExtensionStatusMap( 572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ExtensionStatusMapCallback& callback, 573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<RemoteFileSyncService::OriginStatusMap> status_map) { 5746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!status_map) 5756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) status_map = make_scoped_ptr(new RemoteFileSyncService::OriginStatusMap); 576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v2_remote_service_) { 577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(*status_map); 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v2_remote_service_->GetOriginStatusMap( 582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&SyncFileSystemService::DidGetV2ExtensionStatusMap, 583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AsWeakPtr(), 584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback, 585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Passed(&status_map))); 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncFileSystemService::DidGetV2ExtensionStatusMap( 589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ExtensionStatusMapCallback& callback, 590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<RemoteFileSyncService::OriginStatusMap> status_map_v1, 591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<RemoteFileSyncService::OriginStatusMap> status_map_v2) { 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Merge |status_map_v2| into |status_map_v1|. 5936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!status_map_v1) 5946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) status_map_v1 = make_scoped_ptr(new RemoteFileSyncService::OriginStatusMap); 5956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (status_map_v2) 5966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) status_map_v1->insert(status_map_v2->begin(), status_map_v2->end()); 597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(*status_map_v1); 599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::SetSyncEnabledForTesting(bool enabled) { 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_enabled_ = enabled; 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_->SetSyncEnabled(sync_enabled_); 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (v2_remote_service_) 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_->SetSyncEnabled(sync_enabled_); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::DidGetLocalChangeStatus( 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncFileStatusCallback& callback, 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncStatusCode status, 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_pending_local_changes) { 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run( 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status, 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_pending_local_changes ? 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNC_FILE_STATUS_HAS_PENDING_CHANGES : SYNC_FILE_STATUS_SYNCED); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnRemoteServiceStateUpdated( 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoteServiceState state, 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& description) { 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "OnRemoteServiceStateChanged: %d %s", state, description.c_str()); 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncEventObserver, observers_, 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSyncStateUpdated(GURL(), 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoteStateToSyncServiceState(state), 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description)); 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunForEachSyncRunners(&SyncProcessRunner::Schedule); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 634116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SyncFileSystemService::OnExtensionInstalled( 635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension, 637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_update) { 638d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GURL app_origin = Extension::GetBaseURLFromExtensionId(extension->id()); 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Handle extension notification for INSTALLED: " << app_origin; 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NOTE: When an app is uninstalled and re-installed in a sequence, 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |local_service_| may still keeps |app_origin| as disabled origin. 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->SetOriginEnabled(app_origin, true); 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 645116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SyncFileSystemService::OnExtensionUnloaded( 646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension, 648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::UnloadedExtensionInfo::Reason reason) { 649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (reason != extensions::UnloadedExtensionInfo::REASON_DISABLE) 650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL app_origin = Extension::GetBaseURLFromExtensionId(extension->id()); 653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int disable_reasons = 654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionPrefs::Get(profile_)->GetDisableReasons(extension->id()); 655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (disable_reasons & Extension::DISABLE_RELOAD) { 656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Bypass disabling the origin since the app will be re-enabled soon. 657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // NOTE: If re-enabling the app fails, the app is disabled while it is 658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // handled as enabled origin in the SyncFS. This should be safe and will be 659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // recovered when the user re-enables the app manually or the sync service 660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // restarts. 661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DVLOG(1) << "Handle extension notification for UNLOAD(DISABLE_RELOAD): " 662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << app_origin; 663d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 664d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DVLOG(1) << "Handle extension notification for UNLOAD(DISABLE): " 667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << app_origin; 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRemoteService(app_origin)->DisableOrigin( 669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) app_origin, 670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&DidHandleUnloadedEvent, app_origin)); 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->SetOriginEnabled(app_origin, false); 672a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 674116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SyncFileSystemService::OnExtensionUninstalled( 675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 6765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* extension, 6775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UninstallReason reason) { 67868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RemoteFileSyncService::UninstallFlag flag = 67968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE; 68068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // If it's loaded from an unpacked package and with key: field, 68168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the uninstall will not be sync'ed and the user might be using the 68268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // same app key in other installs, so avoid purging the remote folder. 68368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (extensions::Manifest::IsUnpackedLocation(extension->location()) && 68468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) extension->manifest()->HasKey(extensions::manifest_keys::kKey)) { 68568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) flag = RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE; 68668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 68768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 68868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL app_origin = Extension::GetBaseURLFromExtensionId(extension->id()); 689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DVLOG(1) << "Handle extension notification for UNINSTALLED: " 690a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << app_origin; 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRemoteService(app_origin)->UninstallOrigin( 69268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) app_origin, flag, 693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&DidHandleUninstalledEvent, app_origin)); 694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->SetOriginEnabled(app_origin, false); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 697116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SyncFileSystemService::OnExtensionLoaded( 698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension) { 700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL app_origin = Extension::GetBaseURLFromExtensionId(extension->id()); 701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Handle extension notification for LOADED: " << app_origin; 702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRemoteService(app_origin)->EnableOrigin( 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_origin, 704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&DidHandleLoadEvent, app_origin)); 705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_service_->SetOriginEnabled(app_origin, true); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnStateChanged() { 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service = 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile_); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_sync_service) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSyncEnabledStatus(profile_sync_service); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::OnFileStatusChanged( 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncFileStatus sync_status, 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncAction action_taken, 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncDirection direction) { 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncEventObserver, observers_, 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFileSynced(url, sync_status, action_taken, direction)); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncFileSystemService::UpdateSyncEnabledStatus( 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileSyncServiceBase* profile_sync_service) { 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile_sync_service->HasSyncSetupCompleted()) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 729d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool old_sync_enabled = sync_enabled_; 730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sync_enabled_ = profile_sync_service->GetActiveDataTypes().Has( 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::APPS); 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) remote_service_->SetSyncEnabled(sync_enabled_); 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (v2_remote_service_) 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_->SetSyncEnabled(sync_enabled_); 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!old_sync_enabled && sync_enabled_) 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunForEachSyncRunners(&SyncProcessRunner::Schedule); 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SyncFileSystemService::RunForEachSyncRunners( 740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void(SyncProcessRunner::*method)()) { 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (ScopedVector<SyncProcessRunner>::iterator iter = 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_sync_runners_.begin(); 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) iter != local_sync_runners_.end(); ++iter) 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ((*iter)->*method)(); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (ScopedVector<SyncProcessRunner>::iterator iter = 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) remote_sync_runners_.begin(); 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) iter != remote_sync_runners_.end(); ++iter) 748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ((*iter)->*method)(); 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RemoteFileSyncService* SyncFileSystemService::GetRemoteService( 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& origin) { 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (IsV2Enabled()) 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return remote_service_.get(); 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsV2EnabledForOrigin(origin)) 756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return remote_service_.get(); 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!v2_remote_service_) { 759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_ = RemoteFileSyncService::CreateForBrowserContext( 760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RemoteFileSyncService::V2, profile_, &task_logger_); 761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<RemoteSyncRunner> v2_remote_syncer( 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new RemoteSyncRunner(kRemoteSyncNameV2, this, 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_.get())); 764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_->AddServiceObserver(v2_remote_syncer.get()); 765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_->AddFileStatusObserver(this); 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v2_remote_service_->SetRemoteChangeProcessor(local_service_.get()); 767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v2_remote_service_->SetSyncEnabled(sync_enabled_); 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) remote_sync_runners_.push_back(v2_remote_syncer.release()); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return v2_remote_service_.get(); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sync_file_system 774