sync_engine.h revision 0529e5d033099cbfc42635f6f6183833b09dff6e
14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2013 The Chromium Authors. All rights reserved.
24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Use of this source code is governed by a BSD-style license that can be
34b6829f0d28990dd645e16386eb226d0f10c8731shiqian// found in the LICENSE file.
44b6829f0d28990dd645e16386eb226d0f10c8731shiqian
54b6829f0d28990dd645e16386eb226d0f10c8731shiqian#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_H_
64b6829f0d28990dd645e16386eb226d0f10c8731shiqian#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_H_
74b6829f0d28990dd645e16386eb226d0f10c8731shiqian
84b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <set>
94b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <string>
104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
114b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "base/memory/scoped_ptr.h"
124b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "base/memory/weak_ptr.h"
134b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "base/observer_list.h"
144b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "chrome/browser/drive/drive_notification_observer.h"
154b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "chrome/browser/drive/drive_service_interface.h"
164b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "chrome/browser/sync_file_system/local_change_processor.h"
174b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
184b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "chrome/browser/sync_file_system/sync_action.h"
194b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "chrome/browser/sync_file_system/sync_direction.h"
204b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "net/base/network_change_notifier.h"
214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
224b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass ExtensionServiceInterface;
234b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass SigninManagerBase;
244b6829f0d28990dd645e16386eb226d0f10c8731shiqian
254b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace base {
264b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass SequencedTaskRunner;
274b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
294b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace drive {
304b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass DriveServiceInterface;
314b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass DriveNotificationManager;
324b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass DriveUploaderInterface;
334b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
354b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace leveldb {
364b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Env;
374b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
394b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace sync_file_system {
404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
414b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass RemoteChangeProcessor;
424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
434b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace drive_backend {
444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
454b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass LocalToRemoteSyncer;
464b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MetadataDatabase;
474b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass RemoteToLocalSyncer;
484b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass SyncEngineInitializer;
494b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass SyncTaskManager;
504b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass SyncWorker;
514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
524b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass SyncEngine : public RemoteFileSyncService,
534b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   public LocalChangeProcessor,
544b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   public drive::DriveNotificationObserver,
554b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   public drive::DriveServiceObserver,
564b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   public net::NetworkChangeNotifier::NetworkChangeObserver {
574b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  typedef Observer SyncServiceObserver;
594b6829f0d28990dd645e16386eb226d0f10c8731shiqian
604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static scoped_ptr<SyncEngine> CreateForBrowserContext(
614b6829f0d28990dd645e16386eb226d0f10c8731shiqian      content::BrowserContext* context);
624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void AppendDependsOnFactories(
634b6829f0d28990dd645e16386eb226d0f10c8731shiqian      std::set<BrowserContextKeyedServiceFactory*>* factories);
64e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual ~SyncEngine();
664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void Initialize(const base::FilePath& base_dir,
684b6829f0d28990dd645e16386eb226d0f10c8731shiqian                  base::SequencedTaskRunner* file_task_runner,
69f904a612d9444ab36c07a8e619c113432e046f49vladlosev                  leveldb::Env* env_override);
704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
71e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // RemoteFileSyncService overrides.
72e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  virtual void AddServiceObserver(SyncServiceObserver* observer) OVERRIDE;
734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void AddFileStatusObserver(FileStatusObserver* observer) OVERRIDE;
744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void RegisterOrigin(
754b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const GURL& origin,
764b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const SyncStatusCallback& callback) OVERRIDE;
774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void EnableOrigin(
784b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const GURL& origin,
794b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const SyncStatusCallback& callback) OVERRIDE;
804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void DisableOrigin(
814b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const GURL& origin,
824b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const SyncStatusCallback& callback) OVERRIDE;
834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void UninstallOrigin(
844b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const GURL& origin,
854b6829f0d28990dd645e16386eb226d0f10c8731shiqian      UninstallFlag flag,
864b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const SyncStatusCallback& callback) OVERRIDE;
874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void ProcessRemoteChange(const SyncFileCallback& callback) OVERRIDE;
884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetRemoteChangeProcessor(
894b6829f0d28990dd645e16386eb226d0f10c8731shiqian      RemoteChangeProcessor* processor) OVERRIDE;
904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual LocalChangeProcessor* GetLocalChangeProcessor() OVERRIDE;
914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual bool IsConflicting(const fileapi::FileSystemURL& url) OVERRIDE;
924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual RemoteServiceState GetCurrentState() const OVERRIDE;
934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void GetOriginStatusMap(OriginStatusMap* status_map) OVERRIDE;
944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual scoped_ptr<base::ListValue> DumpFiles(const GURL& origin) OVERRIDE;
954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual scoped_ptr<base::ListValue> DumpDatabase() OVERRIDE;
964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetSyncEnabled(bool enabled) OVERRIDE;
974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual SyncStatusCode SetDefaultConflictResolutionPolicy(
984b6829f0d28990dd645e16386eb226d0f10c8731shiqian      ConflictResolutionPolicy policy) OVERRIDE;
994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual SyncStatusCode SetConflictResolutionPolicy(
1004b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const GURL& origin,
101e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      ConflictResolutionPolicy policy) OVERRIDE;
1024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual ConflictResolutionPolicy GetDefaultConflictResolutionPolicy()
1034b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const OVERRIDE;
1044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual ConflictResolutionPolicy GetConflictResolutionPolicy(
105e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      const GURL& origin) const OVERRIDE;
1064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void GetRemoteVersions(
1074b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const fileapi::FileSystemURL& url,
1084b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const RemoteVersionsCallback& callback) OVERRIDE;
1094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void DownloadRemoteVersion(
1104b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const fileapi::FileSystemURL& url,
1114b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const std::string& version_id,
1124b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const DownloadVersionCallback& callback) OVERRIDE;
1134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void PromoteDemotedChanges() OVERRIDE;
1144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // LocalChangeProcessor overrides.
1164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void ApplyLocalChange(
1174b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const FileChange& local_change,
1184b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const base::FilePath& local_path,
1194b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const SyncFileMetadata& local_metadata,
1204b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const fileapi::FileSystemURL& url,
1214b6829f0d28990dd645e16386eb226d0f10c8731shiqian      const SyncStatusCallback& callback) OVERRIDE;
1224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // drive::DriveNotificationObserver overrides.
1244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void OnNotificationReceived() OVERRIDE;
1254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void OnPushNotificationEnabled(bool enabled) OVERRIDE;
1264b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // drive::DriveServiceObserver overrides.
1284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void OnReadyToSendRequests() OVERRIDE;
1294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void OnRefreshTokenInvalid() OVERRIDE;
1304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // net::NetworkChangeNotifier::NetworkChangeObserver overrides.
1324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void OnNetworkChanged(
1334b6829f0d28990dd645e16386eb226d0f10c8731shiqian      net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
1344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  drive::DriveServiceInterface* GetDriveService();
1364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  drive::DriveUploaderInterface* GetDriveUploader();
1374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  MetadataDatabase* GetMetadataDatabase();
1384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SyncTaskManager* GetSyncTaskManagerForTesting();
1394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Notifies update of sync status to each observer.
1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void UpdateSyncEnabled(bool enabled);
1424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void OnPendingFileListUpdated(int item_count);
1444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void OnFileStatusChanged(const fileapi::FileSystemURL& url,
1454b6829f0d28990dd645e16386eb226d0f10c8731shiqian                           SyncFileStatus file_status,
1464b6829f0d28990dd645e16386eb226d0f10c8731shiqian                           SyncAction sync_action,
1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian                           SyncDirection direction);
1484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void UpdateServiceState(RemoteServiceState state,
1494b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          const std::string& description);
1504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1514b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
1524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  class WorkerObserver;
1534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  friend class DriveBackendSyncTest;
1554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  friend class SyncEngineTest;
1564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SyncEngine(scoped_ptr<drive::DriveServiceInterface> drive_service,
1584b6829f0d28990dd645e16386eb226d0f10c8731shiqian             scoped_ptr<drive::DriveUploaderInterface> drive_uploader,
1594b6829f0d28990dd645e16386eb226d0f10c8731shiqian             base::SequencedTaskRunner* worker_task_runner,
1604b6829f0d28990dd645e16386eb226d0f10c8731shiqian             drive::DriveNotificationManager* notification_manager,
1614b6829f0d28990dd645e16386eb226d0f10c8731shiqian             ExtensionServiceInterface* extension_service,
1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian             SigninManagerBase* signin_manager);
1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void UpdateRegisteredApps();
1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  scoped_ptr<drive::DriveServiceInterface> drive_service_;
1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  scoped_ptr<drive::DriveUploaderInterface> drive_uploader_;
1684b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // These external services are not owned by SyncEngine.
1704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // The owner of the SyncEngine is responsible for their lifetime.
1714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // I.e. the owner should declare the dependency explicitly by calling
1724b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // KeyedService::DependsOn().
1734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  drive::DriveNotificationManager* notification_manager_;
1744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ExtensionServiceInterface* extension_service_;
1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SigninManagerBase* signin_manager_;
1764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ObserverList<SyncServiceObserver> service_observers_;
1784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ObserverList<FileStatusObserver> file_status_observers_;
1794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  scoped_ptr<WorkerObserver> worker_observer_;
1814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  scoped_ptr<SyncWorker> sync_worker_;
1824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
1834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  base::WeakPtrFactory<SyncEngine> weak_ptr_factory_;
1854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  DISALLOW_COPY_AND_ASSIGN(SyncEngine);
1864b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
1874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1884b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace drive_backend
1894b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace sync_file_system
1904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1914b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_H_
1924b6829f0d28990dd645e16386eb226d0f10c8731shiqian