Audacity 3.2.0
Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
audacity::cloud::audiocom::sync::LocalProjectSnapshot Class Referencefinal

#include <LocalProjectSnapshot.h>

Inheritance diagram for audacity::cloud::audiocom::sync::LocalProjectSnapshot:
[legend]
Collaboration diagram for audacity::cloud::audiocom::sync::LocalProjectSnapshot:
[legend]

Classes

struct  ProjectBlocksLock
 
struct  SnapshotData
 
struct  Tag
 

Public Types

using Promise = std::promise< SnapshotData >
 
using Future = std::future< SnapshotData >
 

Public Member Functions

 LocalProjectSnapshot (Tag, const ServiceConfig &config, const OAuthService &oauthService, ProjectCloudExtension &extension, std::string name, UploadMode mode)
 
 ~LocalProjectSnapshot () override
 
bool IsCompleted () const override
 
std::shared_ptr< AudacityProjectGetProject ()
 
void Start () override
 
void SetUploadData (const ProjectUploadData &data) override
 
void Cancel () override
 
void Abort ()
 
- Public Member Functions inherited from audacity::cloud::audiocom::sync::ProjectUploadOperation
virtual ~ProjectUploadOperation ()=default
 
virtual void Start ()=0
 
virtual void SetUploadData (const ProjectUploadData &data)=0
 
virtual bool IsCompleted () const =0
 
- Public Member Functions inherited from audacity::concurrency::ICancellable
virtual ~ICancellable ()=default
 
virtual void Cancel ()=0
 

Static Public Member Functions

static Future Create (const ServiceConfig &config, const OAuthService &oauthService, ProjectCloudExtension &extension, std::string name, UploadMode mode)
 

Private Member Functions

void UploadFailed (CloudSyncError error)
 
void DataUploadFailed (const ResponseResult &uploadResult)
 
void DataUploadFailed (const MissingBlocksUploadProgress &uploadResult)
 
void UpdateProjectSnapshot ()
 
void OnSnapshotCreated (const CreateSnapshotResponse &response, bool newProject)
 
void StorePendingSnapshot (const CreateSnapshotResponse &response, const ProjectUploadData &data)
 
void MarkSnapshotSynced ()
 
void DeleteSnapshot ()
 

Private Attributes

ProjectCloudExtensionmProjectCloudExtension
 
std::weak_ptr< AudacityProjectmWeakProject
 
std::promise< ProjectUploadDatamProjectDataPromise
 
const ServiceConfigmServiceConfig
 
const OAuthServicemOAuthService
 
std::string mProjectName
 
std::unique_ptr< ProjectBlocksLockmProjectBlocksLock
 
std::shared_ptr< MissingBlocksUploadermMissingBlockUploader
 
std::mutex mCreateSnapshotResponseMutex
 
std::optional< CreateSnapshotResponsemCreateSnapshotResponse
 
UploadMode mUploadMode { UploadMode::Normal }
 
Promise mCreateSnapshotPromise
 
concurrency::CancellationContextPtr mCancellationContext
 
std::atomic< bool > mCompleted { false }
 
std::atomic< bool > mCancelled { false }
 
std::atomic< bool > mProjectDataReady { false }
 

Detailed Description

Definition at line 47 of file LocalProjectSnapshot.h.

Member Typedef Documentation

◆ Future

Definition at line 63 of file LocalProjectSnapshot.h.

◆ Promise

Definition at line 62 of file LocalProjectSnapshot.h.

Constructor & Destructor Documentation

◆ LocalProjectSnapshot()

audacity::cloud::audiocom::sync::LocalProjectSnapshot::LocalProjectSnapshot ( Tag  ,
const ServiceConfig config,
const OAuthService oauthService,
ProjectCloudExtension extension,
std::string  name,
UploadMode  mode 
)

Definition at line 189 of file LocalProjectSnapshot.cpp.

193 , mWeakProject { extension.GetProject() }
194 , mServiceConfig { config }
195 , mOAuthService { oauthService }
196 , mProjectName { std::move(name) }
197 , mUploadMode { mode }
199{
200}
const TranslatableString name
Definition: Distortion.cpp:76
concurrency::CancellationContextPtr mCancellationContext

◆ ~LocalProjectSnapshot()

audacity::cloud::audiocom::sync::LocalProjectSnapshot::~LocalProjectSnapshot ( )
override

Definition at line 202 of file LocalProjectSnapshot.cpp.

203{
204}

Member Function Documentation

◆ Abort()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::Abort ( )

Definition at line 273 of file LocalProjectSnapshot.cpp.

References audacity::cloud::audiocom::sync::CloudSyncError::Aborted, DeleteSnapshot(), mCancellationContext, mCancelled, mProjectDataPromise, mProjectDataReady, and UploadFailed().

Here is the call graph for this function:

◆ Cancel()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::Cancel ( )
overridevirtual

Implements audacity::concurrency::ICancellable.

Definition at line 261 of file LocalProjectSnapshot.cpp.

262{
263 mCancelled.store(true, std::memory_order_release);
264
265 mCancellationContext->Cancel();
266
267 if (!mProjectDataReady.load(std::memory_order_acquire))
268 mProjectDataPromise.set_value({});
269
271}

References audacity::cloud::audiocom::sync::CloudSyncError::Cancelled, mCancellationContext, mCancelled, mProjectDataPromise, mProjectDataReady, and UploadFailed().

Here is the call graph for this function:

◆ Create()

LocalProjectSnapshot::Future audacity::cloud::audiocom::sync::LocalProjectSnapshot::Create ( const ServiceConfig config,
const OAuthService oauthService,
ProjectCloudExtension extension,
std::string  name,
UploadMode  mode 
)
static

Definition at line 206 of file LocalProjectSnapshot.cpp.

209{
210 auto project = extension.GetProject().lock();
211
212 if (!project)
213 return {};
214
215 auto snapshot = std::make_shared<LocalProjectSnapshot>(
216 Tag {}, config, oauthService, extension, std::move(name), mode);
217
218 snapshot->mProjectCloudExtension.OnUploadOperationCreated(snapshot);
219
220 snapshot->mProjectBlocksLock = std::make_unique<ProjectBlocksLock>(
222 [weakSnapshot = std::weak_ptr(snapshot)]
223 {
224 auto snapshot = weakSnapshot.lock();
225
226 if (snapshot == nullptr)
227 return;
228
229 auto project = snapshot->GetProject();
230
231 if (project == nullptr)
232 return;
233
234 snapshot->mProjectCloudExtension.OnBlocksHashed(*snapshot);
235 });
236
237 return snapshot->mCreateSnapshotPromise.get_future();
238}
const auto project

References anonymous_namespace{CloudProjectFileIOExtensions.cpp}::extension, name, and project.

◆ DataUploadFailed() [1/2]

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::DataUploadFailed ( const MissingBlocksUploadProgress uploadResult)
private

Definition at line 298 of file LocalProjectSnapshot.cpp.

300{
302
303 for (const auto& uploadError : uploadResult.UploadErrors)
304 {
305 if (
306 uploadError.Code == SyncResultCode::Success ||
307 uploadError.Code == SyncResultCode::Conflict)
308 continue;
309
310 const auto deducedError = DeduceError(uploadError.Code);
311
312 if (
314 deducedError == CloudSyncError::Network)
315 {
316 errorType = deducedError;
317 }
318 else if (
320 deducedError == CloudSyncError::Cancelled)
321 {
322 errorType = deducedError;
323 break;
324 }
325 }
326
327 UploadFailed({ errorType, {} });
328}
CloudSyncError::ErrorType DeduceError(SyncResultCode code)

References audacity::cloud::audiocom::sync::CloudSyncError::Cancelled, audacity::cloud::audiocom::Conflict, audacity::cloud::audiocom::sync::CloudSyncError::DataUploadFailed, audacity::cloud::audiocom::sync::DeduceError(), audacity::cloud::audiocom::sync::CloudSyncError::Network, audacity::cloud::audiocom::sync::CloudSyncError::ProjectStorageLimitReached, audacity::cloud::audiocom::Success, audacity::cloud::audiocom::sync::MissingBlocksUploadProgress::UploadErrors, and UploadFailed().

Here is the call graph for this function:

◆ DataUploadFailed() [2/2]

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::DataUploadFailed ( const ResponseResult uploadResult)
private

Definition at line 293 of file LocalProjectSnapshot.cpp.

294{
295 UploadFailed({ DeduceError(uploadResult.Code), uploadResult.Content });
296}

References audacity::cloud::audiocom::ResponseResult::Code, audacity::cloud::audiocom::ResponseResult::Content, audacity::cloud::audiocom::sync::DeduceError(), and UploadFailed().

Referenced by OnSnapshotCreated().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DeleteSnapshot()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::DeleteSnapshot ( )
private

Definition at line 593 of file LocalProjectSnapshot.cpp.

594{
596 return;
597
598 using namespace network_manager;
599
601 mCreateSnapshotResponse->Project.Id,
602 mCreateSnapshotResponse->Snapshot.Id));
603
604 SetCommonHeaders(request);
605
606 auto response = NetworkManager::GetInstance().doDelete(request);
607
608 response->setRequestFinishedCallback(
609 [this, response, strongThis = shared_from_this()](auto)
610 {
612 mCreateSnapshotResponse->Project.Id,
613 mCreateSnapshotResponse->Snapshot.Id);
614 });
615}
std::string GetDeleteSnapshotUrl(std::string_view projectId, std::string_view snapshotId) const
void RemovePendingSnapshot(std::string_view projectId, std::string_view snapshotId)
std::optional< CreateSnapshotResponse > mCreateSnapshotResponse
ResponsePtr doDelete(const Request &request)
void SetCommonHeaders(Request &request)

References audacity::network_manager::NetworkManager::doDelete(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::cloud::audiocom::ServiceConfig::GetDeleteSnapshotUrl(), audacity::network_manager::NetworkManager::GetInstance(), mCreateSnapshotResponse, mServiceConfig, audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingSnapshot(), and audacity::cloud::audiocom::SetCommonHeaders().

Referenced by Abort().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetProject()

std::shared_ptr< AudacityProject > audacity::cloud::audiocom::sync::LocalProjectSnapshot::GetProject ( )

Definition at line 245 of file LocalProjectSnapshot.cpp.

246{
247 return mWeakProject.lock();
248}

References mWeakProject.

◆ IsCompleted()

bool audacity::cloud::audiocom::sync::LocalProjectSnapshot::IsCompleted ( ) const
overridevirtual

Implements audacity::cloud::audiocom::sync::ProjectUploadOperation.

Definition at line 240 of file LocalProjectSnapshot.cpp.

241{
242 return mCompleted.load(std::memory_order_acquire);
243}

References mCompleted.

◆ MarkSnapshotSynced()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::MarkSnapshotSynced ( )
private

Definition at line 558 of file LocalProjectSnapshot.cpp.

559{
560 using namespace network_manager;
562 mCreateSnapshotResponse->Project.Id,
563 mCreateSnapshotResponse->Snapshot.Id));
564
565 SetCommonHeaders(request);
566
567 auto response = NetworkManager::GetInstance().doPost(request, nullptr, 0);
568
569 response->setRequestFinishedCallback(
570 [this, response, weakThis = weak_from_this()](auto)
571 {
572 auto strongThis = weakThis.lock();
573 if (!strongThis)
574 return;
575
577 mCreateSnapshotResponse->Project.Id,
578 mCreateSnapshotResponse->Snapshot.Id);
579
580 if (response->getError() != NetworkError::NoError)
581 {
583 return;
584 }
585
586 mCompleted.store(true, std::memory_order_release);
588 });
589
590 mCancellationContext->OnCancelled(response);
591}
std::string GetSnapshotSyncUrl(std::string_view projectId, std::string_view snapshotId) const
void OnSyncCompleted(const ProjectUploadOperation *uploadOperation, std::optional< CloudSyncError > error)
This method is called from any thread.
ResponsePtr doPost(const Request &request, const void *data, size_t size)
CLOUD_AUDIOCOM_API CloudSyncError DeduceUploadError(audacity::network_manager::IResponse &response)

References audacity::cloud::audiocom::sync::DeduceUploadError(), audacity::network_manager::NetworkManager::doPost(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::network_manager::NetworkManager::GetInstance(), audacity::cloud::audiocom::ServiceConfig::GetSnapshotSyncUrl(), mCancellationContext, mCompleted, mCreateSnapshotResponse, mProjectCloudExtension, mServiceConfig, audacity::cloud::audiocom::sync::ProjectCloudExtension::OnSyncCompleted(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingSnapshot(), audacity::cloud::audiocom::SetCommonHeaders(), and UploadFailed().

Referenced by OnSnapshotCreated().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnSnapshotCreated()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::OnSnapshotCreated ( const CreateSnapshotResponse response,
bool  newProject 
)
private

Definition at line 427 of file LocalProjectSnapshot.cpp.

429{
430 auto project = mWeakProject.lock();
431
432 if (project == nullptr)
433 {
435 XO("Project was closed before snapshot was created")));
436 return;
437 }
438
439 if (newProject)
440 mProjectBlocksLock->UpdateProjectHashesInCache();
441
442 mProjectBlocksLock->FillMissingBlocks(response.SyncState.MissingBlocks);
443
445
446 {
447 auto lock = std::lock_guard { mCreateSnapshotResponseMutex };
448 mCreateSnapshotResponse = response;
449 }
450
451 mCreateSnapshotPromise.set_value({ response, shared_from_this() });
452
453 auto projectData = mProjectDataPromise.get_future().get();
454
455 if (mCancelled.load(std::memory_order_acquire))
456 return;
457
458 StorePendingSnapshot(response, projectData);
459
461 mCancellationContext, mServiceConfig, response.SyncState.FileUrls,
462 projectData.ProjectSnapshot,
463 [this, weakThis = weak_from_this()](ResponseResult result)
464 {
465 auto strongThis = weakThis.lock();
466 if (!strongThis)
467 return;
468
469 auto& db = CloudProjectsDatabase::Get();
470
471 const auto projectId = mCreateSnapshotResponse->Project.Id;
472 const auto snapshotId = mCreateSnapshotResponse->Snapshot.Id;
473
474 if (result.Code != SyncResultCode::Success)
475 {
476 db.RemovePendingSnapshot(projectId, snapshotId);
477 db.RemovePendingProjectBlob(projectId, snapshotId);
478 db.RemovePendingProjectBlocks(projectId, snapshotId);
479
480 DataUploadFailed(result);
481 return;
482 }
483
485 db.RemovePendingProjectBlob(projectId, snapshotId);
486
487 if (mProjectBlocksLock->MissingBlocks.empty())
488 {
490 return;
491 }
492
495 mProjectBlocksLock->MissingBlocks,
496 [this, weakThis = weak_from_this()](
497 auto result, auto block, auto uploadResult)
498 {
499 auto strongThis = weakThis.lock();
500 if (!strongThis)
501 return;
502
503 if (!IsUploadRecoverable(uploadResult.Code))
505 mCreateSnapshotResponse->Project.Id, block.Id);
506
508 *this, block.Hash,
509 uploadResult.Code == SyncResultCode::Success);
510
511 const auto completed =
512 result.UploadedBlocks == result.TotalBlocks ||
513 result.FailedBlocks != 0;
514 const bool succeeded = completed && result.FailedBlocks == 0;
515
516 if (!completed)
517 return;
518
519 if (succeeded)
521 else
522 DataUploadFailed(result);
523 });
524 });
525}
XO("Cut/Copy/Paste")
void RemovePendingProjectBlock(std::string_view projectId, int64_t blockId)
void Upload(CancellationContextPtr cancellationContex, const ServiceConfig &config, const UploadUrls &target, std::vector< uint8_t > data, std::function< void(ResponseResult)> callback, std::function< void(double)> progressCallback={})
void DataUploadFailed(const ResponseResult &uploadResult)
void StorePendingSnapshot(const CreateSnapshotResponse &response, const ProjectUploadData &data)
std::unique_ptr< ProjectBlocksLock > mProjectBlocksLock
std::shared_ptr< MissingBlocksUploader > mMissingBlockUploader
static std::shared_ptr< MissingBlocksUploader > Create(CancellationContextPtr cancellationContex, const ServiceConfig &serviceConfig, std::vector< BlockUploadTask > uploadTasks, MissingBlocksUploadProgressCallback progress)
void OnSnapshotCreated(const ProjectUploadOperation &uploadOperation, const CreateSnapshotResponse &response)
This method is called from the network thread.
void OnProjectDataUploaded(const ProjectUploadOperation &uploadOperation)
This method is called from the network thread.
void OnBlockUploaded(const ProjectUploadOperation &uploadOperation, std::string_view blockID, bool successful)
This method is called from the network thread.
CloudSyncError MakeClientFailure(const TranslatableString &message)
bool IsUploadRecoverable(SyncResultCode code)

References audacity::cloud::audiocom::ResponseResult::Code, audacity::cloud::audiocom::sync::MissingBlocksUploader::Create(), DataUploadFailed(), audacity::cloud::audiocom::sync::ProjectSyncState::FileUrls, audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::cloud::audiocom::sync::DataUploader::Get(), audacity::cloud::audiocom::IsUploadRecoverable(), audacity::cloud::audiocom::sync::MakeClientFailure(), MarkSnapshotSynced(), mCancellationContext, mCancelled, mCreateSnapshotPromise, mCreateSnapshotResponse, mCreateSnapshotResponseMutex, audacity::cloud::audiocom::sync::ProjectSyncState::MissingBlocks, mMissingBlockUploader, mProjectBlocksLock, mProjectCloudExtension, mProjectDataPromise, mServiceConfig, mWeakProject, audacity::cloud::audiocom::sync::ProjectCloudExtension::OnBlockUploaded(), audacity::cloud::audiocom::sync::ProjectCloudExtension::OnProjectDataUploaded(), audacity::cloud::audiocom::sync::ProjectCloudExtension::OnSnapshotCreated(), project, audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingProjectBlock(), StorePendingSnapshot(), audacity::cloud::audiocom::Success, audacity::cloud::audiocom::sync::CreateSnapshotResponse::SyncState, audacity::cloud::audiocom::sync::DataUploader::Upload(), UploadFailed(), and XO().

Referenced by UpdateProjectSnapshot().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetUploadData()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::SetUploadData ( const ProjectUploadData data)
overridevirtual

Implements audacity::cloud::audiocom::sync::ProjectUploadOperation.

Definition at line 255 of file LocalProjectSnapshot.cpp.

256{
257 mProjectDataReady.store(true);
258 mProjectDataPromise.set_value(data);
259}

References mProjectDataPromise, and mProjectDataReady.

◆ Start()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::Start ( )
overridevirtual

Implements audacity::cloud::audiocom::sync::ProjectUploadOperation.

Definition at line 250 of file LocalProjectSnapshot.cpp.

References UpdateProjectSnapshot().

Here is the call graph for this function:

◆ StorePendingSnapshot()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::StorePendingSnapshot ( const CreateSnapshotResponse response,
const ProjectUploadData data 
)
private

Definition at line 527 of file LocalProjectSnapshot.cpp.

529{
531 { response.Project.Id, response.Snapshot.Id,
533 response.Project.Id, response.Snapshot.Id) });
534
536 { response.Project.Id, response.Snapshot.Id,
537 response.SyncState.FileUrls.UploadUrl,
538 response.SyncState.FileUrls.SuccessUrl,
539 response.SyncState.FileUrls.FailUrl, projectData.ProjectSnapshot });
540
541 if (mProjectBlocksLock->MissingBlocks.empty())
542 return;
543
544 std::vector<PendingProjectBlockData> pendingBlocks;
545 pendingBlocks.reserve(mProjectBlocksLock->MissingBlocks.size());
546
547 for (const auto& block : mProjectBlocksLock->MissingBlocks)
548 {
549 pendingBlocks.push_back(PendingProjectBlockData {
550 response.Project.Id, response.Snapshot.Id, block.BlockUrls.UploadUrl,
551 block.BlockUrls.SuccessUrl, block.BlockUrls.FailUrl, block.Block.Id,
552 static_cast<int>(block.Block.Format), block.Block.Hash });
553 }
554
556}
void AddPendingSnapshot(const PendingSnapshotData &snapshotData)
void AddPendingProjectBlocks(const std::vector< PendingProjectBlockData > &blockData)
void AddPendingProjectBlob(const PendingProjectBlobData &blobData)

References audacity::cloud::audiocom::sync::CloudProjectsDatabase::AddPendingProjectBlob(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::AddPendingProjectBlocks(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::AddPendingSnapshot(), audacity::cloud::audiocom::sync::UploadUrls::FailUrl, audacity::cloud::audiocom::sync::ProjectSyncState::FileUrls, audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::cloud::audiocom::ServiceConfig::GetSnapshotSyncUrl(), audacity::cloud::audiocom::sync::SnapshotInfo::Id, audacity::cloud::audiocom::sync::ProjectInfo::Id, mProjectBlocksLock, mServiceConfig, audacity::cloud::audiocom::sync::CreateSnapshotResponse::Project, audacity::cloud::audiocom::sync::ProjectUploadData::ProjectSnapshot, audacity::cloud::audiocom::sync::CreateSnapshotResponse::Snapshot, audacity::cloud::audiocom::sync::UploadUrls::SuccessUrl, audacity::cloud::audiocom::sync::CreateSnapshotResponse::SyncState, and audacity::cloud::audiocom::sync::UploadUrls::UploadUrl.

Referenced by OnSnapshotCreated().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateProjectSnapshot()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::UpdateProjectSnapshot ( )
private

Definition at line 330 of file LocalProjectSnapshot.cpp.

331{
332 auto project = mWeakProject.lock();
333
334 if (project == nullptr)
335 {
337 XO("Project was closed before snapshot was created")));
338 return;
339 }
340
341 const bool isCloudProject = mProjectCloudExtension.IsCloudProject();
342 const bool createNew =
343 mUploadMode == UploadMode::CreateNew || !isCloudProject;
344
345 ProjectForm projectForm;
346
347 if (createNew)
348 projectForm.Name = mProjectName;
349 else
350 projectForm.HeadSnapshotId = mProjectCloudExtension.GetSnapshotId();
351
352 // For empty projects, mProjectBlocksLock will be nullptr at this point
353 if (mProjectBlocksLock != nullptr)
354 {
355 projectForm.Hashes.reserve(mProjectBlocksLock->Blocks.size());
356 std::transform(
357 mProjectBlocksLock->Blocks.begin(), mProjectBlocksLock->Blocks.end(),
358 std::back_inserter(projectForm.Hashes),
359 [](const auto& block) { return block.Hash; });
360 }
361
362 using namespace audacity::network_manager;
363
364 const auto url = createNew ? mServiceConfig.GetCreateProjectUrl() :
367
368 projectForm.Force = !createNew && mUploadMode == UploadMode::ForceOverwrite;
369
370 auto request = Request(url);
371
372 request.setHeader(
374 request.setHeader(
376 // request.setHeader(common_headers::ContentEncoding, "gzip");
377
378 const auto language = mServiceConfig.GetAcceptLanguageValue();
379
380 if (!language.empty())
381 request.setHeader(
383
384 request.setHeader(
386
387 auto serializedForm = Serialize(projectForm);
388
389 auto response = NetworkManager::GetInstance().doPost(
390 request, serializedForm.data(), serializedForm.size());
391
392 response->setRequestFinishedCallback(
393 [this, response, createNew, weakThis = weak_from_this()](auto)
394 {
395 auto strongThis = weakThis.lock();
396 if (!strongThis)
397 return;
398
399 const auto error = response->getError();
400
401 if (error != NetworkError::NoError)
402 {
404
405 mCreateSnapshotPromise.set_value({});
406 return;
407 }
408
409 const auto body = response->readAll<std::string>();
410 auto result = DeserializeCreateSnapshotResponse(body);
411
412 if (!result)
413 {
415 XO("Invalid Response: %s").Format(body).Translation()));
416
417 mCreateSnapshotPromise.set_value({});
418 return;
419 }
420
421 OnSnapshotCreated(*result, createNew);
422 });
423
424 mCancellationContext->OnCancelled(response);
425}
Abstract base class used in importing a file.
std::string GetAccessToken() const
Return the current access token, if any.
std::string GetCreateSnapshotUrl(std::string_view projectId) const
std::string GetAcceptLanguageValue() const
Returns the preferred language.
void OnSnapshotCreated(const CreateSnapshotResponse &response, bool newProject)
std::string Serialize(const ProjectForm &form)
std::optional< CreateSnapshotResponse > DeserializeCreateSnapshotResponse(const std::string &data)

References audacity::network_manager::common_headers::Accept, audacity::network_manager::common_headers::AcceptLanguage, audacity::network_manager::common_content_types::ApplicationJson, audacity::network_manager::common_headers::Authorization, audacity::network_manager::common_headers::ContentType, audacity::cloud::audiocom::sync::CreateNew, audacity::cloud::audiocom::sync::DeduceUploadError(), audacity::cloud::audiocom::sync::DeserializeCreateSnapshotResponse(), audacity::network_manager::NetworkManager::doPost(), audacity::cloud::audiocom::sync::ProjectForm::Force, audacity::cloud::audiocom::sync::ForceOverwrite, audacity::cloud::audiocom::ServiceConfig::GetAcceptLanguageValue(), audacity::cloud::audiocom::OAuthService::GetAccessToken(), audacity::cloud::audiocom::sync::ProjectCloudExtension::GetCloudProjectId(), audacity::cloud::audiocom::ServiceConfig::GetCreateProjectUrl(), audacity::cloud::audiocom::ServiceConfig::GetCreateSnapshotUrl(), audacity::network_manager::NetworkManager::GetInstance(), audacity::cloud::audiocom::sync::ProjectCloudExtension::GetSnapshotId(), audacity::cloud::audiocom::sync::ProjectForm::Hashes, audacity::cloud::audiocom::sync::ProjectForm::HeadSnapshotId, audacity::cloud::audiocom::sync::ProjectCloudExtension::IsCloudProject(), audacity::cloud::audiocom::sync::MakeClientFailure(), mCancellationContext, mCreateSnapshotPromise, mOAuthService, mProjectBlocksLock, mProjectCloudExtension, mProjectName, mServiceConfig, mUploadMode, mWeakProject, audacity::cloud::audiocom::sync::ProjectForm::Name, OnSnapshotCreated(), project, audacity::cloud::audiocom::sync::Serialize(), UploadFailed(), and XO().

Referenced by Start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UploadFailed()

void audacity::cloud::audiocom::sync::LocalProjectSnapshot::UploadFailed ( CloudSyncError  error)
private

Definition at line 287 of file LocalProjectSnapshot.cpp.

288{
289 if (!mCompleted.exchange(true, std::memory_order_release))
290 mProjectCloudExtension.OnSyncCompleted(this, std::make_optional(error));
291}

References mCompleted, mProjectCloudExtension, and audacity::cloud::audiocom::sync::ProjectCloudExtension::OnSyncCompleted().

Referenced by Abort(), Cancel(), DataUploadFailed(), MarkSnapshotSynced(), OnSnapshotCreated(), and UpdateProjectSnapshot().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mCancellationContext

concurrency::CancellationContextPtr audacity::cloud::audiocom::sync::LocalProjectSnapshot::mCancellationContext
private

◆ mCancelled

std::atomic<bool> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mCancelled { false }
private

Definition at line 124 of file LocalProjectSnapshot.h.

Referenced by Abort(), Cancel(), and OnSnapshotCreated().

◆ mCompleted

std::atomic<bool> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mCompleted { false }
private

Definition at line 123 of file LocalProjectSnapshot.h.

Referenced by IsCompleted(), MarkSnapshotSynced(), and UploadFailed().

◆ mCreateSnapshotPromise

Promise audacity::cloud::audiocom::sync::LocalProjectSnapshot::mCreateSnapshotPromise
private

Definition at line 119 of file LocalProjectSnapshot.h.

Referenced by OnSnapshotCreated(), and UpdateProjectSnapshot().

◆ mCreateSnapshotResponse

std::optional<CreateSnapshotResponse> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mCreateSnapshotResponse
private

Definition at line 115 of file LocalProjectSnapshot.h.

Referenced by DeleteSnapshot(), MarkSnapshotSynced(), and OnSnapshotCreated().

◆ mCreateSnapshotResponseMutex

std::mutex audacity::cloud::audiocom::sync::LocalProjectSnapshot::mCreateSnapshotResponseMutex
private

Definition at line 114 of file LocalProjectSnapshot.h.

Referenced by OnSnapshotCreated().

◆ mMissingBlockUploader

std::shared_ptr<MissingBlocksUploader> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mMissingBlockUploader
private

Definition at line 112 of file LocalProjectSnapshot.h.

Referenced by OnSnapshotCreated().

◆ mOAuthService

const OAuthService& audacity::cloud::audiocom::sync::LocalProjectSnapshot::mOAuthService
private

Definition at line 105 of file LocalProjectSnapshot.h.

Referenced by UpdateProjectSnapshot().

◆ mProjectBlocksLock

std::unique_ptr<ProjectBlocksLock> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mProjectBlocksLock
private

◆ mProjectCloudExtension

ProjectCloudExtension& audacity::cloud::audiocom::sync::LocalProjectSnapshot::mProjectCloudExtension
private

◆ mProjectDataPromise

std::promise<ProjectUploadData> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mProjectDataPromise
private

Definition at line 102 of file LocalProjectSnapshot.h.

Referenced by Abort(), Cancel(), OnSnapshotCreated(), and SetUploadData().

◆ mProjectDataReady

std::atomic<bool> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mProjectDataReady { false }
private

Definition at line 125 of file LocalProjectSnapshot.h.

Referenced by Abort(), Cancel(), and SetUploadData().

◆ mProjectName

std::string audacity::cloud::audiocom::sync::LocalProjectSnapshot::mProjectName
private

Definition at line 107 of file LocalProjectSnapshot.h.

Referenced by UpdateProjectSnapshot().

◆ mServiceConfig

const ServiceConfig& audacity::cloud::audiocom::sync::LocalProjectSnapshot::mServiceConfig
private

◆ mUploadMode

UploadMode audacity::cloud::audiocom::sync::LocalProjectSnapshot::mUploadMode { UploadMode::Normal }
private

Definition at line 117 of file LocalProjectSnapshot.h.

Referenced by UpdateProjectSnapshot().

◆ mWeakProject

std::weak_ptr<AudacityProject> audacity::cloud::audiocom::sync::LocalProjectSnapshot::mWeakProject
private

Definition at line 100 of file LocalProjectSnapshot.h.

Referenced by GetProject(), OnSnapshotCreated(), and UpdateProjectSnapshot().


The documentation for this class was generated from the following files: