/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #include "singleapplication.h" #include #include #include SingleApplication::SingleApplication(int &argc, char **argv) : QApplication(argc, argv) { } SingleApplication::~SingleApplication() { if(m_localServer != nullptr) { if(m_localServer->isListening()) { m_localServer->close(); QLocalServer::removeServer(LOCALSERVER_KEY); } } } /** * @brief SingleApplication::bindLocalSocket check for running local server by connecting to it * @return true if no other instance, false otherwise */ bool SingleApplication::bindLocalSocket(const QString &name) { LOCALSERVER_KEY = name; QLocalSocket socket; socket.connectToServer(LOCALSERVER_KEY); if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) { // another server is running socket.close(); return false; } // there is either no such socket, or the socket wasn't cleaned up else { m_localServer = new QLocalServer(this); connect(m_localServer, &QLocalServer::newConnection, this, &SingleApplication::parseMessage); // no other server QLocalServer::removeServer(LOCALSERVER_KEY); return m_localServer->listen(LOCALSERVER_KEY); } } QString SingleApplication::serverName() const { Q_CHECK_PTR(m_localServer); return m_localServer->fullServerName(); } int SingleApplication::sendMessage(const QString &profileName, bool newWindow, const QStringList &urls) { QLocalSocket socket; socket.connectToServer(LOCALSERVER_KEY); if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) { QHash hashedParams; hashedParams.insert("profile", profileName); hashedParams.insert("newWindow", newWindow); hashedParams.insert("urls", urls); QByteArray argumentData; QDataStream ds(&argumentData, QIODevice::WriteOnly); ds << hashedParams; socket.write(argumentData); socket.waitForBytesWritten(LOCALSERVER_TIMEOUT); return EXIT_SUCCESS; } return EXIT_FAILURE; } void SingleApplication::parseMessage() { QLocalSocket *socket = m_localServer->nextPendingConnection(); // null socket --> return if(socket == nullptr) { return; } socket->waitForReadyRead(); QByteArray argumentData = socket->readAll(); // skip if we got no data if(argumentData.isEmpty()) { return; } QHash params; QDataStream ds(argumentData); ds >> params; socket->deleteLater(); emit messageAvailable(params["profile"].toString(), params["newWindow"].toBool(), params["urls"].toStringList()); }