Home | History | Annotate | Download | only in drive_backend
      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_REMOTE_SYNC_DELEGATE_H_
      6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_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/api_util.h"
     13 #include "chrome/browser/sync_file_system/drive_backend/drive_file_sync_service.h"
     14 #include "chrome/browser/sync_file_system/drive_backend/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 
     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                        scoped_ptr<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 
     91   SyncStatusCode GDataErrorCodeToSyncStatusCodeWrapper(
     92       google_apis::GDataErrorCode error);
     93 
     94   DriveMetadataStore* metadata_store();
     95   APIUtilInterface* api_util();
     96   RemoteChangeHandler* remote_change_handler();
     97   RemoteChangeProcessor* remote_change_processor();
     98   ConflictResolutionResolver* conflict_resolution_resolver();
     99 
    100   const FileChange& remote_file_change() const { return remote_change_.change; }
    101 
    102   DriveFileSyncService* sync_service_;  // Not owned.
    103 
    104   RemoteChange remote_change_;
    105   DriveMetadata drive_metadata_;
    106   SyncFileMetadata local_metadata_;
    107   webkit_blob::ScopedFile temporary_file_;
    108   std::string md5_checksum_;
    109   SyncAction sync_action_;
    110   bool metadata_updated_;
    111   bool clear_local_changes_;
    112 
    113   std::string origin_resource_id_;
    114 
    115   DISALLOW_COPY_AND_ASSIGN(RemoteSyncDelegate);
    116 };
    117 
    118 }  // namespace drive_backend
    119 
    120 }  // namespace sync_file_system
    121 
    122 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_REMOTE_SYNC_DELEGATE_H_
    123