local_to_remote_syncer.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_LOCAL_TO_REMOTE_SYNCER_H_
6#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "base/memory/scoped_vector.h"
10#include "base/memory/weak_ptr.h"
11#include "chrome/browser/sync_file_system/file_change.h"
12#include "chrome/browser/sync_file_system/sync_action.h"
13#include "chrome/browser/sync_file_system/sync_callbacks.h"
14#include "chrome/browser/sync_file_system/sync_file_metadata.h"
15#include "chrome/browser/sync_file_system/sync_task.h"
16#include "google_apis/drive/gdata_errorcode.h"
17
18namespace drive {
19class DriveServiceInterface;
20class DriveUploaderInterface;
21}
22
23namespace google_apis {
24class ResourceEntry;
25class ResourceList;
26}
27
28namespace sync_file_system {
29
30class RemoteChangeProcessor;
31
32namespace drive_backend {
33
34class FileTracker;
35class FolderCreator;
36class MetadataDatabase;
37class SyncEngineContext;
38
39class LocalToRemoteSyncer : public SyncTask {
40 public:
41  LocalToRemoteSyncer(SyncEngineContext* sync_context,
42                      const SyncFileMetadata& local_metadata,
43                      const FileChange& local_change,
44                      const base::FilePath& local_path,
45                      const fileapi::FileSystemURL& url);
46  virtual ~LocalToRemoteSyncer();
47  virtual void Run(const SyncStatusCallback& callback) OVERRIDE;
48
49  const fileapi::FileSystemURL& url() const { return url_; }
50  const base::FilePath& target_path() const { return target_path_; }
51  SyncAction sync_action() const { return sync_action_; }
52  bool needs_remote_change_listing() const {
53    return needs_remote_change_listing_;
54  }
55
56 private:
57  void SyncCompleted(const SyncStatusCallback& callback,
58                     SyncStatusCode status);
59
60  void HandleConflict(const SyncStatusCallback& callback);
61  void HandleExistingRemoteFile(const SyncStatusCallback& callback);
62
63  void DeleteRemoteFile(const SyncStatusCallback& callback);
64  void DidDeleteRemoteFile(const SyncStatusCallback& callback,
65                           google_apis::GDataErrorCode error);
66
67  void UploadExistingFile(const SyncStatusCallback& callback);
68  void DidGetMD5ForUpload(const SyncStatusCallback& callback,
69                          const std::string& local_file_md5);
70  void DidUploadExistingFile(const SyncStatusCallback& callback,
71                             google_apis::GDataErrorCode error,
72                             const GURL&,
73                             scoped_ptr<google_apis::ResourceEntry>);
74  void DidUpdateDatabaseForUploadExistingFile(
75      const SyncStatusCallback& callback,
76      SyncStatusCode status);
77  void UpdateRemoteMetadata(const std::string& file_id,
78                            const SyncStatusCallback& callback);
79  void DidGetRemoteMetadata(const std::string& file_id,
80                            const SyncStatusCallback& callback,
81                            google_apis::GDataErrorCode error,
82                            scoped_ptr<google_apis::ResourceEntry> entry);
83
84  void DidDeleteForUploadNewFile(const SyncStatusCallback& callback,
85                                 SyncStatusCode status);
86  void DidDeleteForCreateFolder(const SyncStatusCallback& callback,
87                                SyncStatusCode status);
88
89  void UploadNewFile(const SyncStatusCallback& callback);
90  void DidUploadNewFile(const SyncStatusCallback& callback,
91                        google_apis::GDataErrorCode error,
92                        const GURL& upload_location,
93                        scoped_ptr<google_apis::ResourceEntry> entry);
94
95  void CreateRemoteFolder(const SyncStatusCallback& callback);
96  void DidCreateRemoteFolder(const SyncStatusCallback& callback,
97                             const std::string& file_id,
98                             SyncStatusCode status);
99  void DidDetachResourceForCreationConflict(const SyncStatusCallback& callback,
100                                            google_apis::GDataErrorCode error);
101
102  bool IsContextReady();
103  drive::DriveServiceInterface* drive_service();
104  drive::DriveUploaderInterface* drive_uploader();
105  MetadataDatabase* metadata_database();
106
107  SyncEngineContext* sync_context_;  // Not owned.
108
109  FileChange local_change_;
110  bool local_is_missing_;
111  base::FilePath local_path_;
112  fileapi::FileSystemURL url_;
113  SyncAction sync_action_;
114
115  scoped_ptr<FileTracker> remote_file_tracker_;
116  scoped_ptr<FileTracker> remote_parent_folder_tracker_;
117  base::FilePath target_path_;
118
119  bool needs_remote_change_listing_;
120
121  scoped_ptr<FolderCreator> folder_creator_;
122
123  base::WeakPtrFactory<LocalToRemoteSyncer> weak_ptr_factory_;
124
125  DISALLOW_COPY_AND_ASSIGN(LocalToRemoteSyncer);
126};
127
128}  // namespace drive_backend
129}  // namespace sync_file_system
130
131#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
132