summaryrefslogtreecommitdiffstats
path: root/singleapplication.cpp
blob: 8573a8cce2750f5547082448f362647edc1d999a (plain)
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
82
83
84
85
#include <QLocalSocket>

#include "singleapplication.h"

/**
 * @brief SingleApplication::SingleApplication
 * @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
 */
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
 * @return
 */
bool SingleApplication::isRunning()
{
        return _isRunning;
}

/**
 * @brief SingleApplication::sendMessage
 * @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;
}