Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 42 additions & 25 deletions src/framework/cloud/internal/abstractcloudservice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,12 @@ void AbstractCloudService::init()
});

if (readTokens()) {
executeAsyncRequest([this]() { return downloadAccountInfo(); });
executeAsyncRequest([this]() { return downloadAccountInfo(); })
.onResolve(this, [](const Ret& ret) {
if (!ret) {
LOGE() << ret.toString();
}
});
}
}

Expand Down Expand Up @@ -156,7 +161,7 @@ bool AbstractCloudService::readTokens()
return true;
}

bool AbstractCloudService::saveTokens()
Ret AbstractCloudService::saveTokens()
{
TRACEFUNC;

Expand All @@ -172,10 +177,6 @@ bool AbstractCloudService::saveTokens()
ret = fileSystem()->writeFile(tokensFilePath(), ByteArray::fromQByteArrayNoCopy(json));
}

if (!ret) {
LOGE() << ret.toString();
}

return ret;
}

Expand Down Expand Up @@ -336,14 +337,21 @@ const AccountInfo& AbstractCloudService::accountInfo() const

Ret AbstractCloudService::checkCloudIsAvailable() const
{
QBuffer receivedData;
deprecated::INetworkManagerPtr manager = networkManagerCreator()->makeDeprecatedNetworkManager();
Ret ret = manager->get(m_serverConfig.serverAvailabilityUrl, &receivedData, m_serverConfig.headers);

if (!ret) {
printServerReply(receivedData);
auto receivedData = std::make_shared<QBuffer>();
RetVal<Progress> progress = m_networkManager->get(m_serverConfig.serverAvailabilityUrl, receivedData, m_serverConfig.headers);
if (!progress.ret) {
return progress.ret;
}

Ret ret = make_ok();

QEventLoop loop;
progress.val.finished().onReceive(this, [&ret, &loop](const ProgressResult& res) {
ret = res.ret;
loop.quit();
});
loop.exec();

return ret;
}

Expand Down Expand Up @@ -396,36 +404,45 @@ Ret AbstractCloudService::executeRequest(const RequestCallback& requestCallback)
return ret;
}

void AbstractCloudService::executeAsyncRequest(const AsyncRequestCallback& requestCallback)
Promise<Ret> AbstractCloudService::executeAsyncRequest(const AsyncRequestCallback& requestCallback)
{
requestCallback().onResolve(this, [this, requestCallback](const Ret& ret) {
//! NOTE: helps to avoid memory leak due to self-capture
auto callback = new AsyncRequestCallback(requestCallback);

return requestCallback().then<Ret>(this, [this, callback](const Ret& ret, auto resolve) {
if (ret) {
return;
delete callback;
return resolve(ret);
}

// Check whether tokens have expired...
if (statusCode(ret) != USER_UNAUTHORIZED_STATUS_CODE) {
LOGE() << ret.toString();
return;
delete callback;
return resolve(ret);
}

// Update tokens and retry request
updateTokens().onResolve(this, [this, requestCallback](const Ret& ret) {
updateTokens().onResolve(this, [this, callback, resolve](const Ret& ret) {
if (!ret) {
LOGE() << ret.toString();
clearTokens();
delete callback;
(void)resolve(ret);
return;
}

if (!saveTokens()) {
Ret saveTokensRet = saveTokens();
if (!saveTokensRet) {
delete callback;
(void)resolve(saveTokensRet);
return;
}

requestCallback().onResolve(this, [](const Ret& ret) {
if (!ret) {
LOGE() << ret.toString();
}
(*callback)().onResolve(this, [resolve, callback](const Ret& ret) {
delete callback;
(void)resolve(ret);
});
});

return Promise<Ret>::dummy_result();
});
}

Expand Down
4 changes: 2 additions & 2 deletions src/framework/cloud/internal/abstractcloudservice.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ private slots:
using AsyncRequestCallback = std::function<async::Promise<Ret>()>;

Ret executeRequest(const RequestCallback& requestCallback);
void executeAsyncRequest(const AsyncRequestCallback& requestCallback);
async::Promise<Ret> executeAsyncRequest(const AsyncRequestCallback& requestCallback);

Ret uploadingDownloadingRetFromRawRet(const Ret& rawRet, bool isAlreadyUploaded = false) const;
int statusCode(const Ret& ret) const;
Expand All @@ -139,7 +139,7 @@ private slots:
void initOAuthIfNecessary();

bool readTokens();
bool saveTokens();
Ret saveTokens();
void removeTokens();
void clearTokens();

Expand Down
16 changes: 8 additions & 8 deletions src/framework/cloud/musescorecom/imusescorecomservice.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore Limited and others
* Copyright (C) 2025 MuseScore Limited and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
Expand All @@ -19,8 +19,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MUSE_CLOUD_IMUSESCORECOMSERVICE_H
#define MUSE_CLOUD_IMUSESCORECOMSERVICE_H

#pragma once

#include <QUrl>

Expand All @@ -34,6 +34,8 @@
class QIODevice;
class QString;

using DevicePtr = std::shared_ptr<QIODevice>;

namespace muse::cloud {
class IMuseScoreComService : MODULE_EXPORT_INTERFACE
{
Expand All @@ -46,9 +48,9 @@ class IMuseScoreComService : MODULE_EXPORT_INTERFACE

virtual QUrl scoreManagerUrl() const = 0;

virtual ProgressPtr uploadScore(QIODevice& scoreData, const QString& title, cloud::Visibility visibility = cloud::Visibility::Private,
virtual ProgressPtr uploadScore(DevicePtr scoreData, const QString& title, cloud::Visibility visibility = cloud::Visibility::Private,
const QUrl& sourceUrl = QUrl(), int revisionId = 0) = 0;
virtual ProgressPtr uploadAudio(QIODevice& audioData, const QString& audioFormat, const QUrl& sourceUrl) = 0;
virtual ProgressPtr uploadAudio(DevicePtr audioData, const QString& audioFormat, const QUrl& sourceUrl) = 0;

virtual RetVal<ScoreInfo> downloadScoreInfo(const QUrl& sourceUrl) = 0;
virtual RetVal<ScoreInfo> downloadScoreInfo(int scoreId) = 0;
Expand All @@ -59,9 +61,7 @@ class IMuseScoreComService : MODULE_EXPORT_INTERFACE
/// big list of all issues, but you have many pages, with 25 issues per page.
virtual async::Promise<ScoresList> downloadScoresList(int scoresPerBatch, int batchNumber) = 0;

virtual ProgressPtr downloadScore(int scoreId, QIODevice& scoreData, const QString& hash = QString(),
virtual ProgressPtr downloadScore(int scoreId, DevicePtr scoreData, const QString& hash = QString(),
const QString& secret = QString()) = 0;
};
}

#endif // MUSE_CLOUD_IMUSESCORECOMSERVICE_H
Loading
Loading