aboutsummaryrefslogtreecommitdiff
path: root/src/singleapplication.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/singleapplication.cpp')
-rw-r--r--src/singleapplication.cpp44
1 files changed, 31 insertions, 13 deletions
diff --git a/src/singleapplication.cpp b/src/singleapplication.cpp
index cb08e35..01b2e65 100644
--- a/src/singleapplication.cpp
+++ b/src/singleapplication.cpp
@@ -21,19 +21,27 @@
#include "singleapplication.h"
#include <QLocalServer>
#include <QLocalSocket>
+#include <QDataStream>
SingleApplication::SingleApplication(int &argc, char **argv) : QApplication(argc, argv)
{
- m_localServer = new QLocalServer(this);
- connect(m_localServer, SIGNAL(newConnection()), this, SLOT(receiveMessage()));
+}
- // if we can't send the arguments to a listening local server, start one
- if(!sendMessage(arguments())) {
- // remove any unused socket
+SingleApplication::~SingleApplication()
+{
+ if(m_localServer->isListening()) {
+ m_localServer->close();
QLocalServer::removeServer(LOCALSERVER_KEY);
- if(!m_localServer->listen(LOCALSERVER_KEY)) {
- qWarning("Cannot bind local server [%s]", qUtf8Printable(LOCALSERVER_KEY));
- }
+ }
+}
+
+void SingleApplication::bindLocalSocket()
+{
+ m_localServer = new QLocalServer(this);
+ connect(m_localServer, SIGNAL(newConnection()), this, SLOT(slot_receiveMessage()));
+
+ if(!m_localServer->listen(LOCALSERVER_KEY)) {
+ qWarning("Cannot bind local server [%s]", qUtf8Printable(LOCALSERVER_KEY));
}
}
@@ -43,20 +51,24 @@ bool SingleApplication::isRunning()
return !m_localServer->isListening();
}
-bool SingleApplication::sendMessage(const QStringList &params)
+bool SingleApplication::sendMessage(const QHash<QString, QVariant> &params)
{
QLocalSocket socket;
socket.connectToServer(LOCALSERVER_KEY);
if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) {
- socket.write(params.join('|').toUtf8());
- socket.waitForBytesWritten();
+ QByteArray argumentData;
+ QDataStream ds(&argumentData, QIODevice::WriteOnly);
+ ds << params;
+
+ socket.write(argumentData);
+ socket.waitForBytesWritten(LOCALSERVER_TIMEOUT);
return true;
}
return false;
}
-void SingleApplication::receiveMessage()
+void SingleApplication::slot_receiveMessage()
{
QLocalSocket *socket = m_localServer->nextPendingConnection();
if(!socket) {
@@ -65,7 +77,13 @@ void SingleApplication::receiveMessage()
}
socket->waitForReadyRead();
- const QStringList params = QString(socket->readAll()).split('|');
+
+ QByteArray argumentData = socket->readAll();
+
+ QHash<QString, QVariant> params;
+ QDataStream ds(argumentData);
+ ds >> params;
+
socket->deleteLater();
emit messageAvailable(params);