Home | History | Annotate | Download | only in drive_backend
      1 // Copyright 2014 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_WORKER_H_
      6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_WORKER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/files/file_path.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/weak_ptr.h"
     13 #include "base/observer_list.h"
     14 #include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h"
     15 #include "chrome/browser/sync_file_system/drive_backend/sync_worker_interface.h"
     16 #include "chrome/browser/sync_file_system/remote_file_sync_service.h"
     17 #include "chrome/browser/sync_file_system/sync_callbacks.h"
     18 #include "chrome/browser/sync_file_system/task_logger.h"
     19 #include "net/base/network_change_notifier.h"
     20 
     21 class ExtensionServiceInterface;
     22 class GURL;
     23 
     24 namespace base {
     25 class ListValue;
     26 }
     27 
     28 namespace drive {
     29 class DriveServiceInterface;
     30 class DriveUploaderInterface;
     31 }
     32 
     33 namespace fileapi {
     34 class FileSystemURL;
     35 }
     36 
     37 namespace leveldb {
     38 class Env;
     39 }
     40 
     41 namespace sync_file_system {
     42 
     43 class FileChange;
     44 class SyncFileMetadata;
     45 
     46 namespace drive_backend {
     47 
     48 class LocalToRemoteSyncer;
     49 class MetadataDatabase;
     50 class RemoteChangeProcessorOnWorker;
     51 class RemoteToLocalSyncer;
     52 class SyncEngineContext;
     53 class SyncEngineInitializer;
     54 
     55 class SyncWorker : public SyncWorkerInterface,
     56                    public SyncTaskManager::Client {
     57  public:
     58   SyncWorker(const base::FilePath& base_dir,
     59              const base::WeakPtr<ExtensionServiceInterface>& extension_service,
     60              leveldb::Env* env_override);
     61 
     62   virtual ~SyncWorker();
     63 
     64   virtual void Initialize(scoped_ptr<SyncEngineContext> context) OVERRIDE;
     65 
     66   // SyncTaskManager::Client overrides
     67   virtual void MaybeScheduleNextTask() OVERRIDE;
     68   virtual void NotifyLastOperationStatus(
     69       SyncStatusCode sync_status, bool used_network) OVERRIDE;
     70   virtual void RecordTaskLog(scoped_ptr<TaskLogger::TaskLog> task_log) OVERRIDE;
     71 
     72   // SyncWorkerInterface overrides
     73   virtual void RegisterOrigin(const GURL& origin,
     74                               const SyncStatusCallback& callback) OVERRIDE;
     75   virtual void EnableOrigin(const GURL& origin,
     76                             const SyncStatusCallback& callback) OVERRIDE;
     77   virtual void DisableOrigin(const GURL& origin,
     78                              const SyncStatusCallback& callback) OVERRIDE;
     79   virtual void UninstallOrigin(const GURL& origin,
     80                                RemoteFileSyncService::UninstallFlag flag,
     81                                const SyncStatusCallback& callback) OVERRIDE;
     82   virtual void ProcessRemoteChange(const SyncFileCallback& callback) OVERRIDE;
     83   virtual void SetRemoteChangeProcessor(
     84       RemoteChangeProcessorOnWorker* remote_change_processor_on_worker)
     85       OVERRIDE;
     86   virtual RemoteServiceState GetCurrentState() const OVERRIDE;
     87   virtual void GetOriginStatusMap(
     88       const RemoteFileSyncService::StatusMapCallback& callback) OVERRIDE;
     89   virtual scoped_ptr<base::ListValue> DumpFiles(const GURL& origin) OVERRIDE;
     90   virtual scoped_ptr<base::ListValue> DumpDatabase() OVERRIDE;
     91   virtual void SetSyncEnabled(bool enabled) OVERRIDE;
     92   virtual void PromoteDemotedChanges() OVERRIDE;
     93 
     94   virtual void ApplyLocalChange(
     95       const FileChange& local_change,
     96       const base::FilePath& local_path,
     97       const SyncFileMetadata& local_metadata,
     98       const fileapi::FileSystemURL& url,
     99       const SyncStatusCallback& callback) OVERRIDE;
    100 
    101   virtual void OnNotificationReceived() OVERRIDE;
    102 
    103   virtual void OnReadyToSendRequests() OVERRIDE;
    104   virtual void OnRefreshTokenInvalid() OVERRIDE;
    105 
    106   virtual void OnNetworkChanged(
    107       net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
    108 
    109   virtual drive::DriveServiceInterface* GetDriveService() OVERRIDE;
    110   virtual drive::DriveUploaderInterface* GetDriveUploader() OVERRIDE;
    111   virtual MetadataDatabase* GetMetadataDatabase() OVERRIDE;
    112   virtual SyncTaskManager* GetSyncTaskManager() OVERRIDE;
    113 
    114   virtual void DetachFromSequence() OVERRIDE;
    115 
    116   virtual void AddObserver(Observer* observer) OVERRIDE;
    117 
    118  private:
    119   friend class DriveBackendSyncTest;
    120   friend class SyncWorkerTest;
    121 
    122   enum AppStatus {
    123     APP_STATUS_ENABLED,
    124     APP_STATUS_DISABLED,
    125     APP_STATUS_UNINSTALLED,
    126   };
    127 
    128   typedef base::hash_map<std::string, AppStatus> AppStatusMap;
    129 
    130   // SyncWorkerInterface overrides.
    131   // TODO(peria): Remove this interface after making FakeSyncWorker class.
    132   virtual void SetHasRefreshToken(bool has_refresh_token) OVERRIDE;
    133 
    134   void DoDisableApp(const std::string& app_id,
    135                     const SyncStatusCallback& callback);
    136   void DoEnableApp(const std::string& app_id,
    137                    const SyncStatusCallback& callback);
    138 
    139   void PostInitializeTask();
    140   void DidInitialize(SyncEngineInitializer* initializer,
    141                      SyncStatusCode status);
    142   void UpdateRegisteredApps();
    143   static void QueryAppStatusOnUIThread(
    144       const base::WeakPtr<ExtensionServiceInterface>& extension_service_ptr,
    145       const std::vector<std::string>* app_ids,
    146       AppStatusMap* status,
    147       const base::Closure& callback);
    148   void DidQueryAppStatus(const AppStatusMap* app_status);
    149   void DidProcessRemoteChange(RemoteToLocalSyncer* syncer,
    150                               const SyncFileCallback& callback,
    151                               SyncStatusCode status);
    152   void DidApplyLocalChange(LocalToRemoteSyncer* syncer,
    153                            const SyncStatusCallback& callback,
    154                            SyncStatusCode status);
    155 
    156   void MaybeStartFetchChanges();
    157   void DidResolveConflict(SyncStatusCode status);
    158   void DidFetchChanges(SyncStatusCode status);
    159 
    160   void UpdateServiceStateFromSyncStatusCode(SyncStatusCode state,
    161                                             bool used_network);
    162   void UpdateServiceState(RemoteServiceState state,
    163                           const std::string& description);
    164 
    165   base::FilePath base_dir_;
    166 
    167   leveldb::Env* env_override_;
    168 
    169   // Sync with SyncEngine.
    170   RemoteServiceState service_state_;
    171 
    172   bool should_check_conflict_;
    173   bool should_check_remote_change_;
    174   bool listing_remote_changes_;
    175   base::TimeTicks time_to_check_changes_;
    176 
    177   bool sync_enabled_;
    178   ConflictResolutionPolicy default_conflict_resolution_policy_;
    179   bool network_available_;
    180 
    181   scoped_ptr<SyncTaskManager> task_manager_;
    182 
    183   base::WeakPtr<ExtensionServiceInterface> extension_service_;
    184 
    185   scoped_ptr<SyncEngineContext> context_;
    186   ObserverList<Observer> observers_;
    187 
    188   bool has_refresh_token_;
    189 
    190   base::SequenceChecker sequence_checker_;
    191 
    192   base::WeakPtrFactory<SyncWorker> weak_ptr_factory_;
    193   DISALLOW_COPY_AND_ASSIGN(SyncWorker);
    194 };
    195 
    196 }  // namespace drive_backend
    197 }  // namespace sync_file_system
    198 
    199 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_WORKER_H_
    200