/***************************************************************************
* Copyright (C) 2010 - 2013 by Artem 'DOOMer' Galichkin *
* doomer3d@gmail.com *
* *
* 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 2 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 . *
***************************************************************************/
#include
#include
#include
#include "singleapp.h"
/*!
Creates of sungle application object
\param argc Nuber of command line arguments
\param argv Array of command line argwuments
\param uniqueKey String key fo unicue shared data indefier
*/
SingleApp::SingleApp(int& argc, char* argv[], const QString keyString) : QApplication(argc, argv), uniqueKey(keyString)
{
sharedMemory.setKey(uniqueKey);
if (sharedMemory.attach())
runned = true;
else
{
runned = false;
// create shared memory.
if (!sharedMemory.create(1))
{
qDebug("Unable to create single instance.");
return;
}
// create local server and listen to incomming messages from other instances.
localServer = new QLocalServer(this);
connect(localServer, SIGNAL(newConnection()), this, SLOT(receiveMessage()));
localServer->listen(uniqueKey);
}
}
// public slots.
void SingleApp::receiveMessage()
{
QLocalSocket *localSocket = localServer->nextPendingConnection();
if (!localSocket->waitForReadyRead(timeout))
{
qDebug("%s", qPrintable(localSocket->errorString().toLatin1()));
return;
}
QByteArray byteArray = localSocket->readAll();
QString message = QString::fromUtf8(byteArray.constData());
emit messageReceived(message);
localSocket->disconnectFromServer();
}
// public functions.
/*!
Checking instance application
\return bool Return tue is another instance running
*/
bool SingleApp::isRunning()
{
return runned;
}
/*1
Sending message to another running instance of application
\param message String dended message
\tryitn bool Return status ofsending message process
*/
bool SingleApp::sendMessage(const QString &message)
{
if (!runned)
return false;
QLocalSocket localSocket(this);
localSocket.connectToServer(uniqueKey, QIODevice::WriteOnly);
if (!localSocket.waitForConnected(timeout))
{
qDebug("%s",qPrintable(localSocket.errorString().toLatin1()));
return false;
}
localSocket.write(message.toUtf8());
if (!localSocket.waitForBytesWritten(timeout))
{
qDebug("%s",qPrintable(localSocket.errorString().toLatin1()));
return false;
}
localSocket.disconnectFromServer();
return true;
}