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
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// 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 <string>
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.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/drive/gdata_errorcode.h"
namespace drive {
class DriveServiceInterface;
class DriveUploaderInterface;
}
namespace google_apis {
class FileResource;
class ResourceList;
}
namespace sync_file_system {
class RemoteChangeProcessor;
namespace drive_backend {
class FileDetails;
class FileTracker;
class FolderCreator;
class MetadataDatabase;
class SyncEngineContext;
class LocalToRemoteSyncer : public SyncTask {
public:
typedef base::Callback<void(scoped_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() override;
void RunPreflight(scoped_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(const Continuation& continuation,
scoped_ptr<SyncTaskToken> token);
void ContinueAsBackgroundTask(const Continuation& continuation,
scoped_ptr<SyncTaskToken> token);
void SyncCompleted(scoped_ptr<SyncTaskToken> token,
SyncStatusCode status);
void HandleConflict(scoped_ptr<SyncTaskToken> token);
void HandleExistingRemoteFile(scoped_ptr<SyncTaskToken> token);
void UpdateTrackerForReusedFolder(const FileDetails& details,
scoped_ptr<SyncTaskToken> token);
void DeleteRemoteFile(scoped_ptr<SyncTaskToken> token);
void DidDeleteRemoteFile(scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error);
void UploadExistingFile(scoped_ptr<SyncTaskToken> token);
void DidUploadExistingFile(scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
const GURL&,
scoped_ptr<google_apis::FileResource>);
void UpdateRemoteMetadata(const std::string& file_id,
scoped_ptr<SyncTaskToken> token);
void DidGetRemoteMetadata(const std::string& file_id,
scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::FileResource> entry);
void UploadNewFile(scoped_ptr<SyncTaskToken> token);
void DidUploadNewFile(scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error,
const GURL& upload_location,
scoped_ptr<google_apis::FileResource> entry);
void CreateRemoteFolder(scoped_ptr<SyncTaskToken> token);
void DidCreateRemoteFolder(scoped_ptr<SyncTaskToken> token,
const std::string& file_id,
SyncStatusCode status);
void DidDetachResourceForCreationConflict(scoped_ptr<SyncTaskToken> token,
google_apis::GDataErrorCode error);
bool IsContextReady();
drive::DriveServiceInterface* drive_service();
drive::DriveUploaderInterface* drive_uploader();
MetadataDatabase* metadata_database();
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_;
scoped_ptr<FileTracker> remote_file_tracker_;
scoped_ptr<FileTracker> remote_parent_folder_tracker_;
base::FilePath target_path_;
int64 remote_file_change_id_;
bool retry_on_success_;
bool needs_remote_change_listing_;
scoped_ptr<FolderCreator> folder_creator_;
base::WeakPtrFactory<LocalToRemoteSyncer> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(LocalToRemoteSyncer);
};
} // namespace drive_backend
} // namespace sync_file_system
#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
|