40 XO(
"Open from audio.com"),
XO(
"Synchronizing project"),
46 return [&dialog](
double progress)
48 return dialog.
Poll(
static_cast<unsigned>(progress * 10000), 10000ULL) ==
56 while (future.wait_for(std::chrono::milliseconds(50)) !=
57 std::future_status::ready)
73 "Opening of the cloud project was canceled", result.
Result.
Content);
85 wxLogError(
"Failed to open cloud project: %s", result.
Result.
Content);
102 return ConflictResolution::None;
107 const auto resolution = dialog.ShowDialog();
110 return ConflictResolution::Stop;
113 return ConflictResolution::Local;
116 return ConflictResolution::Remote;
119 return ConflictResolution::Stop;
125 "Transfer stats: %f Kb transferred, %f secs",
140 auto iter = std::find_if(
180 auto snapshotIdFuture =
183 auto snapshotIdResult =
GetResult(snapshotIdFuture);
185 if (std::holds_alternative<std::string>(snapshotIdResult))
187 const auto headSnapshotId =
188 *std::get_if<std::string>(&snapshotIdResult);
194 auto dialog = std::make_unique<ProjectVersionConflictDialog>(
197 const auto result = dialog->ShowDialog();
205 newProject, projectId, headSnapshotId,
212 return openedProject;
219 std::string(projectId), std::string(snapshotId), mode,
225 progressDialog.reset();
227 const auto conflictResolution =
230 if (conflictResolution == ConflictResolution::Stop)
233 if (conflictResolution == ConflictResolution::Remote)
236 potentialTarget, projectId, snapshotId,
255 std::string_view snapshotId,
bool forceNew)
258 potentialTarget, projectId, snapshotId,
288 progressDialog.reset();
292 if (conflictResolution == ConflictResolution::Stop)
295 if (conflictResolution == ConflictResolution::Remote)
308 const auto parsedUri =
ParseUri(uri);
310 if (parsedUri.Scheme !=
"audacity" || parsedUri.Host !=
"open")
315 if (queryParameters.empty())
318 const auto projectId = queryParameters.find(
"projectId");
320 if (projectId == queryParameters.end())
323 const auto snapshotId = queryParameters.find(
"snapshotId");
325 const auto forceNew = queryParameters.find(
"new") != queryParameters.end();
329 snapshotId != queryParameters.end() ? snapshotId->second :
340 if (!projectCloudExtension.IsCloudProject())
345 projectId = std::string(projectCloudExtension.GetCloudProjectId())]
347 auto newProject = ProjectManager::New();
348 ProjectWindow::Get(project).Close(true);
349 OpenProjectFromCloud(
350 newProject, projectId, {},
Toolkit-neutral facade for basic user interface services.
#define ASSERT_MAIN_THREAD()
Declare functions to perform UTF-8 to std::wstring conversions.
QueryFields ParseUriQuery(std::string_view query, std::string_view delimiter) noexcept
Parses URI query and returns QueryFields structure with parsed fields.
UriFields ParseUri(std::string_view uri) noexcept
const_iterator end() const
Container::value_type value_type
const_iterator begin() const
const_reverse_iterator rbegin() const
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Abstraction of a progress dialog with well defined time-to-completion estimate.
virtual ProgressResult Poll(unsigned long long numerator, unsigned long long denominator, const TranslatableString &message={})=0
Update the bar and poll for clicks. Call only on the main thread.
static ProjectFileIO & Get(AudacityProject &project)
static AudacityProject * New()
static AudacityProject * OpenProject(AudacityProject *pGivenProject, const FilePath &fileNameArg, bool addtohistory, bool reuseNonemptyProject)
Open a file into an AudacityProject, returning the project, or nullptr for failure.
static ProjectWindow & Get(AudacityProject &project)
GetHeadSnapshotIDFuture GetHeadSnapshotID(std::string_view projectId)
SyncFuture SyncProject(AudacityProject &project, const std::string &path, bool forceSync, sync::ProgressCallback callback)
static CloudSyncService & Get()
SyncFuture OpenFromCloud(std::string projectId, std::string snapshotId, SyncMode mode, sync::ProgressCallback callback)
Open the project from the cloud. This operation is asynchronous.
DialogButtonIdentifier ShowDialog(std::function< DialogButtonIdentifier()> poller={})
static DialogButtonIdentifier CancelButtonIdentifier()
std::string GetSnapshotId() const
std::string GetCloudProjectId() const
static ProjectCloudExtension & Get(AudacityProject &project)
static DialogButtonIdentifier UseRemoteIdentifier()
static DialogButtonIdentifier UseLocalIdentifier()
static void OnOpen(const CloudSyncError &error)
void CallAfter(Action action)
Schedule an action to be done later, and in the main thread.
void Yield()
Dispatch waiting events, including actions enqueued by CallAfter.
std::unique_ptr< ProgressDialog > MakeProgress(const TranslatableString &title, const TranslatableString &message, unsigned flags=(ProgressShowStop|ProgressShowCancel), const TranslatableString &remainingLabelText={})
Create and display a progress dialog.
auto MakePoller(BasicUI::ProgressDialog &dialog)
ConflictResolution GetConfilctResolution(AudacityProject *project, const ProjectSyncResult &result)
bool HandleFailure(const ProjectSyncResult &result)
void LogTransferStats(TransferStats stats)
T GetResult(std::future< T > &future)
bool SyncCloudProject(AudacityProject &project, std::string_view path, bool force)
void ReopenProject(AudacityProject &project)
bool HandleProjectLink(std::string_view uri)
AudacityProject * OpenProjectFromCloud(AudacityProject *potentialTarget, std::string_view projectId, std::string_view snapshotId, CloudSyncService::SyncMode mode)
AudacityProject * GetOpenedProject(std::string_view projectId)
AudacityProject * GetPotentialTarget()
AuthResult PerformBlockingAuth(AudacityProject *project, const TranslatableString &alternativeActionLabel)
wxString ToWXString(const std::string &str)
const char * end(const char *str) noexcept
const char * begin(const char *str) noexcept
Duration TransferDuration