blob: 28544e12c6761d77b61c909fc59fa56402915fb7 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_WORKER_H_
#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_WORKER_H_
#include <set>
#include <string>
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/drive/drive_notification_observer.h"
#include "chrome/browser/drive/drive_service_interface.h"
#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h"
#include "chrome/browser/sync_file_system/local_change_processor.h"
#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
#include "chrome/browser/sync_file_system/sync_action.h"
#include "chrome/browser/sync_file_system/sync_direction.h"
#include "net/base/network_change_notifier.h"
class ExtensionServiceInterface;
namespace base {
class SequencedTaskRunner;
}
namespace drive {
class DriveServiceInterface;
class DriveNotificationManager;
class DriveUploaderInterface;
}
namespace leveldb {
class Env;
}
namespace sync_file_system {
class RemoteChangeProcessor;
namespace drive_backend {
class LocalToRemoteSyncer;
class MetadataDatabase;
class RemoteToLocalSyncer;
class SyncEngineContext;
class SyncEngineInitializer;
class SyncWorker : public SyncTaskManager::Client {
public:
enum AppStatus {
APP_STATUS_ENABLED,
APP_STATUS_DISABLED,
APP_STATUS_UNINSTALLED,
};
typedef base::hash_map<std::string, AppStatus> AppStatusMap;
class Observer {
public:
virtual void OnPendingFileListUpdated(int item_count) = 0;
virtual void OnFileStatusChanged(const fileapi::FileSystemURL& url,
SyncFileStatus file_status,
SyncAction sync_action,
SyncDirection direction) = 0;
virtual void UpdateServiceState(RemoteServiceState state,
const std::string& description) = 0;
protected:
virtual ~Observer() {}
};
static scoped_ptr<SyncWorker> CreateOnWorker(
const base::FilePath& base_dir,
Observer* observer,
const base::WeakPtr<ExtensionServiceInterface>& extension_service,
scoped_ptr<SyncEngineContext> sync_engine_context,
leveldb::Env* env_override);
virtual ~SyncWorker();
void Initialize();
// SyncTaskManager::Client overrides
virtual void MaybeScheduleNextTask() OVERRIDE;
virtual void NotifyLastOperationStatus(
SyncStatusCode sync_status, bool used_network) OVERRIDE;
void RegisterOrigin(const GURL& origin, const SyncStatusCallback& callback);
void EnableOrigin(const GURL& origin, const SyncStatusCallback& callback);
void DisableOrigin(const GURL& origin, const SyncStatusCallback& callback);
void UninstallOrigin(
const GURL& origin,
RemoteFileSyncService::UninstallFlag flag,
const SyncStatusCallback& callback);
void ProcessRemoteChange(const SyncFileCallback& callback);
void SetRemoteChangeProcessor(RemoteChangeProcessor* processor);
RemoteServiceState GetCurrentState() const;
void GetOriginStatusMap(RemoteFileSyncService::OriginStatusMap* status_map);
scoped_ptr<base::ListValue> DumpFiles(const GURL& origin);
scoped_ptr<base::ListValue> DumpDatabase();
void SetSyncEnabled(bool enabled);
SyncStatusCode SetDefaultConflictResolutionPolicy(
ConflictResolutionPolicy policy);
SyncStatusCode SetConflictResolutionPolicy(
const GURL& origin,
ConflictResolutionPolicy policy);
ConflictResolutionPolicy GetDefaultConflictResolutionPolicy()
const;
ConflictResolutionPolicy GetConflictResolutionPolicy(
const GURL& origin) const;
void ApplyLocalChange(
const FileChange& local_change,
const base::FilePath& local_path,
const SyncFileMetadata& local_metadata,
const fileapi::FileSystemURL& url,
const SyncStatusCallback& callback);
void OnNotificationReceived();
void OnReadyToSendRequests(const std::string& account_id);
void OnRefreshTokenInvalid();
void OnNetworkChanged(net::NetworkChangeNotifier::ConnectionType type);
drive::DriveServiceInterface* GetDriveService();
drive::DriveUploaderInterface* GetDriveUploader();
MetadataDatabase* GetMetadataDatabase();
SyncTaskManager* GetSyncTaskManager();
void AddObserver(Observer* observer);
private:
friend class DriveBackendSyncTest;
friend class SyncEngineTest;
SyncWorker(const base::FilePath& base_dir,
const base::WeakPtr<ExtensionServiceInterface>& extension_service,
scoped_ptr<SyncEngineContext> sync_engine_context,
leveldb::Env* env_override);
void DoDisableApp(const std::string& app_id,
const SyncStatusCallback& callback);
void DoEnableApp(const std::string& app_id,
const SyncStatusCallback& callback);
void PostInitializeTask();
void DidInitialize(SyncEngineInitializer* initializer,
SyncStatusCode status);
void UpdateRegisteredApp();
void DidQueryAppStatus(const AppStatusMap* app_status);
void DidProcessRemoteChange(RemoteToLocalSyncer* syncer,
const SyncFileCallback& callback,
SyncStatusCode status);
void DidApplyLocalChange(LocalToRemoteSyncer* syncer,
const SyncStatusCallback& callback,
SyncStatusCode status);
void MaybeStartFetchChanges();
void DidResolveConflict(SyncStatusCode status);
void DidFetchChanges(SyncStatusCode status);
void UpdateServiceStateFromSyncStatusCode(SyncStatusCode state,
bool used_network);
void UpdateServiceState(RemoteServiceState state,
const std::string& description);
void UpdateRegisteredApps();
base::FilePath base_dir_;
leveldb::Env* env_override_;
// Sync with SyncEngine.
RemoteServiceState service_state_;
bool should_check_conflict_;
bool should_check_remote_change_;
bool listing_remote_changes_;
base::TimeTicks time_to_check_changes_;
bool sync_enabled_;
ConflictResolutionPolicy default_conflict_resolution_policy_;
bool network_available_;
scoped_ptr<SyncTaskManager> task_manager_;
base::WeakPtr<ExtensionServiceInterface> extension_service_;
scoped_ptr<SyncEngineContext> context_;
ObserverList<Observer> observers_;
base::WeakPtrFactory<SyncWorker> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(SyncWorker);
};
} // namespace drive_backend
} // namespace sync_file_system
#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_WORKER_H_