SingleApplication
This commit is contained in:
parent
96aa3d409d
commit
39224c7bf7
5 changed files with 2 additions and 139 deletions
|
|
@ -27,7 +27,7 @@
|
||||||
#include <QtNetwork/QLocalSocket>
|
#include <QtNetwork/QLocalSocket>
|
||||||
|
|
||||||
#ifndef QAPPLICATION_CLASS
|
#ifndef QAPPLICATION_CLASS
|
||||||
#define QAPPLICATION_CLASS QCoreApplication
|
#define QAPPLICATION_CLASS QApplication
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include QT_STRINGIFY(QAPPLICATION_CLASS)
|
#include QT_STRINGIFY(QAPPLICATION_CLASS)
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ HEADERS += \
|
||||||
defines.h \
|
defines.h \
|
||||||
managementserver.h \
|
managementserver.h \
|
||||||
protocols/shadowsocksvpnprotocol.h \
|
protocols/shadowsocksvpnprotocol.h \
|
||||||
runguard.h \
|
|
||||||
settings.h \
|
settings.h \
|
||||||
ui/Controls/SlidingStackedWidget.h \
|
ui/Controls/SlidingStackedWidget.h \
|
||||||
ui/mainwindow.h \
|
ui/mainwindow.h \
|
||||||
|
|
@ -39,7 +38,6 @@ SOURCES += \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
managementserver.cpp \
|
managementserver.cpp \
|
||||||
protocols/shadowsocksvpnprotocol.cpp \
|
protocols/shadowsocksvpnprotocol.cpp \
|
||||||
runguard.cpp \
|
|
||||||
settings.cpp \
|
settings.cpp \
|
||||||
ui/Controls/SlidingStackedWidget.cpp \
|
ui/Controls/SlidingStackedWidget.cpp \
|
||||||
ui/mainwindow.cpp \
|
ui/mainwindow.cpp \
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,10 @@
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "runguard.h"
|
#include "singleapplication.h"
|
||||||
|
|
||||||
#include "ui/mainwindow.h"
|
#include "ui/mainwindow.h"
|
||||||
|
|
||||||
#define QAPPLICATION_CLASS QApplication
|
|
||||||
#include "singleapplication.h"
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include "Windows.h"
|
#include "Windows.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -28,7 +25,6 @@ static void loadTranslator()
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
|
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
|
||||||
//RunGuard::instance(APPLICATION_NAME).activate();
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
AllowSetForegroundWindow(ASFW_ANY);
|
AllowSetForegroundWindow(ASFW_ANY);
|
||||||
|
|
@ -42,12 +38,6 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
loadTranslator();
|
loadTranslator();
|
||||||
|
|
||||||
// if (!RunGuard::instance().tryToRun()) {
|
|
||||||
// qDebug() << "Tried to run second instance. Exiting...";
|
|
||||||
// QMessageBox::information(NULL, QObject::tr("Notification"), QObject::tr("AmneziaVPN is already running."));
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
QFontDatabase::addApplicationFont(":/fonts/Lato-Black.ttf");
|
QFontDatabase::addApplicationFont(":/fonts/Lato-Black.ttf");
|
||||||
QFontDatabase::addApplicationFont(":/fonts/Lato-BlackItalic.ttf");
|
QFontDatabase::addApplicationFont(":/fonts/Lato-BlackItalic.ttf");
|
||||||
QFontDatabase::addApplicationFont(":/fonts/Lato-Bold.ttf");
|
QFontDatabase::addApplicationFont(":/fonts/Lato-Bold.ttf");
|
||||||
|
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
#include "runguard.h"
|
|
||||||
#include <QCryptographicHash>
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
|
|
||||||
QString generateKeyHash( const QString& key, const QString& salt )
|
|
||||||
{
|
|
||||||
QByteArray data;
|
|
||||||
|
|
||||||
data.append( key.toUtf8() );
|
|
||||||
data.append( salt.toUtf8() );
|
|
||||||
data = QCryptographicHash::hash( data, QCryptographicHash::Sha1 ).toHex();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
RunGuard::RunGuard(const QString& key)
|
|
||||||
: key( key )
|
|
||||||
, memLockKey( generateKeyHash( key, "_memLockKey" ) )
|
|
||||||
, sharedmemKey( generateKeyHash( key, "_sharedmemKey" ) )
|
|
||||||
, sharedMem( sharedmemKey )
|
|
||||||
, memLock( memLockKey, 1 )
|
|
||||||
{
|
|
||||||
qDebug() << "RunGuard::RunGuard key" << key;
|
|
||||||
}
|
|
||||||
|
|
||||||
RunGuard &RunGuard::instance(const QString& key)
|
|
||||||
{
|
|
||||||
static RunGuard s(key);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RunGuard::activate()
|
|
||||||
{
|
|
||||||
memLock.acquire();
|
|
||||||
{
|
|
||||||
QSharedMemory fix(sharedmemKey); // Fix for *nix: http://habrahabr.ru/post/173281/
|
|
||||||
fix.attach();
|
|
||||||
}
|
|
||||||
memLock.release();
|
|
||||||
}
|
|
||||||
|
|
||||||
RunGuard::~RunGuard()
|
|
||||||
{
|
|
||||||
release();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RunGuard::isAnotherRunning() const
|
|
||||||
{
|
|
||||||
if ( sharedMem.isAttached() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
memLock.acquire();
|
|
||||||
const bool isRunning = sharedMem.attach();
|
|
||||||
if ( isRunning )
|
|
||||||
sharedMem.detach();
|
|
||||||
memLock.release();
|
|
||||||
|
|
||||||
return isRunning;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RunGuard::tryToRun()
|
|
||||||
{
|
|
||||||
if ( isAnotherRunning() ) // Extra check
|
|
||||||
return false;
|
|
||||||
|
|
||||||
memLock.acquire();
|
|
||||||
const bool result = sharedMem.create( sizeof( quint64 ) );
|
|
||||||
memLock.release();
|
|
||||||
if ( !result )
|
|
||||||
{
|
|
||||||
release();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RunGuard::release()
|
|
||||||
{
|
|
||||||
memLock.acquire();
|
|
||||||
if ( sharedMem.isAttached() )
|
|
||||||
sharedMem.detach();
|
|
||||||
memLock.release();
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
#ifndef RUNGUARD_H
|
|
||||||
#define RUNGUARD_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QSharedMemory>
|
|
||||||
#include <QSystemSemaphore>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief The RunGuard class - The application single instance (via shared memory)
|
|
||||||
*/
|
|
||||||
class RunGuard
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
static RunGuard &instance(const QString& key = QString());
|
|
||||||
|
|
||||||
~RunGuard();
|
|
||||||
|
|
||||||
void activate();
|
|
||||||
bool isAnotherRunning() const;
|
|
||||||
bool tryToRun();
|
|
||||||
void release();
|
|
||||||
|
|
||||||
private:
|
|
||||||
RunGuard(const QString& key);
|
|
||||||
Q_DISABLE_COPY( RunGuard )
|
|
||||||
|
|
||||||
const QString key;
|
|
||||||
const QString memLockKey;
|
|
||||||
const QString sharedmemKey;
|
|
||||||
|
|
||||||
mutable QSharedMemory sharedMem;
|
|
||||||
mutable QSystemSemaphore memLock;
|
|
||||||
|
|
||||||
};
|
|
||||||
#endif // RUNGUARD_H
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue