186 lines
5.2 KiB
C++
186 lines
5.2 KiB
C++
|
#include "LegacyUpdate.h"
|
||
|
#include "lists/LwjglVersionList.h"
|
||
|
#include "BaseInstance.h"
|
||
|
#include "LegacyInstance.h"
|
||
|
#include "net/NetWorker.h"
|
||
|
#include <pathutils.h>
|
||
|
#include <quazip.h>
|
||
|
#include <quazipfile.h>
|
||
|
|
||
|
|
||
|
LegacyUpdate::LegacyUpdate ( BaseInstance* inst, QObject* parent ) : BaseUpdate ( inst, parent ) {}
|
||
|
|
||
|
void LegacyUpdate::executeTask()
|
||
|
{
|
||
|
lwjglStart();
|
||
|
}
|
||
|
|
||
|
void LegacyUpdate::lwjglStart()
|
||
|
{
|
||
|
LegacyInstance * inst = (LegacyInstance *) m_inst;
|
||
|
auto &list = LWJGLVersionList::get();
|
||
|
if(!list.isLoaded())
|
||
|
{
|
||
|
error("Too soon! Let the LWJGL list load :)");
|
||
|
emitEnded();
|
||
|
return;
|
||
|
}
|
||
|
QString lwjglVer = inst->lwjglVersion();
|
||
|
auto version = list.getVersion(lwjglVer);
|
||
|
if(!version)
|
||
|
{
|
||
|
error("Game update failed: the selected LWJGL version is invalid.");
|
||
|
emitEnded();
|
||
|
}
|
||
|
lwjglVersion = version->name();
|
||
|
QString url = version->url();
|
||
|
|
||
|
auto &worker = NetWorker::spawn();
|
||
|
QNetworkRequest req(url);
|
||
|
req.setRawHeader("Host", "sourceforge.net");
|
||
|
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
|
||
|
QNetworkReply * rep = worker.get ( req );
|
||
|
|
||
|
m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
|
||
|
connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
|
||
|
connect(&worker, SIGNAL(finished(QNetworkReply*)), SLOT(lwjglFinished(QNetworkReply*)));
|
||
|
//connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(downloadError(QNetworkReply::NetworkError)));
|
||
|
}
|
||
|
|
||
|
void LegacyUpdate::lwjglFinished(QNetworkReply* reply)
|
||
|
{
|
||
|
if(m_reply != reply)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
if(reply->error() != QNetworkReply::NoError)
|
||
|
{
|
||
|
error("Failed to download: " + reply->errorString() + "\nSometimes you have to wait a bit if you download many LWJGL versions in a row. YMMV");
|
||
|
emitEnded();
|
||
|
return;
|
||
|
}
|
||
|
auto &worker = NetWorker::spawn();
|
||
|
//Here i check if there is a cookie for me in the reply and extract it
|
||
|
QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie>>(reply->header(QNetworkRequest::SetCookieHeader));
|
||
|
if(cookies.count() != 0)
|
||
|
{
|
||
|
//you must tell which cookie goes with which url
|
||
|
worker.cookieJar()->setCookiesFromUrl(cookies, QUrl("sourceforge.net"));
|
||
|
}
|
||
|
|
||
|
//here you can check for the 302 or whatever other header i need
|
||
|
QVariant newLoc = reply->header(QNetworkRequest::LocationHeader);
|
||
|
if(newLoc.isValid())
|
||
|
{
|
||
|
auto &worker = NetWorker::spawn();
|
||
|
QString redirectedTo = reply->header(QNetworkRequest::LocationHeader).toString();
|
||
|
QNetworkRequest req(redirectedTo);
|
||
|
req.setRawHeader("Host", "sourceforge.net");
|
||
|
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
|
||
|
QNetworkReply * rep = worker.get(req);
|
||
|
connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
|
||
|
m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
|
||
|
return;
|
||
|
}
|
||
|
QFile saveMe("lwjgl.zip");
|
||
|
saveMe.open(QIODevice::WriteOnly);
|
||
|
saveMe.write(m_reply->readAll());
|
||
|
saveMe.close();
|
||
|
setStatus("Installing new LWJGL...");
|
||
|
extractLwjgl();
|
||
|
}
|
||
|
void LegacyUpdate::extractLwjgl()
|
||
|
{
|
||
|
// make sure the directories are there
|
||
|
QString lwjgl_base = PathCombine("lwjgl", lwjglVersion );
|
||
|
QString nativesPath = PathCombine( lwjgl_base, "natives/");
|
||
|
bool success = ensurePathExists(nativesPath);
|
||
|
|
||
|
if(!success)
|
||
|
{
|
||
|
error("Failed to extract the lwjgl libs - error when creating required folders.");
|
||
|
emitEnded();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
QuaZip zip("lwjgl.zip");
|
||
|
if(!zip.open(QuaZip::mdUnzip))
|
||
|
{
|
||
|
error("Failed to extract the lwjgl libs - not a valid archive.");
|
||
|
emitEnded();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// and now we are going to access files inside it
|
||
|
QuaZipFile file(&zip);
|
||
|
const QString jarNames[] = { "jinput.jar", "lwjgl_util.jar", "lwjgl.jar" };
|
||
|
for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile())
|
||
|
{
|
||
|
if(!file.open(QIODevice::ReadOnly))
|
||
|
{
|
||
|
zip.close();
|
||
|
error("Failed to extract the lwjgl libs - error while reading archive.");
|
||
|
emitEnded();
|
||
|
return;
|
||
|
}
|
||
|
QuaZipFileInfo info;
|
||
|
QString name = file.getActualFileName();
|
||
|
if(name.endsWith('/'))
|
||
|
{
|
||
|
file.close();
|
||
|
continue;
|
||
|
}
|
||
|
QString destFileName;
|
||
|
// Look for the jars
|
||
|
for (int i = 0; i < 3; i++)
|
||
|
{
|
||
|
if (name.endsWith(jarNames[i]))
|
||
|
{
|
||
|
destFileName = PathCombine(lwjgl_base, jarNames[i]);
|
||
|
}
|
||
|
}
|
||
|
// Not found? look for the natives
|
||
|
if(destFileName.isEmpty())
|
||
|
{
|
||
|
#ifdef Q_OS_WIN32
|
||
|
QString nativesDir = "windows";
|
||
|
#elif Q_OS_MAC
|
||
|
QString nativesDir = "macosx";
|
||
|
#else
|
||
|
QString nativesDir = "linux";
|
||
|
#endif
|
||
|
if (name.contains(nativesDir))
|
||
|
{
|
||
|
int lastSlash = name.lastIndexOf('/');
|
||
|
int lastBackSlash = name.lastIndexOf('/');
|
||
|
if(lastSlash != -1)
|
||
|
name = name.mid(lastSlash+1);
|
||
|
else if(lastBackSlash != -1)
|
||
|
name = name.mid(lastBackSlash+1);
|
||
|
destFileName = PathCombine(nativesPath, name);
|
||
|
}
|
||
|
}
|
||
|
// Now if destFileName is still empty, go to the next file.
|
||
|
if (!destFileName.isEmpty())
|
||
|
{
|
||
|
setStatus("Installing new LWJGL - Extracting " + name);
|
||
|
QFile output(destFileName);
|
||
|
output.open(QIODevice::WriteOnly);
|
||
|
output.write(file.readAll()); // FIXME: wste of memory!?
|
||
|
output.close();
|
||
|
}
|
||
|
file.close(); // do not forget to close!
|
||
|
}
|
||
|
zip.close();
|
||
|
m_reply.clear();
|
||
|
emit gameUpdateComplete();
|
||
|
emitEnded();
|
||
|
}
|
||
|
|
||
|
void LegacyUpdate::lwjglFailed()
|
||
|
{
|
||
|
error("Bad stuff happened while trying to get the lwjgl libs...");
|
||
|
emitEnded();
|
||
|
}
|
||
|
|