sync_engine_initializer.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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_INITIALIZER_H_ 6#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_INITIALIZER_H_ 7 8#include "base/memory/ref_counted.h" 9#include "base/memory/scoped_ptr.h" 10#include "base/memory/scoped_vector.h" 11#include "base/memory/weak_ptr.h" 12#include "base/sequenced_task_runner.h" 13#include "chrome/browser/sync_file_system/sync_callbacks.h" 14#include "chrome/browser/sync_file_system/sync_task.h" 15#include "google_apis/drive/drive_common_callbacks.h" 16#include "google_apis/drive/gdata_errorcode.h" 17 18namespace drive { 19class DriveServiceInterface; 20} 21 22namespace google_apis { 23class AboutResource; 24class ResourceEntry; 25class ResourceList; 26} 27 28namespace sync_file_system { 29namespace drive_backend { 30 31class MetadataDatabase; 32class SyncEngineContext; 33 34// This class performs initializion sequence of SyncEngine. 35// 36// After initialize sequence completed, the Database must have 37// - Largest change ID, 38// - Sync-root folder and its tracker, 39// - All children of sync-root folder that have inactive and non-dirty 40// trackers. 41// 42// The initialization sequence is: 43// - Open database and load its contents, 44// - If the database is already populated, complete the sequence. 45// - Get AboutResource to get the largest change ID and the Drive root folder 46// ID. 47// - Find the remote sync-root folder, whose title is 48// "Chrome Syncable FileSystem" and has no parent. 49// Note that if the initialization is interrupted by the browser restart or 50// an error, the sequence leaves the folder in the Drive root folder. So, if 51// we find the folder in the Drive root folder, handle it as the sync-root 52// folder. 53// - Create the remote sync-root folder if we don't have. 54// - Detach the remote sync-root folder from its parent if it has. 55// - Fetch the folder contents of the remote sync-root folder. 56// The contents are likely registered as app-root folders, but handle them 57// as regular inactive folders until they are registered explicitly. 58// - Populate database with the largest change ID, the sync-root folder and 59// its contents. 60// 61class SyncEngineInitializer : public SyncTask { 62 public: 63 SyncEngineInitializer(SyncEngineContext* sync_context, 64 base::SequencedTaskRunner* task_runner, 65 drive::DriveServiceInterface* drive_service, 66 const base::FilePath& database_path); 67 virtual ~SyncEngineInitializer(); 68 virtual void Run(const SyncStatusCallback& callback) OVERRIDE; 69 70 scoped_ptr<MetadataDatabase> PassMetadataDatabase(); 71 72 private: 73 typedef base::Callback<void(const SyncStatusCallback& callback)> Task; 74 75 void DidCreateMetadataDatabase(const SyncStatusCallback& callback, 76 SyncStatusCode status, 77 scoped_ptr<MetadataDatabase> instance); 78 79 void GetAboutResource(const SyncStatusCallback& callback); 80 void DidGetAboutResource( 81 const SyncStatusCallback& callback, 82 google_apis::GDataErrorCode error, 83 scoped_ptr<google_apis::AboutResource> about_resource); 84 void FindSyncRoot(const SyncStatusCallback& callback); 85 void DidFindSyncRoot(const SyncStatusCallback& callback, 86 google_apis::GDataErrorCode error, 87 scoped_ptr<google_apis::ResourceList> resource_list); 88 void CreateSyncRoot(const SyncStatusCallback& callback); 89 void DidCreateSyncRoot(const SyncStatusCallback& callback, 90 google_apis::GDataErrorCode error, 91 scoped_ptr<google_apis::ResourceEntry> entry); 92 void DetachSyncRoot(const SyncStatusCallback& callback); 93 void DidDetachSyncRoot(const SyncStatusCallback& callback, 94 google_apis::GDataErrorCode error); 95 void ListAppRootFolders(const SyncStatusCallback& callback); 96 void DidListAppRootFolders( 97 const SyncStatusCallback& callback, 98 google_apis::GDataErrorCode error, 99 scoped_ptr<google_apis::ResourceList> resource_list); 100 void PopulateDatabase(const SyncStatusCallback& callback); 101 void DidPopulateDatabase(const SyncStatusCallback& callback, 102 SyncStatusCode status); 103 104 SyncEngineContext* sync_context_; // Not owned. 105 106 scoped_refptr<base::SequencedTaskRunner> task_runner_; 107 drive::DriveServiceInterface* drive_service_; 108 google_apis::CancelCallback cancel_callback_; 109 base::FilePath database_path_; 110 111 int find_sync_root_retry_count_; 112 113 scoped_ptr<MetadataDatabase> metadata_database_; 114 ScopedVector<google_apis::ResourceEntry> app_root_folders_; 115 116 int64 largest_change_id_; 117 std::string root_folder_id_; 118 119 scoped_ptr<google_apis::ResourceEntry> sync_root_folder_; 120 121 base::WeakPtrFactory<SyncEngineInitializer> weak_ptr_factory_; 122 123 DISALLOW_COPY_AND_ASSIGN(SyncEngineInitializer); 124}; 125 126} // namespace drive_backend 127} // namespace sync_file_system 128 129#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_INITIALIZER_H_ 130