summaryrefslogtreecommitdiffstats
path: root/singleapplication.cpp
diff options
context:
space:
mode:
authorAnne Jan Brouwer <brouwer@annejan.com>2014-08-17 05:23:37 +0200
committerAnne Jan Brouwer <ajbrouwer@totalactivemedia.nl>2014-08-17 05:23:37 +0200
commit9c70b87e1e9736e2cf74162532665d9d7d0c5149 (patch)
tree7686531a2596bb67321e6bad99c4ff2f442a93ea /singleapplication.cpp
parenta0b9842a969ed5454d3c502fa03b9a9c036bb862 (diff)
Highlander code
Diffstat (limited to 'singleapplication.cpp')
-rw-r--r--singleapplication.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/singleapplication.cpp b/singleapplication.cpp
new file mode 100644
index 00000000..fc668f97
--- /dev/null
+++ b/singleapplication.cpp
@@ -0,0 +1,68 @@
+#include <QLocalSocket>
+
+#include "singleapplication.h"
+
+SingleApplication::SingleApplication(int &argc, char *argv[], const QString uniqueKey) : QApplication(argc, argv), _uniqueKey(uniqueKey)
+{
+ sharedMemory.setKey(_uniqueKey);
+ if (sharedMemory.attach())
+ _isRunning = true;
+ else
+ {
+ _isRunning = false;
+ // create shared memory.
+ if (!sharedMemory.create(1))
+ {
+ qDebug("Unable to create single instance.");
+ return;
+ }
+ // create local server and listen to incomming messages from other instances.
+ localServer = new QLocalServer(this);
+ connect(localServer, SIGNAL(newConnection()), this, SLOT(receiveMessage()));
+ localServer->listen(_uniqueKey);
+ }
+}
+
+// public slots.
+
+void SingleApplication::receiveMessage()
+{
+ QLocalSocket *localSocket = localServer->nextPendingConnection();
+ if (!localSocket->waitForReadyRead(timeout))
+ {
+ qDebug() << localSocket->errorString().toLatin1();
+ return;
+ }
+ QByteArray byteArray = localSocket->readAll();
+ QString message = QString::fromUtf8(byteArray.constData());
+ emit messageAvailable(message);
+ localSocket->disconnectFromServer();
+}
+
+// public functions.
+
+bool SingleApplication::isRunning()
+{
+ return _isRunning;
+}
+
+bool SingleApplication::sendMessage(const QString &message)
+{
+ if (!_isRunning)
+ return false;
+ QLocalSocket localSocket(this);
+ localSocket.connectToServer(_uniqueKey, QIODevice::WriteOnly);
+ if (!localSocket.waitForConnected(timeout))
+ {
+ qDebug() << localSocket.errorString().toLatin1();
+ return false;
+ }
+ localSocket.write(message.toUtf8());
+ if (!localSocket.waitForBytesWritten(timeout))
+ {
+ qDebug() << localSocket.errorString().toLatin1();
+ return false;
+ }
+ localSocket.disconnectFromServer();
+ return true;
+}