Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F34906393
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
5 KB
Subscribers
None
View Options
diff --git a/main.cpp b/main.cpp
index d4a97f7..87df4ad 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,27 +1,31 @@
#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
+#include "singleapplication.h"
int main(int argc, char *argv[])
{
- QApplication app(argc, argv);
+ SingleApplication app(argc, argv, "QtPass");
+ if (app.isRunning()) {
+ return 0;
+ }
QCoreApplication::setOrganizationName("IJHack");
QCoreApplication::setOrganizationDomain("ijhack.org");
QCoreApplication::setApplicationName("QtPass");
QCoreApplication::setApplicationVersion("0.1.0");
//Setup and load translator for localization
QTranslator translator;
QString locale = QLocale::system().name();
translator.load(QString(":localization/localization_") + locale + QString(".qm"));
app.installTranslator(&translator);
MainWindow w;
app.setWindowIcon(QIcon(":artwork/icon.png"));
w.checkConfig();
w.show();
return app.exec();
}
diff --git a/qtpass.pro b/qtpass.pro
index fe4f027..e81e24b 100644
--- a/qtpass.pro
+++ b/qtpass.pro
@@ -1,49 +1,51 @@
#-------------------------------------------------
#
# Project created by QtCreator 2014-07-30T21:56:15
#
#-------------------------------------------------
-QT += core gui
+QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
macx {
TARGET = QtPass
} else {
TARGET = qtpass
}
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
dialog.cpp \
- storemodel.cpp
+ storemodel.cpp \
+ singleapplication.cpp
HEADERS += mainwindow.h \
dialog.h \
- storemodel.h
+ storemodel.h \
+ singleapplication.h
FORMS += mainwindow.ui \
dialog.ui
TRANSLATIONS += localization/localization_nl_NL.ts \
localization/localization_de_DE.ts \
localization/localization_hu_HU.ts \
localization/localization_sv_SE.ts \
localization/localization_pl_PL.ts
RESOURCES += resources.qrc
win32 {
RC_FILE = windows.rc
} else:macx {
ICON = artwork/icon.icns
}
OTHER_FILES += LICENSE \
README.md
target.path = /usr/local/bin/
INSTALLS += target
diff --git a/singleapplication.cpp b/singleapplication.cpp
new file mode 100644
index 0000000..fc668f9
--- /dev/null
+++ b/singleapplication.cpp
@@ -0,0 +1,68 @@
+#include <QLocalSocket>
+
+#include "singleapplication.h"
+
+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 = new QLocalServer(this);
+ connect(localServer, SIGNAL(newConnection()), this, SLOT(receiveMessage()));
+ localServer->listen(_uniqueKey);
+ }
+}
+
+// public slots.
+
+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.
+
+bool SingleApplication::isRunning()
+{
+ return _isRunning;
+}
+
+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;
+}
diff --git a/singleapplication.h b/singleapplication.h
new file mode 100644
index 0000000..85c5f60
--- /dev/null
+++ b/singleapplication.h
@@ -0,0 +1,31 @@
+#ifndef SINGLE_APPLICATION_H
+#define SINGLE_APPLICATION_H
+
+#include <QApplication>
+#include <QSharedMemory>
+#include <QLocalServer>
+
+class SingleApplication : public QApplication
+{
+ Q_OBJECT
+public:
+ SingleApplication(int &argc, char *argv[], const QString uniqueKey);
+
+ bool isRunning();
+ bool sendMessage(const QString &message);
+
+public slots:
+ void receiveMessage();
+
+signals:
+ void messageAvailable(QString message);
+
+private:
+ bool _isRunning;
+ QString _uniqueKey;
+ QSharedMemory sharedMemory;
+ QLocalServer *localServer;
+
+ static const int timeout = 1000;
+};
+#endif // SINGLE_APPLICATION_H
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Jan 27, 8:53 PM (23 h, 24 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
aa/09/14b20ce88598b105efcdb8866386
Attached To
rGPGPASS GnuPG Password Manager
Event Timeline
Log In to Comment