summaryrefslogtreecommitdiff
path: root/InternetUpdater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'InternetUpdater.cpp')
-rw-r--r--InternetUpdater.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/InternetUpdater.cpp b/InternetUpdater.cpp
new file mode 100644
index 0000000..a3dbded
--- /dev/null
+++ b/InternetUpdater.cpp
@@ -0,0 +1,110 @@
+#include "InternetUpdater.h"
+#include "EventDispatcher.h"
+#include "OptionEngine.h"
+#include "cpp11addition.h"
+
+#ifdef ULTRACOPIER_INTERNET_SUPPORT
+
+#include <QNetworkRequest>
+#include <QUrl>
+
+#include "PluginsManager.h"
+
+InternetUpdater::InternetUpdater(QObject *parent) :
+ QObject(parent)
+{
+ connect(&newUpdateTimer,&QTimer::timeout,this,&InternetUpdater::downloadFile);
+ connect(&firstUpdateTimer,&QTimer::timeout,this,&InternetUpdater::downloadFile);
+ newUpdateTimer.start(1000*3600);
+ firstUpdateTimer.setSingleShot(true);
+ firstUpdateTimer.start(1000*60);
+}
+
+void InternetUpdater::downloadFile()
+{
+ if(!stringtobool(OptionEngine::optionEngine->getOptionValue("Ultracopier","checkTheUpdate")))
+ return;
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ std::string name="Supercopier";
+ #else
+ std::string name="Ultracopier";
+ #endif
+ std::string ultracopierVersion;
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ ultracopierVersion=name+" Ultimate/"+ULTRACOPIER_VERSION;
+ #else
+ ultracopierVersion=name+"/"+ULTRACOPIER_VERSION;
+ #endif
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ ultracopierVersion+=" portable/all-in-one";
+ #else
+ ultracopierVersion+=" portable";
+ #endif
+ #else
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ ultracopierVersion+=" all-in-one";
+ #endif
+ #endif
+ #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
+ ultracopierVersion+=" (OS: "+EventDispatcher::GetOSDisplayString()+")";
+ #endif
+ ultracopierVersion+=" "+std::string(ULTRACOPIER_PLATFORM_CODE);
+ QNetworkRequest networkRequest(QStringLiteral(ULTRACOPIER_UPDATER_URL));
+ networkRequest.setHeader(QNetworkRequest::UserAgentHeader,QString::fromStdString(ultracopierVersion));
+ networkRequest.setRawHeader("Connection", "Close");
+ reply = qnam.get(networkRequest);
+ connect(reply, &QNetworkReply::finished, this, &InternetUpdater::httpFinished);
+}
+
+void InternetUpdater::httpFinished()
+{
+ QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+ if (!reply->isFinished())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"get the new update failed: not finished");
+ reply->deleteLater();
+ return;
+ }
+ else if (reply->error())
+ {
+ newUpdateTimer.stop();
+ newUpdateTimer.start(1000*3600*24);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"get the new update failed: "+reply->errorString().toStdString());
+ reply->deleteLater();
+ return;
+ } else if (!redirectionTarget.isNull()) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"redirection denied to: "+redirectionTarget.toUrl().toString().toStdString());
+ reply->deleteLater();
+ return;
+ }
+ QString newVersion=QString::fromUtf8(reply->readAll());
+ if(newVersion.isEmpty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"version string is empty");
+ reply->deleteLater();
+ return;
+ }
+ newVersion.remove("\n");
+ if(!newVersion.contains(QRegularExpression(QLatin1Literal("^[0-9]+(\\.[0-9]+)+$"))))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"version string don't match: "+newVersion.toStdString());
+ reply->deleteLater();
+ return;
+ }
+ if(newVersion==ULTRACOPIER_VERSION)
+ {
+ reply->deleteLater();
+ return;
+ }
+ if(PluginsManager::compareVersion(newVersion.toStdString(),"<=",ULTRACOPIER_VERSION))
+ {
+ reply->deleteLater();
+ return;
+ }
+ newUpdateTimer.stop();
+ emit newUpdate(newVersion.toStdString());
+ reply->deleteLater();
+}
+
+#endif