[Pkg-owncloud-commits] [owncloud-client] 12/83: Update QtSingleApplication and QtLockedFile
Sandro Knauß
hefee-guest at moszumanska.debian.org
Sat May 31 11:31:38 UTC 2014
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit 3db3c7b8767f64998fcd48b574729dca90b95fd9
Author: Daniel Molkentin <danimo at owncloud.com>
Date: Tue May 20 17:12:56 2014 +0200
Update QtSingleApplication and QtLockedFile
Fixes stale temp file issues, and is needed for blocking support.
---
src/3rdparty/qtlockedfile/README.txt | 2 +-
src/3rdparty/qtlockedfile/qtlockedfile.cpp | 41 ++---
src/3rdparty/qtlockedfile/qtlockedfile.h | 41 ++---
src/3rdparty/qtlockedfile/qtlockedfile.pri | 11 ++
src/3rdparty/qtlockedfile/qtlockedfile_unix.cpp | 42 ++---
src/3rdparty/qtlockedfile/qtlockedfile_win.cpp | 44 ++---
src/3rdparty/qtsingleapplication/README.txt | 2 +-
src/3rdparty/qtsingleapplication/qtlocalpeer.cpp | 82 +++++----
src/3rdparty/qtsingleapplication/qtlocalpeer.h | 53 +++---
.../qtsingleapplication/qtsingleapplication.cpp | 202 ++++++++++++---------
.../qtsingleapplication/qtsingleapplication.h | 80 ++++----
.../qtsingleapplication/qtsingleapplication.pri | 15 ++
.../qtsinglecoreapplication.cpp | 49 ++---
.../qtsingleapplication/qtsinglecoreapplication.h | 45 ++---
.../qtsinglecoreapplication.pri | 14 ++
src/mirall/application.cpp | 3 +-
16 files changed, 394 insertions(+), 332 deletions(-)
diff --git a/src/3rdparty/qtlockedfile/README.txt b/src/3rdparty/qtlockedfile/README.txt
index 564b478..b894012 100644
--- a/src/3rdparty/qtlockedfile/README.txt
+++ b/src/3rdparty/qtlockedfile/README.txt
@@ -1,5 +1,5 @@
This is the src directory of the QtLockedFile
-solution integrated over from Qt's Qt Creator.
+solution integrated over from Qt's Qt Creator.
It is required by the QtSingleApplication solution.
diff --git a/src/3rdparty/qtlockedfile/qtlockedfile.cpp b/src/3rdparty/qtlockedfile/qtlockedfile.cpp
index 93fa822..f833ca0 100644
--- a/src/3rdparty/qtlockedfile/qtlockedfile.cpp
+++ b/src/3rdparty/qtlockedfile/qtlockedfile.cpp
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include "qtlockedfile.h"
diff --git a/src/3rdparty/qtlockedfile/qtlockedfile.h b/src/3rdparty/qtlockedfile/qtlockedfile.h
index 1609837..fcfb8cc 100644
--- a/src/3rdparty/qtlockedfile/qtlockedfile.h
+++ b/src/3rdparty/qtlockedfile/qtlockedfile.h
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#ifndef QTLOCKEDFILE_H
#define QTLOCKEDFILE_H
diff --git a/src/3rdparty/qtlockedfile/qtlockedfile.pri b/src/3rdparty/qtlockedfile/qtlockedfile.pri
new file mode 100644
index 0000000..ad0c2fb
--- /dev/null
+++ b/src/3rdparty/qtlockedfile/qtlockedfile.pri
@@ -0,0 +1,11 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/qtlockedfile.h
+SOURCES += $$PWD/qtlockedfile.cpp
+
+unix:SOURCES += $$PWD/qtlockedfile_unix.cpp
+win32:SOURCES += $$PWD/qtlockedfile_win.cpp
+
+win32:contains(TEMPLATE, lib):contains(CONFIG, shared) {
+ DEFINES += QT_QTLOCKEDFILE_EXPORT=__declspec(dllexport)
+}
diff --git a/src/3rdparty/qtlockedfile/qtlockedfile_unix.cpp b/src/3rdparty/qtlockedfile/qtlockedfile_unix.cpp
index d3efa99..171178b 100644
--- a/src/3rdparty/qtlockedfile/qtlockedfile_unix.cpp
+++ b/src/3rdparty/qtlockedfile/qtlockedfile_unix.cpp
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include "qtlockedfile.h"
@@ -96,6 +95,7 @@ bool QtLockedFile::unlock()
}
m_lock_mode = NoLock;
+ remove();
return true;
}
diff --git a/src/3rdparty/qtlockedfile/qtlockedfile_win.cpp b/src/3rdparty/qtlockedfile/qtlockedfile_win.cpp
index 6d189fb..ae6286f 100644
--- a/src/3rdparty/qtlockedfile/qtlockedfile_win.cpp
+++ b/src/3rdparty/qtlockedfile/qtlockedfile_win.cpp
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include "qtlockedfile.h"
@@ -50,7 +49,7 @@ static QString errorCodeToString(DWORD errorCode)
if (data != 0)
LocalFree(data);
- if (result.endsWith('\n'))
+ if (result.endsWith(QLatin1Char('\n')))
result.truncate(result.length() - 1);
return result;
@@ -168,6 +167,7 @@ bool QtLockedFile::unlock()
}
m_lock_mode = QtLockedFile::NoLock;
+ remove();
return true;
}
diff --git a/src/3rdparty/qtsingleapplication/README.txt b/src/3rdparty/qtsingleapplication/README.txt
index daf5e1b..b5d8869 100644
--- a/src/3rdparty/qtsingleapplication/README.txt
+++ b/src/3rdparty/qtsingleapplication/README.txt
@@ -1,5 +1,5 @@
This is the src directory of the QtSingleApplication solution
-integrated over from Qt's Qt Creator project.
+integrated over from Qt's Qt Creator project.
It additionally requires the QtLockedFile solution.
diff --git a/src/3rdparty/qtsingleapplication/qtlocalpeer.cpp b/src/3rdparty/qtsingleapplication/qtlocalpeer.cpp
index a9d8c87..09c69ce 100644
--- a/src/3rdparty/qtsingleapplication/qtlocalpeer.cpp
+++ b/src/3rdparty/qtsingleapplication/qtlocalpeer.cpp
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include "qtlocalpeer.h"
@@ -47,34 +46,39 @@ static PProcessIdToSessionId pProcessIdToSessionId = 0;
namespace SharedTools {
-const char *QtLocalPeer::ack = "ack";
+static const char ack[] = "ack";
-QtLocalPeer::QtLocalPeer(QObject *parent, const QString &appId)
- : QObject(parent), id(appId)
+QString QtLocalPeer::appSessionId(const QString &appId)
{
- if (id.isEmpty())
- id = QCoreApplication::applicationFilePath(); //### On win, check if this returns .../argv[0] without casefolding; .\MYAPP == .\myapp on Win
-
- QByteArray idc = id.toUtf8();
+ QByteArray idc = appId.toUtf8();
quint16 idNum = qChecksum(idc.constData(), idc.size());
//### could do: two 16bit checksums over separate halves of id, for a 32bit result - improved uniqeness probability. Every-other-char split would be best.
- socketName = QLatin1String("qtsingleapplication-")
+ QString res = QLatin1String("qtsingleapplication-")
+ QString::number(idNum, 16);
#if defined(Q_OS_WIN)
if (!pProcessIdToSessionId) {
- QLibrary lib("kernel32");
+ QLibrary lib(QLatin1String("kernel32"));
pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId");
}
if (pProcessIdToSessionId) {
DWORD sessionId = 0;
pProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
- socketName += QLatin1Char('-') + QString::number(sessionId, 16);
+ res += QLatin1Char('-') + QString::number(sessionId, 16);
}
#else
- socketName += QLatin1Char('-') + QString::number(::getuid(), 16);
+ res += QLatin1Char('-') + QString::number(::getuid(), 16);
#endif
+ return res;
+}
+QtLocalPeer::QtLocalPeer(QObject *parent, const QString &appId)
+ : QObject(parent), id(appId)
+{
+ if (id.isEmpty())
+ id = QCoreApplication::applicationFilePath(); //### On win, check if this returns .../argv[0] without casefolding; .\MYAPP == .\myapp on Win
+
+ socketName = appSessionId(id);
server = new QLocalServer(this);
QString lockName = QDir(QDir::tempPath()).absolutePath()
+ QLatin1Char('/') + socketName
@@ -100,7 +104,7 @@ bool QtLocalPeer::isClient()
return false;
}
-bool QtLocalPeer::sendMessage(const QString &message, int timeout)
+bool QtLocalPeer::sendMessage(const QString &message, int timeout, bool block)
{
if (!isClient())
return false;
@@ -130,6 +134,8 @@ bool QtLocalPeer::sendMessage(const QString &message, int timeout)
bool res = socket.waitForBytesWritten(timeout);
res &= socket.waitForReadyRead(timeout); // wait for ack
res &= (socket.read(qstrlen(ack)) == ack);
+ if (block) // block until peer disconnects
+ socket.waitForDisconnected(-1);
return res;
}
@@ -140,8 +146,11 @@ void QtLocalPeer::receiveConnection()
return;
// Why doesn't Qt have a blocking stream that takes care of this shait???
- while (socket->bytesAvailable() < static_cast<int>(sizeof(quint32)))
- socket->waitForReadyRead();
+ while (socket->bytesAvailable() < static_cast<int>(sizeof(quint32))) {
+ if (!socket->isValid()) // stale request
+ return;
+ socket->waitForReadyRead(1000);
+ }
QDataStream ds(socket);
QByteArray uMsg;
quint32 remaining;
@@ -166,8 +175,7 @@ void QtLocalPeer::receiveConnection()
QString message = QString::fromUtf8(uMsg.constData(), uMsg.size());
socket->write(ack, qstrlen(ack));
socket->waitForBytesWritten(1000);
- delete socket;
- emit messageReceived(message); // ##(might take a long time to return)
+ emit messageReceived(message, socket); // ##(might take a long time to return)
}
} // namespace SharedTools
diff --git a/src/3rdparty/qtsingleapplication/qtlocalpeer.h b/src/3rdparty/qtsingleapplication/qtlocalpeer.h
index b28caad..3619363 100644
--- a/src/3rdparty/qtsingleapplication/qtlocalpeer.h
+++ b/src/3rdparty/qtsingleapplication/qtlocalpeer.h
@@ -1,34 +1,33 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
-**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
-#include "qtlockedfile.h"
+#include <qtlockedfile.h>
#include <QLocalServer>
#include <QLocalSocket>
@@ -43,12 +42,13 @@ class QtLocalPeer : public QObject
public:
explicit QtLocalPeer(QObject *parent = 0, const QString &appId = QString());
bool isClient();
- bool sendMessage(const QString &message, int timeout);
+ bool sendMessage(const QString &message, int timeout, bool block);
QString applicationId() const
{ return id; }
+ static QString appSessionId(const QString &appId);
Q_SIGNALS:
- void messageReceived(const QString &message);
+ void messageReceived(const QString &message, QObject *socket);
protected Q_SLOTS:
void receiveConnection();
@@ -58,9 +58,6 @@ protected:
QString socketName;
QLocalServer* server;
QtLockedFile lockFile;
-
-private:
- static const char* ack;
};
} // namespace SharedTools
diff --git a/src/3rdparty/qtsingleapplication/qtsingleapplication.cpp b/src/3rdparty/qtsingleapplication/qtsingleapplication.cpp
index 69e6f32..9610937 100644
--- a/src/3rdparty/qtsingleapplication/qtsingleapplication.cpp
+++ b/src/3rdparty/qtsingleapplication/qtsingleapplication.cpp
@@ -1,96 +1,123 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include "qtsingleapplication.h"
#include "qtlocalpeer.h"
-#include <QWidget>
+#include <qtlockedfile.h>
+
+#include <QDir>
#include <QFileOpenEvent>
+#include <QSharedMemory>
+#include <QWidget>
namespace SharedTools {
-void QtSingleApplication::sysInit(const QString &appId)
-{
- actWin = 0;
- firstPeer = new QtLocalPeer(this, appId);
- connect(firstPeer, SIGNAL(messageReceived(QString)), SIGNAL(messageReceived(QString)));
- pidPeer = new QtLocalPeer(this, appId + QLatin1Char('-') + QString::number(QCoreApplication::applicationPid(), 10));
- connect(pidPeer, SIGNAL(messageReceived(QString)), SIGNAL(messageReceived(QString)));
-}
+static const int instancesSize = 1024;
-
-QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled)
- : QApplication(argc, argv, GUIenabled)
+static QString instancesLockFilename(const QString &appSessionId)
{
- sysInit();
+ const QChar slash(QLatin1Char('/'));
+ QString res = QDir::tempPath();
+ if (!res.endsWith(slash))
+ res += slash;
+ return res + appSessionId + QLatin1String("-instances");
}
-
QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv)
- : QApplication(argc, argv)
+ : QApplication(argc, argv),
+ firstPeer(-1),
+ pidPeer(0)
{
this->appId = appId;
- sysInit(appId);
-}
-
-
-#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
-QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)
- : QApplication(argc, argv, type)
-{
- sysInit();
-}
-#endif
-
-#if defined(Q_WS_X11)
-QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE colormap)
- : QApplication(dpy, visual, colormap)
-{
- sysInit();
-}
+ const QString appSessionId = QtLocalPeer::appSessionId(appId);
-QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)
- : QApplication(dpy, argc, argv, visual, cmap)
-{
- sysInit();
-}
+ // This shared memory holds a zero-terminated array of active (or crashed) instances
+ instances = new QSharedMemory(appSessionId, this);
+ actWin = 0;
+ block = false;
+
+ // First instance creates the shared memory, later instances attach to it
+ const bool created = instances->create(instancesSize);
+ if (!created) {
+ if (!instances->attach()) {
+ qWarning() << "Failed to initialize instances shared memory: "
+ << instances->errorString();
+ delete instances;
+ instances = 0;
+ return;
+ }
+ }
-QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId,
- int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE colormap)
- : QApplication(dpy, argc, argv, visual, colormap)
-{
- this->appId = appId;
- sysInit(appId);
+ // QtLockedFile is used to workaround QTBUG-10364
+ QtLockedFile lockfile(instancesLockFilename(appSessionId));
+
+ lockfile.open(QtLockedFile::ReadWrite);
+ lockfile.lock(QtLockedFile::WriteLock);
+ qint64 *pids = static_cast<qint64 *>(instances->data());
+ if (!created) {
+ // Find the first instance that it still running
+ // The whole list needs to be iterated in order to append to it
+ for (; *pids; ++pids) {
+ if (firstPeer == -1 && isRunning(*pids))
+ firstPeer = *pids;
+ }
+ }
+ // Add current pid to list and terminate it
+ *pids++ = QCoreApplication::applicationPid();
+ *pids = 0;
+ pidPeer = new QtLocalPeer(this, appId + QLatin1Char('-') +
+ QString::number(QCoreApplication::applicationPid()));
+ connect(pidPeer, SIGNAL(messageReceived(QString,QObject*)), SIGNAL(messageReceived(QString,QObject*)));
+ pidPeer->isClient();
+ lockfile.unlock();
+}
+
+QtSingleApplication::~QtSingleApplication()
+{
+ if (!instances)
+ return;
+ const qint64 appPid = QCoreApplication::applicationPid();
+ QtLockedFile lockfile(instancesLockFilename(QtLocalPeer::appSessionId(appId)));
+ lockfile.open(QtLockedFile::ReadWrite);
+ lockfile.lock(QtLockedFile::WriteLock);
+ // Rewrite array, removing current pid and previously crashed ones
+ qint64 *pids = static_cast<qint64 *>(instances->data());
+ qint64 *newpids = pids;
+ for (; *pids; ++pids) {
+ if (*pids != appPid && isRunning(*pids))
+ *newpids++ = *pids;
+ }
+ *newpids = 0;
+ lockfile.unlock();
}
-#endif
bool QtSingleApplication::event(QEvent *event)
{
@@ -104,48 +131,47 @@ bool QtSingleApplication::event(QEvent *event)
bool QtSingleApplication::isRunning(qint64 pid)
{
- if (pid == -1)
- return firstPeer->isClient();
+ if (pid == -1) {
+ pid = firstPeer;
+ if (pid == -1)
+ return false;
+ }
QtLocalPeer peer(this, appId + QLatin1Char('-') + QString::number(pid, 10));
return peer.isClient();
}
-void QtSingleApplication::initialize(bool)
-{
- firstPeer->isClient();
- pidPeer->isClient();
-}
-
bool QtSingleApplication::sendMessage(const QString &message, int timeout, qint64 pid)
{
- if (pid == -1)
- return firstPeer->sendMessage(message, timeout);
+ if (pid == -1) {
+ pid = firstPeer;
+ if (pid == -1)
+ return false;
+ }
QtLocalPeer peer(this, appId + QLatin1Char('-') + QString::number(pid, 10));
- return peer.sendMessage(message, timeout);
+ return peer.sendMessage(message, timeout, block);
}
-QString QtSingleApplication::id() const
+QString QtSingleApplication::applicationId() const
{
- return firstPeer->applicationId();
+ return appId;
}
-QString QtSingleApplication::applicationId() const
+void QtSingleApplication::setBlock(bool value)
{
- return appId;
+ block = value;
}
void QtSingleApplication::setActivationWindow(QWidget *aw, bool activateOnMessage)
{
actWin = aw;
- if (activateOnMessage) {
- connect(firstPeer, SIGNAL(messageReceived(QString)), this, SLOT(activateWindow()));
- connect(pidPeer, SIGNAL(messageReceived(QString)), this, SLOT(activateWindow()));
- } else {
- disconnect(firstPeer, SIGNAL(messageReceived(QString)), this, SLOT(activateWindow()));
- disconnect(pidPeer, SIGNAL(messageReceived(QString)), this, SLOT(activateWindow()));
- }
+ if (!pidPeer)
+ return;
+ if (activateOnMessage)
+ connect(pidPeer, SIGNAL(messageReceived(QString,QObject*)), this, SLOT(activateWindow()));
+ else
+ disconnect(pidPeer, SIGNAL(messageReceived(QString,QObject*)), this, SLOT(activateWindow()));
}
diff --git a/src/3rdparty/qtsingleapplication/qtsingleapplication.h b/src/3rdparty/qtsingleapplication/qtsingleapplication.h
index b04b2a1..9e8d86c 100644
--- a/src/3rdparty/qtsingleapplication/qtsingleapplication.h
+++ b/src/3rdparty/qtsingleapplication/qtsingleapplication.h
@@ -1,38 +1,39 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
-#ifndef _SHAREDTOOLS_SINGLEAPPLICATION
-#define _SHAREDTOOLS_SINGLEAPPLICATION
+#ifndef QTSINGLEAPPLICATION_H
+#define QTSINGLEAPPLICATION_H
#include <QApplication>
+QT_FORWARD_DECLARE_CLASS(QSharedMemory)
+
namespace SharedTools {
class QtLocalPeer;
@@ -42,50 +43,37 @@ class QtSingleApplication : public QApplication
Q_OBJECT
public:
- QtSingleApplication(int &argc, char **argv, bool GUIenabled = true);
QtSingleApplication(const QString &id, int &argc, char **argv);
-#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
- QtSingleApplication(int &argc, char **argv, Type type);
-#endif
-#if defined(Q_WS_X11)
- explicit 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);
-#endif
+ ~QtSingleApplication();
bool isRunning(qint64 pid = -1);
- QString id() const;
-
void setActivationWindow(QWidget* aw, bool activateOnMessage = true);
QWidget* activationWindow() const;
bool event(QEvent *event);
QString applicationId() const;
+ void setBlock(bool value);
public Q_SLOTS:
bool sendMessage(const QString &message, int timeout = 5000, qint64 pid = -1);
void activateWindow();
-//Obsolete methods:
-public:
- void initialize(bool = true);
-
-#if defined(Q_WS_X11)
- QtSingleApplication(Display* dpy, const QString &id, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);
-#endif
-// end obsolete methods
-
Q_SIGNALS:
- void messageReceived(const QString &message);
+ void messageReceived(const QString &message, QObject *socket);
void fileOpenRequest(const QString &file);
private:
- void sysInit(const QString &appId = QString());
- QtLocalPeer *firstPeer;
+ QString instancesFileName(const QString &appId);
+
+ qint64 firstPeer;
+ QSharedMemory *instances;
QtLocalPeer *pidPeer;
QWidget *actWin;
QString appId;
+ bool block;
};
} // namespace SharedTools
-#endif // _SHAREDTOOLS_SINGLEAPPLICATION
+
+#endif // QTSINGLEAPPLICATION_H
diff --git a/src/3rdparty/qtsingleapplication/qtsingleapplication.pri b/src/3rdparty/qtsingleapplication/qtsingleapplication.pri
new file mode 100644
index 0000000..c807763
--- /dev/null
+++ b/src/3rdparty/qtsingleapplication/qtsingleapplication.pri
@@ -0,0 +1,15 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h
+SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp
+
+QT *= network
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+gotqtlockedfile = $$find(HEADERS, .*qtlockedfile.h)
+isEmpty(gotqtlockedfile):include(../qtlockedfile/qtlockedfile.pri)
+
+
+win32:contains(TEMPLATE, lib):contains(CONFIG, shared) {
+ DEFINES += QT_QTSINGLEAPPLICATION_EXPORT=__declspec(dllexport)
+}
diff --git a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp
index 96af121..25a511f 100644
--- a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp
+++ b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include "qtsinglecoreapplication.h"
#include "qtlocalpeer.h"
@@ -37,6 +36,7 @@ QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv)
: QCoreApplication(argc, argv)
{
peer = new QtLocalPeer(this);
+ block = false;
connect(peer, SIGNAL(messageReceived(QString)), SIGNAL(messageReceived(QString)));
}
@@ -57,7 +57,7 @@ bool QtSingleCoreApplication::isRunning()
bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout)
{
- return peer->sendMessage(message, timeout);
+ return peer->sendMessage(message, timeout, block);
}
@@ -66,4 +66,9 @@ QString QtSingleCoreApplication::id() const
return peer->applicationId();
}
+void QtSingleCoreApplication::setBlock(bool value)
+{
+ block = value;
+}
+
} // namespace SharedTools
diff --git a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h
index 373f693..1575032 100644
--- a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h
+++ b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h
@@ -1,32 +1,31 @@
-/**************************************************************************
+/****************************************************************************
**
-** This file is part of Qt Creator
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
-** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: http://www.qt-project.org/
+** This file is part of Qt Creator.
**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
-**
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Other Usage
-**
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**************************************************************************/
+****************************************************************************/
#include <QCoreApplication>
@@ -44,6 +43,7 @@ public:
bool isRunning();
QString id() const;
+ void setBlock(bool value);
public Q_SLOTS:
bool sendMessage(const QString &message, int timeout = 5000);
@@ -55,6 +55,7 @@ Q_SIGNALS:
private:
QtLocalPeer* peer;
+ bool block;
};
} // namespace SharedTools
diff --git a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.pri b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.pri
new file mode 100644
index 0000000..3d6301b
--- /dev/null
+++ b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.pri
@@ -0,0 +1,14 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/qtsinglecoreapplication.h $$PWD/qtlocalpeer.h
+SOURCES += $$PWD/qtsinglecoreapplication.cpp $$PWD/qtlocalpeer.cpp
+
+QT *= network
+
+gotqtlockedfile = $$find(HEADERS, .*qtlockedfile.h)
+isEmpty(gotqtlockedfile):include(../qtlockedfile/qtlockedfile.pri)
+
+
+win32:contains(TEMPLATE, lib):contains(CONFIG, shared) {
+ DEFINES += QT_QTSINGLECOREAPPLICATION_EXPORT=__declspec(dllexport)
+}
diff --git a/src/mirall/application.cpp b/src/mirall/application.cpp
index 7b0a6f1..86b8f85 100644
--- a/src/mirall/application.cpp
+++ b/src/mirall/application.cpp
@@ -77,7 +77,7 @@ QString applicationTrPath()
// ----------------------------------------------------------------------------------
Application::Application(int &argc, char **argv) :
- SharedTools::QtSingleApplication(argc, argv),
+ SharedTools::QtSingleApplication(Theme::instance()->appName() ,argc, argv),
_gui(0),
_theme(Theme::instance()),
_helpOnly(false),
@@ -97,7 +97,6 @@ Application::Application(int &argc, char **argv) :
//no need to waste time;
if ( _helpOnly ) return;
- initialize();
if (isRunning())
return;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list