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_LOCAL_SYNC_DELEGATE_H_ 6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_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_v1/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 ResetMetadataForStartOver(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_V1_LOCAL_SYNC_DELEGATE_H_ 147