Files
86Box/src/qt/qt_downloader.cpp
cold-brewed c6da2caff2 vmm preview
2025-05-30 15:20:23 +05:00

96 lines
2.6 KiB
C++

/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Downloader module
*
*
*
* Authors: cold-brewed
*
* Copyright 2024 cold-brewed
*/
#include <QDir>
#include <QFile>
#include <QNetworkReply>
#include <QStandardPaths>
#include "qt_downloader.hpp"
extern "C" {
#include <86box/plat.h>
}
Downloader::
Downloader(const DownloadLocation downloadLocation, QObject *parent)
: QObject(parent)
, file(nullptr)
, reply(nullptr)
, variantData(QVariant::Invalid)
{
char PATHBUF[256];
switch (downloadLocation) {
case DownloadLocation::Data:
plat_get_global_data_dir(PATHBUF, 255);
break;
case DownloadLocation::Config:
plat_get_global_config_dir(PATHBUF, 255);
break;
case DownloadLocation::Temp:
plat_get_temp_dir(PATHBUF, 255);
break;
}
downloadDirectory = QDir(PATHBUF);
}
Downloader::~Downloader() { delete file; }
void Downloader::download(const QUrl &url, const QString &filepath, const QVariant &varData) {
variantData = varData;
// temporary until I get the plat stuff fixed
// const auto global_dir = temporaryGetGlobalDataDir();
// qDebug() << "I was passed filepath " << filepath;
// Join with filename to create final file
// const auto final_path = QDir(global_dir).filePath(filepath);
const auto final_path = downloadDirectory.filePath(filepath);
file = new QFile(final_path);
if(!file->open(QIODevice::WriteOnly)) {
qWarning() << "Unable to open file " << final_path;
return;
}
const auto nam = new QNetworkAccessManager(this);
// Create the network request and execute
const auto request = QNetworkRequest(url);
reply = nam->get(request);
// Connect to the finished signal
connect(reply, &QNetworkReply::finished, this, &Downloader::onResult);
}
void
Downloader::onResult()
{
if (reply->error()) {
qWarning() << "Error returned from QNetworkRequest: " << reply->errorString();
emit errorOccurred(reply->errorString());
reply->deleteLater();
return;
}
file->write(reply->readAll());
file->flush();
file->close();
reply->deleteLater();
qDebug() << Q_FUNC_INFO << "Downloaded complete: file written to " << file->fileName();
emit downloadCompleted(file->fileName(), variantData);
}