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