diff options
author | kh1 <karsten.heimrich@nokia.com> | 2012-03-15 14:53:47 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@nokia.com> | 2012-03-19 16:14:04 +0100 |
commit | be3b47d0d504a3409ce66bd77bb8c0acff87c4f5 (patch) | |
tree | 09dfb02d484a4f395991972b828da71400fb761a /src/libs/kdtools/kdrunoncechecker.cpp | |
parent | 9fd62353cf7f973d78cd2093328ac15b5c4980b6 (diff) |
Reorganize the tree, have better ifw.pri. Shadow build support.
Change-Id: I01fb12537f863ed0744979973c7e4153889cc5cb
Reviewed-by: Tim Jenssen <tim.jenssen@nokia.com>
Diffstat (limited to 'src/libs/kdtools/kdrunoncechecker.cpp')
-rw-r--r-- | src/libs/kdtools/kdrunoncechecker.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/libs/kdtools/kdrunoncechecker.cpp b/src/libs/kdtools/kdrunoncechecker.cpp new file mode 100644 index 000000000..8e0af3ddc --- /dev/null +++ b/src/libs/kdtools/kdrunoncechecker.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved. +** +** This file is part of the KD Tools library. +** +** Licensees holding valid commercial KD Tools licenses may use this file in +** accordance with the KD Tools Commercial License Agreement provided with +** the Software. +** +** +** This file may be distributed and/or modified under the terms of the +** GNU Lesser General Public License version 2 and version 3 as published by the +** Free Software Foundation and appearing in the file LICENSE.LGPL included. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** Contact info@kdab.com if any conditions of this licensing are not +** clear to you. +** +**********************************************************************/ + +#include "kdrunoncechecker.h" +#include "kdlockfile.h" +#include "kdsysinfo.h" + +#include <QtCore/QList> +#include <QtCore/QCoreApplication> +#include <QtCore/QDir> +#include <QtCore/QFileInfo> + +#include <algorithm> + +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)) +{} + +KDRunOnceChecker::~KDRunOnceChecker() +{ + delete d; +} + +class ProcessnameEquals +{ +public: + ProcessnameEquals(const QString &name): m_name(name) {} + + bool operator()(const ProcessInfo &info) + { +#ifndef Q_WS_WIN + if (info.name == m_name) + return true; + const QFileInfo fi(info.name); + if (fi.fileName() == m_name || fi.baseName() == 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())) + return true; + const QFileInfo fi(info.name); + if (fi.fileName().toLower() == m_name.toLower() || fi.baseName().toLower() == m_name.toLower()) + return true; + return info.name == m_name; +#endif + } + +private: + QString m_name; +}; + +bool KDRunOnceChecker::isRunning(Dependencies depends) +{ + 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; + } + + return running; +} |