Audacity 3.2.0
Classes | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation Class Referencefinal
Inheritance diagram for audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation:
[legend]
Collaboration diagram for audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation:
[legend]

Classes

struct  Tag
 

Public Member Functions

 ResumedSnaphotUploadOperation (Tag, ProjectCloudExtension &projectCloudExtension, std::string_view snapshotId, std::string_view confirmationUrl)
 
 ~ResumedSnaphotUploadOperation () override
 
- 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 void Perform (ProjectCloudExtension &projectCloudExtension, std::string_view snapshotId, std::string_view confirmationUrl)
 

Private Member Functions

void UploadSnapshot ()
 
void CompleteSync ()
 
void FailSync (CloudSyncError error)
 
void FailSync (ResponseResult result)
 
void UploadBlocks ()
 
void Start () override
 
void RefreshUrls ()
 
void UpdateUrls (const ProjectSyncState &syncState)
 
void MarkSnapshotSynced ()
 
void SetUploadData (const ProjectUploadData &data) override
 
bool IsCompleted () const override
 
void Cancel () override
 

Private Attributes

ProjectCloudExtensionmProjectCloudExtension
 
std::string mProjectId
 
std::string mSnapshotId
 
std::string mConfirmationUrl
 
concurrency::CancellationContextPtr mCancellationContext
 
std::optional< PendingProjectBlobDatamPendingProjectBlobData
 
std::vector< PendingProjectBlockDatamPendingProjectBlocks
 
std::shared_ptr< MissingBlocksUploadermMissingBlocksUploader
 
std::atomic< bool > mCompleted { false }
 
bool mHasExpiredUrls { false }
 

Detailed Description

Definition at line 78 of file ResumedSnaphotUploadOperation.cpp.

Constructor & Destructor Documentation

◆ ResumedSnaphotUploadOperation()

audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::ResumedSnaphotUploadOperation ( Tag  ,
ProjectCloudExtension projectCloudExtension,
std::string_view  snapshotId,
std::string_view  confirmationUrl 
)
inline

Definition at line 87 of file ResumedSnaphotUploadOperation.cpp.

90 : mProjectCloudExtension { projectCloudExtension }
92 , mSnapshotId { snapshotId }
93 , mConfirmationUrl { confirmationUrl }
95 {
96 }

◆ ~ResumedSnaphotUploadOperation()

audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::~ResumedSnaphotUploadOperation ( )
inlineoverride

Definition at line 98 of file ResumedSnaphotUploadOperation.cpp.

99 {
100 }

Member Function Documentation

◆ Cancel()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::Cancel ( )
inlineoverrideprivatevirtual

◆ CompleteSync()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::CompleteSync ( )
inlineprivate

Definition at line 171 of file ResumedSnaphotUploadOperation.cpp.

172 {
173 if (!mCompleted.exchange(true))
175 }
void OnSyncCompleted(const ProjectUploadOperation *uploadOperation, std::optional< CloudSyncError > error)
This method is called from any thread.

◆ FailSync() [1/2]

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::FailSync ( CloudSyncError  error)
inlineprivate

Definition at line 177 of file ResumedSnaphotUploadOperation.cpp.

178 {
179 if (!mCompleted.exchange(true))
181 }

◆ FailSync() [2/2]

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::FailSync ( ResponseResult  result)
inlineprivate

Definition at line 183 of file ResumedSnaphotUploadOperation.cpp.

184 {
185 FailSync(CloudSyncError { DeduceError(result.Code), result.Content });
186 }
CloudSyncError::ErrorType DeduceError(SyncResultCode code)

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

Here is the call graph for this function:

◆ IsCompleted()

bool audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::IsCompleted ( ) const
inlineoverrideprivatevirtual

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

Definition at line 412 of file ResumedSnaphotUploadOperation.cpp.

413 {
414 return mCompleted.load();
415 }

◆ MarkSnapshotSynced()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::MarkSnapshotSynced ( )
inlineprivate

Definition at line 376 of file ResumedSnaphotUploadOperation.cpp.

377 {
378 using namespace network_manager;
379 Request request { mConfirmationUrl };
380
381 SetCommonHeaders(request);
382
383 auto response = NetworkManager::GetInstance().doPost(request, nullptr, 0);
384
385 response->setRequestFinishedCallback(
386 [this, response, weakThis = weak_from_this()](auto)
387 {
388 auto strongThis = weakThis.lock();
389 if (!strongThis)
390 return;
391
394
395 if (response->getError() != NetworkError::NoError)
396 {
397 FailSync(DeduceUploadError(*response));
398 return;
399 }
400
401 CompleteSync();
402 });
403
404 mCancellationContext->OnCancelled(response);
405 }
Class to construct the HTTP request.
void RemovePendingSnapshot(std::string_view projectId, std::string_view snapshotId)
ResponsePtr doPost(const Request &request, const void *data, size_t size)
CLOUD_AUDIOCOM_API CloudSyncError DeduceUploadError(audacity::network_manager::IResponse &response)
void SetCommonHeaders(Request &request)

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::sync::CloudProjectsDatabase::RemovePendingSnapshot(), and audacity::cloud::audiocom::SetCommonHeaders().

Here is the call graph for this function:

◆ Perform()

static void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::Perform ( ProjectCloudExtension projectCloudExtension,
std::string_view  snapshotId,
std::string_view  confirmationUrl 
)
inlinestatic

Definition at line 102 of file ResumedSnaphotUploadOperation.cpp.

105 {
106 auto& cloudProjectsDatabase = CloudProjectsDatabase::Get();
107
108 auto operation = std::make_shared<ResumedSnaphotUploadOperation>(
109 Tag {}, projectCloudExtension, snapshotId, confirmationUrl);
110
111 const auto projectId = projectCloudExtension.GetCloudProjectId();
112
113 operation->mPendingProjectBlobData =
114 cloudProjectsDatabase.GetPendingProjectBlob(projectId, snapshotId);
115
116 operation->mPendingProjectBlocks =
117 cloudProjectsDatabase.GetPendingProjectBlocks(projectId, snapshotId);
118
119 const int64_t totalBlocks = operation->mPendingProjectBlocks.size();
120
121 if (operation->mPendingProjectBlobData)
122 {
123 operation->mHasExpiredUrls =
124 IsUrlExpired(operation->mPendingProjectBlobData->UploadUrl);
125 }
126
127 for (const auto& block : operation->mPendingProjectBlocks)
128 {
129 if (operation->mHasExpiredUrls)
130 break;
131
132 operation->mHasExpiredUrls = IsUrlExpired(block.UploadUrl);
133 }
134
135 projectCloudExtension.OnSyncResumed(
136 operation, totalBlocks,
137 operation->mPendingProjectBlobData.has_value());
138 }

References audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::cloud::audiocom::sync::ProjectCloudExtension::GetCloudProjectId(), audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::IsUrlExpired(), and audacity::cloud::audiocom::sync::ProjectCloudExtension::OnSyncResumed().

Here is the call graph for this function:

◆ RefreshUrls()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::RefreshUrls ( )
inlineprivate

Definition at line 287 of file ResumedSnaphotUploadOperation.cpp.

288 {
289 using namespace network_manager;
292
293 SetCommonHeaders(request);
294
295 auto response = NetworkManager::GetInstance().doGet(request);
296
297 response->setRequestFinishedCallback(
298 [this, response, weakThis = weak_from_this()](auto)
299 {
300 auto strongThis = weakThis.lock();
301 if (!strongThis)
302 return;
303
304 if (response->getError() != NetworkError::NoError)
305 {
306 FailSync(DeduceUploadError(*response));
307 return;
308 }
309
310 auto syncState =
311 DeserializeProjectSyncState(response->readAll<std::string>());
312
313 if (!syncState)
314 {
315 FailSync(
316 MakeClientFailure(XO("Failed to deserialize the response")));
317 return;
318 }
319
320 UpdateUrls(*syncState);
321
322 if (mPendingProjectBlobData.has_value())
324 else
325 UploadBlocks();
326 });
327 }
XO("Cut/Copy/Paste")
std::string GetSnapshotSyncUrl(std::string_view projectId, std::string_view snapshotId) const
ResponsePtr doGet(const Request &request)
std::optional< ProjectSyncState > DeserializeProjectSyncState(const std::string &data)
CloudSyncError MakeClientFailure(const TranslatableString &message)
const ServiceConfig & GetServiceConfig()
Returns the instance of the ServiceConfig.

References audacity::cloud::audiocom::sync::DeserializeProjectSyncState(), audacity::network_manager::NetworkManager::doGet(), audacity::network_manager::NetworkManager::GetInstance(), audacity::cloud::audiocom::GetServiceConfig(), audacity::cloud::audiocom::ServiceConfig::GetSnapshotSyncUrl(), audacity::cloud::audiocom::sync::MakeClientFailure(), audacity::cloud::audiocom::SetCommonHeaders(), and XO().

Here is the call graph for this function:

◆ SetUploadData()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::SetUploadData ( const ProjectUploadData data)
inlineoverrideprivatevirtual

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

Definition at line 407 of file ResumedSnaphotUploadOperation.cpp.

408 {
409 // This method will never be called for resumed operations
410 }

◆ Start()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::Start ( )
inlineoverrideprivatevirtual

◆ UpdateUrls()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::UpdateUrls ( const ProjectSyncState syncState)
inlineprivate

Definition at line 329 of file ResumedSnaphotUploadOperation.cpp.

330 {
331 if (mPendingProjectBlobData.has_value())
332 {
333 if (syncState.FileUrls.UploadUrl.empty())
334 {
338 }
339 else
340 {
341 mPendingProjectBlobData->UploadUrl = syncState.FileUrls.UploadUrl;
342 mPendingProjectBlobData->ConfirmUrl = syncState.FileUrls.SuccessUrl;
343 mPendingProjectBlobData->FailUrl = syncState.FileUrls.SuccessUrl;
344 }
345 }
346
347 std::unordered_map<std::string, UploadUrls> urlsLookup;
348 for (const auto& urls : syncState.MissingBlocks)
349 urlsLookup.emplace(urls.Id, urls);
350
351 for (auto& block : mPendingProjectBlocks)
352 {
353 auto it = urlsLookup.find(block.BlockHash);
354
355 if (it == urlsLookup.end())
356 {
358 mProjectId, block.BlockId);
359
360 continue;
361 }
362
363 block.UploadUrl = urlsLookup[block.BlockHash].UploadUrl;
364 block.ConfirmUrl = urlsLookup[block.BlockHash].SuccessUrl;
365 block.FailUrl = urlsLookup[block.BlockHash].FailUrl;
366 }
367
369 std::remove_if(
371 [&urlsLookup](auto& block)
372 { return urlsLookup.find(block.BlockHash) == urlsLookup.end(); }),
374 }
void RemovePendingProjectBlock(std::string_view projectId, int64_t blockId)
void RemovePendingProjectBlob(std::string_view projectId, std::string_view snapshotId)

References audacity::cloud::audiocom::sync::ProjectSyncState::FileUrls, audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::cloud::audiocom::sync::ProjectSyncState::MissingBlocks, audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingProjectBlob(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingProjectBlock(), audacity::cloud::audiocom::sync::UploadUrls::SuccessUrl, and audacity::cloud::audiocom::sync::UploadUrls::UploadUrl.

Here is the call graph for this function:

◆ UploadBlocks()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::UploadBlocks ( )
inlineprivate

Definition at line 188 of file ResumedSnaphotUploadOperation.cpp.

189 {
190 if (mPendingProjectBlocks.empty())
192
194
195 if (!project)
196 {
198 return;
199 }
200
201 auto& waveTrackFactory = WaveTrackFactory::Get(*project);
202 auto& sampleBlockFactory = waveTrackFactory.GetSampleBlockFactory();
203
204 std::vector<BlockUploadTask> blockTasks;
205 blockTasks.reserve(mPendingProjectBlocks.size());
206
207 for (const auto& pendingBlock : mPendingProjectBlocks)
208 {
209 BlockUploadTask task;
210
211 task.BlockUrls = { {},
212 pendingBlock.UploadUrl,
213 pendingBlock.ConfirmUrl,
214 pendingBlock.FailUrl };
215
216 task.Block.Format =
217 static_cast<sampleFormat>(pendingBlock.BlockSampleFormat);
218 task.Block.Hash = pendingBlock.BlockHash;
219 task.Block.Id = pendingBlock.BlockId;
220 try
221 {
222 task.Block.Block = sampleBlockFactory->CreateFromId(
223 task.Block.Format, pendingBlock.BlockId);
224
225 blockTasks.push_back(std::move(task));
226 }
227 catch (const FileException& e)
228 {
229 // We have failed to resume the upload, local data is missing
232 FailSync(
234 ToUTF8(
235 XO("Local project data was removed before the sync has completed")
236 .Translation()) });
237 return;
238 }
239 }
240
242 mCancellationContext, GetServiceConfig(), std::move(blockTasks),
243 [this, weakThis = weak_from_this()](
244 const MissingBlocksUploadProgress& progress,
245 const LockedBlock& block, ResponseResult blockResponseResult)
246 {
247 auto strongThis = weakThis.lock();
248 if (!strongThis)
249 return;
250
251 if (
252 blockResponseResult.Code != SyncResultCode::ConnectionFailed &&
253 blockResponseResult.Code != SyncResultCode::Cancelled)
255 mProjectId, block.Id);
256
258 *this, block.Hash,
259 blockResponseResult.Code == SyncResultCode::Success);
260
261 const auto completed =
262 progress.UploadedBlocks == progress.TotalBlocks ||
263 progress.FailedBlocks != 0;
264
265 const bool succeeded = completed && progress.FailedBlocks == 0;
266
267 if (!completed)
268 return;
269
270 if (succeeded)
272 else
273 FailSync(std::move(blockResponseResult));
274 });
275 }
sampleFormat
The ordering of these values with operator < agrees with the order of increasing bit width.
Definition: SampleFormat.h:30
const auto project
Thrown for failure of file or database operations in deeply nested places.
Definition: FileException.h:19
static WaveTrackFactory & Get(AudacityProject &project)
Definition: WaveTrack.cpp:3349
static std::shared_ptr< MissingBlocksUploader > Create(CancellationContextPtr cancellationContex, const ServiceConfig &serviceConfig, std::vector< BlockUploadTask > uploadTasks, MissingBlocksUploadProgressCallback progress)
void OnBlockUploaded(const ProjectUploadOperation &uploadOperation, std::string_view blockID, bool successful)
This method is called from the network thread.
std::string ToUTF8(const std::wstring &wstr)

References audacity::cloud::audiocom::sync::LockedBlock::Block, audacity::cloud::audiocom::sync::BlockUploadTask::Block, audacity::cloud::audiocom::sync::BlockUploadTask::BlockUrls, audacity::cloud::audiocom::Cancelled, audacity::cloud::audiocom::ResponseResult::Code, audacity::cloud::audiocom::ConnectionFailed, audacity::cloud::audiocom::sync::MissingBlocksUploader::Create(), audacity::cloud::audiocom::sync::MissingBlocksUploadProgress::FailedBlocks, audacity::cloud::audiocom::sync::LockedBlock::Format, audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), WaveTrackFactory::Get(), audacity::cloud::audiocom::GetServiceConfig(), audacity::cloud::audiocom::sync::LockedBlock::Hash, audacity::cloud::audiocom::sync::LockedBlock::Id, audacity::cloud::audiocom::InternalClientError, project, audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingProjectBlock(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingSnapshot(), anonymous_namespace{StretchingSequenceIntegrationTest.cpp}::sampleBlockFactory, audacity::cloud::audiocom::Success, audacity::cloud::audiocom::sync::MissingBlocksUploadProgress::TotalBlocks, audacity::ToUTF8(), audacity::cloud::audiocom::sync::MissingBlocksUploadProgress::UploadedBlocks, audacity::cloud::audiocom::sync::UploadUrls::UploadUrl, and XO().

Here is the call graph for this function:

◆ UploadSnapshot()

void audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::UploadSnapshot ( )
inlineprivate

Definition at line 141 of file ResumedSnaphotUploadOperation.cpp.

142 {
143 const auto urls = UploadUrls { {},
144 mPendingProjectBlobData->UploadUrl,
145 mPendingProjectBlobData->ConfirmUrl,
146 mPendingProjectBlobData->FailUrl };
147
150 mPendingProjectBlobData->BlobData,
151 [this, weakThis = weak_from_this()](auto result)
152 {
153 auto strongThis = weakThis.lock();
154 if (!strongThis)
155 return;
156
157 if (!IsUploadRecoverable(result.Code))
160
161 if (result.Code == SyncResultCode::Success)
162 {
163 mProjectCloudExtension.OnProjectDataUploaded(*this);
164 UploadBlocks();
165 }
166 else
167 FailSync(std::move(result));
168 });
169 }
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={})
bool IsUploadRecoverable(SyncResultCode code)

References audacity::cloud::audiocom::sync::CloudProjectsDatabase::Get(), audacity::cloud::audiocom::sync::DataUploader::Get(), audacity::cloud::audiocom::GetServiceConfig(), audacity::cloud::audiocom::IsUploadRecoverable(), audacity::cloud::audiocom::sync::CloudProjectsDatabase::RemovePendingProjectBlob(), audacity::cloud::audiocom::Success, audacity::cloud::audiocom::sync::DataUploader::Upload(), and audacity::cloud::audiocom::sync::UploadUrls::UploadUrl.

Here is the call graph for this function:

Member Data Documentation

◆ mCancellationContext

concurrency::CancellationContextPtr audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mCancellationContext
private

Definition at line 429 of file ResumedSnaphotUploadOperation.cpp.

◆ mCompleted

std::atomic<bool> audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mCompleted { false }
private

Definition at line 436 of file ResumedSnaphotUploadOperation.cpp.

◆ mConfirmationUrl

std::string audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mConfirmationUrl
private

Definition at line 427 of file ResumedSnaphotUploadOperation.cpp.

◆ mHasExpiredUrls

bool audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mHasExpiredUrls { false }
private

Definition at line 438 of file ResumedSnaphotUploadOperation.cpp.

◆ mMissingBlocksUploader

std::shared_ptr<MissingBlocksUploader> audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mMissingBlocksUploader
private

Definition at line 434 of file ResumedSnaphotUploadOperation.cpp.

◆ mPendingProjectBlobData

std::optional<PendingProjectBlobData> audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mPendingProjectBlobData
private

Definition at line 431 of file ResumedSnaphotUploadOperation.cpp.

◆ mPendingProjectBlocks

std::vector<PendingProjectBlockData> audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mPendingProjectBlocks
private

Definition at line 432 of file ResumedSnaphotUploadOperation.cpp.

◆ mProjectCloudExtension

ProjectCloudExtension& audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mProjectCloudExtension
private

Definition at line 423 of file ResumedSnaphotUploadOperation.cpp.

◆ mProjectId

std::string audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mProjectId
private

Definition at line 425 of file ResumedSnaphotUploadOperation.cpp.

◆ mSnapshotId

std::string audacity::cloud::audiocom::sync::anonymous_namespace{ResumedSnaphotUploadOperation.cpp}::ResumedSnaphotUploadOperation::mSnapshotId
private

Definition at line 426 of file ResumedSnaphotUploadOperation.cpp.


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