|
@@ -0,0 +1,114 @@
|
|
|
+#include "models/patchdownloader.h"
|
|
|
+#include "models/settings.h"
|
|
|
+#include "models/filesystem.h"
|
|
|
+
|
|
|
+#include <QUrlQuery>
|
|
|
+
|
|
|
+void PatchDownloader::init() {
|
|
|
+ for (const QString& patch: patches_) {
|
|
|
+ patch_downloaders_[patch] = new Downloader(this);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+PatchDownloader::~PatchDownloader()
|
|
|
+{
|
|
|
+ for (const QString& patch: patches_) {
|
|
|
+ patch_downloaders_[patch]->deleteLater();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+PatchDownloader::PatchDownloader() {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void PatchDownloader::startPatchDownloaderChain() {
|
|
|
+ checkForUpdates();
|
|
|
+ download();
|
|
|
+}
|
|
|
+
|
|
|
+void PatchDownloader::checkForUpdates() {
|
|
|
+ qDebug() << "CHECKING FOR UPDATES!";
|
|
|
+ QUrlQuery query;
|
|
|
+
|
|
|
+ for (const QString& patch: patches_) {
|
|
|
+ query.addQueryItem(patch, "100");
|
|
|
+ }
|
|
|
+
|
|
|
+ QUrl target_url;
|
|
|
+ target_url.setUrl(Settings::getValue("Network/patch_updates_url").toString());
|
|
|
+ target_url.setQuery(query);
|
|
|
+
|
|
|
+ QByteArray target_array;
|
|
|
+ Downloader downloader;
|
|
|
+ downloader.setUrl(target_url);
|
|
|
+ downloader.targetBytearray = &target_array;
|
|
|
+ downloader.start();
|
|
|
+ downloader.waitForDownloaded();
|
|
|
+
|
|
|
+ if (target_array.isEmpty()) {
|
|
|
+ qWarning() << "PatchDwnlder: Cannot check for updates, target_array is empty!";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ qDebug() << "CHECK FOR UPDATES RESULT: " << target_array;
|
|
|
+
|
|
|
+ QStringList patch_info = QString(target_array).split('|');
|
|
|
+ if (patch_info.size() != patches_.size()) {
|
|
|
+ qCritical() << __FUNCTION__ << "Incorrect patches number! Data: " << patch_info;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < patches_.size(); ++i) {
|
|
|
+ const QString patch = patches_[i];
|
|
|
+ const QStringList patch_data = patch_info[i].split(":::");
|
|
|
+ if (patch_data.size() != 3) {
|
|
|
+ qCritical() << __FUNCTION__ << "Incorrect patch entry size! Entry: " << patch_data;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ QString patch_filename = Settings::getValue("General/PatchDownloadDir").toString() + "/" + patch;
|
|
|
+
|
|
|
+ Settings::setValue("PatchDatabases/" + patch + "/url", patch_data[0]);
|
|
|
+ Settings::setValue("PatchDatabases/" + patch + "/hashsum", patch_data[1]);
|
|
|
+ Settings::setValue("PatchDatabases/" + patch + "/datetime", patch_data[2]);
|
|
|
+ Settings::setValue("PatchDatabases/" + patch + "/path", patch_filename);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void PatchDownloader::download() {
|
|
|
+ qDebug() << "STARTING PATCH DOWNLOAD";
|
|
|
+ for (const QString& patch: patches_) {
|
|
|
+ QString target_filename = Settings::getValue("PatchDatabases/" + patch + "/path").toString();
|
|
|
+
|
|
|
+ qDebug() << patch << ": Checking if there's need to download patch";
|
|
|
+ if (!needDownloadDatabase(patch)) {
|
|
|
+ qInfo() << patch << ": file " << target_filename << " is up-to-date, no need to download";
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ FileSystem::createFilePath(target_filename);
|
|
|
+ QFile* target_file = new QFile(target_filename);
|
|
|
+ if (!target_file->open(QIODevice::ReadWrite | QIODevice::Truncate)) {
|
|
|
+ qWarning() << "PatchDwnlder" << patch << "Cannot open file " << target_filename;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ qInfo() << "PatchDwnlder" << patch << ": beginning download of file " << target_filename;
|
|
|
+
|
|
|
+ patch_downloaders_[patch]->setUrl(Settings::getValue("PatchDatabases/" + patch + "/url").toUrl());
|
|
|
+ patch_downloaders_[patch]->targetFile = target_file;
|
|
|
+ patch_downloaders_[patch]->start();
|
|
|
+ patch_downloaders_[patch]->waitForDownloaded();
|
|
|
+ target_file->close();
|
|
|
+ target_file->deleteLater();
|
|
|
+ Settings::setValue("DatabaseNeedInstall/" + patch, true);
|
|
|
+ }
|
|
|
+ qDebug() << "FINISHED PATCH DOWNLOAD";
|
|
|
+}
|
|
|
+
|
|
|
+bool PatchDownloader::needDownloadDatabase(QString db_name)
|
|
|
+{
|
|
|
+ QString patch_filename = Settings::getValue("PatchDatabases/" + db_name + "/path").toString();
|
|
|
+ QString current_file_hash = FileSystem::fileHash(patch_filename);
|
|
|
+ QString required_file_hash = Settings::getValue("PatchDatabases/" + db_name + "/hashsum").toString();
|
|
|
+ return Settings::getValue("DatabaseDownload/" + db_name).toBool() && (current_file_hash != required_file_hash);
|
|
|
+}
|