1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include "singleapplication.h"
#include <QLocalSocket>
/**
* @brief SingleApplication::SingleApplication this replaces the QApplication
* allowing for local socket based communications.
* @param argc
* @param argv
* @param uniqueKey
*/
SingleApplication::SingleApplication(int &argc, char *argv[],
const QString uniqueKey)
: QApplication(argc, argv), _uniqueKey(uniqueKey) {
sharedMemory.setKey(_uniqueKey);
if (sharedMemory.attach()) {
_isRunning = true;
} else {
_isRunning = 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.reset(new QLocalServer(this));
connect(localServer.data(), SIGNAL(newConnection()), this,
SLOT(receiveMessage()));
localServer->listen(_uniqueKey);
}
}
// public slots.
/**
* @brief SingleApplication::receiveMessage we have received (a command line)
* message.
*/
void SingleApplication::receiveMessage() {
QLocalSocket *localSocket = localServer->nextPendingConnection();
if (!localSocket->waitForReadyRead(timeout)) {
qDebug() << localSocket->errorString().toLatin1();
return;
}
QByteArray byteArray = localSocket->readAll();
QString message = QString::fromUtf8(byteArray.constData());
emit messageAvailable(message);
localSocket->disconnectFromServer();
}
// public functions.
/**
* @brief SingleApplication::isRunning is there already a QtPass instance
* running, to check wether to be server or client.
* @return
*/
bool SingleApplication::isRunning() { return _isRunning; }
/**
* @brief SingleApplication::sendMessage send a message (from commandline) to an
* already running QtPass instance.
* @param message
* @return
*/
bool SingleApplication::sendMessage(const QString &message) {
if (!_isRunning)
return false;
QLocalSocket localSocket(this);
localSocket.connectToServer(_uniqueKey, QIODevice::WriteOnly);
if (!localSocket.waitForConnected(timeout)) {
qDebug() << localSocket.errorString().toLatin1();
return false;
}
localSocket.write(message.toUtf8());
if (!localSocket.waitForBytesWritten(timeout)) {
qDebug() << localSocket.errorString().toLatin1();
return false;
}
localSocket.disconnectFromServer();
return true;
}
|