diff options
Diffstat (limited to 'src/singleapplication.cpp')
-rw-r--r-- | src/singleapplication.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/singleapplication.cpp b/src/singleapplication.cpp new file mode 100644 index 0000000..3a23bfb --- /dev/null +++ b/src/singleapplication.cpp @@ -0,0 +1,71 @@ +/******************************************************************************* + ** + ** smolbote: yet another qute browser + ** Copyright (C) 2017 Xian Nox + ** + ** This program is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with this program. If not, see <http://www.gnu.org/licenses/>. + ** + ******************************************************************************/ + +#include "singleapplication.h" +#include <QLocalSocket> + +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 + QLocalServer::removeServer(LOCALSERVER_KEY); + if(!m_localServer->listen(LOCALSERVER_KEY)) { + qWarning("Cannot bind local server [%s]", qUtf8Printable(LOCALSERVER_KEY)); + } + } + +} + +bool SingleApplication::isRunning() +{ + return !m_localServer->isListening(); +} + +bool SingleApplication::sendMessage(const QStringList ¶ms) +{ + QLocalSocket socket; + socket.connectToServer(LOCALSERVER_KEY); + if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) { + socket.write(params.join('|').toUtf8()); + socket.waitForBytesWritten(); + return true; + } + + return false; +} + +void SingleApplication::receiveMessage() +{ + QLocalSocket *socket = m_localServer->nextPendingConnection(); + if(!socket) { + // null socket --> return + return; + } + + socket->waitForReadyRead(); + const QStringList params = QString(socket->readAll()).split('|'); + socket->deleteLater(); + + emit messageAvailable(params); +} |