Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into feat/launcher-updater

Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
Trial97
2023-08-15 13:29:42 +03:00
712 changed files with 18878 additions and 17954 deletions

View File

@ -27,7 +27,7 @@ namespace Net {
class ApiHeaderProxy : public HeaderProxy {
public:
ApiHeaderProxy() : HeaderProxy(){};
ApiHeaderProxy() : HeaderProxy() {}
virtual ~ApiHeaderProxy() = default;
public:

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
* Copyright (c) 2022 flowln <flowlnlnln@gmail.com>
*
* This program is free software: you can redistribute it and/or modify

View File

@ -48,7 +48,7 @@ class Download : public NetRequest {
Q_OBJECT
public:
using Ptr = shared_qobject_ptr<class Download>;
explicit Download() : NetRequest() { logCat = taskDownloadLogC; };
explicit Download() : NetRequest() { logCat = taskDownloadLogC; }
#if defined(LAUNCHER_APPLICATION)
static auto makeCached(QUrl url, MetaEntryPtr entry, Options options = Option::NoOptions) -> Download::Ptr;

View File

@ -31,8 +31,8 @@ struct HeaderPair {
class HeaderProxy {
public:
HeaderProxy(){};
virtual ~HeaderProxy(){};
HeaderProxy() {}
virtual ~HeaderProxy() {}
public:
virtual QList<HeaderPair> headers(const QNetworkRequest& request) const = 0;
@ -43,7 +43,7 @@ class HeaderProxy {
for (auto header : headers(request)) {
request.setRawHeader(header.headerName, header.headerValue);
}
};
}
};
} // namespace Net

View File

@ -125,8 +125,9 @@ auto HttpMetaCache::resolveEntry(QString base, QString resource_path, QString ex
// Get rid of old entries, to prevent cache problems
auto current_time = QDateTime::currentSecsSinceEpoch();
if (entry->isExpired(current_time - ( file_last_changed / 1000 ))) {
qCWarning(taskNetLogC) << "[HttpMetaCache]" << "Removing cache entry because of old age!";
if (entry->isExpired(current_time - (file_last_changed / 1000))) {
qCWarning(taskNetLogC) << "[HttpMetaCache]"
<< "Removing cache entry because of old age!";
selected_base.entry_list.remove(resource_path);
return staleEntry(base, resource_path);
}

View File

@ -74,7 +74,7 @@ class MetaEntry {
auto getMaximumAge() -> qint64 { return m_max_age; }
void setMaximumAge(qint64 age) { m_max_age = age; }
bool isExpired(qint64 offset) { return !m_is_eternal && (m_current_age >= m_max_age - offset); };
bool isExpired(qint64 offset) { return !m_is_eternal && (m_current_age >= m_max_age - offset); }
protected:
QString m_baseId;

View File

@ -16,8 +16,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#pragma once
#include <QLoggingCategory>

View File

@ -46,32 +46,27 @@ namespace Net {
/** Maximum time to hold a cache entry
* = 1 week in seconds
*/
#define MAX_TIME_TO_EXPIRE 1*7*24*60*60
#define MAX_TIME_TO_EXPIRE 1 * 7 * 24 * 60 * 60
MetaCacheSink::MetaCacheSink(MetaEntryPtr entry, ChecksumValidator * md5sum, bool is_eternal)
:Net::FileSink(entry->getFullPath()), m_entry(entry), m_md5Node(md5sum), m_is_eternal(is_eternal)
MetaCacheSink::MetaCacheSink(MetaEntryPtr entry, ChecksumValidator* md5sum, bool is_eternal)
: Net::FileSink(entry->getFullPath()), m_entry(entry), m_md5Node(md5sum), m_is_eternal(is_eternal)
{
addValidator(md5sum);
}
Task::State MetaCacheSink::initCache(QNetworkRequest& request)
{
if (!m_entry->isStale())
{
if (!m_entry->isStale()) {
return Task::State::Succeeded;
}
// check if file exists, if it does, use its information for the request
QFile current(m_filename);
if(current.exists() && current.size() != 0)
{
if (m_entry->getRemoteChangedTimestamp().size())
{
if (current.exists() && current.size() != 0) {
if (m_entry->getRemoteChangedTimestamp().size()) {
request.setRawHeader(QString("If-Modified-Since").toLatin1(), m_entry->getRemoteChangedTimestamp().toLatin1());
}
if (m_entry->getETag().size())
{
if (m_entry->getETag().size()) {
request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->getETag().toLatin1());
}
}
@ -79,25 +74,23 @@ Task::State MetaCacheSink::initCache(QNetworkRequest& request)
return Task::State::Running;
}
Task::State MetaCacheSink::finalizeCache(QNetworkReply & reply)
Task::State MetaCacheSink::finalizeCache(QNetworkReply& reply)
{
QFileInfo output_file_info(m_filename);
if(wroteAnyData)
{
if (wroteAnyData) {
m_entry->setMD5Sum(m_md5Node->hash().toHex().constData());
}
m_entry->setETag(reply.rawHeader("ETag").constData());
if (reply.hasRawHeader("Last-Modified"))
{
if (reply.hasRawHeader("Last-Modified")) {
m_entry->setRemoteChangedTimestamp(reply.rawHeader("Last-Modified").constData());
}
m_entry->setLocalChangedTimestamp(output_file_info.lastModified().toUTC().toMSecsSinceEpoch());
{ // Cache lifetime
{ // Cache lifetime
if (m_is_eternal) {
qCDebug(taskMetaCacheLogC) << "Adding eternal cache entry:" << m_entry->getFullPath();
m_entry->makeEternal(true);
@ -141,4 +134,4 @@ bool MetaCacheSink::hasLocalData()
QFileInfo info(m_filename);
return info.exists() && info.size() != 0;
}
}
} // namespace Net

View File

@ -47,7 +47,7 @@
class NetAction : public Task {
Q_OBJECT
protected:
explicit NetAction() : Task(){};
explicit NetAction() : Task() {}
public:
using Ptr = shared_qobject_ptr<NetAction>;
@ -76,7 +76,7 @@ class NetAction : public Task {
qCritical() << "Certificate in question:\n" << cert.toText();
i++;
}
};
}
public slots:
void startAction(shared_qobject_ptr<QNetworkAccessManager> network)
@ -86,7 +86,7 @@ class NetAction : public Task {
}
protected:
void executeTask() override{};
void executeTask() override {}
public:
shared_qobject_ptr<QNetworkAccessManager> m_network;

View File

@ -52,7 +52,9 @@ class NetJob : public ConcurrentTask {
public:
using Ptr = shared_qobject_ptr<NetJob>;
explicit NetJob(QString job_name, shared_qobject_ptr<QNetworkAccessManager> network) : ConcurrentTask(nullptr, job_name), m_network(network) {}
explicit NetJob(QString job_name, shared_qobject_ptr<QNetworkAccessManager> network)
: ConcurrentTask(nullptr, job_name), m_network(network)
{}
~NetJob() override = default;
void startNext() override;

View File

@ -158,7 +158,7 @@ void NetRequest::downloadError(QNetworkReply::NetworkError error)
{
if (error == QNetworkReply::OperationCanceledError) {
qCCritical(logCat) << getUid().toString() << "Aborted " << m_url.toString();
m_state = State::AbortedByUser;
m_state = State::Failed;
} else {
if (m_options & Option::AcceptLocalFiles) {
if (m_sink->hasLocalData()) {
@ -275,6 +275,13 @@ void NetRequest::downloadFinished()
if (data.size()) {
qCDebug(logCat) << getUid().toString() << "Writing extra" << data.size() << "bytes";
m_state = m_sink->write(data);
if (m_state != State::Succeeded) {
qCDebug(logCat) << getUid().toString() << "Request failed to write:" << m_url.toString();
m_sink->abort();
emit failed("");
emit finished();
return;
}
}
// otherwise, finalize the whole graph
@ -310,10 +317,14 @@ void NetRequest::downloadReadyRead()
auto NetRequest::abort() -> bool
{
m_state = State::AbortedByUser;
if (m_reply) {
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) // QNetworkReply::errorOccurred added in 5.15
disconnect(m_reply.get(), &QNetworkReply::errorOccurred, nullptr, nullptr);
#else
disconnect(m_reply.get(), QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), nullptr, nullptr);
#endif
m_reply->abort();
} else {
m_state = State::AbortedByUser;
}
return true;
}

View File

@ -52,7 +52,7 @@ namespace Net {
class NetRequest : public NetAction {
Q_OBJECT
protected:
explicit NetRequest() : NetAction(){};
explicit NetRequest() : NetAction() {}
public:
using Ptr = shared_qobject_ptr<class NetRequest>;
@ -62,12 +62,12 @@ class NetRequest : public NetAction {
public:
~NetRequest() override = default;
void init() override{};
void init() override {}
public:
void addValidator(Validator* v);
auto abort() -> bool override;
auto canAbort() const -> bool override { return true; };
auto canAbort() const -> bool override { return true; }
private:
auto handleRedirect() -> bool;

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
* Copyright (c) 2022 Sefa Eyeoglu <contact@scrumplex.net>
*
* This program is free software: you can redistribute it and/or modify
@ -22,23 +22,22 @@
#include <QSet>
namespace Net {
inline bool isApplicationError(QNetworkReply::NetworkError x) {
// Mainly taken from https://github.com/qt/qtbase/blob/dev/src/network/access/qhttpthreaddelegate.cpp
static QSet<QNetworkReply::NetworkError> errors = {
QNetworkReply::ProtocolInvalidOperationError,
QNetworkReply::AuthenticationRequiredError,
QNetworkReply::ContentAccessDenied,
QNetworkReply::ContentNotFoundError,
QNetworkReply::ContentOperationNotPermittedError,
QNetworkReply::ProxyAuthenticationRequiredError,
QNetworkReply::ContentConflictError,
QNetworkReply::ContentGoneError,
QNetworkReply::InternalServerError,
QNetworkReply::OperationNotImplementedError,
QNetworkReply::ServiceUnavailableError,
QNetworkReply::UnknownServerError,
QNetworkReply::UnknownContentError
};
return errors.contains(x);
}
inline bool isApplicationError(QNetworkReply::NetworkError x)
{
// Mainly taken from https://github.com/qt/qtbase/blob/dev/src/network/access/qhttpthreaddelegate.cpp
static QSet<QNetworkReply::NetworkError> errors = { QNetworkReply::ProtocolInvalidOperationError,
QNetworkReply::AuthenticationRequiredError,
QNetworkReply::ContentAccessDenied,
QNetworkReply::ContentNotFoundError,
QNetworkReply::ContentOperationNotPermittedError,
QNetworkReply::ProxyAuthenticationRequiredError,
QNetworkReply::ContentConflictError,
QNetworkReply::ContentGoneError,
QNetworkReply::InternalServerError,
QNetworkReply::OperationNotImplementedError,
QNetworkReply::ServiceUnavailableError,
QNetworkReply::UnknownServerError,
QNetworkReply::UnknownContentError };
return errors.contains(x);
}
} // namespace Net

View File

@ -36,26 +36,26 @@
*/
#include "PasteUpload.h"
#include "BuildConfig.h"
#include "Application.h"
#include "BuildConfig.h"
#include <QDebug>
#include <QJsonObject>
#include <QFile>
#include <QHttpPart>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QJsonObject>
#include <QUrlQuery>
#include "net/Logging.h"
std::array<PasteUpload::PasteTypeInfo, 4> PasteUpload::PasteTypes = {
{{"0x0.st", "https://0x0.st", ""},
{"hastebin", "https://hst.sh", "/documents"},
{"paste.gg", "https://paste.gg", "/api/v1/pastes"},
{"mclo.gs", "https://api.mclo.gs", "/1/log"}}};
std::array<PasteUpload::PasteTypeInfo, 4> PasteUpload::PasteTypes = { { { "0x0.st", "https://0x0.st", "" },
{ "hastebin", "https://hst.sh", "/documents" },
{ "paste.gg", "https://paste.gg", "/api/v1/pastes" },
{ "mclo.gs", "https://api.mclo.gs", "/1/log" } } };
PasteUpload::PasteUpload(QWidget *window, QString text, QString baseUrl, PasteType pasteType) : m_window(window), m_baseUrl(baseUrl), m_pasteType(pasteType), m_text(text.toUtf8())
PasteUpload::PasteUpload(QWidget* window, QString text, QString baseUrl, PasteType pasteType)
: m_window(window), m_baseUrl(baseUrl), m_pasteType(pasteType), m_text(text.toUtf8())
{
if (m_baseUrl == "")
m_baseUrl = PasteTypes.at(pasteType).defaultBase;
@ -67,68 +67,64 @@ PasteUpload::PasteUpload(QWidget *window, QString text, QString baseUrl, PasteTy
m_uploadUrl = m_baseUrl + PasteTypes.at(pasteType).endpointPath;
}
PasteUpload::~PasteUpload()
{
}
PasteUpload::~PasteUpload() {}
void PasteUpload::executeTask()
{
QNetworkRequest request{QUrl(m_uploadUrl)};
QNetworkReply *rep{};
QNetworkRequest request{ QUrl(m_uploadUrl) };
QNetworkReply* rep{};
request.setHeader(QNetworkRequest::UserAgentHeader, APPLICATION->getUserAgentUncached().toUtf8());
switch (m_pasteType) {
case NullPointer: {
QHttpMultiPart *multiPart =
new QHttpMultiPart{QHttpMultiPart::FormDataType};
case NullPointer: {
QHttpMultiPart* multiPart = new QHttpMultiPart{ QHttpMultiPart::FormDataType };
QHttpPart filePart;
filePart.setBody(m_text);
filePart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
"form-data; name=\"file\"; filename=\"log.txt\"");
multiPart->append(filePart);
QHttpPart filePart;
filePart.setBody(m_text);
filePart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"file\"; filename=\"log.txt\"");
multiPart->append(filePart);
rep = APPLICATION->network()->post(request, multiPart);
multiPart->setParent(rep);
rep = APPLICATION->network()->post(request, multiPart);
multiPart->setParent(rep);
break;
}
case Hastebin: {
request.setHeader(QNetworkRequest::UserAgentHeader, APPLICATION->getUserAgentUncached().toUtf8());
rep = APPLICATION->network()->post(request, m_text);
break;
}
case Mclogs: {
QUrlQuery postData;
postData.addQueryItem("content", m_text);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
rep = APPLICATION->network()->post(request, postData.toString().toUtf8());
break;
}
case PasteGG: {
QJsonObject obj;
QJsonDocument doc;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
break;
}
case Hastebin: {
request.setHeader(QNetworkRequest::UserAgentHeader, APPLICATION->getUserAgentUncached().toUtf8());
rep = APPLICATION->network()->post(request, m_text);
break;
}
case Mclogs: {
QUrlQuery postData;
postData.addQueryItem("content", m_text);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
rep = APPLICATION->network()->post(request, postData.toString().toUtf8());
break;
}
case PasteGG: {
QJsonObject obj;
QJsonDocument doc;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
obj.insert("expires", QDateTime::currentDateTimeUtc().addDays(100).toString(Qt::DateFormat::ISODate));
obj.insert("expires", QDateTime::currentDateTimeUtc().addDays(100).toString(Qt::DateFormat::ISODate));
QJsonArray files;
QJsonObject logFileInfo;
QJsonObject logFileContentInfo;
logFileContentInfo.insert("format", "text");
logFileContentInfo.insert("value", QString::fromUtf8(m_text));
logFileInfo.insert("name", "log.txt");
logFileInfo.insert("content", logFileContentInfo);
files.append(logFileInfo);
QJsonArray files;
QJsonObject logFileInfo;
QJsonObject logFileContentInfo;
logFileContentInfo.insert("format", "text");
logFileContentInfo.insert("value", QString::fromUtf8(m_text));
logFileInfo.insert("name", "log.txt");
logFileInfo.insert("content", logFileContentInfo);
files.append(logFileInfo);
obj.insert("files", files);
obj.insert("files", files);
doc.setObject(obj);
rep = APPLICATION->network()->post(request, doc.toJson());
break;
}
doc.setObject(obj);
rep = APPLICATION->network()->post(request, doc.toJson());
break;
}
}
connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress);
@ -140,7 +136,6 @@ void PasteUpload::executeTask()
connect(rep, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), this, &PasteUpload::downloadError);
#endif
m_reply = std::shared_ptr<QNetworkReply>(rep);
setStatus(tr("Uploading to %1").arg(m_uploadUrl));
@ -158,97 +153,81 @@ void PasteUpload::downloadFinished()
QByteArray data = m_reply->readAll();
int statusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (m_reply->error() != QNetworkReply::NetworkError::NoError)
{
if (m_reply->error() != QNetworkReply::NetworkError::NoError) {
emitFailed(tr("Network error: %1").arg(m_reply->errorString()));
m_reply.reset();
return;
}
else if (statusCode != 200 && statusCode != 201)
{
} else if (statusCode != 200 && statusCode != 201) {
QString reasonPhrase = m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
emitFailed(tr("Error: %1 returned unexpected status code %2 %3").arg(m_uploadUrl).arg(statusCode).arg(reasonPhrase));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned unexpected status code " << statusCode << " with body: " << data;
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned unexpected status code " << statusCode
<< " with body: " << data;
m_reply.reset();
return;
}
switch (m_pasteType)
{
case NullPointer:
m_pasteLink = QString::fromUtf8(data).trimmed();
break;
case Hastebin: {
QJsonDocument jsonDoc{QJsonDocument::fromJson(data)};
QJsonObject jsonObj{jsonDoc.object()};
if (jsonObj.contains("key") && jsonObj["key"].isString())
{
QString key = jsonDoc.object()["key"].toString();
m_pasteLink = m_baseUrl + "/" + key;
}
else
{
emitFailed(tr("Error: %1 returned a malformed response body").arg(m_uploadUrl));
qCCritical(taskUploadLogC) << getUid().toString() << getUid().toString() << m_uploadUrl << " returned malformed response body: " << data;
return;
}
break;
}
case Mclogs: {
QJsonDocument jsonDoc{QJsonDocument::fromJson(data)};
QJsonObject jsonObj{jsonDoc.object()};
if (jsonObj.contains("success") && jsonObj["success"].isBool())
{
bool success = jsonObj["success"].toBool();
if (success)
{
m_pasteLink = jsonObj["url"].toString();
}
else
{
QString error = jsonObj["error"].toString();
emitFailed(tr("Error: %1 returned an error: %2").arg(m_uploadUrl, error));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned error: " << error;
qCCritical(taskUploadLogC) << getUid().toString() << "Response body: " << data;
switch (m_pasteType) {
case NullPointer:
m_pasteLink = QString::fromUtf8(data).trimmed();
break;
case Hastebin: {
QJsonDocument jsonDoc{ QJsonDocument::fromJson(data) };
QJsonObject jsonObj{ jsonDoc.object() };
if (jsonObj.contains("key") && jsonObj["key"].isString()) {
QString key = jsonDoc.object()["key"].toString();
m_pasteLink = m_baseUrl + "/" + key;
} else {
emitFailed(tr("Error: %1 returned a malformed response body").arg(m_uploadUrl));
qCCritical(taskUploadLogC) << getUid().toString() << getUid().toString() << m_uploadUrl
<< " returned malformed response body: " << data;
return;
}
break;
}
else
{
emitFailed(tr("Error: %1 returned a malformed response body").arg(m_uploadUrl));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned malformed response body: " << data;
return;
}
break;
}
case PasteGG:
QJsonDocument jsonDoc{QJsonDocument::fromJson(data)};
QJsonObject jsonObj{jsonDoc.object()};
if (jsonObj.contains("status") && jsonObj["status"].isString())
{
QString status = jsonObj["status"].toString();
if (status == "success")
{
m_pasteLink = m_baseUrl + "/p/anonymous/" + jsonObj["result"].toObject()["id"].toString();
}
else
{
QString error = jsonObj["error"].toString();
QString message = (jsonObj.contains("message") && jsonObj["message"].isString()) ? jsonObj["message"].toString() : "none";
emitFailed(tr("Error: %1 returned an error code: %2\nError message: %3").arg(m_uploadUrl, error, message));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned error: " << error;
qCCritical(taskUploadLogC) << getUid().toString() << "Error message: " << message;
qCCritical(taskUploadLogC) << getUid().toString() << "Response body: " << data;
case Mclogs: {
QJsonDocument jsonDoc{ QJsonDocument::fromJson(data) };
QJsonObject jsonObj{ jsonDoc.object() };
if (jsonObj.contains("success") && jsonObj["success"].isBool()) {
bool success = jsonObj["success"].toBool();
if (success) {
m_pasteLink = jsonObj["url"].toString();
} else {
QString error = jsonObj["error"].toString();
emitFailed(tr("Error: %1 returned an error: %2").arg(m_uploadUrl, error));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned error: " << error;
qCCritical(taskUploadLogC) << getUid().toString() << "Response body: " << data;
return;
}
} else {
emitFailed(tr("Error: %1 returned a malformed response body").arg(m_uploadUrl));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned malformed response body: " << data;
return;
}
break;
}
else
{
emitFailed(tr("Error: %1 returned a malformed response body").arg(m_uploadUrl));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned malformed response body: " << data;
return;
}
break;
case PasteGG:
QJsonDocument jsonDoc{ QJsonDocument::fromJson(data) };
QJsonObject jsonObj{ jsonDoc.object() };
if (jsonObj.contains("status") && jsonObj["status"].isString()) {
QString status = jsonObj["status"].toString();
if (status == "success") {
m_pasteLink = m_baseUrl + "/p/anonymous/" + jsonObj["result"].toObject()["id"].toString();
} else {
QString error = jsonObj["error"].toString();
QString message =
(jsonObj.contains("message") && jsonObj["message"].isString()) ? jsonObj["message"].toString() : "none";
emitFailed(tr("Error: %1 returned an error code: %2\nError message: %3").arg(m_uploadUrl, error, message));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned error: " << error;
qCCritical(taskUploadLogC) << getUid().toString() << "Error message: " << message;
qCCritical(taskUploadLogC) << getUid().toString() << "Response body: " << data;
return;
}
} else {
emitFailed(tr("Error: %1 returned a malformed response body").arg(m_uploadUrl));
qCCritical(taskUploadLogC) << getUid().toString() << m_uploadUrl << " returned malformed response body: " << data;
return;
}
break;
}
emitSucceeded();
}

View File

@ -35,17 +35,16 @@
#pragma once
#include "tasks/Task.h"
#include <QBuffer>
#include <QNetworkReply>
#include <QString>
#include <QBuffer>
#include <memory>
#include <array>
#include <memory>
#include "tasks/Task.h"
class PasteUpload : public Task
{
class PasteUpload : public Task {
Q_OBJECT
public:
public:
enum PasteType : int {
// 0x0.st
NullPointer,
@ -68,26 +67,23 @@ public:
static std::array<PasteTypeInfo, 4> PasteTypes;
PasteUpload(QWidget *window, QString text, QString url, PasteType pasteType);
PasteUpload(QWidget* window, QString text, QString url, PasteType pasteType);
virtual ~PasteUpload();
QString pasteLink()
{
return m_pasteLink;
}
protected:
QString pasteLink() { return m_pasteLink; }
protected:
virtual void executeTask();
private:
QWidget *m_window;
private:
QWidget* m_window;
QString m_pasteLink;
QString m_baseUrl;
QString m_uploadUrl;
PasteType m_pasteType;
QByteArray m_text;
std::shared_ptr<QNetworkReply> m_reply;
public
slots:
public slots:
void downloadError(QNetworkReply::NetworkError);
void downloadFinished();
};

View File

@ -27,7 +27,7 @@ namespace Net {
class RawHeaderProxy : public HeaderProxy {
public:
RawHeaderProxy() : HeaderProxy(){};
RawHeaderProxy() : HeaderProxy() {}
virtual ~RawHeaderProxy() = default;
public:

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
* Copyright (c) 2022 flowln <flowlnlnln@gmail.com>
*
* This program is free software: you can redistribute it and/or modify

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -37,16 +37,15 @@
#include "net/NetAction.h"
namespace Net {
class Validator
{
public: /* con/des */
Validator() {};
virtual ~Validator() {};
class Validator {
public: /* con/des */
Validator() {}
virtual ~Validator() {}
public: /* methods */
virtual bool init(QNetworkRequest & request) = 0;
virtual bool write(QByteArray & data) = 0;
public: /* methods */
virtual bool init(QNetworkRequest& request) = 0;
virtual bool write(QByteArray& data) = 0;
virtual bool abort() = 0;
virtual bool validate(QNetworkReply & reply) = 0;
virtual bool validate(QNetworkReply& reply) = 0;
};
}
} // namespace Net