| 382 | } |
| 383 | |
| 384 | CloudSyncService::SyncFuture CloudSyncService::SyncProject( |
| 385 | AudacityProject& project, const std::string& path, bool forceSync, |
| 386 | sync::ProgressCallback callback) |
| 387 | { |
| 388 | ASSERT_MAIN_THREAD(); |
| 389 | |
| 390 | // Reset promise |
| 391 | mSyncPromise = {}; |
| 392 | |
| 393 | if (mSyncInProcess.exchange(true)) |
| 394 | { |
| 395 | CompleteSync({ sync::ProjectSyncResult::StatusCode::Blocked }); |
| 396 | return mSyncPromise.get_future(); |
| 397 | } |
| 398 | |
| 399 | if (!callback) |
| 400 | mProgressCallback = [](auto...) { return true; }; |
| 401 | else |
| 402 | mProgressCallback = std::move(callback); |
| 403 | |
| 404 | auto& cloudDatabase = sync::CloudProjectsDatabase::Get(); |
| 405 | |
| 406 | auto projectInfo = cloudDatabase.GetProjectDataForPath(path); |
| 407 | |
| 408 | if (!projectInfo) |
| 409 | { |
| 410 | // We assume, that the project is local |
| 411 | CompleteSync(path); |
| 412 | return mSyncPromise.get_future(); |
| 413 | } |
| 414 | |
| 415 | GetProjectInfo( |
| 416 | GetOAuthService(), GetServiceConfig(), projectInfo->ProjectId, |
| 417 | [projectInfo = *projectInfo, &project, path, |
| 418 | mode = forceSync ? SyncMode::ForceOverwrite : SyncMode::Normal, |
| 419 | this](sync::ProjectInfo remoteInfo, ResponseResult result) |
| 420 | { |
| 421 | if (result.Code != SyncResultCode::Success) |
| 422 | { |
| 423 | FailSync(std::move(result)); |
| 424 | return; |
| 425 | } |
| 426 | |
| 427 | // Do not perform the snapshot request if the project is up to date |
| 428 | if (remoteInfo.HeadSnapshot.Id == projectInfo.SnapshotId) |
| 429 | { |
| 430 | CompleteSync({ sync::ProjectSyncResult::StatusCode::Succeeded }); |
| 431 | return; |
| 432 | } |
| 433 | |
| 434 | const auto snapshotId = remoteInfo.HeadSnapshot.Synced > 0 ? |
| 435 | remoteInfo.HeadSnapshot.Id : |
| 436 | remoteInfo.LastSyncedSnapshotId; |
| 437 | |
| 438 | GetSnapshotInfo( |
| 439 | GetOAuthService(), GetServiceConfig(), remoteInfo.Id, snapshotId, |
| 440 | [this, &project, mode, |
| 441 | remoteInfo](sync::SnapshotInfo snapshotInfo, ResponseResult result) |
no test coverage detected