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