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 53 private: 54 void SyncCompleted(const SyncStatusCallback& callback, 55 SyncStatusCode status); 56 57 void HandleConflict(const SyncStatusCallback& callback); 58 void HandleExistingRemoteFile(const SyncStatusCallback& callback); 59 60 void DeleteRemoteFile(const SyncStatusCallback& callback); 61 void DidDeleteRemoteFile(const SyncStatusCallback& callback, 62 google_apis::GDataErrorCode error); 63 64 void UploadExistingFile(const SyncStatusCallback& callback); 65 void DidGetMD5ForUpload(const SyncStatusCallback& callback, 66 const std::string& local_file_md5); 67 void DidUploadExistingFile(const SyncStatusCallback& callback, 68 google_apis::GDataErrorCode error, 69 const GURL&, 70 scoped_ptr<google_apis::ResourceEntry>); 71 void DidUpdateDatabaseForUploadExistingFile( 72 const SyncStatusCallback& callback, 73 SyncStatusCode status); 74 void UpdateRemoteMetadata(const std::string& file_id, 75 const SyncStatusCallback& callback); 76 void DidGetRemoteMetadata(const std::string& file_id, 77 const SyncStatusCallback& callback, 78 google_apis::GDataErrorCode error, 79 scoped_ptr<google_apis::ResourceEntry> entry); 80 81 void DidDeleteForUploadNewFile(const SyncStatusCallback& callback, 82 SyncStatusCode status); 83 void DidDeleteForCreateFolder(const SyncStatusCallback& callback, 84 SyncStatusCode status); 85 86 void UploadNewFile(const SyncStatusCallback& callback); 87 void DidUploadNewFile(const SyncStatusCallback& callback, 88 google_apis::GDataErrorCode error, 89 const GURL& upload_location, 90 scoped_ptr<google_apis::ResourceEntry> entry); 91 92 void CreateRemoteFolder(const SyncStatusCallback& callback); 93 void DidCreateRemoteFolder(const SyncStatusCallback& callback, 94 const std::string& file_id, 95 SyncStatusCode status); 96 void DidDetachResourceForCreationConflict(const SyncStatusCallback& callback, 97 google_apis::GDataErrorCode error); 98 99 bool IsContextReady(); 100 drive::DriveServiceInterface* drive_service(); 101 drive::DriveUploaderInterface* drive_uploader(); 102 MetadataDatabase* metadata_database(); 103 104 SyncEngineContext* sync_context_; // Not owned. 105 106 FileChange local_change_; 107 bool local_is_missing_; 108 base::FilePath local_path_; 109 fileapi::FileSystemURL url_; 110 SyncAction sync_action_; 111 112 scoped_ptr<FileTracker> remote_file_tracker_; 113 scoped_ptr<FileTracker> remote_parent_folder_tracker_; 114 base::FilePath target_path_; 115 116 scoped_ptr<FolderCreator> folder_creator_; 117 118 base::WeakPtrFactory<LocalToRemoteSyncer> weak_ptr_factory_; 119 120 DISALLOW_COPY_AND_ASSIGN(LocalToRemoteSyncer); 121}; 122 123} // namespace drive_backend 124} // namespace sync_file_system 125 126#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_ 127