mirror of
https://github.com/tnodir/fort
synced 2024-11-15 05:46:03 +00:00
UI: ControlManager: Prepare service handling.
This commit is contained in:
parent
b13f4cb84c
commit
98a5bd8667
@ -58,7 +58,7 @@ Root: HKCR; Subkey: "{#REG_SHELL}"; Flags: uninsdeletekeyifempty; Tasks: explore
|
||||
Root: HKCR; Subkey: "{#REG_SHELL_MENU}"; Flags: deletekey uninsdeletekey
|
||||
Root: HKCR; Subkey: "{#REG_SHELL_MENU}"; ValueType: string; ValueName: "icon"; ValueData: "{#APP_EXE}"; Tasks: explorer
|
||||
Root: HKCR; Subkey: "{#REG_SHELL_MENU}"; ValueType: string; ValueName: "MUIVerb"; ValueData: "Fort Firewall ..."; Tasks: explorer
|
||||
Root: HKCR; Subkey: "{#REG_SHELL_MENU}\command"; ValueType: string; ValueData: """{#APP_EXE}"" -c prog add ""%1"""; Tasks: explorer
|
||||
Root: HKCR; Subkey: "{#REG_SHELL_MENU}\command"; ValueType: string; ValueData: """{#APP_EXE}"" -w -c prog add ""%1"""; Tasks: explorer
|
||||
|
||||
[Icons]
|
||||
; Start menu shortcut
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "controlmanager.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QLoggingCategory>
|
||||
#include <QThreadPool>
|
||||
|
||||
@ -16,13 +17,12 @@ Q_LOGGING_CATEGORY(CLOG_CONTROL_MANAGER, "control")
|
||||
#define logWarning() qCWarning(CLOG_CONTROL_MANAGER, )
|
||||
#define logCritical() qCCritical(CLOG_CONTROL_MANAGER, )
|
||||
|
||||
ControlManager::ControlManager(const QString &globalName, const QString &command, QObject *parent) :
|
||||
ControlManager::ControlManager(FortSettings *settings, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_isClient(!command.isEmpty()),
|
||||
m_command(command),
|
||||
m_semaphore(globalName + QLatin1String("_ControlSemaphore"), 0,
|
||||
m_settings(settings),
|
||||
m_semaphore(QApplication::applicationName() + QLatin1String("_ControlSemaphore"), 0,
|
||||
isClient() ? QSystemSemaphore::Open : QSystemSemaphore::Create),
|
||||
m_sharedMemory(globalName + QLatin1String("_ControlSharedMemory"))
|
||||
m_sharedMemory(QApplication::applicationName() + QLatin1String("_ControlSharedMemory"))
|
||||
{
|
||||
}
|
||||
|
||||
@ -31,6 +31,11 @@ ControlManager::~ControlManager()
|
||||
abort();
|
||||
}
|
||||
|
||||
bool ControlManager::isClient() const
|
||||
{
|
||||
return !settings()->controlCommand().isEmpty();
|
||||
}
|
||||
|
||||
bool ControlManager::listen(FortManager *fortManager)
|
||||
{
|
||||
if (m_sharedMemory.size() > 0)
|
||||
@ -50,8 +55,12 @@ bool ControlManager::listen(FortManager *fortManager)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ControlManager::post(const QStringList &args)
|
||||
bool ControlManager::post()
|
||||
{
|
||||
if (settings()->isWindowControl()) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
if (!m_sharedMemory.attach()) {
|
||||
logWarning() << "Shared Memory attach error:" << m_sharedMemory.errorString();
|
||||
return false;
|
||||
@ -59,15 +68,17 @@ bool ControlManager::post(const QStringList &args)
|
||||
|
||||
ControlWorker worker(&m_semaphore, &m_sharedMemory);
|
||||
|
||||
return worker.post(m_command, args);
|
||||
return worker.post(settings()->controlCommand(), settings()->args());
|
||||
}
|
||||
|
||||
void ControlManager::processRequest(const QString &command, const QStringList &args)
|
||||
bool ControlManager::processRequest(const QString &command, const QStringList &args)
|
||||
{
|
||||
QString errorMessage;
|
||||
if (!processCommand(command, args, errorMessage)) {
|
||||
logWarning() << "Bad control command" << errorMessage << ':' << command << args;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ControlManager::processCommand(
|
||||
@ -82,7 +93,7 @@ bool ControlManager::processCommand(
|
||||
return false;
|
||||
}
|
||||
|
||||
auto conf = m_fortManager->conf();
|
||||
auto conf = fortManager()->conf();
|
||||
bool onlyFlags = true;
|
||||
|
||||
const auto confPropName = args.at(0);
|
||||
@ -103,7 +114,7 @@ bool ControlManager::processCommand(
|
||||
}
|
||||
|
||||
if (ok) {
|
||||
m_fortManager->saveOriginConf(tr("Control command executed"), onlyFlags);
|
||||
fortManager()->saveOriginConf(tr("Control command executed"), onlyFlags);
|
||||
}
|
||||
} else if (command == "prog") {
|
||||
if (argsSize < 1) {
|
||||
@ -119,7 +130,7 @@ bool ControlManager::processCommand(
|
||||
return false;
|
||||
}
|
||||
|
||||
ok = m_fortManager->showProgramEditForm(args.at(1));
|
||||
ok = fortManager()->showProgramEditForm(args.at(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9,28 +9,27 @@
|
||||
|
||||
class ControlWorker;
|
||||
class FortManager;
|
||||
class FortSettings;
|
||||
|
||||
class ControlManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ControlManager(
|
||||
const QString &globalName, const QString &command, QObject *parent = nullptr);
|
||||
explicit ControlManager(FortSettings *settings, QObject *parent = nullptr);
|
||||
~ControlManager() override;
|
||||
CLASS_DELETE_COPY_MOVE(ControlManager)
|
||||
|
||||
bool isClient() const { return m_isClient; }
|
||||
bool isClient() const;
|
||||
|
||||
bool listen(FortManager *fortManager);
|
||||
bool post(const QStringList &args);
|
||||
bool post();
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
FortSettings *settings() const { return m_settings; }
|
||||
FortManager *fortManager() const { return m_fortManager; }
|
||||
|
||||
private slots:
|
||||
void processRequest(const QString &command, const QStringList &args);
|
||||
bool processRequest(const QString &command, const QStringList &args);
|
||||
|
||||
private:
|
||||
bool processCommand(const QString &command, const QStringList &args, QString &errorMessage);
|
||||
@ -40,13 +39,10 @@ private:
|
||||
void abort();
|
||||
|
||||
private:
|
||||
bool m_isClient = false;
|
||||
|
||||
FortSettings *m_settings = nullptr;
|
||||
FortManager *m_fortManager = nullptr;
|
||||
ControlWorker *m_worker = nullptr;
|
||||
|
||||
QString m_command;
|
||||
|
||||
QSystemSemaphore m_semaphore;
|
||||
QSharedMemory m_sharedMemory;
|
||||
};
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "conf/firewallconf.h"
|
||||
#include "driver/drivermanager.h"
|
||||
#include "form/conn/connectionswindow.h"
|
||||
#include "form/controls/mainwindow.h"
|
||||
#include "form/graph/graphwindow.h"
|
||||
#include "form/opt/optionswindow.h"
|
||||
#include "form/prog/programswindow.h"
|
||||
@ -50,20 +51,21 @@
|
||||
#include "util/stringutil.h"
|
||||
#include "util/window/widgetwindowstatewatcher.h"
|
||||
|
||||
FortManager::FortManager(FortSettings *fortSettings, EnvManager *envManager, QObject *parent) :
|
||||
FortManager::FortManager(FortSettings *settings, EnvManager *envManager, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_mainWindow(new MainWindow()),
|
||||
m_trayIcon(new QSystemTrayIcon(this)),
|
||||
m_progWindowState(new WidgetWindowStateWatcher(this)),
|
||||
m_optWindowState(new WidgetWindowStateWatcher(this)),
|
||||
m_zoneWindowState(new WidgetWindowStateWatcher(this)),
|
||||
m_graphWindowState(new WidgetWindowStateWatcher(this)),
|
||||
m_connWindowState(new WidgetWindowStateWatcher(this)),
|
||||
m_settings(fortSettings),
|
||||
m_settings(settings),
|
||||
m_envManager(envManager),
|
||||
m_quotaManager(new QuotaManager(fortSettings, this)),
|
||||
m_statManager(new StatManager(fortSettings->statFilePath(), m_quotaManager, this)),
|
||||
m_quotaManager(new QuotaManager(settings, this)),
|
||||
m_statManager(new StatManager(settings->statFilePath(), m_quotaManager, this)),
|
||||
m_driverManager(new DriverManager(this)),
|
||||
m_confManager(new ConfManager(fortSettings->confFilePath(), this, this)),
|
||||
m_confManager(new ConfManager(settings->confFilePath(), this, this)),
|
||||
m_logManager(new LogManager(this, this)),
|
||||
m_nativeEventFilter(new NativeEventFilter(this)),
|
||||
m_hotKeyManager(new HotKeyManager(m_nativeEventFilter, this)),
|
||||
@ -103,6 +105,8 @@ FortManager::~FortManager()
|
||||
|
||||
closeDriver();
|
||||
closeLogManager();
|
||||
|
||||
delete m_mainWindow;
|
||||
}
|
||||
|
||||
FirewallConf *FortManager::conf() const
|
||||
@ -555,8 +559,8 @@ bool FortManager::checkPassword()
|
||||
|
||||
g_passwordDialogOpened = true;
|
||||
|
||||
const QString password = QInputDialog::getText(
|
||||
&m_window, tr("Password input"), tr("Please enter the password"), QLineEdit::Password);
|
||||
const QString password = QInputDialog::getText(m_mainWindow, tr("Password input"),
|
||||
tr("Please enter the password"), QLineEdit::Password);
|
||||
|
||||
g_passwordDialogOpened = false;
|
||||
|
||||
@ -796,7 +800,7 @@ void FortManager::createTrayMenu()
|
||||
{
|
||||
const bool hotKeyEnabled = settings()->hotKeyEnabled();
|
||||
|
||||
QMenu *menu = new QMenu(&m_window);
|
||||
QMenu *menu = new QMenu(m_mainWindow);
|
||||
|
||||
m_programsAction = addAction(menu, IconCache::icon(":/icons/window.png"), QString(), this,
|
||||
SLOT(showProgramsWindow()));
|
||||
@ -949,7 +953,7 @@ void FortManager::removeHotKeys()
|
||||
QWidget *FortManager::focusWidget()
|
||||
{
|
||||
auto w = QApplication::focusWidget();
|
||||
return w ? w : &m_window;
|
||||
return w ? w : m_mainWindow;
|
||||
}
|
||||
|
||||
QAction *FortManager::addAction(QWidget *widget, const QIcon &icon, const QString &text,
|
||||
|
@ -3,9 +3,10 @@
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "form/controls/mainwindow.h"
|
||||
#include "util/classhelpers.h"
|
||||
|
||||
QT_FORWARD_DECLARE_CLASS(QAction)
|
||||
QT_FORWARD_DECLARE_CLASS(QMouseEvent)
|
||||
QT_FORWARD_DECLARE_CLASS(QSystemTrayIcon)
|
||||
|
||||
class AppInfoCache;
|
||||
@ -22,6 +23,7 @@ class GraphWindow;
|
||||
class HostInfoCache;
|
||||
class HotKeyManager;
|
||||
class LogManager;
|
||||
class MainWindow;
|
||||
class NativeEventFilter;
|
||||
class OptionsWindow;
|
||||
class ProgramsWindow;
|
||||
@ -196,11 +198,12 @@ private:
|
||||
const QObject *receiver = nullptr, const char *member = nullptr);
|
||||
|
||||
private:
|
||||
MainWindow m_window; // dummy window for tray icon
|
||||
bool m_trayTriggered = false;
|
||||
|
||||
TrayMessageType m_lastMessageType = MessageOptions;
|
||||
|
||||
bool m_trayTriggered = false;
|
||||
MainWindow *m_mainWindow = nullptr; // dummy window for tray icon
|
||||
|
||||
QSystemTrayIcon *m_trayIcon = nullptr;
|
||||
|
||||
ProgramsWindow *m_progWindow = nullptr;
|
||||
|
@ -32,6 +32,7 @@ FortSettings::FortSettings(QObject *parent) :
|
||||
m_iniExists(false),
|
||||
m_noCache(false),
|
||||
m_isService(false),
|
||||
m_isWindowControl(false),
|
||||
m_bulkUpdating(false),
|
||||
m_bulkIniChanged(false)
|
||||
{
|
||||
@ -81,29 +82,31 @@ void FortSettings::processArguments(const QStringList &args, EnvManager *envMana
|
||||
"Directory to store settings.", "profile");
|
||||
parser.addOption(profileOption);
|
||||
|
||||
const QCommandLineOption statOption(QStringList() << "s"
|
||||
<< "stat",
|
||||
"Directory to store statistics.", "stat");
|
||||
const QCommandLineOption statOption("stat", "Directory to store statistics.", "stat");
|
||||
parser.addOption(statOption);
|
||||
|
||||
const QCommandLineOption logsOption(
|
||||
QStringList() << "logs", "Directory to store logs.", "logs");
|
||||
const QCommandLineOption logsOption("logs", "Directory to store logs.", "logs");
|
||||
parser.addOption(logsOption);
|
||||
|
||||
const QCommandLineOption cacheOption(
|
||||
QStringList() << "cache", "Directory to store cache.", "cache");
|
||||
const QCommandLineOption cacheOption("cache", "Directory to store cache.", "cache");
|
||||
parser.addOption(cacheOption);
|
||||
|
||||
const QCommandLineOption noCacheOption(QStringList() << "no-cache", "Don't use cache on disk.");
|
||||
const QCommandLineOption uninstallOption("u", "Uninstall booted provider and startup entries.");
|
||||
parser.addOption(uninstallOption);
|
||||
|
||||
const QCommandLineOption noCacheOption("no-cache", "Don't use cache on disk.");
|
||||
parser.addOption(noCacheOption);
|
||||
|
||||
const QCommandLineOption langOption(QStringList() << "lang", "Default language.", "lang", "en");
|
||||
const QCommandLineOption langOption("lang", "Default language.", "lang", "en");
|
||||
parser.addOption(langOption);
|
||||
|
||||
const QCommandLineOption serviceOption(
|
||||
QStringList() << "service", "Is running as a service?", "service");
|
||||
const QCommandLineOption serviceOption("service", "Is running as a service?");
|
||||
parser.addOption(serviceOption);
|
||||
|
||||
const QCommandLineOption windowControlOption(
|
||||
"w", "Control running instance's window by sending the command.");
|
||||
parser.addOption(windowControlOption);
|
||||
|
||||
const QCommandLineOption controlOption(QStringList() << "c"
|
||||
<< "control",
|
||||
"Control running instance by executing the command.", "control");
|
||||
@ -174,6 +177,7 @@ void FortSettings::processArguments(const QStringList &args, EnvManager *envMana
|
||||
}
|
||||
|
||||
// Control command
|
||||
m_isWindowControl = parser.isSet(windowControlOption);
|
||||
m_controlCommand = parser.value(controlOption);
|
||||
|
||||
// Other Arguments
|
||||
|
@ -19,6 +19,7 @@ public:
|
||||
|
||||
bool noCache() const { return m_noCache; }
|
||||
bool isService() const { return m_isService; }
|
||||
bool isWindowControl() const { return m_isWindowControl; }
|
||||
|
||||
bool debug() const { return iniBool("base/debug"); }
|
||||
void setDebug(bool on) { setIniValue("base/debug", on); }
|
||||
@ -278,6 +279,7 @@ private:
|
||||
bool m_iniExists : 1;
|
||||
bool m_noCache : 1;
|
||||
bool m_isService : 1;
|
||||
bool m_isWindowControl : 1;
|
||||
|
||||
bool m_bulkUpdating : 1;
|
||||
bool m_bulkIniChanged : 1;
|
||||
|
@ -50,11 +50,11 @@ int main(int argc, char *argv[])
|
||||
fortSettings.initialize(QCoreApplication::arguments(), &envManager);
|
||||
|
||||
#ifdef USE_CONTROL_COMMANDS
|
||||
ControlManager controlManager(QApplication::applicationName(), fortSettings.controlCommand());
|
||||
ControlManager controlManager(&fortSettings);
|
||||
|
||||
// Send control request to running instance
|
||||
if (controlManager.isClient()) {
|
||||
return controlManager.post(fortSettings.args()) ? 0 : FORT_ERROR_CONTROL;
|
||||
return controlManager.post() ? 0 : FORT_ERROR_CONTROL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user