sync_file_system_service_factory.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/sync_file_system/sync_file_system_service_factory.h" 6 7#include "base/command_line.h" 8#include "base/threading/sequenced_worker_pool.h" 9#include "chrome/browser/drive/drive_api_service.h" 10#include "chrome/browser/drive/drive_notification_manager_factory.h" 11#include "chrome/browser/drive/drive_uploader.h" 12#include "chrome/browser/extensions/extension_service.h" 13#include "chrome/browser/extensions/extension_system_factory.h" 14#include "chrome/browser/google_apis/drive_api_url_generator.h" 15#include "chrome/browser/google_apis/gdata_wapi_url_generator.h" 16#include "chrome/browser/profiles/profile.h" 17#include "chrome/browser/signin/profile_oauth2_token_service.h" 18#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 19#include "chrome/browser/sync/profile_sync_service.h" 20#include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" 21#include "chrome/browser/sync_file_system/drive_backend_v1/drive_file_sync_service.h" 22#include "chrome/browser/sync_file_system/sync_file_system_service.h" 23#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 24#include "components/browser_context_keyed_service/browser_context_dependency_manager.h" 25 26namespace sync_file_system { 27 28namespace { 29const char kDisableLastWriteWin[] = "disable-syncfs-last-write-win"; 30} 31 32// static 33SyncFileSystemService* SyncFileSystemServiceFactory::GetForProfile( 34 Profile* profile) { 35 return static_cast<SyncFileSystemService*>( 36 GetInstance()->GetServiceForBrowserContext(profile, true)); 37} 38 39// static 40SyncFileSystemServiceFactory* SyncFileSystemServiceFactory::GetInstance() { 41 return Singleton<SyncFileSystemServiceFactory>::get(); 42} 43 44void SyncFileSystemServiceFactory::set_mock_remote_file_service( 45 scoped_ptr<RemoteFileSyncService> mock_remote_service) { 46 mock_remote_file_service_ = mock_remote_service.Pass(); 47} 48 49SyncFileSystemServiceFactory::SyncFileSystemServiceFactory() 50 : BrowserContextKeyedServiceFactory( 51 "SyncFileSystemService", 52 BrowserContextDependencyManager::GetInstance()) { 53 DependsOn(drive::DriveNotificationManagerFactory::GetInstance()); 54 DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance()); 55 DependsOn(extensions::ExtensionSystemFactory::GetInstance()); 56} 57 58SyncFileSystemServiceFactory::~SyncFileSystemServiceFactory() {} 59 60BrowserContextKeyedService* 61SyncFileSystemServiceFactory::BuildServiceInstanceFor( 62 content::BrowserContext* context) const { 63 Profile* profile = Profile::FromBrowserContext(context); 64 65 SyncFileSystemService* service = new SyncFileSystemService(profile); 66 67 scoped_ptr<LocalFileSyncService> local_file_service( 68 new LocalFileSyncService(profile)); 69 70 scoped_ptr<RemoteFileSyncService> remote_file_service; 71 if (mock_remote_file_service_) { 72 remote_file_service = mock_remote_file_service_.Pass(); 73 } else if (sync_file_system::IsV2Enabled()) { 74 GURL base_drive_url( 75 google_apis::DriveApiUrlGenerator::kBaseUrlForProduction); 76 GURL base_download_url( 77 google_apis::DriveApiUrlGenerator::kBaseDownloadUrlForProduction); 78 GURL wapi_base_url( 79 google_apis::GDataWapiUrlGenerator::kBaseUrlForProduction); 80 81 scoped_refptr<base::SequencedWorkerPool> worker_pool( 82 content::BrowserThread::GetBlockingPool()); 83 scoped_refptr<base::SequencedTaskRunner> drive_task_runner( 84 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( 85 worker_pool->GetSequenceToken(), 86 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); 87 88 ProfileOAuth2TokenService* token_service = 89 ProfileOAuth2TokenServiceFactory::GetForProfile(profile); 90 scoped_ptr<drive::DriveServiceInterface> drive_service( 91 new drive::DriveAPIService( 92 token_service, 93 context->GetRequestContext(), 94 drive_task_runner.get(), 95 base_drive_url, base_download_url, wapi_base_url, 96 std::string() /* custom_user_agent */)); 97 drive_service->Initialize(token_service->GetPrimaryAccountId()); 98 99 scoped_ptr<drive::DriveUploaderInterface> drive_uploader( 100 new drive::DriveUploader(drive_service.get(), drive_task_runner.get())); 101 102 drive::DriveNotificationManager* notification_manager = 103 drive::DriveNotificationManagerFactory::GetForBrowserContext(profile); 104 ExtensionService* extension_service = 105 extensions::ExtensionSystem::Get(profile)->extension_service(); 106 107 scoped_refptr<base::SequencedTaskRunner> task_runner( 108 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( 109 worker_pool->GetSequenceToken(), 110 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); 111 112 scoped_ptr<drive_backend::SyncEngine> sync_engine( 113 new drive_backend::SyncEngine( 114 GetSyncFileSystemDir(context->GetPath()), 115 task_runner.get(), 116 drive_service.Pass(), 117 drive_uploader.Pass(), 118 notification_manager, 119 extension_service)); 120 121 sync_engine->Initialize(); 122 remote_file_service = sync_engine.PassAs<RemoteFileSyncService>(); 123 } else { 124 remote_file_service = 125 DriveFileSyncService::Create(profile).PassAs<RemoteFileSyncService>(); 126 } 127 128 if (CommandLine::ForCurrentProcess()->HasSwitch(kDisableLastWriteWin)) { 129 remote_file_service->SetConflictResolutionPolicy( 130 CONFLICT_RESOLUTION_POLICY_MANUAL); 131 } 132 133 service->Initialize(local_file_service.Pass(), 134 remote_file_service.Pass()); 135 return service; 136} 137 138} // namespace sync_file_system 139