local_to_remote_syncer.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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_LOCAL_TO_REMOTE_SYNCER_H_
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string>
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_vector.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/sync_task.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync_file_system/file_change.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_action.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_callbacks.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_metadata.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace drive {
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DriveServiceInterface;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DriveUploaderInterface;
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace google_apis {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FileResource;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ResourceList;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace sync_file_system {
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class RemoteChangeProcessor;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace drive_backend {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FileTracker;
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class FolderCreator;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MetadataDatabase;
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncEngineContext;
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class LocalToRemoteSyncer : public SyncTask {
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LocalToRemoteSyncer(SyncEngineContext* sync_context,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      const SyncFileMetadata& local_metadata,
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const FileChange& local_change,
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const base::FilePath& local_path,
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const fileapi::FileSystemURL& url);
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~LocalToRemoteSyncer();
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void RunPreflight(scoped_ptr<SyncTaskToken> token) OVERRIDE;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RunExclusive(scoped_ptr<SyncTaskToken> token);
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const fileapi::FileSystemURL& url() const { return url_; }
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::FilePath& target_path() const { return target_path_; }
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyncAction sync_action() const { return sync_action_; }
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool needs_remote_change_listing() const {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return needs_remote_change_listing_;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SyncCompleted(scoped_ptr<SyncTaskToken> token,
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     SyncStatusCode status);
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void HandleConflict(scoped_ptr<SyncTaskToken> token);
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void HandleExistingRemoteFile(scoped_ptr<SyncTaskToken> token);
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DeleteRemoteFile(const SyncStatusCallback& callback);
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DidDeleteRemoteFile(const SyncStatusCallback& callback,
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           google_apis::GDataErrorCode error);
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UploadExistingFile(scoped_ptr<SyncTaskToken> token);
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidGetMD5ForUpload(scoped_ptr<SyncTaskToken> token,
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          const std::string& local_file_md5);
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidUploadExistingFile(scoped_ptr<SyncTaskToken> token,
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             google_apis::GDataErrorCode error,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             const GURL&,
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             scoped_ptr<google_apis::FileResource>);
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void DidUpdateDatabaseForUploadExistingFile(
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<SyncTaskToken> token,
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SyncStatusCode status);
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void UpdateRemoteMetadata(const std::string& file_id,
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            const SyncStatusCallback& callback);
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void DidGetRemoteMetadata(const std::string& file_id,
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            const SyncStatusCallback& callback,
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            google_apis::GDataErrorCode error,
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            scoped_ptr<google_apis::FileResource> entry);
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidDeleteForUploadNewFile(scoped_ptr<SyncTaskToken> token,
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 SyncStatusCode status);
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidDeleteForCreateFolder(scoped_ptr<SyncTaskToken> token,
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                SyncStatusCode status);
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UploadNewFile(scoped_ptr<SyncTaskToken> token);
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidUploadNewFile(scoped_ptr<SyncTaskToken> token,
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        google_apis::GDataErrorCode error,
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        const GURL& upload_location,
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        scoped_ptr<google_apis::FileResource> entry);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CreateRemoteFolder(scoped_ptr<SyncTaskToken> token);
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidCreateRemoteFolder(scoped_ptr<SyncTaskToken> token,
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const std::string& file_id,
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             SyncStatusCode status);
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidDetachResourceForCreationConflict(scoped_ptr<SyncTaskToken> token,
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            google_apis::GDataErrorCode error);
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool IsContextReady();
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  drive::DriveServiceInterface* drive_service();
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  drive::DriveUploaderInterface* drive_uploader();
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MetadataDatabase* metadata_database();
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SyncEngineContext* sync_context_;  // Not owned.
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FileChange local_change_;
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool local_is_missing_;
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FilePath local_path_;
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fileapi::FileSystemURL url_;
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyncAction sync_action_;
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<FileTracker> remote_file_tracker_;
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<FileTracker> remote_parent_folder_tracker_;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FilePath target_path_;
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool needs_remote_change_listing_;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<FolderCreator> folder_creator_;
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtrFactory<LocalToRemoteSyncer> weak_ptr_factory_;
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LocalToRemoteSyncer);
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace drive_backend
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace sync_file_system
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
135