]> Some of my projects - localmylist.git/commitdiff
qtsingleapplication ported to Qt5
authorAPTX <marek321@gmail.com>
Thu, 21 Feb 2013 02:12:36 +0000 (03:12 +0100)
committerAPTX <marek321@gmail.com>
Thu, 21 Feb 2013 02:12:36 +0000 (03:12 +0100)
management-gui/qtsingleapplication/qtlocalpeer.cpp
management-gui/qtsingleapplication/qtlocalpeer.h
management-gui/qtsingleapplication/qtlockedfile.cpp
management-gui/qtsingleapplication/qtlockedfile.h
management-gui/qtsingleapplication/qtlockedfile_win.cpp
management-gui/qtsingleapplication/qtsingleapplication.cpp
management-gui/qtsingleapplication/qtsingleapplication.h

index 382d182dcb85027025f120edf6e2142c096e68c3..1a3b7aecf606c51339044ec7d23e2e3fa6a8a10d 100644 (file)
 
 
 #include "qtlocalpeer.h"
-#include <QtCore/QCoreApplication>
-#include <QtCore/QTime>
+#include <QCoreApplication>
+#include <QTime>
 
 #if defined(Q_OS_WIN)
-#include <QtCore/QLibrary>
-#include <QtCore/qt_windows.h>
+#include <QLibrary>
+#include <qt_windows.h>
 typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*);
 static PProcessIdToSessionId pProcessIdToSessionId = 0;
 #endif
@@ -64,136 +64,136 @@ namespace QtLP_Private {
 const char* QtLocalPeer::ack = "ack";
 
 QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId)
-    : QObject(parent), id(appId)
+       : QObject(parent), id(appId)
 {
-    QString prefix = id;
-    if (id.isEmpty()) {
-        id = QCoreApplication::applicationFilePath();
+       QString prefix = id;
+       if (id.isEmpty()) {
+               id = QCoreApplication::applicationFilePath();
 #if defined(Q_OS_WIN)
-        id = id.toLower();
+               id = id.toLower();
 #endif
-        prefix = id.section(QLatin1Char('/'), -1);
-    }
-    prefix.remove(QRegExp("[^a-zA-Z]"));
-    prefix.truncate(6);
+               prefix = id.section(QLatin1Char('/'), -1);
+       }
+       prefix.remove(QRegExp("[^a-zA-Z]"));
+       prefix.truncate(6);
 
-    QByteArray idc = id.toUtf8();
-    quint16 idNum = qChecksum(idc.constData(), idc.size());
-    socketName = QLatin1String("qtsingleapp-") + prefix
-                 + QLatin1Char('-') + QString::number(idNum, 16);
+       QByteArray idc = id.toUtf8();
+       quint16 idNum = qChecksum(idc.constData(), idc.size());
+       socketName = QLatin1String("qtsingleapp-") + prefix
+                                + QLatin1Char('-') + QString::number(idNum, 16);
 
 #if defined(Q_OS_WIN)
-    if (!pProcessIdToSessionId) {
-        QLibrary lib("kernel32");
-        pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId");
-    }
-    if (pProcessIdToSessionId) {
-        DWORD sessionId = 0;
-        pProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
-        socketName += QLatin1Char('-') + QString::number(sessionId, 16);
-    }
+       if (!pProcessIdToSessionId) {
+               QLibrary lib("kernel32");
+               pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId");
+       }
+       if (pProcessIdToSessionId) {
+               DWORD sessionId = 0;
+               pProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
+               socketName += QLatin1Char('-') + QString::number(sessionId, 16);
+       }
 #else
-    socketName += QLatin1Char('-') + QString::number(::getuid(), 16);
+       socketName += QLatin1Char('-') + QString::number(::getuid(), 16);
 #endif
 
-    server = new QLocalServer(this);
-    QString lockName = QDir(QDir::tempPath()).absolutePath()
-                       + QLatin1Char('/') + socketName
-                       + QLatin1String("-lockfile");
-    lockFile.setFileName(lockName);
-    lockFile.open(QIODevice::ReadWrite);
+       server = new QLocalServer(this);
+       QString lockName = QDir(QDir::tempPath()).absolutePath()
+                                          + QLatin1Char('/') + socketName
+                                          + QLatin1String("-lockfile");
+       lockFile.setFileName(lockName);
+       lockFile.open(QIODevice::ReadWrite);
 }
 
 
 
 bool QtLocalPeer::isClient()
 {
-    if (lockFile.isLocked())
-        return false;
+       if (lockFile.isLocked())
+               return false;
 
-    if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))
-        return true;
+       if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))
+               return true;
 
-    bool res = server->listen(socketName);
+       bool res = server->listen(socketName);
 #if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0))
-    // ### Workaround
-    if (!res && server->serverError() == QAbstractSocket::AddressInUseError) {
-        QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);
-        res = server->listen(socketName);
-    }
+       // ### Workaround
+       if (!res && server->serverError() == QAbstractSocket::AddressInUseError) {
+               QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);
+               res = server->listen(socketName);
+       }
 #endif
-    if (!res)
-        qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString()));
-    QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection()));
-    return false;
+       if (!res)
+               qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString()));
+       QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection()));
+       return false;
 }
 
 
 bool QtLocalPeer::sendMessage(const QString &message, int timeout)
 {
-    if (!isClient())
-        return false;
-
-    QLocalSocket socket;
-    bool connOk = false;
-    for(int i = 0; i < 2; i++) {
-        // Try twice, in case the other instance is just starting up
-        socket.connectToServer(socketName);
-        connOk = socket.waitForConnected(timeout/2);
-        if (connOk || i)
-            break;
-        int ms = 250;
+       if (!isClient())
+               return false;
+
+       QLocalSocket socket;
+       bool connOk = false;
+       for(int i = 0; i < 2; i++) {
+               // Try twice, in case the other instance is just starting up
+               socket.connectToServer(socketName);
+               connOk = socket.waitForConnected(timeout/2);
+               if (connOk || i)
+                       break;
+               int ms = 250;
 #if defined(Q_OS_WIN)
-        Sleep(DWORD(ms));
+               Sleep(DWORD(ms));
 #else
-        struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
-        nanosleep(&ts, NULL);
+               struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
+               nanosleep(&ts, NULL);
 #endif
-    }
-    if (!connOk)
-        return false;
-
-    QByteArray uMsg(message.toUtf8());
-    QDataStream ds(&socket);
-    ds.writeBytes(uMsg.constData(), uMsg.size());
-    bool res = socket.waitForBytesWritten(timeout);
-    if (res) {
-        res &= socket.waitForReadyRead(timeout);   // wait for ack
-        if (res)
-            res &= (socket.read(qstrlen(ack)) == ack);
-    }
-    return res;
+       }
+       if (!connOk)
+               return false;
+
+       QByteArray uMsg(message.toUtf8());
+       QDataStream ds(&socket);
+       ds.writeBytes(uMsg.constData(), uMsg.size());
+       bool res = socket.waitForBytesWritten(timeout);
+       if (res) {
+               res &= socket.waitForReadyRead(timeout);   // wait for ack
+               if (res)
+                       res &= (socket.read(qstrlen(ack)) == ack);
+       }
+       return res;
 }
 
 
 void QtLocalPeer::receiveConnection()
 {
-    QLocalSocket* socket = server->nextPendingConnection();
-    if (!socket)
-        return;
-
-    while (socket->bytesAvailable() < (int)sizeof(quint32))
-        socket->waitForReadyRead();
-    QDataStream ds(socket);
-    QByteArray uMsg;
-    quint32 remaining;
-    ds >> remaining;
-    uMsg.resize(remaining);
-    int got = 0;
-    char* uMsgBuf = uMsg.data();
-    do {
-        got = ds.readRawData(uMsgBuf, remaining);
-        remaining -= got;
-        uMsgBuf += got;
-    } while (remaining && got >= 0 && socket->waitForReadyRead(2000));
-    if (got < 0) {
-        qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData());
-        delete socket;
-        return;
-    }
-    QString message(QString::fromUtf8(uMsg));
-    socket->write(ack, qstrlen(ack));
-    socket->waitForBytesWritten(1000);
-    delete socket;
-    emit messageReceived(message); //### (might take a long time to return)
+       QLocalSocket* socket = server->nextPendingConnection();
+       if (!socket)
+               return;
+
+       while (socket->bytesAvailable() < (int)sizeof(quint32))
+               socket->waitForReadyRead();
+       QDataStream ds(socket);
+       QByteArray uMsg;
+       quint32 remaining;
+       ds >> remaining;
+       uMsg.resize(remaining);
+       int got = 0;
+       char* uMsgBuf = uMsg.data();
+       do {
+               got = ds.readRawData(uMsgBuf, remaining);
+               remaining -= got;
+               uMsgBuf += got;
+       } while (remaining && got >= 0 && socket->waitForReadyRead(2000));
+       if (got < 0) {
+               qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData());
+               delete socket;
+               return;
+       }
+       QString message(QString::fromUtf8(uMsg));
+       socket->write(ack, qstrlen(ack));
+       socket->waitForBytesWritten(1000);
+       delete socket;
+       emit messageReceived(message); //### (might take a long time to return)
 }
index e834b73871d9d811dfc0086ca334998d3b9e53ea..dbccd5982b8e03104e069b198fdd385bf46b4d49 100644 (file)
 #ifndef QTLOCALPEER_H
 #define QTLOCALPEER_H
 
-#include <QtNetwork/QLocalServer>
-#include <QtNetwork/QLocalSocket>
-#include <QtCore/QDir>
+#include <QLocalServer>
+#include <QLocalSocket>
+#include <QDir>
 
 #include "qtlockedfile.h"
 
 class QtLocalPeer : public QObject
 {
-    Q_OBJECT
+       Q_OBJECT
 
 public:
-    QtLocalPeer(QObject *parent = 0, const QString &appId = QString());
-    bool isClient();
-    bool sendMessage(const QString &message, int timeout);
-    QString applicationId() const
-        { return id; }
+       QtLocalPeer(QObject *parent = 0, const QString &appId = QString());
+       bool isClient();
+       bool sendMessage(const QString &message, int timeout);
+       QString applicationId() const
+               { return id; }
 
 Q_SIGNALS:
-    void messageReceived(const QString &message);
+       void messageReceived(const QString &message);
 
 protected Q_SLOTS:
-    void receiveConnection();
+       void receiveConnection();
 
 protected:
-    QString id;
-    QString socketName;
-    QLocalServer* server;
-    QtLP_Private::QtLockedFile lockFile;
+       QString id;
+       QString socketName;
+       QLocalServer* server;
+       QtLP_Private::QtLockedFile lockFile;
 
 private:
-    static const char* ack;
+       static const char* ack;
 };
 
 #endif // QTLOCALPEER_H
index 3e73ba652f48c782967d226b67cb739a6096254d..7fdf4878ba83439bd6195bc3a098925f3abe2fe1 100644 (file)
 #include "qtlockedfile.h"
 
 /*!
-    \class QtLockedFile
-
-    \brief The QtLockedFile class extends QFile with advisory locking
-    functions.
-
-    A file may be locked in read or write mode. Multiple instances of
-    \e QtLockedFile, created in multiple processes running on the same
-    machine, may have a file locked in read mode. Exactly one instance
-    may have it locked in write mode. A read and a write lock cannot
-    exist simultaneously on the same file.
-
-    The file locks are advisory. This means that nothing prevents
-    another process from manipulating a locked file using QFile or
-    file system functions offered by the OS. Serialization is only
-    guaranteed if all processes that access the file use
-    QLockedFile. Also, while holding a lock on a file, a process
-    must not open the same file again (through any API), or locks
-    can be unexpectedly lost.
-
-    The lock provided by an instance of \e QtLockedFile is released
-    whenever the program terminates. This is true even when the
-    program crashes and no destructors are called.
+       \class QtLockedFile
+
+       \brief The QtLockedFile class extends QFile with advisory locking
+       functions.
+
+       A file may be locked in read or write mode. Multiple instances of
+       \e QtLockedFile, created in multiple processes running on the same
+       machine, may have a file locked in read mode. Exactly one instance
+       may have it locked in write mode. A read and a write lock cannot
+       exist simultaneously on the same file.
+
+       The file locks are advisory. This means that nothing prevents
+       another process from manipulating a locked file using QFile or
+       file system functions offered by the OS. Serialization is only
+       guaranteed if all processes that access the file use
+       QLockedFile. Also, while holding a lock on a file, a process
+       must not open the same file again (through any API), or locks
+       can be unexpectedly lost.
+
+       The lock provided by an instance of \e QtLockedFile is released
+       whenever the program terminates. This is true even when the
+       program crashes and no destructors are called.
 */
 
 /*! \enum QtLockedFile::LockMode
 
-    This enum describes the available lock modes.
+       This enum describes the available lock modes.
 
-    \value ReadLock A read lock.
-    \value WriteLock A write lock.
-    \value NoLock Neither a read lock nor a write lock.
+       \value ReadLock A read lock.
+       \value WriteLock A write lock.
+       \value NoLock Neither a read lock nor a write lock.
 */
 
 /*!
-    Constructs an unlocked \e QtLockedFile object. This constructor
-    behaves in the same way as \e QFile::QFile().
+       Constructs an unlocked \e QtLockedFile object. This constructor
+       behaves in the same way as \e QFile::QFile().
 
-    \sa QFile::QFile()
+       \sa QFile::QFile()
 */
 QtLockedFile::QtLockedFile()
-    : QFile()
+       : QFile()
 {
 #ifdef Q_OS_WIN
-    wmutex = 0;
-    rmutex = 0;
+       wmutex = 0;
+       rmutex = 0;
 #endif
-    m_lock_mode = NoLock;
+       m_lock_mode = NoLock;
 }
 
 /*!
-    Constructs an unlocked QtLockedFile object with file \a name. This
-    constructor behaves in the same way as \e QFile::QFile(const
-    QString&).
+       Constructs an unlocked QtLockedFile object with file \a name. This
+       constructor behaves in the same way as \e QFile::QFile(const
+       QString&).
 
-    \sa QFile::QFile()
+       \sa QFile::QFile()
 */
 QtLockedFile::QtLockedFile(const QString &name)
-    : QFile(name)
+       : QFile(name)
 {
 #ifdef Q_OS_WIN
-    wmutex = 0;
-    rmutex = 0;
+       wmutex = 0;
+       rmutex = 0;
 #endif
-    m_lock_mode = NoLock;
+       m_lock_mode = NoLock;
 }
 
 /*!
@@ -121,72 +121,72 @@ QtLockedFile::QtLockedFile(const QString &name)
 */
 bool QtLockedFile::open(OpenMode mode)
 {
-    if (mode & QIODevice::Truncate) {
-        qWarning("QtLockedFile::open(): Truncate mode not allowed.");
-        return false;
-    }
-    return QFile::open(mode);
+       if (mode & QIODevice::Truncate) {
+               qWarning("QtLockedFile::open(): Truncate mode not allowed.");
+               return false;
+       }
+       return QFile::open(mode);
 }
 
 /*!
-    Returns \e true if this object has a in read or write lock;
-    otherwise returns \e false.
+       Returns \e true if this object has a in read or write lock;
+       otherwise returns \e false.
 
-    \sa lockMode()
+       \sa lockMode()
 */
 bool QtLockedFile::isLocked() const
 {
-    return m_lock_mode != NoLock;
+       return m_lock_mode != NoLock;
 }
 
 /*!
-    Returns the type of lock currently held by this object, or \e
-    QtLockedFile::NoLock.
+       Returns the type of lock currently held by this object, or \e
+       QtLockedFile::NoLock.
 
-    \sa isLocked()
+       \sa isLocked()
 */
 QtLockedFile::LockMode QtLockedFile::lockMode() const
 {
-    return m_lock_mode;
+       return m_lock_mode;
 }
 
 /*!
-    \fn bool QtLockedFile::lock(LockMode mode, bool block = true)
+       \fn bool QtLockedFile::lock(LockMode mode, bool block = true)
 
-    Obtains a lock of type \a mode. The file must be opened before it
-    can be locked.
+       Obtains a lock of type \a mode. The file must be opened before it
+       can be locked.
 
-    If \a block is true, this function will block until the lock is
-    aquired. If \a block is false, this function returns \e false
-    immediately if the lock cannot be aquired.
+       If \a block is true, this function will block until the lock is
+       aquired. If \a block is false, this function returns \e false
+       immediately if the lock cannot be aquired.
 
-    If this object already has a lock of type \a mode, this function
-    returns \e true immediately. If this object has a lock of a
-    different type than \a mode, the lock is first released and then a
-    new lock is obtained.
+       If this object already has a lock of type \a mode, this function
+       returns \e true immediately. If this object has a lock of a
+       different type than \a mode, the lock is first released and then a
+       new lock is obtained.
 
-    This function returns \e true if, after it executes, the file is
-    locked by this object, and \e false otherwise.
+       This function returns \e true if, after it executes, the file is
+       locked by this object, and \e false otherwise.
 
-    \sa unlock(), isLocked(), lockMode()
+       \sa unlock(), isLocked(), lockMode()
 */
 
 /*!
-    \fn bool QtLockedFile::unlock()
+       \fn bool QtLockedFile::unlock()
 
-    Releases a lock.
+       Releases a lock.
 
-    If the object has no lock, this function returns immediately.
+       If the object has no lock, this function returns immediately.
 
-    This function returns \e true if, after it executes, the file is
-    not locked by this object, and \e false otherwise.
+       This function returns \e true if, after it executes, the file is
+       not locked by this object, and \e false otherwise.
 
-    \sa lock(), isLocked(), lockMode()
+       \sa lock(), isLocked(), lockMode()
 */
 
 /*!
-    \fn QtLockedFile::~QtLockedFile()
+       \fn QtLockedFile::~QtLockedFile()
 
-    Destroys the \e QtLockedFile object. If any locks were held, they
-    are released.
+       Destroys the \e QtLockedFile object. If any locks were held, they
+       are released.
 */
index 07a42bffb16fd46e0fece650eb2f2501acdee593..08be78f30eb6a568d61a096dbca772aeba4b6ca0 100644 (file)
@@ -40,9 +40,9 @@
 #ifndef QTLOCKEDFILE_H
 #define QTLOCKEDFILE_H
 
-#include <QtCore/QFile>
+#include <QFile>
 #ifdef Q_OS_WIN
-#include <QtCore/QVector>
+#include <QVector>
 #endif
 
 #if defined(Q_WS_WIN)
@@ -66,31 +66,31 @@ namespace QtLP_Private {
 class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile
 {
 public:
-    enum LockMode { NoLock = 0, ReadLock, WriteLock };
+       enum LockMode { NoLock = 0, ReadLock, WriteLock };
 
-    QtLockedFile();
-    QtLockedFile(const QString &name);
-    ~QtLockedFile();
+       QtLockedFile();
+       QtLockedFile(const QString &name);
+       ~QtLockedFile();
 
-    bool open(OpenMode mode);
+       bool open(OpenMode mode);
 
-    bool lock(LockMode mode, bool block = true);
-    bool unlock();
-    bool isLocked() const;
-    LockMode lockMode() const;
+       bool lock(LockMode mode, bool block = true);
+       bool unlock();
+       bool isLocked() const;
+       LockMode lockMode() const;
 
 private:
 #ifdef Q_OS_WIN
-    Qt::HANDLE wmutex;
-    Qt::HANDLE rmutex;
-    QVector<Qt::HANDLE> rmutexes;
-    QString mutexname;
+       Qt::HANDLE wmutex;
+       Qt::HANDLE rmutex;
+       QVector<Qt::HANDLE> rmutexes;
+       QString mutexname;
 
-    Qt::HANDLE getMutexHandle(int idx, bool doCreate);
-    bool waitMutex(Qt::HANDLE mutex, bool doBlock);
+       Qt::HANDLE getMutexHandle(int idx, bool doCreate);
+       bool waitMutex(Qt::HANDLE mutex, bool doBlock);
 
 #endif
-    LockMode m_lock_mode;
+       LockMode m_lock_mode;
 };
 }
 #endif
index 4cd200397831137666858d3ff5073d57ba52cce1..b54ac34e6bd5e2cd1362569c3fca2f1f05ba4945 100644 (file)
 
 Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate)
 {
-    if (mutexname.isEmpty()) {
-        QFileInfo fi(*this);
-        mutexname = QString::fromLatin1(MUTEX_PREFIX)
-                    + fi.absoluteFilePath().toLower();
-    }
-    QString mname(mutexname);
-    if (idx >= 0)
-        mname += QString::number(idx);
-
-    Qt::HANDLE mutex;
-    if (doCreate) {
-        QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); },
-               { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } );
-        if (!mutex) {
-            qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
-            return 0;
-        }
-    }
-    else {
-        QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); },
-               { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } );
-        if (!mutex) {
-            if (GetLastError() != ERROR_FILE_NOT_FOUND)
-                qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
-            return 0;
-        }
-    }
-    return mutex;
+       if (mutexname.isEmpty()) {
+               QFileInfo fi(*this);
+               mutexname = QString::fromLatin1(MUTEX_PREFIX)
+                                       + fi.absoluteFilePath().toLower();
+       }
+       QString mname(mutexname);
+       if (idx >= 0)
+               mname += QString::number(idx);
+
+       Qt::HANDLE mutex;
+       if (doCreate) {
+               mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16());
+               if (!mutex) {
+                       qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
+                       return 0;
+               }
+       }
+       else {
+               mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16());
+               if (!mutex) {
+                       if (GetLastError() != ERROR_FILE_NOT_FOUND)
+                               qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
+                       return 0;
+               }
+       }
+       return mutex;
 }
 
 bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock)
 {
-    Q_ASSERT(mutex);
-    DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);
-    switch (res) {
-    case WAIT_OBJECT_0:
-    case WAIT_ABANDONED:
-        return true;
-        break;
-    case WAIT_TIMEOUT:
-        break;
-    default:
-        qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
-    }
-    return false;
+       Q_ASSERT(mutex);
+       DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);
+       switch (res) {
+       case WAIT_OBJECT_0:
+       case WAIT_ABANDONED:
+               return true;
+               break;
+       case WAIT_TIMEOUT:
+               break;
+       default:
+               qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
+       }
+       return false;
 }
 
 
 
 bool QtLockedFile::lock(LockMode mode, bool block)
 {
-    if (!isOpen()) {
-        qWarning("QtLockedFile::lock(): file is not opened");
-        return false;
-    }
-
-    if (mode == NoLock)
-        return unlock();
-
-    if (mode == m_lock_mode)
-        return true;
-
-    if (m_lock_mode != NoLock)
-        unlock();
-
-    if (!wmutex && !(wmutex = getMutexHandle(-1, true)))
-        return false;
-
-    if (!waitMutex(wmutex, block))
-        return false;
-
-    if (mode == ReadLock) {
-        int idx = 0;
-        for (; idx < MAX_READERS; idx++) {
-            rmutex = getMutexHandle(idx, false);
-            if (!rmutex || waitMutex(rmutex, false))
-                break;
-            CloseHandle(rmutex);
-        }
-        bool ok = true;
-        if (idx >= MAX_READERS) {
-            qWarning("QtLockedFile::lock(): too many readers");
-            rmutex = 0;
-            ok = false;
-        }
-        else if (!rmutex) {
-            rmutex = getMutexHandle(idx, true);
-            if (!rmutex || !waitMutex(rmutex, false))
-                ok = false;
-        }
-        if (!ok && rmutex) {
-            CloseHandle(rmutex);
-            rmutex = 0;
-        }
-        ReleaseMutex(wmutex);
-        if (!ok)
-            return false;
-    }
-    else {
-        Q_ASSERT(rmutexes.isEmpty());
-        for (int i = 0; i < MAX_READERS; i++) {
-            Qt::HANDLE mutex = getMutexHandle(i, false);
-            if (mutex)
-                rmutexes.append(mutex);
-        }
-        if (rmutexes.size()) {
-            DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),
-                                               TRUE, block ? INFINITE : 0);
-            if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
-                if (res != WAIT_TIMEOUT)
-                    qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
-                m_lock_mode = WriteLock;  // trick unlock() to clean up - semiyucky
-                unlock();
-                return false;
-            }
-        }
-    }
-
-    m_lock_mode = mode;
-    return true;
+       if (!isOpen()) {
+               qWarning("QtLockedFile::lock(): file is not opened");
+               return false;
+       }
+
+       if (mode == NoLock)
+               return unlock();
+
+       if (mode == m_lock_mode)
+               return true;
+
+       if (m_lock_mode != NoLock)
+               unlock();
+
+       if (!wmutex && !(wmutex = getMutexHandle(-1, true)))
+               return false;
+
+       if (!waitMutex(wmutex, block))
+               return false;
+
+       if (mode == ReadLock) {
+               int idx = 0;
+               for (; idx < MAX_READERS; idx++) {
+                       rmutex = getMutexHandle(idx, false);
+                       if (!rmutex || waitMutex(rmutex, false))
+                               break;
+                       CloseHandle(rmutex);
+               }
+               bool ok = true;
+               if (idx >= MAX_READERS) {
+                       qWarning("QtLockedFile::lock(): too many readers");
+                       rmutex = 0;
+                       ok = false;
+               }
+               else if (!rmutex) {
+                       rmutex = getMutexHandle(idx, true);
+                       if (!rmutex || !waitMutex(rmutex, false))
+                               ok = false;
+               }
+               if (!ok && rmutex) {
+                       CloseHandle(rmutex);
+                       rmutex = 0;
+               }
+               ReleaseMutex(wmutex);
+               if (!ok)
+                       return false;
+       }
+       else {
+               Q_ASSERT(rmutexes.isEmpty());
+               for (int i = 0; i < MAX_READERS; i++) {
+                       Qt::HANDLE mutex = getMutexHandle(i, false);
+                       if (mutex)
+                               rmutexes.append(mutex);
+               }
+               if (rmutexes.size()) {
+                       DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),
+                                                                                          TRUE, block ? INFINITE : 0);
+                       if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
+                               if (res != WAIT_TIMEOUT)
+                                       qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
+                               m_lock_mode = WriteLock;  // trick unlock() to clean up - semiyucky
+                               unlock();
+                               return false;
+                       }
+               }
+       }
+
+       m_lock_mode = mode;
+       return true;
 }
 
 bool QtLockedFile::unlock()
 {
-    if (!isOpen()) {
-        qWarning("QtLockedFile::unlock(): file is not opened");
-        return false;
-    }
-
-    if (!isLocked())
-        return true;
-
-    if (m_lock_mode == ReadLock) {
-        ReleaseMutex(rmutex);
-        CloseHandle(rmutex);
-        rmutex = 0;
-    }
-    else {
-        foreach(Qt::HANDLE mutex, rmutexes) {
-            ReleaseMutex(mutex);
-            CloseHandle(mutex);
-        }
-        rmutexes.clear();
-        ReleaseMutex(wmutex);
-    }
-
-    m_lock_mode = QtLockedFile::NoLock;
-    return true;
+       if (!isOpen()) {
+               qWarning("QtLockedFile::unlock(): file is not opened");
+               return false;
+       }
+
+       if (!isLocked())
+               return true;
+
+       if (m_lock_mode == ReadLock) {
+               ReleaseMutex(rmutex);
+               CloseHandle(rmutex);
+               rmutex = 0;
+       }
+       else {
+               foreach(Qt::HANDLE mutex, rmutexes) {
+                       ReleaseMutex(mutex);
+                       CloseHandle(mutex);
+               }
+               rmutexes.clear();
+               ReleaseMutex(wmutex);
+       }
+
+       m_lock_mode = QtLockedFile::NoLock;
+       return true;
 }
 
 QtLockedFile::~QtLockedFile()
 {
-    if (isOpen())
-        unlock();
-    if (wmutex)
-        CloseHandle(wmutex);
+       if (isOpen())
+               unlock();
+       if (wmutex)
+               CloseHandle(wmutex);
 }
index 5a8f1b0351fa34d0097d15fb9d6cebcb1d69edb7..8fbea0ad465580fcaa1d696abfc8abfde9fac8f4 100644 (file)
 
 #include "qtsingleapplication.h"
 #include "qtlocalpeer.h"
-#include <QtGui/QWidget>
+#include <QWidget>
 
 
 /*!
-    \class QtSingleApplication qtsingleapplication.h
-    \brief The QtSingleApplication class provides an API to detect and
-    communicate with running instances of an application.
-
-    This class allows you to create applications where only one
-    instance should be running at a time. I.e., if the user tries to
-    launch another instance, the already running instance will be
-    activated instead. Another usecase is a client-server system,
-    where the first started instance will assume the role of server,
-    and the later instances will act as clients of that server.
-
-    By default, the full path of the executable file is used to
-    determine whether two processes are instances of the same
-    application. You can also provide an explicit identifier string
-    that will be compared instead.
-
-    The application should create the QtSingleApplication object early
-    in the startup phase, and call isRunning() to find out if another
-    instance of this application is already running. If isRunning()
-    returns false, it means that no other instance is running, and
-    this instance has assumed the role as the running instance. In
-    this case, the application should continue with the initialization
-    of the application user interface before entering the event loop
-    with exec(), as normal.
-
-    The messageReceived() signal will be emitted when the running
-    application receives messages from another instance of the same
-    application. When a message is received it might be helpful to the
-    user to raise the application so that it becomes visible. To
-    facilitate this, QtSingleApplication provides the
-    setActivationWindow() function and the activateWindow() slot.
-
-    If isRunning() returns true, another instance is already
-    running. It may be alerted to the fact that another instance has
-    started by using the sendMessage() function. Also data such as
-    startup parameters (e.g. the name of the file the user wanted this
-    new instance to open) can be passed to the running instance with
-    this function. Then, the application should terminate (or enter
-    client mode).
-
-    If isRunning() returns true, but sendMessage() fails, that is an
-    indication that the running instance is frozen.
-
-    Here's an example that shows how to convert an existing
-    application to use QtSingleApplication. It is very simple and does
-    not make use of all QtSingleApplication's functionality (see the
-    examples for that).
-
-    \code
-    // Original
-    int main(int argc, char **argv)
-    {
-        QApplication app(argc, argv);
-
-        MyMainWidget mmw;
-        mmw.show();
-        return app.exec();
-    }
-
-    // Single instance
-    int main(int argc, char **argv)
-    {
-        QtSingleApplication app(argc, argv);
-
-        if (app.isRunning())
-            return !app.sendMessage(someDataString);
-
-        MyMainWidget mmw;
-        app.setActivationWindow(&mmw);
-        mmw.show();
-        return app.exec();
-    }
-    \endcode
-
-    Once this QtSingleApplication instance is destroyed (normally when
-    the process exits or crashes), when the user next attempts to run the
-    application this instance will not, of course, be encountered. The
-    next instance to call isRunning() or sendMessage() will assume the
-    role as the new running instance.
-
-    For console (non-GUI) applications, QtSingleCoreApplication may be
-    used instead of this class, to avoid the dependency on the QtGui
-    library.
-
-    \sa QtSingleCoreApplication
+       \class QtSingleApplication qtsingleapplication.h
+       \brief The QtSingleApplication class provides an API to detect and
+       communicate with running instances of an application.
+
+       This class allows you to create applications where only one
+       instance should be running at a time. I.e., if the user tries to
+       launch another instance, the already running instance will be
+       activated instead. Another usecase is a client-server system,
+       where the first started instance will assume the role of server,
+       and the later instances will act as clients of that server.
+
+       By default, the full path of the executable file is used to
+       determine whether two processes are instances of the same
+       application. You can also provide an explicit identifier string
+       that will be compared instead.
+
+       The application should create the QtSingleApplication object early
+       in the startup phase, and call isRunning() to find out if another
+       instance of this application is already running. If isRunning()
+       returns false, it means that no other instance is running, and
+       this instance has assumed the role as the running instance. In
+       this case, the application should continue with the initialization
+       of the application user interface before entering the event loop
+       with exec(), as normal.
+
+       The messageReceived() signal will be emitted when the running
+       application receives messages from another instance of the same
+       application. When a message is received it might be helpful to the
+       user to raise the application so that it becomes visible. To
+       facilitate this, QtSingleApplication provides the
+       setActivationWindow() function and the activateWindow() slot.
+
+       If isRunning() returns true, another instance is already
+       running. It may be alerted to the fact that another instance has
+       started by using the sendMessage() function. Also data such as
+       startup parameters (e.g. the name of the file the user wanted this
+       new instance to open) can be passed to the running instance with
+       this function. Then, the application should terminate (or enter
+       client mode).
+
+       If isRunning() returns true, but sendMessage() fails, that is an
+       indication that the running instance is frozen.
+
+       Here's an example that shows how to convert an existing
+       application to use QtSingleApplication. It is very simple and does
+       not make use of all QtSingleApplication's functionality (see the
+       examples for that).
+
+       \code
+       // Original
+       int main(int argc, char **argv)
+       {
+               QApplication app(argc, argv);
+
+               MyMainWidget mmw;
+               mmw.show();
+               return app.exec();
+       }
+
+       // Single instance
+       int main(int argc, char **argv)
+       {
+               QtSingleApplication app(argc, argv);
+
+               if (app.isRunning())
+                       return !app.sendMessage(someDataString);
+
+               MyMainWidget mmw;
+               app.setActivationWindow(&mmw);
+               mmw.show();
+               return app.exec();
+       }
+       \endcode
+
+       Once this QtSingleApplication instance is destroyed (normally when
+       the process exits or crashes), when the user next attempts to run the
+       application this instance will not, of course, be encountered. The
+       next instance to call isRunning() or sendMessage() will assume the
+       role as the new running instance.
+
+       For console (non-GUI) applications, QtSingleCoreApplication may be
+       used instead of this class, to avoid the dependency on the QtGui
+       library.
+
+       \sa QtSingleCoreApplication
 */
 
 
 void QtSingleApplication::sysInit(const QString &appId)
 {
-    actWin = 0;
-    peer = new QtLocalPeer(this, appId);
-    connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&)));
+       actWin = 0;
+       peer = new QtLocalPeer(this, appId);
+       connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&)));
 }
 
 
 /*!
-    Creates a QtSingleApplication object. The application identifier
-    will be QCoreApplication::applicationFilePath(). \a argc, \a
-    argv, and \a GUIenabled are passed on to the QAppliation constructor.
+       Creates a QtSingleApplication object. The application identifier
+       will be QCoreApplication::applicationFilePath(). \a argc, \a
+       argv, and \a GUIenabled are passed on to the QAppliation constructor.
 
-    If you are creating a console application (i.e. setting \a
-    GUIenabled to false), you may consider using
-    QtSingleCoreApplication instead.
+       If you are creating a console application (i.e. setting \a
+       GUIenabled to false), you may consider using
+       QtSingleCoreApplication instead.
 */
 
 QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled)
-    : QApplication(argc, argv, GUIenabled)
+       : QApplication(argc, argv, GUIenabled)
 {
-    sysInit();
+       sysInit();
 }
 
 
 /*!
-    Creates a QtSingleApplication object with the application
-    identifier \a appId. \a argc and \a argv are passed on to the
-    QAppliation constructor.
+       Creates a QtSingleApplication object with the application
+       identifier \a appId. \a argc and \a argv are passed on to the
+       QAppliation constructor.
 */
 
 QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv)
-    : QApplication(argc, argv)
+       : QApplication(argc, argv)
 {
-    sysInit(appId);
+       sysInit(appId);
 }
 
-
-/*!
-    Creates a QtSingleApplication object. The application identifier
-    will be QCoreApplication::applicationFilePath(). \a argc, \a
-    argv, and \a type are passed on to the QAppliation constructor.
-*/
-QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)
-    : QApplication(argc, argv, type)
-{
-    sysInit();
-}
-
-
 #if defined(Q_WS_X11)
 /*!
   Special constructor for X11, ref. the documentation of
@@ -190,9 +177,9 @@ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)
   and \a cmap are passed on to the QApplication constructor.
 */
 QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap)
-    : QApplication(dpy, visual, cmap)
+       : QApplication(dpy, visual, cmap)
 {
-    sysInit();
+       sysInit();
 }
 
 /*!
@@ -203,9 +190,9 @@ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HA
   constructor.
 */
 QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)
-    : QApplication(dpy, argc, argv, visual, cmap)
+       : QApplication(dpy, argc, argv, visual, cmap)
 {
-    sysInit();
+       sysInit();
 }
 
 /*!
@@ -216,56 +203,56 @@ QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Q
   constructor.
 */
 QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)
-    : QApplication(dpy, argc, argv, visual, cmap)
+       : QApplication(dpy, argc, argv, visual, cmap)
 {
-    sysInit(appId);
+       sysInit(appId);
 }
 #endif
 
 
 /*!
-    Returns true if another instance of this application is running;
-    otherwise false.
+       Returns true if another instance of this application is running;
+       otherwise false.
 
-    This function does not find instances of this application that are
-    being run by a different user (on Windows: that are running in
-    another session).
+       This function does not find instances of this application that are
+       being run by a different user (on Windows: that are running in
+       another session).
 
-    \sa sendMessage()
+       \sa sendMessage()
 */
 
 bool QtSingleApplication::isRunning()
 {
-    return peer->isClient();
+       return peer->isClient();
 }
 
 
 /*!
-    Tries to send the text \a message to the currently running
-    instance. The QtSingleApplication object in the running instance
-    will emit the messageReceived() signal when it receives the
-    message.
+       Tries to send the text \a message to the currently running
+       instance. The QtSingleApplication object in the running instance
+       will emit the messageReceived() signal when it receives the
+       message.
 
-    This function returns true if the message has been sent to, and
-    processed by, the current instance. If there is no instance
-    currently running, or if the running instance fails to process the
-    message within \a timeout milliseconds, this function return false.
+       This function returns true if the message has been sent to, and
+       processed by, the current instance. If there is no instance
+       currently running, or if the running instance fails to process the
+       message within \a timeout milliseconds, this function return false.
 
-    \sa isRunning(), messageReceived()
+       \sa isRunning(), messageReceived()
 */
 bool QtSingleApplication::sendMessage(const QString &message, int timeout)
 {
-    return peer->sendMessage(message, timeout);
+       return peer->sendMessage(message, timeout);
 }
 
 
 /*!
-    Returns the application identifier. Two processes with the same
-    identifier will be regarded as instances of the same application.
+       Returns the application identifier. Two processes with the same
+       identifier will be regarded as instances of the same application.
 */
 QString QtSingleApplication::id() const
 {
-    return peer->applicationId();
+       return peer->applicationId();
 }
 
 
@@ -283,23 +270,23 @@ QString QtSingleApplication::id() const
 
 void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage)
 {
-    actWin = aw;
-    if (activateOnMessage)
-        connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
-    else
-        disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
+       actWin = aw;
+       if (activateOnMessage)
+               connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
+       else
+               disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
 }
 
 
 /*!
-    Returns the applications activation window if one has been set by
-    calling setActivationWindow(), otherwise returns 0.
+       Returns the applications activation window if one has been set by
+       calling setActivationWindow(), otherwise returns 0.
 
-    \sa setActivationWindow()
+       \sa setActivationWindow()
 */
 QWidget* QtSingleApplication::activationWindow() const
 {
-    return actWin;
+       return actWin;
 }
 
 
@@ -319,26 +306,26 @@ QWidget* QtSingleApplication::activationWindow() const
 */
 void QtSingleApplication::activateWindow()
 {
-    if (actWin) {
-        actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);
-        actWin->raise();
-        actWin->activateWindow();
-    }
+       if (actWin) {
+               actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);
+               actWin->raise();
+               actWin->activateWindow();
+       }
 }
 
 
 /*!
-    \fn void QtSingleApplication::messageReceived(const QString& message)
+       \fn void QtSingleApplication::messageReceived(const QString& message)
 
-    This signal is emitted when the current instance receives a \a
-    message from another instance of this application.
+       This signal is emitted when the current instance receives a \a
+       message from another instance of this application.
 
-    \sa sendMessage(), setActivationWindow(), activateWindow()
+       \sa sendMessage(), setActivationWindow(), activateWindow()
 */
 
 
 /*!
-    \fn void QtSingleApplication::initialize(bool dummy = true)
+       \fn void QtSingleApplication::initialize(bool dummy = true)
 
-    \obsolete
+       \obsolete
 */
index d1613a4f3c5e5fd86c90bc7f4fb6f63ad565def2..a6f5788539646a68f5b2af934cbddd0e07f8e649 100644 (file)
@@ -40,7 +40,7 @@
 #ifndef QTSINGLEAPPLICATION_H
 #define QTSINGLEAPPLICATION_H
 
-#include <QtGui/QApplication>
+#include <QApplication>
 
 class QtLocalPeer;
 
@@ -62,41 +62,40 @@ class QtLocalPeer;
 
 class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication
 {
-    Q_OBJECT
+       Q_OBJECT
 
 public:
-    QtSingleApplication(int &argc, char **argv, bool GUIenabled = true);
-    QtSingleApplication(const QString &id, int &argc, char **argv);
-    QtSingleApplication(int &argc, char **argv, Type type);
+       QtSingleApplication(int &argc, char **argv, bool GUIenabled = true);
+       QtSingleApplication(const QString &id, int &argc, char **argv);
 #if defined(Q_WS_X11)
-    QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
-    QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0);
-    QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
+       QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
+       QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0);
+       QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
 #endif
 
-    bool isRunning();
-    QString id() const;
+       bool isRunning();
+       QString id() const;
 
-    void setActivationWindow(QWidget* aw, bool activateOnMessage = true);
-    QWidget* activationWindow() const;
+       void setActivationWindow(QWidget* aw, bool activateOnMessage = true);
+       QWidget* activationWindow() const;
 
-    // Obsolete:
-    void initialize(bool dummy = true)
-        { isRunning(); Q_UNUSED(dummy) }
+       // Obsolete:
+       void initialize(bool dummy = true)
+               { isRunning(); Q_UNUSED(dummy) }
 
 public Q_SLOTS:
-    bool sendMessage(const QString &message, int timeout = 5000);
-    void activateWindow();
+       bool sendMessage(const QString &message, int timeout = 5000);
+       void activateWindow();
 
 
 Q_SIGNALS:
-    void messageReceived(const QString &message);
+       void messageReceived(const QString &message);
 
 
 private:
-    void sysInit(const QString &appId = QString());
-    QtLocalPeer *peer;
-    QWidget *actWin;
+       void sysInit(const QString &appId = QString());
+       QtLocalPeer *peer;
+       QWidget *actWin;
 };
 
 #endif // QTSINGLEAPPLICATION_H