mirror of
https://github.com/redstrate/Astra.git
synced 2025-04-22 20:47:45 +00:00
Add boot update support
Now with the related changes in libxiv, Astra is now capable of updating the boot folder on it's own! The actual user-visible flow however is a WIP. This also includes changes to properly load version files from a freshly installed game, and report expansion levels correctly.
This commit is contained in:
parent
2bb7b90bec
commit
06c9658e94
4 changed files with 47 additions and 10 deletions
|
@ -411,6 +411,7 @@ void LauncherCore::readGameVersion() {
|
||||||
for(auto& profile : profileSettings) {
|
for(auto& profile : profileSettings) {
|
||||||
profile.bootVersion = readVersion(profile.gamePath + "/boot/ffxivboot.ver");
|
profile.bootVersion = readVersion(profile.gamePath + "/boot/ffxivboot.ver");
|
||||||
profile.gameVersion = readVersion(profile.gamePath + "/game/ffxivgame.ver");
|
profile.gameVersion = readVersion(profile.gamePath + "/game/ffxivgame.ver");
|
||||||
|
profile.installedMaxExpansion = 0;
|
||||||
|
|
||||||
for(auto dir : QDir(profile.gamePath + "/game/sqpack/").entryList(QDir::Filter::Dirs)) {
|
for(auto dir : QDir(profile.gamePath + "/game/sqpack/").entryList(QDir::Filter::Dirs)) {
|
||||||
if(dir.contains("ex") && dir.length() == 3 && dir[2].isDigit()) {
|
if(dir.contains("ex") && dir.length() == 3 && dir[2].isDigit()) {
|
||||||
|
@ -418,10 +419,6 @@ void LauncherCore::readGameVersion() {
|
||||||
|
|
||||||
profile.installedMaxExpansion = std::max(profile.installedMaxExpansion, expacVersion);
|
profile.installedMaxExpansion = std::max(profile.installedMaxExpansion, expacVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dir == "ffxiv") {
|
|
||||||
profile.installedMaxExpansion = std::max(profile.installedMaxExpansion, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
readExpansionVersions(profile, profile.installedMaxExpansion);
|
readExpansionVersions(profile, profile.installedMaxExpansion);
|
||||||
|
|
|
@ -425,7 +425,7 @@ void SettingsWindow::reloadControls() {
|
||||||
directXCombo->setCurrentIndex(profile.useDX9 ? 1 : 0);
|
directXCombo->setCurrentIndex(profile.useDX9 ? 1 : 0);
|
||||||
currentGameDirectory->setText(profile.gamePath);
|
currentGameDirectory->setText(profile.gamePath);
|
||||||
|
|
||||||
if(profile.installedMaxExpansion == -1) {
|
if(profile.gameVersion.isEmpty()) {
|
||||||
expansionVersionLabel->setText("No game installed.");
|
expansionVersionLabel->setText("No game installed.");
|
||||||
} else {
|
} else {
|
||||||
QString expacString;
|
QString expacString;
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QFile>
|
||||||
|
#include <patch.h>
|
||||||
|
|
||||||
#include "squarelauncher.h"
|
#include "squarelauncher.h"
|
||||||
|
|
||||||
|
@ -32,14 +35,51 @@ void SquareBoot::bootCheck(LoginInformation& info) {
|
||||||
|
|
||||||
auto reply = window.mgr->get(request);
|
auto reply = window.mgr->get(request);
|
||||||
connect(reply, &QNetworkReply::finished, [=] {
|
connect(reply, &QNetworkReply::finished, [=] {
|
||||||
QString response = reply->readAll();
|
const QString response = reply->readAll();
|
||||||
|
|
||||||
if(response.isEmpty()) {
|
if(response.isEmpty()) {
|
||||||
launcher.getStored(info);
|
launcher.getStored(info);
|
||||||
} else {
|
} else {
|
||||||
auto messageBox = new QMessageBox(QMessageBox::Icon::Critical, "Failed to Login", "Failed to launch. The game may require an update, please use another launcher.");
|
// TODO: move this out into a dedicated function, we need to use this for regular game patches later on
|
||||||
window.addUpdateButtons(*info.settings, *messageBox);
|
// TODO: create a nice progress window like ffxivboot has
|
||||||
|
// TODO: improve flow when updating boot, maybe do at launch ala official launcher?
|
||||||
|
const QStringList parts = response.split(QRegExp("\n|\r\n|\r"));
|
||||||
|
|
||||||
messageBox->show();
|
// patch list starts at line 5
|
||||||
|
for(int i = 5; i < parts.size() - 2; i++) {
|
||||||
|
const QStringList patchParts = parts[i].split("\t");
|
||||||
|
|
||||||
|
const int length = patchParts[0].toInt();
|
||||||
|
const int version = patchParts[4].toInt();
|
||||||
|
const int hashType = patchParts[5].toInt();
|
||||||
|
|
||||||
|
QString name = patchParts[4];
|
||||||
|
QString url = patchParts[5];
|
||||||
|
|
||||||
|
QNetworkRequest patchRequest(url);
|
||||||
|
auto patchReply = window.mgr->get(patchRequest);
|
||||||
|
connect(patchReply, &QNetworkReply::finished, [=] {
|
||||||
|
const QString dataDir =
|
||||||
|
QStandardPaths::writableLocation(QStandardPaths::TempLocation);
|
||||||
|
|
||||||
|
QFile file(dataDir + "/" + name + ".patch");
|
||||||
|
file.open(QIODevice::WriteOnly);
|
||||||
|
file.write(patchReply->readAll());
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// TODO: we really a dedicated .ver writing/reading class
|
||||||
|
QFile verFile(info.settings->gamePath + "/boot/ffxivboot.ver");
|
||||||
|
verFile.open(QIODevice::WriteOnly | QIODevice::Text);
|
||||||
|
verFile.write(name.toUtf8());
|
||||||
|
verFile.close();
|
||||||
|
|
||||||
|
processPatch((dataDir + "/" + name + ".patch").toStdString(), (info.settings->gamePath + "/boot").toStdString());
|
||||||
|
|
||||||
|
auto messageBox = new QMessageBox(QMessageBox::Icon::Critical, "Successfully updated", "ffxivboot is now updated to " + name);
|
||||||
|
|
||||||
|
messageBox->show();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
|
@ -171,7 +171,7 @@ void SquareLauncher::registerSession(const LoginInformation& info) {
|
||||||
|
|
||||||
QString report = info.settings->bootVersion + "=" + getBootHash(info);
|
QString report = info.settings->bootVersion + "=" + getBootHash(info);
|
||||||
|
|
||||||
for(int i = 0; i < info.settings->expansionVersions.size(); i++)
|
for(int i = 0; i < info.settings->installedMaxExpansion; i++)
|
||||||
report += QString("\nex%1\t%2").arg(QString::number(i + 1), info.settings->expansionVersions[i]);
|
report += QString("\nex%1\t%2").arg(QString::number(i + 1), info.settings->expansionVersions[i]);
|
||||||
|
|
||||||
auto reply = window.mgr->post(request, report.toUtf8());
|
auto reply = window.mgr->post(request, report.toUtf8());
|
||||||
|
|
Loading…
Add table
Reference in a new issue