• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_V1_REMOTE_SYNC_DELEGATE_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_REMOTE_SYNC_DELEGATE_H_
7 
8 #include <string>
9 
10 #include "base/callback.h"
11 #include "base/memory/weak_ptr.h"
12 #include "chrome/browser/sync_file_system/drive_backend_v1/api_util.h"
13 #include "chrome/browser/sync_file_system/drive_backend_v1/drive_file_sync_service.h"
14 #include "chrome/browser/sync_file_system/drive_backend_v1/drive_metadata_store.h"
15 #include "chrome/browser/sync_file_system/file_change.h"
16 #include "chrome/browser/sync_file_system/sync_action.h"
17 #include "chrome/browser/sync_file_system/sync_callbacks.h"
18 #include "chrome/browser/sync_file_system/sync_file_metadata.h"
19 #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
20 #include "webkit/browser/fileapi/file_system_url.h"
21 #include "webkit/common/blob/scoped_file.h"
22 
23 namespace sync_file_system {
24 
25 class DriveMetadataStore;
26 class RemoteChangeProcessor;
27 
28 namespace drive_backend {
29 
30 class APIUtil;
31 
32 // This class handles RemoteFileSyncService::ProcessRemoteChange for drive
33 // backend, and its instance represents single ProcessRemoteChange operation.
34 // The caller is responsible to own the instance, and can cancel operation by
35 // deleting the instance.
36 class RemoteSyncDelegate : public base::SupportsWeakPtr<RemoteSyncDelegate> {
37  public:
38   typedef RemoteChangeHandler::RemoteChange RemoteChange;
39 
40   RemoteSyncDelegate(
41       DriveFileSyncService* sync_service,
42       const RemoteChange& remote_change);
43   virtual ~RemoteSyncDelegate();
44 
45   void Run(const SyncStatusCallback& callback);
46 
url()47   const fileapi::FileSystemURL& url() const { return remote_change_.url; }
48 
49  private:
50   void DidPrepareForProcessRemoteChange(const SyncStatusCallback& callback,
51                                         SyncStatusCode status,
52                                         const SyncFileMetadata& metadata,
53                                         const FileChangeList& local_changes);
54   void ApplyRemoteChange(const SyncStatusCallback& callback);
55   void DidApplyRemoteChange(const SyncStatusCallback& callback,
56                             SyncStatusCode status);
57   void DeleteMetadata(const SyncStatusCallback& callback);
58   void DownloadFile(const SyncStatusCallback& callback);
59   void DidDownloadFile(const SyncStatusCallback& callback,
60                        google_apis::GDataErrorCode error,
61                        const std::string& md5_checksum,
62                        int64 file_size,
63                        const base::Time& updated_time,
64                        webkit_blob::ScopedFile downloaded_file);
65   void HandleConflict(const SyncStatusCallback& callback,
66                       SyncFileType remote_file_type);
67   void HandleLocalWin(const SyncStatusCallback& callback);
68   void HandleRemoteWin(const SyncStatusCallback& callback,
69                        SyncFileType remote_file_type);
70   void HandleManualResolutionCase(const SyncStatusCallback& callback);
71   void DidGetEntryForConflictResolution(
72       const SyncStatusCallback& callback,
73       google_apis::GDataErrorCode error,
74       scoped_ptr<google_apis::ResourceEntry> entry);
75   void ResolveToLocal(const SyncStatusCallback& callback);
76   void DidResolveToLocal(const SyncStatusCallback& callback,
77                          SyncStatusCode status);
78   void ResolveToRemote(const SyncStatusCallback& callback);
79   void DidResolveToRemote(const SyncStatusCallback& callback,
80                           SyncStatusCode status);
81   void StartOver(const SyncStatusCallback& callback,
82                  SyncStatusCode status);
83 
84   void CompleteSync(const SyncStatusCallback& callback,
85                     SyncStatusCode status);
86   void AbortSync(const SyncStatusCallback& callback,
87                  SyncStatusCode status);
88   void DidFinish(const SyncStatusCallback& callback,
89                  SyncStatusCode status);
90   void DispatchCallbackAfterDidFinish(const SyncStatusCallback& callback,
91                                       SyncStatusCode status);
92 
93   SyncStatusCode GDataErrorCodeToSyncStatusCodeWrapper(
94       google_apis::GDataErrorCode error);
95 
96   DriveMetadataStore* metadata_store();
97   APIUtilInterface* api_util();
98   RemoteChangeHandler* remote_change_handler();
99   RemoteChangeProcessor* remote_change_processor();
100   ConflictResolutionResolver* conflict_resolution_resolver();
101 
remote_file_change()102   const FileChange& remote_file_change() const { return remote_change_.change; }
103 
104   DriveFileSyncService* sync_service_;  // Not owned.
105 
106   RemoteChange remote_change_;
107   DriveMetadata drive_metadata_;
108   SyncFileMetadata local_metadata_;
109   webkit_blob::ScopedFile temporary_file_;
110   std::string md5_checksum_;
111   SyncAction sync_action_;
112   bool metadata_updated_;
113   bool clear_local_changes_;
114 
115   std::string origin_resource_id_;
116 
117   DISALLOW_COPY_AND_ASSIGN(RemoteSyncDelegate);
118 };
119 
120 }  // namespace drive_backend
121 
122 }  // namespace sync_file_system
123 
124 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_REMOTE_SYNC_DELEGATE_H_
125