diff options
author | Petr Mrázek <peterix@gmail.com> | 2021-07-25 19:11:59 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2021-07-25 19:50:44 +0200 |
commit | 20b9f2b42a3b58b6081af271774fbcc34025dccb (patch) | |
tree | 064fa59facb3357139b47bd4e60bfc8edb35ca11 /launcher/net/FileSink.cpp | |
parent | dd133680858351e3e07690e286882327a4f42ba5 (diff) | |
download | PrismLauncher-20b9f2b42a3b58b6081af271774fbcc34025dccb.tar.gz PrismLauncher-20b9f2b42a3b58b6081af271774fbcc34025dccb.tar.bz2 PrismLauncher-20b9f2b42a3b58b6081af271774fbcc34025dccb.zip |
NOISSUE Flatten gui and logic libraries into MultiMC
Diffstat (limited to 'launcher/net/FileSink.cpp')
-rw-r--r-- | launcher/net/FileSink.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/launcher/net/FileSink.cpp b/launcher/net/FileSink.cpp new file mode 100644 index 00000000..8b3e917d --- /dev/null +++ b/launcher/net/FileSink.cpp @@ -0,0 +1,115 @@ +#include "FileSink.h" +#include <QFile> +#include <QFileInfo> +#include "Env.h" +#include "FileSystem.h" + +namespace Net { + +FileSink::FileSink(QString filename) + :m_filename(filename) +{ + // nil +} + +FileSink::~FileSink() +{ + // nil +} + +JobStatus FileSink::init(QNetworkRequest& request) +{ + auto result = initCache(request); + if(result != Job_InProgress) + { + return result; + } + // create a new save file and open it for writing + if (!FS::ensureFilePathExists(m_filename)) + { + qCritical() << "Could not create folder for " + m_filename; + return Job_Failed; + } + wroteAnyData = false; + m_output_file.reset(new QSaveFile(m_filename)); + if (!m_output_file->open(QIODevice::WriteOnly)) + { + qCritical() << "Could not open " + m_filename + " for writing"; + return Job_Failed; + } + + if(initAllValidators(request)) + return Job_InProgress; + return Job_Failed; +} + +JobStatus FileSink::initCache(QNetworkRequest &) +{ + return Job_InProgress; +} + +JobStatus FileSink::write(QByteArray& data) +{ + if (!writeAllValidators(data) || m_output_file->write(data) != data.size()) + { + qCritical() << "Failed writing into " + m_filename; + m_output_file->cancelWriting(); + m_output_file.reset(); + wroteAnyData = false; + return Job_Failed; + } + wroteAnyData = true; + return Job_InProgress; +} + +JobStatus FileSink::abort() +{ + m_output_file->cancelWriting(); + failAllValidators(); + return Job_Failed; +} + +JobStatus FileSink::finalize(QNetworkReply& reply) +{ + bool gotFile = false; + QVariant statusCodeV = reply.attribute(QNetworkRequest::HttpStatusCodeAttribute); + bool validStatus = false; + int statusCode = statusCodeV.toInt(&validStatus); + if(validStatus) + { + // this leaves out 304 Not Modified + gotFile = statusCode == 200 || statusCode == 203; + } + // if we wrote any data to the save file, we try to commit the data to the real file. + // if it actually got a proper file, we write it even if it was empty + if (gotFile || wroteAnyData) + { + // ask validators for data consistency + // we only do this for actual downloads, not 'your data is still the same' cache hits + if(!finalizeAllValidators(reply)) + return Job_Failed; + // nothing went wrong... + if (!m_output_file->commit()) + { + qCritical() << "Failed to commit changes to " << m_filename; + m_output_file->cancelWriting(); + return Job_Failed; + } + } + // then get rid of the save file + m_output_file.reset(); + + return finalizeCache(reply); +} + +JobStatus FileSink::finalizeCache(QNetworkReply &) +{ + return Job_Finished; +} + +bool FileSink::hasLocalData() +{ + QFileInfo info(m_filename); + return info.exists() && info.size() != 0; +} +} |