#include <QEventLoop>
#include <QTimer>
#include <QElapsedTimer>
+#include <QSet>
using namespace MUtils;
"http://muldersoft.com/",
"http://mulder.bplaced.net/",
"http://mulder.6te.net/",
- "http://mulder.webuda.com/",
+ "http://mulder.000webhostapp.com/", //"http://mulder.webuda.com/",
"http://mulder.pe.hu/",
"http://muldersoft.square7.ch/",
"http://muldersoft.co.nf/",
"www.bing.com",
"www.bingeandgrab.com",
"www.bucketheadpikes.com",
- "www.buckethead-coop.com",
"www.buzzfeed.com",
"www.cam.ac.uk",
"www.ccc.de",
"www.der-postillon.com",
"www.ebay.com",
"www.equation.com",
+ "www.ethz.ch",
"www.farbrausch.de",
"fc2.com",
"fedoraproject.org",
"www.nytimes.com",
"www.opera.com",
"www.oxford.gov.uk",
+ "www.ox-fanzine.de",
"www.partha.com",
"pastebin.com",
"pastie.org",
"www.qt.io",
"www.quakelive.com",
"rationalqm.us",
+ "www.reddit.com",
"www.rwth-aachen.de",
"www.seamonkey-project.org",
"selfhtml.org",
"www.tdrsmusic.com",
"tu-dresden.de",
"www.ubuntu.com",
+ "portal.uned.es",
+ "www.unibuc.ro",
+ "www.uniroma1.it",
+ "www.univ-paris1.fr",
+ "www.univer.kharkov.ua",
+ "www.univie.ac.at",
"www.uol.com.br",
+ "www.uva.nl",
+ "www.uw.edu.pl",
"www.videohelp.com",
"www.videolan.org",
"virtualdub.org",
#define CHECK_CANCELLED() do \
{ \
- if(m_cancelled) \
+ if(MUTILS_BOOLIFY(m_cancelled)) \
{ \
- m_success = false; \
+ m_success.fetchAndStoreOrdered(0); \
log("", "Update check has been cancelled by user!"); \
setProgress(m_maxProgress); \
setStatus(UpdateStatus_CancelledByUser); \
// Constructor & Destructor
////////////////////////////////////////////////////////////
-UpdateChecker::UpdateChecker(const QString &binWGet, const QString &binNC, const QString &binGnuPG, const QString &binKeys, const QString &applicationId, const quint32 &installedBuildNo, const bool betaUpdates, const bool testMode)
+UpdateChecker::UpdateChecker(const QString &binWGet, const QString &binMCat, const QString &binGnuPG, const QString &binKeys, const QString &applicationId, const quint32 &installedBuildNo, const bool betaUpdates, const bool testMode)
:
m_updateInfo(new UpdateCheckerInfo()),
m_binaryWGet(binWGet),
- m_binaryNC(binNC),
+ m_binaryMCat(binMCat),
m_binaryGnuPG(binGnuPG),
m_binaryKeys(binKeys),
m_applicationId(applicationId),
m_testMode(testMode),
m_maxProgress(getMaxProgress())
{
- m_success = m_cancelled = false;
m_status = UpdateStatus_NotStartedYet;
m_progress = 0;
void UpdateChecker::start(Priority priority)
{
- m_cancelled = m_success = false;
+ m_success.fetchAndStoreOrdered(0);
+ m_cancelled.fetchAndStoreOrdered(0);
QThread::start(priority);
}
const bool isQuick = (mirrorCount++ < QUICK_MIRRORS);
if(tryUpdateMirror(m_updateInfo.data(), currentMirror, isQuick))
{
- m_success = true; /*success*/
+ m_success.ref(); /*success*/
break;
}
if (isQuick)
// ----- Generate final result ----- //
- if(m_success)
+ if(MUTILS_BOOLIFY(m_success))
{
if(m_updateInfo->m_buildNo > m_installedBuildNo)
{
qDebug("\n[Known Hosts]");
log("Testing all known hosts...", "", "---");
- int hostCount = hostList.count();
+ QSet<quint32> ipAddrSet;
+ quint32 ipAddr;
while(!hostList.isEmpty())
{
- QString currentHost = hostList.takeFirst();
+ const QString currentHost = hostList.takeFirst();
qDebug("Testing: %s", currentHost.toLatin1().constData());
log("", "Testing:", currentHost, "");
- if (!tryContactHost(currentHost, DOWNLOAD_TIMEOUT))
+ if (tryContactHost(currentHost, DOWNLOAD_TIMEOUT, &ipAddr))
+ {
+ if (ipAddrSet.contains(ipAddr))
+ {
+ qWarning("Duplicate IP-address 0x%08X was encountered!", ipAddr);
+ }
+ else
+ {
+ ipAddrSet << ipAddr; /*not encountered yet*/
+ }
+ }
+ else
{
qWarning("\nConnectivity test FAILED on the following host:\n%s\n", currentHost.toLatin1().constData());
}
log("", "Download okay, checking signature:");
if (checkSignature(outFileVers, outFileSign))
{
- log("", "Signature okay, parsing info:");
+ log("", "Signature okay, parsing info:", "");
success = parseVersionInfo(outFileVers, updateInfo);
}
else
bool UpdateChecker::getUpdateInfo(const QString &url, const QString &outFileVers, const QString &outFileSign)
{
- log("Downloading update info:");
- if(!getFile(QString("%1%2" ).arg(url, mirror_url_postfix[m_betaUpdates ? 1 : 0]), outFileVers))
+ log("Downloading update info:", "");
+ if(getFile(QString("%1%2").arg(url, mirror_url_postfix[m_betaUpdates ? 1 : 0]), outFileVers))
{
- return false;
- }
-
- log("", "Downloading signature:");
- if(!getFile(QString("%1%2.sig2").arg(url, mirror_url_postfix[m_betaUpdates ? 1 : 0]), outFileSign))
- {
- return false;
+ if (!m_cancelled)
+ {
+ log("", "Downloading signature:", "");
+ if (getFile(QString("%1%2.sig2").arg(url, mirror_url_postfix[m_betaUpdates ? 1 : 0]), outFileSign))
+ {
+ return true;
+ }
+ }
}
-
- return true;
+ return false;
}
bool UpdateChecker::parseVersionInfo(const QString &file, UpdateCheckerInfo *updateInfo)
{
return true;
}
+ if (MUTILS_BOOLIFY(m_cancelled))
+ {
+ break; /*cancelled*/
+ }
}
return false;
}
const QString line = QString::fromLatin1(process.readLine()).simplified();
log(line);
}
- if (bTimeOut || m_cancelled)
+ if (bTimeOut || MUTILS_BOOLIFY(m_cancelled))
{
qWarning("WGet process timed out <-- killing!");
process.kill();
return (process.exitCode() == 0) && output.exists() && output.isFile();
}
-bool UpdateChecker::tryContactHost(const QString &hostname, const int &timeoutMsec)
+bool UpdateChecker::tryContactHost(const QString &hostname, const int &timeoutMsec, quint32 *const ipAddrOut)
{
- log(QString("Connecting to host: %1").arg(hostname));
+ log(QString("Connecting to host: %1").arg(hostname), "");
QProcess process;
init_process(process, temp_folder());
QStringList args;
- args << "-z" << hostname << QString::number(80);
+ args << "--retry" << QString::number(3) << hostname << QString::number(80);
QEventLoop loop;
connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
timer.setSingleShot(true);
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
- process.start(m_binaryNC, args);
+ QScopedPointer<QRegExp> ipAddr;
+ if (ipAddrOut)
+ {
+ *ipAddrOut = 0;
+ ipAddr.reset(new QRegExp("Connecting\\s+to\\s+(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+):(\\d+)", Qt::CaseInsensitive));
+ }
+
+ process.start(m_binaryMCat, args);
if (!process.waitForStarted())
{
const bool bTimeOut = (!timer.isActive());
while (process.canReadLine())
{
- QString line = QString::fromLatin1(process.readLine()).simplified();
+ const QString line = QString::fromLatin1(process.readLine()).simplified();
+ if (!ipAddr.isNull())
+ {
+ if (ipAddr->indexIn(line) >= 0)
+ {
+ quint32 values[4];
+ if (MUtils::regexp_parse_uint32((*ipAddr), values, 4))
+ {
+ *ipAddrOut |= ((values[0] & 0xFF) << 0x18);
+ *ipAddrOut |= ((values[1] & 0xFF) << 0x10);
+ *ipAddrOut |= ((values[2] & 0xFF) << 0x08);
+ *ipAddrOut |= ((values[3] & 0xFF) << 0x00);
+ }
+ }
+ }
log(line);
}
- if (bTimeOut || m_cancelled)
+ if (bTimeOut || MUTILS_BOOLIFY(m_cancelled))
{
- qWarning("NC process timed out <-- killing!");
+ qWarning("MCat process timed out <-- killing!");
process.kill();
process.waitForFinished();
log(bTimeOut ? "!!! TIMEOUT !!!" : "!!! CANCELLED !!!");