1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/sync_file_system/drive_backend/sync_task.h"
#include "chrome/browser/sync_file_system/file_change.h"
#include "chrome/browser/sync_file_system/sync_action.h"
#include "chrome/browser/sync_file_system/sync_file_metadata.h"
#include "google_apis/common/api_error_codes.h"
namespace drive {
class DriveServiceInterface;
class DriveUploaderInterface;
} // namespace drive
namespace google_apis {
class FileResource;
}
namespace sync_file_system {
namespace drive_backend {
class FileDetails;
class FileTracker;
class FolderCreator;
class MetadataDatabase;
class SyncEngineContext;
class LocalToRemoteSyncer : public SyncTask {
public:
typedef base::OnceCallback<void(std::unique_ptr<SyncTaskToken>)> Continuation;
LocalToRemoteSyncer(SyncEngineContext* sync_context,
const SyncFileMetadata& local_metadata,
const FileChange& local_change,
const base::FilePath& local_path,
const storage::FileSystemURL& url);
LocalToRemoteSyncer(const LocalToRemoteSyncer&) = delete;
LocalToRemoteSyncer& operator=(const LocalToRemoteSyncer&) = delete;
~LocalToRemoteSyncer() override;
void RunPreflight(std::unique_ptr<SyncTaskToken> token) override;
const storage::FileSystemURL& url() const { return url_; }
const base::FilePath& target_path() const { return target_path_; }
SyncFileType file_type() const { return file_type_; }
SyncAction sync_action() const { return sync_action_; }
bool needs_remote_change_listing() const {
return needs_remote_change_listing_;
}
private:
void MoveToBackground(Continuation continuation,
std::unique_ptr<SyncTaskToken> token);
void ContinueAsBackgroundTask(Continuation continuation,
std::unique_ptr<SyncTaskToken> token);
void SyncCompleted(std::unique_ptr<SyncTaskToken> token,
SyncStatusCode status);
void HandleConflict(std::unique_ptr<SyncTaskToken> token);
void HandleExistingRemoteFile(std::unique_ptr<SyncTaskToken> token);
void UpdateTrackerForReusedFolder(const FileDetails& details,
std::unique_ptr<SyncTaskToken> token);
void DeleteRemoteFile(std::unique_ptr<SyncTaskToken> token);
void DidDeleteRemoteFile(std::unique_ptr<SyncTaskToken> token,
google_apis::ApiErrorCode error);
void UploadExistingFile(std::unique_ptr<SyncTaskToken> token);
void DidUploadExistingFile(std::unique_ptr<SyncTaskToken> token,
google_apis::ApiErrorCode error,
const GURL&,
std::unique_ptr<google_apis::FileResource>);
void UpdateRemoteMetadata(const std::string& file_id,
std::unique_ptr<SyncTaskToken> token);
void DidGetRemoteMetadata(const std::string& file_id,
std::unique_ptr<SyncTaskToken> token,
google_apis::ApiErrorCode error,
std::unique_ptr<google_apis::FileResource> entry);
void UploadNewFile(std::unique_ptr<SyncTaskToken> token);
void DidUploadNewFile(std::unique_ptr<SyncTaskToken> token,
google_apis::ApiErrorCode error,
const GURL& upload_location,
std::unique_ptr<google_apis::FileResource> entry);
void CreateRemoteFolder(std::unique_ptr<SyncTaskToken> token);
void DidCreateRemoteFolder(std::unique_ptr<SyncTaskToken> token,
const std::string& file_id,
SyncStatusCode status);
void DidDetachResourceForCreationConflict(
std::unique_ptr<SyncTaskToken> token,
google_apis::ApiErrorCode error);
bool IsContextReady();
drive::DriveServiceInterface* drive_service();
drive::DriveUploaderInterface* drive_uploader();
MetadataDatabase* metadata_database();
raw_ptr<SyncEngineContext> sync_context_; // Not owned.
FileChange local_change_;
bool local_is_missing_;
base::FilePath local_path_;
storage::FileSystemURL url_;
SyncFileType file_type_;
SyncAction sync_action_;
std::unique_ptr<FileTracker> remote_file_tracker_;
std::unique_ptr<FileTracker> remote_parent_folder_tracker_;
base::FilePath target_path_;
int64_t remote_file_change_id_;
bool retry_on_success_;
bool needs_remote_change_listing_;
std::unique_ptr<FolderCreator> folder_creator_;
base::WeakPtrFactory<LocalToRemoteSyncer> weak_ptr_factory_{this};
};
} // namespace drive_backend
} // namespace sync_file_system
#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
|