158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_INITIALIZER_H_ 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_INITIALIZER_H_ 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/ref_counted.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_vector.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/weak_ptr.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/sync_task.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_callbacks.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_common_callbacks.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace drive { 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DriveServiceInterface; 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace google_apis { 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class AboutResource; 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FileList; 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FileResource; 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class ResourceEntry; 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace leveldb { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Env; 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace sync_file_system { 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace drive_backend { 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MetadataDatabase; 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SyncEngineContext; 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This class performs initializion sequence of SyncEngine. 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// After initialize sequence completed, the Database must have 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Largest change ID, 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Sync-root folder and its tracker, 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - All children of sync-root folder that have inactive and non-dirty 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// trackers. 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The initialization sequence is: 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Open database and load its contents, 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - If the database is already populated, complete the sequence. 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Get AboutResource to get the largest change ID and the Drive root folder 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// ID. 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Find the remote sync-root folder, whose title is 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// "Chrome Syncable FileSystem" and has no parent. 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Note that if the initialization is interrupted by the browser restart or 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// an error, the sequence leaves the folder in the Drive root folder. So, if 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// we find the folder in the Drive root folder, handle it as the sync-root 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// folder. 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Create the remote sync-root folder if we don't have. 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Detach the remote sync-root folder from its parent if it has. 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Fetch the folder contents of the remote sync-root folder. 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The contents are likely registered as app-root folders, but handle them 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// as regular inactive folders until they are registered explicitly. 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// - Populate database with the largest change ID, the sync-root folder and 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// its contents. 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass SyncEngineInitializer : public SyncTask { 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncEngineInitializer(SyncEngineContext* sync_context, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& database_path, 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leveldb::Env* env_override); 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~SyncEngineInitializer(); 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void RunPreflight(scoped_ptr<SyncTaskToken> token) OVERRIDE; 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<MetadataDatabase> PassMetadataDatabase(); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef base::Callback<void(const SyncStatusCallback& callback)> Task; 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void GetAboutResource(scoped_ptr<SyncTaskToken> token); 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DidGetAboutResource( 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<SyncTaskToken> token, 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::GDataErrorCode error, 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<google_apis::AboutResource> about_resource); 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void FindSyncRoot(scoped_ptr<SyncTaskToken> token); 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DidFindSyncRoot(scoped_ptr<SyncTaskToken> token, 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::GDataErrorCode error, 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileList> file_list); 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void CreateSyncRoot(scoped_ptr<SyncTaskToken> token); 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DidCreateSyncRoot(scoped_ptr<SyncTaskToken> token, 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::GDataErrorCode error, 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> entry); 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DetachSyncRoot(scoped_ptr<SyncTaskToken> token); 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DidDetachSyncRoot(scoped_ptr<SyncTaskToken> token, 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::GDataErrorCode error); 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void ListAppRootFolders(scoped_ptr<SyncTaskToken> token); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DidListAppRootFolders( 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<SyncTaskToken> token, 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::GDataErrorCode error, 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileList> file_list); 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void PopulateDatabase(scoped_ptr<SyncTaskToken> token); 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncEngineContext* sync_context_; // Not owned. 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leveldb::Env* env_override_; 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::CancelCallback cancel_callback_; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath database_path_; 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int find_sync_root_retry_count_; 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<MetadataDatabase> metadata_database_; 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ScopedVector<google_apis::FileResource> app_root_folders_; 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int64 largest_change_id_; 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string root_folder_id_; 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> sync_root_folder_; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::WeakPtrFactory<SyncEngineInitializer> weak_ptr_factory_; 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SyncEngineInitializer); 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace drive_backend 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace sync_file_system 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_SYNC_ENGINE_INITIALIZER_H_ 128