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_LOCAL_SYNC_DELEGATE_H_
      6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_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/drive_file_sync_service.h"
     13 #include "chrome/browser/sync_file_system/file_change.h"
     14 #include "chrome/browser/sync_file_system/sync_callbacks.h"
     15 #include "chrome/browser/sync_file_system/sync_file_metadata.h"
     16 #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
     17 #include "webkit/browser/fileapi/file_system_url.h"
     18 
     19 namespace sync_file_system {
     20 
     21 class ConflictResolutionResolver;
     22 class DriveMetadataStore;
     23 
     24 namespace drive_backend {
     25 
     26 class APIUtil;
     27 
     28 // This class handles ApplyLocalChange in LocalChangeProcessor, and its instance
     29 // represents single ApplyLocalChange operation.
     30 // The caller is responsible to own the instance, and can cancel operation by
     31 // deleting the instance or |sync_service|.
     32 class LocalSyncDelegate {
     33  public:
     34   typedef RemoteChangeHandler::RemoteChange RemoteChange;
     35 
     36   LocalSyncDelegate(DriveFileSyncService* sync_service,
     37                     const FileChange& change,
     38                     const base::FilePath& local_file_path,
     39                     const SyncFileMetadata& local_file_metadata,
     40                     const fileapi::FileSystemURL& url);
     41   ~LocalSyncDelegate();
     42 
     43   void Run(const SyncStatusCallback& callback);
     44 
     45  private:
     46   void DidGetOriginRoot(const SyncStatusCallback& callback,
     47                         SyncStatusCode status,
     48                         const std::string& resource_id);
     49   void UploadNewFile(const SyncStatusCallback& callback);
     50   void DidUploadNewFile(const SyncStatusCallback& callback,
     51                         google_apis::GDataErrorCode error,
     52                         const std::string& resource_id,
     53                         const std::string& md5);
     54   void CreateDirectory(const SyncStatusCallback& callback);
     55   void DidCreateDirectory(
     56       const SyncStatusCallback& callback,
     57       google_apis::GDataErrorCode error,
     58       const std::string& resource_id);
     59   void UploadExistingFile(const SyncStatusCallback& callback);
     60   void DidUploadExistingFile(
     61       const SyncStatusCallback& callback,
     62       google_apis::GDataErrorCode error,
     63       const std::string& resource_id,
     64       const std::string& md5);
     65   void Delete(const SyncStatusCallback& callback);
     66   void DidDelete(const SyncStatusCallback& callback,
     67                  google_apis::GDataErrorCode error);
     68   void DidDeleteMetadataForDeletionConflict(
     69       const SyncStatusCallback& callback,
     70       SyncStatusCode status);
     71   void ResolveToLocal(const SyncStatusCallback& callback);
     72   void DidDeleteFileToResolveToLocal(
     73       const SyncStatusCallback& callback,
     74       google_apis::GDataErrorCode error);
     75   void ResolveToRemote(const SyncStatusCallback& callback,
     76                        SyncFileType remote_file_type);
     77   void DidResolveToRemote(const SyncStatusCallback& callback,
     78                           SyncStatusCode status);
     79   void DidApplyLocalChange(
     80       const SyncStatusCallback& callback,
     81       const google_apis::GDataErrorCode error,
     82       SyncStatusCode status);
     83 
     84   // Metadata manipulation.
     85   void UpdateMetadata(const std::string& resource_id,
     86                       const std::string& md5,
     87                       DriveMetadata::ResourceType type,
     88                       const SyncStatusCallback& callback);
     89   void ResetMetadataMD5(const SyncStatusCallback& callback);
     90   void SetMetadataToBeFetched(DriveMetadata::ResourceType type,
     91                               const SyncStatusCallback& callback);
     92   void DeleteMetadata(const SyncStatusCallback& callback);
     93   void SetMetadataConflict(const SyncStatusCallback& callback);
     94 
     95   // Conflict handling.
     96   void HandleCreationConflict(
     97       const std::string& resource_id,
     98       DriveMetadata::ResourceType type,
     99       const SyncStatusCallback& callback);
    100   void HandleConflict(const SyncStatusCallback& callback);
    101   void DidGetEntryForConflictResolution(
    102       const SyncStatusCallback& callback,
    103       google_apis::GDataErrorCode error,
    104       scoped_ptr<google_apis::ResourceEntry> entry);
    105 
    106   void HandleManualResolutionCase(const SyncStatusCallback& callback);
    107   void DidMarkConflict(const SyncStatusCallback& callback,
    108                        SyncStatusCode status);
    109 
    110   void HandleLocalWinCase(const SyncStatusCallback& callback);
    111   void HandleRemoteWinCase(const SyncStatusCallback& callback,
    112                            SyncFileType remote_file_type);
    113   void StartOver(const SyncStatusCallback& callback, SyncStatusCode status);
    114 
    115   SyncStatusCode GDataErrorCodeToSyncStatusCodeWrapper(
    116       google_apis::GDataErrorCode error);
    117 
    118   DriveMetadataStore* metadata_store();
    119   APIUtilInterface* api_util();
    120   RemoteChangeHandler* remote_change_handler();
    121   ConflictResolutionResolver* conflict_resolution_resolver();
    122 
    123   DriveFileSyncService* sync_service_;  // Not owned.
    124 
    125   SyncOperationType operation_;
    126 
    127   fileapi::FileSystemURL url_;
    128   FileChange local_change_;
    129   base::FilePath local_path_;
    130   SyncFileMetadata local_metadata_;
    131   DriveMetadata drive_metadata_;
    132   bool has_drive_metadata_;
    133   RemoteChange remote_change_;
    134   bool has_remote_change_;
    135 
    136   std::string origin_resource_id_;
    137 
    138   base::WeakPtrFactory<LocalSyncDelegate> weak_factory_;
    139 
    140   DISALLOW_COPY_AND_ASSIGN(LocalSyncDelegate);
    141 };
    142 
    143 }  // namespace drive_backend
    144 }  // namespace sync_file_system
    145 
    146 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_SYNC_DELEGATE_H_
    147