Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / sync_engine.h
1 // Copyright 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 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_H_
7
8 #include <set>
9 #include <string>
10
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/observer_list.h"
14 #include "chrome/browser/drive/drive_notification_observer.h"
15 #include "chrome/browser/drive/drive_service_interface.h"
16 #include "chrome/browser/sync_file_system/drive_backend/callback_tracker.h"
17 #include "chrome/browser/sync_file_system/local_change_processor.h"
18 #include "chrome/browser/sync_file_system/remote_file_sync_service.h"
19 #include "chrome/browser/sync_file_system/sync_action.h"
20 #include "chrome/browser/sync_file_system/sync_direction.h"
21 #include "components/signin/core/browser/signin_manager_base.h"
22 #include "net/base/network_change_notifier.h"
23
24 class ExtensionServiceInterface;
25 class OAuth2TokenService;
26
27 namespace base {
28 class SequencedTaskRunner;
29 }
30
31 namespace drive {
32 class DriveServiceInterface;
33 class DriveNotificationManager;
34 class DriveUploaderInterface;
35 }
36
37 namespace leveldb {
38 class Env;
39 }
40
41 namespace net {
42 class URLRequestContextGetter;
43 }
44
45 namespace sync_file_system {
46
47 class RemoteChangeProcessor;
48 class SyncFileSystemTest;
49
50 namespace drive_backend {
51
52 class DriveServiceWrapper;
53 class DriveUploaderWrapper;
54 class MetadataDatabase;
55 class RemoteChangeProcessorOnWorker;
56 class RemoteChangeProcessorWrapper;
57 class SyncTaskManager;
58 class SyncWorkerInterface;
59
60 class SyncEngine : public RemoteFileSyncService,
61                    public LocalChangeProcessor,
62                    public drive::DriveNotificationObserver,
63                    public drive::DriveServiceObserver,
64                    public net::NetworkChangeNotifier::NetworkChangeObserver,
65                    public SigninManagerBase::Observer {
66  public:
67   typedef RemoteFileSyncService::Observer SyncServiceObserver;
68
69   class DriveServiceFactory {
70    public:
71     DriveServiceFactory() {}
72     virtual ~DriveServiceFactory() {}
73     virtual scoped_ptr<drive::DriveServiceInterface> CreateDriveService(
74         OAuth2TokenService* oauth2_token_service,
75         net::URLRequestContextGetter* url_request_context_getter,
76         base::SequencedTaskRunner* blocking_task_runner);
77
78    private:
79     DISALLOW_COPY_AND_ASSIGN(DriveServiceFactory);
80   };
81
82   static scoped_ptr<SyncEngine> CreateForBrowserContext(
83       content::BrowserContext* context,
84       TaskLogger* task_logger);
85   static void AppendDependsOnFactories(
86       std::set<BrowserContextKeyedServiceFactory*>* factories);
87
88   virtual ~SyncEngine();
89   void Reset();
90
91   // Can be called more than once.
92   void Initialize();
93
94   void InitializeForTesting(
95       scoped_ptr<drive::DriveServiceInterface> drive_service,
96       scoped_ptr<drive::DriveUploaderInterface> drive_uploader,
97       scoped_ptr<SyncWorkerInterface> sync_worker);
98   void InitializeInternal(
99       scoped_ptr<drive::DriveServiceInterface> drive_service,
100       scoped_ptr<drive::DriveUploaderInterface> drive_uploader,
101       scoped_ptr<SyncWorkerInterface> sync_worker);
102
103   // RemoteFileSyncService overrides.
104   virtual void AddServiceObserver(SyncServiceObserver* observer) OVERRIDE;
105   virtual void AddFileStatusObserver(FileStatusObserver* observer) OVERRIDE;
106   virtual void RegisterOrigin(
107       const GURL& origin,
108       const SyncStatusCallback& callback) OVERRIDE;
109   virtual void EnableOrigin(
110       const GURL& origin,
111       const SyncStatusCallback& callback) OVERRIDE;
112   virtual void DisableOrigin(
113       const GURL& origin,
114       const SyncStatusCallback& callback) OVERRIDE;
115   virtual void UninstallOrigin(
116       const GURL& origin,
117       UninstallFlag flag,
118       const SyncStatusCallback& callback) OVERRIDE;
119   virtual void ProcessRemoteChange(const SyncFileCallback& callback) OVERRIDE;
120   virtual void SetRemoteChangeProcessor(
121       RemoteChangeProcessor* processor) OVERRIDE;
122   virtual LocalChangeProcessor* GetLocalChangeProcessor() OVERRIDE;
123   virtual RemoteServiceState GetCurrentState() const OVERRIDE;
124   virtual void GetOriginStatusMap(const StatusMapCallback& callback) OVERRIDE;
125   virtual void DumpFiles(const GURL& origin,
126                          const ListCallback& callback) OVERRIDE;
127   virtual void DumpDatabase(const ListCallback& callback) OVERRIDE;
128   virtual void SetSyncEnabled(bool enabled) OVERRIDE;
129   virtual void PromoteDemotedChanges(const base::Closure& callback) OVERRIDE;
130
131   // LocalChangeProcessor overrides.
132   virtual void ApplyLocalChange(const FileChange& local_change,
133                                 const base::FilePath& local_path,
134                                 const SyncFileMetadata& local_metadata,
135                                 const storage::FileSystemURL& url,
136                                 const SyncStatusCallback& callback) OVERRIDE;
137
138   // drive::DriveNotificationObserver overrides.
139   virtual void OnNotificationReceived() OVERRIDE;
140   virtual void OnPushNotificationEnabled(bool enabled) OVERRIDE;
141
142   // drive::DriveServiceObserver overrides.
143   virtual void OnReadyToSendRequests() OVERRIDE;
144   virtual void OnRefreshTokenInvalid() OVERRIDE;
145
146   // net::NetworkChangeNotifier::NetworkChangeObserver overrides.
147   virtual void OnNetworkChanged(
148       net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
149
150   // SigninManagerBase::Observer overrides.
151   virtual void GoogleSigninFailed(const GoogleServiceAuthError& error) OVERRIDE;
152   virtual void GoogleSigninSucceeded(const std::string& account_id,
153                                      const std::string& username,
154                                      const std::string& password) OVERRIDE;
155   virtual void GoogleSignedOut(const std::string& account_id,
156                                const std::string& username) OVERRIDE;
157
158  private:
159   class WorkerObserver;
160
161   friend class DriveBackendSyncTest;
162   friend class SyncEngineTest;
163   friend class sync_file_system::SyncFileSystemTest;
164
165   SyncEngine(const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner,
166              const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
167              const scoped_refptr<base::SequencedTaskRunner>& drive_task_runner,
168              const base::FilePath& sync_file_system_dir,
169              TaskLogger* task_logger,
170              drive::DriveNotificationManager* notification_manager,
171              ExtensionServiceInterface* extension_service,
172              SigninManagerBase* signin_manager,
173              OAuth2TokenService* token_service,
174              net::URLRequestContextGetter* request_context,
175              scoped_ptr<DriveServiceFactory> drive_service_factory,
176              leveldb::Env* env_override);
177
178   // Called by WorkerObserver.
179   void OnPendingFileListUpdated(int item_count);
180   void OnFileStatusChanged(const storage::FileSystemURL& url,
181                            SyncFileStatus file_status,
182                            SyncAction sync_action,
183                            SyncDirection direction);
184   void UpdateServiceState(RemoteServiceState state,
185                           const std::string& description);
186
187   SyncStatusCallback TrackCallback(const SyncStatusCallback& callback);
188
189   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
190   scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
191   scoped_refptr<base::SequencedTaskRunner> drive_task_runner_;
192
193   const base::FilePath sync_file_system_dir_;
194   TaskLogger* task_logger_;
195
196   // These external services are not owned by SyncEngine.
197   // The owner of the SyncEngine is responsible for their lifetime.
198   // I.e. the owner should declare the dependency explicitly by calling
199   // KeyedService::DependsOn().
200   drive::DriveNotificationManager* notification_manager_;
201   ExtensionServiceInterface* extension_service_;
202   SigninManagerBase* signin_manager_;
203   OAuth2TokenService* token_service_;
204
205   scoped_refptr<net::URLRequestContextGetter> request_context_;
206
207   scoped_ptr<DriveServiceFactory> drive_service_factory_;
208
209   scoped_ptr<drive::DriveServiceInterface> drive_service_;
210   scoped_ptr<DriveServiceWrapper> drive_service_wrapper_;
211   scoped_ptr<drive::DriveUploaderInterface> drive_uploader_;
212   scoped_ptr<DriveUploaderWrapper> drive_uploader_wrapper_;
213
214   RemoteChangeProcessor* remote_change_processor_;  // Not owned.
215   scoped_ptr<RemoteChangeProcessorWrapper> remote_change_processor_wrapper_;
216   // Delete this on worker.
217   scoped_ptr<RemoteChangeProcessorOnWorker> remote_change_processor_on_worker_;
218
219   RemoteServiceState service_state_;
220   bool has_refresh_token_;
221   bool network_available_;
222   bool sync_enabled_;
223
224   // Delete them on worker.
225   scoped_ptr<WorkerObserver> worker_observer_;
226   scoped_ptr<SyncWorkerInterface> sync_worker_;
227
228   ObserverList<SyncServiceObserver> service_observers_;
229   ObserverList<FileStatusObserver> file_status_observers_;
230   leveldb::Env* env_override_;
231
232   CallbackTracker callback_tracker_;
233
234   base::WeakPtrFactory<SyncEngine> weak_ptr_factory_;
235   DISALLOW_COPY_AND_ASSIGN(SyncEngine);
236 };
237
238 }  // namespace drive_backend
239 }  // namespace sync_file_system
240
241 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_H_