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