From dde9aeda550c482d45caca867dd50a9849384100 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 24 Feb 2024 11:48:02 -0500 Subject: [PATCH] Make Dalamud asset downloading more reliable This uses the complete package which should prevent partial downloads. In the future it should check for the hashes they give us. (cherry picked from commit 51715ca3be52b231cbed1dc791f077fe95529edc) --- launcher/include/assetupdater.h | 1 + launcher/src/assetupdater.cpp | 44 ++++++++++++++------------------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/launcher/include/assetupdater.h b/launcher/include/assetupdater.h index cb67377..0bd59e1 100644 --- a/launcher/include/assetupdater.h +++ b/launcher/include/assetupdater.h @@ -61,6 +61,7 @@ private: int m_remoteDalamudAssetVersion = -1; QJsonArray m_remoteDalamudAssetArray; QString m_remoteDalamudDownloadUrl; + QString m_remoteDalamudAssetPackageUrl; QString m_remoteCompatibilityToolVersion; QString m_remoteDxvkToolVersion; // TODO: hardcoded diff --git a/launcher/src/assetupdater.cpp b/launcher/src/assetupdater.cpp index 4418d58..b2d8dfd 100644 --- a/launcher/src/assetupdater.cpp +++ b/launcher/src/assetupdater.cpp @@ -130,6 +130,7 @@ QCoro::Task AssetUpdater::checkRemoteDalamudAssetVersion() const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll()); m_remoteDalamudAssetVersion = doc.object()["version"_L1].toInt(); + m_remoteDalamudAssetPackageUrl = doc.object()["packageUrl"_L1].toString(); m_remoteDalamudAssetArray = doc.object()["assets"_L1].toArray(); qInfo(ASTRA_LOG) << "Dalamud asset remote version" << m_remoteDalamudAssetVersion; @@ -265,36 +266,27 @@ QCoro::Task AssetUpdater::installDalamudAssets() { Q_EMIT launcher.stageChanged(i18n("Updating Dalamud assets...")); - QFutureSynchronizer synchronizer; + const QNetworkRequest request = QNetworkRequest(QUrl(m_remoteDalamudAssetPackageUrl)); + Utility::printRequest(QStringLiteral("GET"), request); - for (const auto &assetObject : m_remoteDalamudAssetArray) { - const QNetworkRequest assetRequest(QUrl(assetObject.toObject()["url"_L1].toString())); - Utility::printRequest(QStringLiteral("GET"), assetRequest); - - const auto assetReply = launcher.mgr()->get(assetRequest); - - const auto future = QtFuture::connect(assetReply, &QNetworkReply::finished).then([this, assetReply, assetObject] { - const QString fileName = assetObject.toObject()["fileName"_L1].toString(); - const QString dirPath = fileName.left(fileName.lastIndexOf('/'_L1)); - - const QString path = m_dalamudAssetDir.absoluteFilePath(dirPath); - Utility::createPathIfNeeded(path); - - QFile file(m_dalamudAssetDir.absoluteFilePath(assetObject.toObject()["fileName"_L1].toString())); - file.open(QIODevice::WriteOnly); - file.write(assetReply->readAll()); - file.close(); - }); - - synchronizer.addFuture(future); - } - - co_await QtConcurrent::run([&synchronizer] { - synchronizer.waitForFinished(); - }); + const auto reply = launcher.mgr()->get(request); + co_await reply; qInfo(ASTRA_LOG) << "Finished downloading Dalamud assets"; + QFile file(m_tempDir.filePath(QStringLiteral("dalamud-assets.zip"))); + file.open(QIODevice::WriteOnly); + file.write(reply->readAll()); + file.close(); + + if (!extractZip(m_tempDir.filePath(QStringLiteral("dalamud-assets.zip")), m_dalamudAssetDir.absolutePath())) { + qCritical(ASTRA_LOG) << "Failed to install Dalamud assets"; + Q_EMIT launcher.dalamudError(i18n("Failed to install Dalamud assets.")); + co_return false; + } + + // TODO: check for file hashes + m_profile.setDalamudAssetVersion(m_remoteDalamudAssetVersion); Utility::writeVersion(m_dalamudAssetDir.absoluteFilePath(QStringLiteral("asset.ver")), QString::number(m_remoteDalamudAssetVersion));