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"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_metadata.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace drive {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DriveServiceInterface;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DriveUploaderInterface;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace google_apis {
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FileResource;
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ResourceList;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace sync_file_system {
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class RemoteChangeProcessor;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace drive_backend {
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileDetails;
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:
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef base::Callback<void(scoped_ptr<SyncTaskToken>)> Continuation;
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LocalToRemoteSyncer(SyncEngineContext* sync_context,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      const SyncFileMetadata& local_metadata,
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const FileChange& local_change,
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      const base::FilePath& local_path,
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      const storage::FileSystemURL& url);
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~LocalToRemoteSyncer();
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void RunPreflight(scoped_ptr<SyncTaskToken> token) OVERRIDE;
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const storage::FileSystemURL& url() const { return url_; }
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::FilePath& target_path() const { return target_path_; }
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyncAction sync_action() const { return sync_action_; }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool needs_remote_change_listing() const {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return needs_remote_change_listing_;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void MoveToBackground(const Continuation& continuation,
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        scoped_ptr<SyncTaskToken> token);
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ContinueAsBackgroundTask(const Continuation& continuation,
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                scoped_ptr<SyncTaskToken> token);
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SyncCompleted(scoped_ptr<SyncTaskToken> token,
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     SyncStatusCode status);
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void HandleConflict(scoped_ptr<SyncTaskToken> token);
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void HandleExistingRemoteFile(scoped_ptr<SyncTaskToken> token);
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void UpdateTrackerForReusedFolder(const FileDetails& details,
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    scoped_ptr<SyncTaskToken> token);
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void DeleteRemoteFile(scoped_ptr<SyncTaskToken> token);
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void DidDeleteRemoteFile(scoped_ptr<SyncTaskToken> token,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           google_apis::GDataErrorCode error);
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UploadExistingFile(scoped_ptr<SyncTaskToken> token);
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidUploadExistingFile(scoped_ptr<SyncTaskToken> token,
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             google_apis::GDataErrorCode error,
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             const GURL&,
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             scoped_ptr<google_apis::FileResource>);
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void UpdateRemoteMetadata(const std::string& file_id,
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            scoped_ptr<SyncTaskToken> token);
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void DidGetRemoteMetadata(const std::string& file_id,
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            scoped_ptr<SyncTaskToken> token,
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            google_apis::GDataErrorCode error,
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            scoped_ptr<google_apis::FileResource> entry);
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UploadNewFile(scoped_ptr<SyncTaskToken> token);
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidUploadNewFile(scoped_ptr<SyncTaskToken> token,
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        google_apis::GDataErrorCode error,
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        const GURL& upload_location,
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        scoped_ptr<google_apis::FileResource> entry);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CreateRemoteFolder(scoped_ptr<SyncTaskToken> token);
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidCreateRemoteFolder(scoped_ptr<SyncTaskToken> token,
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const std::string& file_id,
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             SyncStatusCode status);
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DidDetachResourceForCreationConflict(scoped_ptr<SyncTaskToken> token,
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            google_apis::GDataErrorCode error);
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool IsContextReady();
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  drive::DriveServiceInterface* drive_service();
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  drive::DriveUploaderInterface* drive_uploader();
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MetadataDatabase* metadata_database();
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SyncEngineContext* sync_context_;  // Not owned.
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FileChange local_change_;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool local_is_missing_;
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FilePath local_path_;
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL url_;
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyncAction sync_action_;
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<FileTracker> remote_file_tracker_;
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<FileTracker> remote_parent_folder_tracker_;
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FilePath target_path_;
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 remote_file_change_id_;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool retry_on_success_;
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