diff options
Diffstat (limited to 'src/singleapplication.cpp')
-rw-r--r-- | src/singleapplication.cpp | 44 |
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 ¶ms) +bool SingleApplication::sendMessage(const QHash<QString, QVariant> ¶ms) { 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); |