///////////////////////////////////////////////////////////////////////////////
// MuldeR's Utilities for Qt
-// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2018 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#pragma once
+//MUtils
+#include <MUtils/Global.h>
+
+//Qt
#include <QThread>
#include <QDate>
+class QUrl;
+
///////////////////////////////////////////////////////////////////////////////
namespace MUtils
{
- class UpdateCheckerInfo
+ class MUTILS_API UpdateCheckerInfo
{
friend class UpdateChecker;
public:
UpdateCheckerInfo(void);
void resetInfo(void);
+ bool isComplete(void);
const quint32 &getBuildNo(void) const { return m_buildNo; }
const QDate &getBuildDate(void) const { return m_buildDate; }
const QString &getDownloadAddress(void) const { return m_downloadAddress; }
const QString &getDownloadFilename(void) const { return m_downloadFilename; }
const QString &getDownloadFilecode(void) const { return m_downloadFilecode; }
+ const QString &getDownloadChecksum(void) const { return m_downloadChecksum; }
private:
quint32 m_buildNo;
QString m_downloadAddress;
QString m_downloadFilename;
QString m_downloadFilecode;
+ QString m_downloadChecksum;
};
// ----------------------------------------------------------------
- class UpdateChecker : public QThread
+ class MUTILS_API UpdateChecker : public QThread
{
Q_OBJECT
UpdateStatus_CompletedNewVersionOlder = 5,
UpdateStatus_ErrorNoConnection = 6,
UpdateStatus_ErrorConnectionTestFailed = 7,
- UpdateStatus_ErrorFetchUpdateInfo = 8
+ UpdateStatus_ErrorFetchUpdateInfo = 8,
+ UpdateStatus_CancelledByUser = 9
}
update_status_t;
- UpdateChecker(const QString &binWGet, const QString &binGnuPG, const QString &binKeys, const QString &applicationId, const quint32 &installedBuildNo, const bool betaUpdates, const bool testMode = false);
+ UpdateChecker(const QString &binCurl, const QString &binGnuPG, const QString &binKeys, const QString &applicationId, const quint32 &installedBuildNo, const bool betaUpdates, const bool testMode = false);
~UpdateChecker(void);
- const int getUpdateStatus(void) const { return m_status; }
- const bool getSuccess(void) const { return m_success; };
- const int getMaximumProgress(void) const { return m_maxProgress; };
- const int getCurrentProgress(void) const { return m_progress; };
- const UpdateCheckerInfo *getUpdateInfo(void) const { return m_updateInfo; }
+ const int getUpdateStatus(void) const { return m_status; }
+ const bool getSuccess(void) const { return m_success; };
+ const int getMaximumProgress(void) const { return m_maxProgress; };
+ const int getCurrentProgress(void) const { return m_progress; };
+ const UpdateCheckerInfo *getUpdateInfo(void) const { return m_updateInfo.data(); }
+
+ bool cancel(void) { return m_cancelled.ref(); }
+
+ public slots:
+ void start(Priority = InheritPriority);
protected:
void run(void);
void checkForUpdates(void);
- void testKnownHosts(void);
+ void testMirrorsList(void);
signals:
void statusChanged(const int status);
private:
const int m_maxProgress;
- UpdateCheckerInfo *const m_updateInfo;
+ QScopedPointer<UpdateCheckerInfo> m_updateInfo;
const bool m_betaUpdates;
const bool m_testMode;
const QString m_applicationId;
const quint32 m_installedBuildNo;
- const QString m_binaryWGet;
+ const QString m_binaryCurl;
const QString m_binaryGnuPG;
const QString m_binaryKeys;
- volatile bool m_success;
+ const QScopedPointer<const QHash<QString, QString>> m_environment;
+
+ QAtomicInt m_success;
+ QAtomicInt m_cancelled;
int m_status;
int m_progress;
inline void setProgress(const int progress);
inline void log(const QString &str1, const QString &str2 = QString(), const QString &str3 = QString(), const QString &str4 = QString());
- bool getFile(const QString &url, const QString &outFile, unsigned int maxRedir = 5, bool *httpOk = NULL);
bool getUpdateInfo(const QString &url, const QString &outFileVers, const QString &outFileSign);
- int tryContactHost(const QString &url);
- bool tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url);
- bool checkSignature(const QString &file, const QString &signature);
+ bool tryContactHost(const QString &hostname, const int &timeoutMsec);
bool parseVersionInfo(const QString &file, UpdateCheckerInfo *updateInfo);
+
+ bool getFile(const QUrl &url, const QString &outFile, const unsigned int maxRedir = 8U);
+ bool checkSignature(const QString &file, const QString &signature);
+ bool tryUpdateMirror(UpdateCheckerInfo *updateInfo, const QString &url, const bool &quick);
+
+ bool execCurl(const QStringList &args, const QString &workingDir, const int timeout);
+ int execProcess(const QString &programFile, const QStringList &args, const QString &workingDir, const int timeout);
};
}