From 6db714e70c1368eeed3542a92f3db2d4161b4de1 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 16 Sep 2017 14:58:12 +0200 Subject: Fixed bug opening URLs from the command line while instance is running --- src/singleapplication.cpp | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) (limited to 'src/singleapplication.cpp') 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 #include +#include 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 ¶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 params; + QDataStream ds(argumentData); + ds >> params; + socket->deleteLater(); emit messageAvailable(params); -- cgit v1.2.1