summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc96
-rw-r--r--chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h9
2 files changed, 85 insertions, 20 deletions
diff --git a/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc b/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc
index 302bb42..8c98dbc 100644
--- a/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc
+++ b/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc
@@ -39,6 +39,13 @@ scoped_ptr<FileTracker> FindTracker(MetadataDatabase* metadata_database,
return scoped_ptr<FileTracker>();
}
+void DidUpdateDatabase(const SyncStatusCallback& callback,
+ SyncStatusCode status) {
+ if (status == SYNC_STATUS_OK)
+ status = SYNC_STATUS_RETRY;
+ callback.Run(status);
+}
+
} // namespace
LocalToRemoteSyncer::LocalToRemoteSyncer(SyncEngineContext* sync_context,
@@ -123,15 +130,13 @@ void LocalToRemoteSyncer::HandleMissingRemoteFile(
DCHECK(remote_parent_folder_tracker_);
if (local_change_.file_type() == SYNC_FILE_TYPE_FILE) {
// Upload local file as a new file.
- NOTIMPLEMENTED();
- callback.Run(SYNC_STATUS_FAILED);
+ UploadNewFile(callback);
return;
}
DCHECK_EQ(SYNC_FILE_TYPE_DIRECTORY, local_change_.file_type());
// Create remote folder.
- NOTIMPLEMENTED();
- callback.Run(SYNC_STATUS_FAILED);
+ UploadNewFile(callback);
}
void LocalToRemoteSyncer::HandleConflict(const SyncStatusCallback& callback) {
@@ -155,12 +160,7 @@ void LocalToRemoteSyncer::HandleExistingRemoteFile(
DCHECK(local_change_.IsDelete());
// Local file deletion for existing remote file.
- drive_service()->DeleteResource(
- remote_file_tracker_->file_id(),
- remote_file_tracker_->synced_details().etag(),
- base::Bind(&LocalToRemoteSyncer::DidDeleteRemoteFile,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ DeleteRemoteFile(callback);
return;
}
@@ -180,21 +180,21 @@ void LocalToRemoteSyncer::HandleExistingRemoteFile(
DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind());
// Non-conflicting local file update to existing remote *folder*.
- // Our policy prioritize the folder on this case.
- // Do nothing to remote folder and mark the tracker dirty to defer it to
- // next remote-to-local sync phase.
- metadata_database()->MarkTrackerDirty(remote_file_tracker_->tracker_id(),
- callback);
+ // Assuming this case as local folder deletion + local file creation, delete
+ // the remote folder and upload the file.
+ DeleteRemoteFile(base::Bind(&LocalToRemoteSyncer::DidDeleteForUploadNewFile,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
return;
}
DCHECK_EQ(SYNC_FILE_TYPE_DIRECTORY, local_change_.file_type());
if (synced_details.file_kind() == FILE_KIND_FILE) {
// Non-conflicting local folder creation to existing remote *file*.
- // Our policy prioritize the folder on this case.
- // TODO(tzik): Delete remote file and create a folder at the path.
- NOTIMPLEMENTED();
- callback.Run(SYNC_STATUS_FAILED);
+ // Assuming this case as local file deletion + local folder creation, delete
+ // the remote file and create a remote folder.
+ DeleteRemoteFile(base::Bind(&LocalToRemoteSyncer::DidDeleteForCreateFolder,
+ weak_ptr_factory_.GetWeakPtr(), callback));
return;
}
@@ -203,6 +203,19 @@ void LocalToRemoteSyncer::HandleExistingRemoteFile(
callback.Run(SYNC_STATUS_OK);
}
+void LocalToRemoteSyncer::DeleteRemoteFile(
+ const SyncStatusCallback& callback) {
+ DCHECK(remote_file_tracker_);
+ DCHECK(remote_file_tracker_->has_synced_details());
+
+ drive_service()->DeleteResource(
+ remote_file_tracker_->file_id(),
+ remote_file_tracker_->synced_details().etag(),
+ base::Bind(&LocalToRemoteSyncer::DidDeleteRemoteFile,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
+}
+
void LocalToRemoteSyncer::DidDeleteRemoteFile(
const SyncStatusCallback& callback,
google_apis::GDataErrorCode error) {
@@ -294,7 +307,50 @@ void LocalToRemoteSyncer::DidGetRemoteMetadata(
metadata_database()->UpdateByFileResource(
change_id,
*drive::util::ConvertResourceEntryToFileResource(*entry),
- callback);
+ base::Bind(&DidUpdateDatabase, callback));
+}
+
+void LocalToRemoteSyncer::DidDeleteForUploadNewFile(
+ const SyncStatusCallback& callback,
+ SyncStatusCode status) {
+ if (status == SYNC_STATUS_HAS_CONFLICT) {
+ UpdateRemoteMetadata(callback);
+ return;
+ }
+
+ if (status != SYNC_STATUS_OK) {
+ callback.Run(status);
+ return;
+ }
+
+ UploadNewFile(callback);
+}
+
+void LocalToRemoteSyncer::DidDeleteForCreateFolder(
+ const SyncStatusCallback& callback,
+ SyncStatusCode status) {
+ if (status == SYNC_STATUS_HAS_CONFLICT) {
+ UpdateRemoteMetadata(callback);
+ return;
+ }
+
+ if (status != SYNC_STATUS_OK) {
+ callback.Run(status);
+ return;
+ }
+
+ CreateRemoteFolder(callback);
+}
+
+void LocalToRemoteSyncer::UploadNewFile(const SyncStatusCallback& callback) {
+ NOTIMPLEMENTED();
+ callback.Run(SYNC_STATUS_FAILED);
+}
+
+void LocalToRemoteSyncer::CreateRemoteFolder(
+ const SyncStatusCallback& callback) {
+ NOTIMPLEMENTED();
+ callback.Run(SYNC_STATUS_FAILED);
}
drive::DriveServiceInterface* LocalToRemoteSyncer::drive_service() {
diff --git a/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h b/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
index 74421d1..62942be 100644
--- a/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
+++ b/chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
@@ -46,6 +46,7 @@ class LocalToRemoteSyncer : public SyncTask {
void HandleConflict(const SyncStatusCallback& callback);
void HandleExistingRemoteFile(const SyncStatusCallback& callback);
+ void DeleteRemoteFile(const SyncStatusCallback& callback);
void DidDeleteRemoteFile(const SyncStatusCallback& callback,
google_apis::GDataErrorCode error);
@@ -64,6 +65,14 @@ class LocalToRemoteSyncer : public SyncTask {
google_apis::GDataErrorCode error,
scoped_ptr<google_apis::ResourceEntry> entry);
+ void DidDeleteForUploadNewFile(const SyncStatusCallback& callback,
+ SyncStatusCode status);
+ void DidDeleteForCreateFolder(const SyncStatusCallback& callback,
+ SyncStatusCode status);
+
+ void UploadNewFile(const SyncStatusCallback& callback);
+ void CreateRemoteFolder(const SyncStatusCallback& callback);
+
drive::DriveServiceInterface* drive_service();
drive::DriveUploaderInterface* drive_uploader();
MetadataDatabase* metadata_database();