diff options
author | kh1 <karsten.heimrich@digia.com> | 2014-11-11 14:49:17 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2014-11-12 21:22:35 +0100 |
commit | b1b9a3df473b3a27629be91cab0058b0e140d06d (patch) | |
tree | 3308a35c1e5148de3d29f073f515afd375c828c3 /src/libs/kdtools | |
parent | ca0369791c672b72cf47974ba3e3a4e0b81cce28 (diff) |
Rewrite the isRunning implementation and remove private class.
Use a more descriptive enum name. On Windows keep the lower case
version of the process name instead of calling toLower() several
times. Print a warning if we cannot obtain or release the lock.
Change-Id: Iaaefae0359cd214290f62ce78677cb343da8823c
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
Reviewed-by: Niels Weber <niels.weber@digia.com>
Diffstat (limited to 'src/libs/kdtools')
-rw-r--r-- | src/libs/kdtools/kdrunoncechecker.cpp | 97 | ||||
-rw-r--r-- | src/libs/kdtools/kdrunoncechecker.h | 14 |
2 files changed, 45 insertions, 66 deletions
diff --git a/src/libs/kdtools/kdrunoncechecker.cpp b/src/libs/kdtools/kdrunoncechecker.cpp index 7be12d425..8e4c42711 100644 --- a/src/libs/kdtools/kdrunoncechecker.cpp +++ b/src/libs/kdtools/kdrunoncechecker.cpp @@ -38,6 +38,7 @@ #include "kdsysinfo.h" #include <QCoreApplication> +#include <QDebug> #include <QDir> #include <QFileInfo> #include <QList> @@ -46,90 +47,64 @@ using namespace KDUpdater; -class KDRunOnceChecker::Private -{ -public: - Private(const QString &filename); - - KDLockFile m_lockfile; - bool m_hasLock; -}; - -KDRunOnceChecker::Private::Private(const QString &filename) - : m_lockfile(filename) - , m_hasLock(false) -{} - KDRunOnceChecker::KDRunOnceChecker(const QString &filename) - :d(new Private(filename)) -{} + : m_lockfile(filename) +{ +} KDRunOnceChecker::~KDRunOnceChecker() { - delete d; + if (!m_lockfile.unlock()) + qWarning() << m_lockfile.errorString().toUtf8().constData(); } class ProcessnameEquals { public: - ProcessnameEquals(const QString &name): m_name(name) {} + ProcessnameEquals(const QString &name) +#ifdef Q_OS_WIN + : m_name(name.toLower()) +#else + : m_name(name) +#endif + {} bool operator()(const ProcessInfo &info) { -#ifndef Q_OS_WIN - if (info.name == m_name) - return true; - const QFileInfo fi(info.name); - if (fi.fileName() == m_name || fi.baseName() == m_name) +#ifdef Q_OS_WIN + const QString infoName = info.name.toLower(); + if (infoName == QDir::toNativeSeparators(m_name)) return true; - return false; #else - if (info.name.toLower() == m_name.toLower()) - return true; - if (info.name.toLower() == QDir::toNativeSeparators(m_name.toLower())) + const QString infoName = info.name; +#endif + if (infoName == m_name) return true; - const QFileInfo fi(info.name); - if (fi.fileName().toLower() == m_name.toLower() || fi.baseName().toLower() == m_name.toLower()) + + const QFileInfo fi(infoName); + if (fi.fileName() == m_name || fi.baseName() == m_name) return true; - return info.name == m_name; -#endif + return false; } private: QString m_name; }; -bool KDRunOnceChecker::isRunning(Dependencies depends) +bool KDRunOnceChecker::isRunning(KDRunOnceChecker::ConditionFlags flags) { - bool running = false; - switch (depends) { - case Lockfile: { - const bool locked = d->m_hasLock || d->m_lockfile.lock(); - if (locked) - d->m_hasLock = true; - running = running || ! locked; - } - break; - case ProcessList: { - const QList<ProcessInfo> allProcesses = runningProcesses(); - const QString appName = qApp->applicationFilePath(); - //QList< ProcessInfo >::const_iterator it = std::find_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName)); - const int count = std::count_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName)); - running = running || /*it != allProcesses.constEnd()*/count > 1; - } - break; - case Both: { - const QList<ProcessInfo> allProcesses = runningProcesses(); - const QString appName = qApp->applicationFilePath(); - //QList<ProcessInfo>::const_iterator it = std::find_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName)); - const int count = std::count_if(allProcesses.constBegin(), allProcesses.constEnd(), ProcessnameEquals(appName)); - const bool locked = d->m_hasLock || d->m_lockfile.lock(); - if (locked) - d->m_hasLock = true; - running = running || ( /*it != allProcesses.constEnd()*/count > 1 && !locked); - } - break; + if (flags.testFlag(ConditionFlag::ProcessList)) { + const QList<ProcessInfo> allProcesses = runningProcesses(); + const int count = std::count_if(allProcesses.constBegin(), allProcesses.constEnd(), + ProcessnameEquals(QCoreApplication::applicationFilePath())); + return (count > 1); } - return running; + if (flags.testFlag(ConditionFlag::Lockfile)) { + const bool locked = m_lockfile.lock(); + if (!locked) + qWarning() << m_lockfile.errorString().toUtf8().constData(); + return !locked; + } + return false; } diff --git a/src/libs/kdtools/kdrunoncechecker.h b/src/libs/kdtools/kdrunoncechecker.h index 5c43e596e..92051ee9f 100644 --- a/src/libs/kdtools/kdrunoncechecker.h +++ b/src/libs/kdtools/kdrunoncechecker.h @@ -36,7 +36,7 @@ #ifndef KDTOOLS_RUNONCECHECKER_H #define KDTOOLS_RUNONCECHECKER_H -#include <kdtoolsglobal.h> +#include "kdlockfile.h" #include <QString> @@ -45,15 +45,19 @@ class KDTOOLS_EXPORT KDRunOnceChecker Q_DISABLE_COPY(KDRunOnceChecker) public: - enum Dependencies { ProcessList, Lockfile, Both }; + enum struct ConditionFlag { + Lockfile = 0x01, + ProcessList = 0x02 + }; + Q_DECLARE_FLAGS(ConditionFlags, ConditionFlag) explicit KDRunOnceChecker(const QString &filename = QString()); ~KDRunOnceChecker(); - bool isRunning(Dependencies depends); + + bool isRunning(KDRunOnceChecker::ConditionFlags flags); private: - class Private; - Private *d; + KDLockFile m_lockfile; }; #endif // KDTOOLS_RUNONCECHECKER_H |