/*********************************************************************** * This file is part of module_misc. * * module_misc is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * module_misc is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with module_misc. If not, see * * * Copyright (C) 2013, Dominik Rueß; info@dominik-ruess.de **********************************************************************/ #ifndef VERSIONING_H #define VERSIONING_H #include #include #include #include #include #include #ifdef QT_NETWORK_LIB #include #include #include #include #include #endif // determine bits of this compiler // http://stackoverflow.com/a/1505664 template static int DetermineBitsHelper(); template<> int DetermineBitsHelper<4>() { return 32; } template<> int DetermineBitsHelper<8>() { return 64; } // helper function just to hide clumsy syntax static int DetermineBits() { return DetermineBitsHelper(); } /** * class to allow for checking version requirements * * APR's Version Numbering: * http://apr.apache.org/versioning.html */ template struct VersionNumber { VersionNumber() { checkRequirements(); } template void checkCompatibility() const { static_assert(requireMajor == major, "Incompatible major library version"); static_assert(usedMinor <= minor, "Incompatible minor version: library too old"); } virtual bool checkForUpdateVersion(const QString& location, const qint32 magicNumber, qint32& majorRemote, qint32& minorRemote, qint32& patchRemote, QString& link, QString& text, bool& connection) const { #ifdef QT_NETWORK_LIB QNetworkAccessManager* m_NetworkMngr = new QNetworkAccessManager(); QNetworkReply *reply= m_NetworkMngr->get(QNetworkRequest(location)); QEventLoop loop; loop.connect(reply, SIGNAL(finished()),SLOT(quit())); loop.exec(); if (reply->error() == QNetworkReply::NoError) { connection= true; QDataStream in(reply); qint32 magic; quint16 streamVersion; in >> magic >> streamVersion; if (magic != magicNumber) { qCritical() << "Version file is not recognized by this application"; connection = false; return false; } else if (streamVersion > in.version()) { qCritical() << "Version file is from a more recent version of the application"; connection = false; return false; } in.setVersion(streamVersion); in >> majorRemote >> minorRemote >> patchRemote >> link >> text; } else { qCritical() << "Could not establish connection " << reply->error() << ":" << reply->errorString(); connection = false; delete m_NetworkMngr; return false; } delete reply; delete m_NetworkMngr; const bool newVersion = major < majorRemote || minor < minorRemote || patch < patchRemote; return newVersion; #else Q_UNUSED(location); Q_UNUSED(magicNumber); Q_UNUSED(majorRemote); Q_UNUSED(minorRemote); Q_UNUSED(patchRemote); Q_UNUSED(link); Q_UNUSED(text); qCritical() << QString("network library of Qt not linked against application"); connection = false; return false; #endif } int getVersionMajor() const { return major; } int getVersionMinor() const { return minor; } int getVersionPatch() const { return patch; } virtual void checkRequirements() const { static_assert(true, "no requirements needed"); } int getCompilerBits() { // appropriate function will be selected at compile time return DetermineBits(); } }; #endif // VERSIONING_H