UI: Prepare ConnectionsWindow.

This commit is contained in:
Nodir Temirkhodjaev 2021-02-12 14:10:39 +05:00
parent 13f6dd0c1c
commit dac4eec3ec
22 changed files with 455 additions and 38 deletions

View File

@ -7,7 +7,7 @@
#include "../../util/classhelpers.h"
QT_FORWARD_DECLARE_STRUCT(sqlite3_stmt)
struct sqlite3_stmt;
class SqliteStmt
{

View File

@ -18,6 +18,8 @@ SOURCES += \
control/controlworker.cpp \
driver/drivermanager.cpp \
driver/driverworker.cpp \
form/conn/connectionscontroller.cpp \
form/conn/connectionswindow.cpp \
form/controls/checkspincombo.cpp \
form/controls/checktimeperiod.cpp \
form/controls/controlutil.cpp \
@ -133,6 +135,8 @@ HEADERS += \
control/controlworker.h \
driver/drivermanager.h \
driver/driverworker.h \
form/conn/connectionscontroller.h \
form/conn/connectionswindow.h \
form/controls/checkspincombo.h \
form/controls/checktimeperiod.h \
form/controls/controlutil.h \

View File

@ -0,0 +1,37 @@
#include "connectionscontroller.h"
#include "../../conf/confmanager.h"
#include "../../fortmanager.h"
#include "../../translationmanager.h"
ConnectionsController::ConnectionsController(FortManager *fortManager, QObject *parent) :
QObject(parent), m_fortManager(fortManager)
{
connect(translationManager(), &TranslationManager::languageChanged, this,
&ConnectionsController::retranslateUi);
}
FortSettings *ConnectionsController::settings() const
{
return fortManager()->settings();
}
ConfManager *ConnectionsController::confManager() const
{
return fortManager()->confManager();
}
FirewallConf *ConnectionsController::conf() const
{
return confManager()->conf();
}
ConnListModel *ConnectionsController::connListModel() const
{
return fortManager()->connListModel();
}
TranslationManager *ConnectionsController::translationManager() const
{
return TranslationManager::instance();
}

View File

@ -0,0 +1,34 @@
#ifndef CONNECTIONSCONTROLLER_H
#define CONNECTIONSCONTROLLER_H
#include <QObject>
class ConfManager;
class ConnListModel;
class FirewallConf;
class FortManager;
class FortSettings;
class TranslationManager;
class ConnectionsController : public QObject
{
Q_OBJECT
public:
explicit ConnectionsController(FortManager *fortManager, QObject *parent = nullptr);
FortManager *fortManager() const { return m_fortManager; }
FortSettings *settings() const;
ConfManager *confManager() const;
FirewallConf *conf() const;
ConnListModel *connListModel() const;
TranslationManager *translationManager() const;
signals:
void retranslateUi();
private:
FortManager *m_fortManager = nullptr;
};
#endif // CONNECTIONSCONTROLLER_H

View File

@ -0,0 +1,190 @@
#include "connectionswindow.h"
#include <QCheckBox>
#include <QHeaderView>
#include <QPushButton>
#include <QVBoxLayout>
#include "../../conf/firewallconf.h"
#include "../../fortmanager.h"
#include "../../fortsettings.h"
#include "../../model/connlistmodel.h"
#include "../../util/guiutil.h"
#include "../../util/iconcache.h"
#include "../controls/controlutil.h"
#include "../controls/tableview.h"
#include "connectionscontroller.h"
namespace {
#define CONN_LIST_HEADER_VERSION 1
}
ConnectionsWindow::ConnectionsWindow(FortManager *fortManager, QWidget *parent) :
WidgetWindow(parent), m_ctrl(new ConnectionsController(fortManager, this))
{
setupUi();
setupController();
}
void ConnectionsWindow::setupController()
{
connect(ctrl(), &ConnectionsController::retranslateUi, this,
&ConnectionsWindow::onRetranslateUi);
connect(this, &ConnectionsWindow::aboutToClose, fortManager(),
&FortManager::closeConnectionsWindow);
connect(fortManager(), &FortManager::afterSaveConnWindowState, this,
&ConnectionsWindow::onSaveWindowState);
connect(fortManager(), &FortManager::afterRestoreConnWindowState, this,
&ConnectionsWindow::onRestoreWindowState);
emit ctrl()->retranslateUi();
}
void ConnectionsWindow::onSaveWindowState()
{
auto header = m_connListView->horizontalHeader();
settings()->setConnListHeader(header->saveState());
settings()->setConnListHeaderVersion(CONN_LIST_HEADER_VERSION);
}
void ConnectionsWindow::onRestoreWindowState()
{
if (settings()->connListHeaderVersion() != CONN_LIST_HEADER_VERSION)
return;
auto header = m_connListView->horizontalHeader();
header->restoreState(settings()->connListHeader());
}
void ConnectionsWindow::onRetranslateUi()
{
this->unsetLocale();
m_cbLogBlockedIp->setText(tr("Collect blocked connections"));
connListModel()->refresh();
this->setWindowTitle(tr("Connections"));
}
void ConnectionsWindow::setupUi()
{
auto layout = new QVBoxLayout();
layout->setContentsMargins(6, 6, 6, 6);
// Header
auto header = setupHeader();
layout->addLayout(header);
// Table
setupTableConnList();
setupTableConnListHeader();
layout->addWidget(m_connListView, 1);
this->setLayout(layout);
// Font
this->setFont(QFont("Tahoma", 9));
// Icon
this->setWindowIcon(GuiUtil::overlayIcon(":/images/sheild-96.png", ":/icons/connect.png"));
// Size
this->resize(1024, 768);
this->setMinimumSize(500, 400);
}
QLayout *ConnectionsWindow::setupHeader()
{
auto layout = new QHBoxLayout();
// Log Options
setupLogOptions();
layout->addStretch();
layout->addWidget(m_btLogOptions);
return layout;
}
void ConnectionsWindow::setupLogOptions()
{
setupLogBlockedIp();
// Menu
const QList<QWidget *> menuWidgets = { /*m_cbLogBlocked,*/ ControlUtil::createSeparator(),
m_cbLogBlockedIp };
auto layout = ControlUtil::createLayoutByWidgets(menuWidgets);
auto menu = ControlUtil::createMenuByLayout(layout, this);
m_btLogOptions = ControlUtil::createButton(":/icons/wrench.png");
m_btLogOptions->setMenu(menu);
}
void ConnectionsWindow::setupLogBlockedIp()
{
m_cbLogBlockedIp = ControlUtil::createCheckBox(conf()->logBlockedIp(), [&](bool checked) {
if (conf()->logBlockedIp() == checked)
return;
conf()->setLogBlockedIp(checked);
fortManager()->applyConfImmediateFlags();
});
}
void ConnectionsWindow::setupTableConnList()
{
m_connListView = new TableView();
m_connListView->setAlternatingRowColors(true);
m_connListView->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_connListView->setSelectionBehavior(QAbstractItemView::SelectItems);
m_connListView->setSortingEnabled(true);
m_connListView->setModel(connListModel());
}
void ConnectionsWindow::setupTableConnListHeader()
{
auto header = m_connListView->horizontalHeader();
header->setSectionResizeMode(0, QHeaderView::Interactive);
header->setSectionResizeMode(1, QHeaderView::Interactive);
header->setSectionResizeMode(2, QHeaderView::Interactive);
header->setSectionResizeMode(3, QHeaderView::Fixed);
header->setSectionResizeMode(4, QHeaderView::Stretch);
header->resizeSection(0, 600);
header->resizeSection(1, 120);
header->resizeSection(2, 100);
header->resizeSection(3, 30);
header->setSectionsClickable(true);
header->setSortIndicatorShown(true);
header->setSortIndicator(4, Qt::DescendingOrder);
}
FortManager *ConnectionsWindow::fortManager() const
{
return ctrl()->fortManager();
}
FortSettings *ConnectionsWindow::settings() const
{
return ctrl()->settings();
}
FirewallConf *ConnectionsWindow::conf() const
{
return ctrl()->conf();
}
ConnListModel *ConnectionsWindow::connListModel() const
{
return fortManager()->connListModel();
}

View File

@ -0,0 +1,53 @@
#ifndef CONNECTIONSWINDOW_H
#define CONNECTIONSWINDOW_H
#include "../../util/window/widgetwindow.h"
QT_FORWARD_DECLARE_CLASS(QCheckBox)
QT_FORWARD_DECLARE_CLASS(QPushButton)
class ConnListModel;
class ConnectionsController;
class FirewallConf;
class FortManager;
class FortSettings;
class TableView;
class ConnectionsWindow : public WidgetWindow
{
Q_OBJECT
public:
explicit ConnectionsWindow(FortManager *fortManager, QWidget *parent = nullptr);
protected slots:
void onSaveWindowState();
void onRestoreWindowState();
void onRetranslateUi();
private:
void setupController();
void setupUi();
QLayout *setupHeader();
void setupLogOptions();
void setupLogBlockedIp();
void setupTableConnList();
void setupTableConnListHeader();
ConnectionsController *ctrl() const { return m_ctrl; }
FortManager *fortManager() const;
FortSettings *settings() const;
FirewallConf *conf() const;
ConnListModel *connListModel() const;
private:
ConnectionsController *m_ctrl = nullptr;
QPushButton *m_btLogOptions = nullptr;
QCheckBox *m_cbLogBlockedIp = nullptr;
TableView *m_connListView = nullptr;
};
#endif // CONNECTIONSWINDOW_H

View File

@ -19,7 +19,6 @@
#include "../../../conf/firewallconf.h"
#include "../../../fortmanager.h"
#include "../../../fortsettings.h"
#include "../../../log/logmanager.h"
#include "../../../model/appstatmodel.h"
#include "../../../model/traflistmodel.h"
#include "../../../util/app/appinfocache.h"
@ -68,7 +67,7 @@ void StatisticsPage::setGraphEdited(bool v)
AppStatModel *StatisticsPage::appStatModel() const
{
return fortManager()->logManager()->appStatModel();
return fortManager()->appStatModel();
}
AppInfoCache *StatisticsPage::appInfoCache() const

View File

@ -2,7 +2,6 @@
#include "../../conf/confmanager.h"
#include "../../fortmanager.h"
#include "../../log/logmanager.h"
#include "../../translationmanager.h"
ProgramsController::ProgramsController(FortManager *fortManager, QObject *parent) :
@ -29,7 +28,7 @@ FirewallConf *ProgramsController::conf() const
AppListModel *ProgramsController::appListModel() const
{
return fortManager()->logManager()->appListModel();
return fortManager()->appListModel();
}
TranslationManager *ProgramsController::translationManager() const

View File

@ -111,7 +111,6 @@ void ProgramsWindow::onRetranslateUi()
m_btLogOptions->setText(tr("Options"));
m_cbLogBlocked->setText(tr("Collect New Blocked Programs"));
m_cbLogBlockedIp->setText(tr("Collect blocked connections"));
appListModel()->refresh();
@ -390,11 +389,9 @@ QLayout *ProgramsWindow::setupHeader()
void ProgramsWindow::setupLogOptions()
{
setupLogBlocked();
setupLogBlockedIp();
// Menu
const QList<QWidget *> menuWidgets = { m_cbLogBlocked, ControlUtil::createSeparator(),
m_cbLogBlockedIp };
const QList<QWidget *> menuWidgets = { m_cbLogBlocked };
auto layout = ControlUtil::createLayoutByWidgets(menuWidgets);
auto menu = ControlUtil::createMenuByLayout(layout, this);
@ -417,18 +414,6 @@ void ProgramsWindow::setupLogBlocked()
m_cbLogBlocked->setFont(ControlUtil::fontDemiBold());
}
void ProgramsWindow::setupLogBlockedIp()
{
m_cbLogBlockedIp = ControlUtil::createCheckBox(conf()->logBlockedIp(), [&](bool checked) {
if (conf()->logBlockedIp() == checked)
return;
conf()->setLogBlockedIp(checked);
fortManager()->applyConfImmediateFlags();
});
}
void ProgramsWindow::setupTableApps()
{
m_appListView = new TableView();

View File

@ -22,8 +22,6 @@ class FortSettings;
class ProgramsController;
class TableView;
QT_FORWARD_DECLARE_STRUCT(AppRow)
class ProgramsWindow : public WidgetWindow
{
Q_OBJECT
@ -49,7 +47,6 @@ private:
QLayout *setupHeader();
void setupLogOptions();
void setupLogBlocked();
void setupLogBlockedIp();
void setupTableApps();
void setupTableAppsHeader();
void setupAppInfoRow();
@ -109,7 +106,6 @@ private:
QDialog *m_formAppEdit = nullptr;
QPushButton *m_btLogOptions = nullptr;
QCheckBox *m_cbLogBlocked = nullptr;
QCheckBox *m_cbLogBlockedIp = nullptr;
TableView *m_appListView = nullptr;
QWidget *m_appInfoRow = nullptr;
QPushButton *m_btAppCopyPath = nullptr;

View File

@ -17,8 +17,6 @@ class TaskManager;
class ZoneListModel;
class ZonesController;
QT_FORWARD_DECLARE_STRUCT(ZoneRow)
class ZonesWindow : public WidgetWindow
{
Q_OBJECT

View File

@ -7,6 +7,7 @@
<file>icons/arrow-retweet.png</file>
<file>icons/clock.png</file>
<file>icons/cog.png</file>
<file>icons/connect.png</file>
<file>icons/copy.png</file>
<file>icons/database.png</file>
<file>icons/download.png</file>

View File

@ -15,6 +15,7 @@
#include "conf/confmanager.h"
#include "conf/firewallconf.h"
#include "driver/drivermanager.h"
#include "form/conn/connectionswindow.h"
#include "form/graph/graphwindow.h"
#include "form/opt/optionswindow.h"
#include "form/prog/programswindow.h"
@ -56,6 +57,7 @@ FortManager::FortManager(FortSettings *fortSettings, QObject *parent) :
m_optWindowState(new WidgetWindowStateWatcher(this)),
m_zoneWindowState(new WidgetWindowStateWatcher(this)),
m_graphWindowState(new WidgetWindowStateWatcher(this)),
m_connWindowState(new WidgetWindowStateWatcher(this)),
m_settings(fortSettings),
m_quotaManager(new QuotaManager(fortSettings, this)),
m_statManager(new StatManager(fortSettings->statFilePath(), m_quotaManager, this)),
@ -69,6 +71,7 @@ FortManager::FortManager(FortSettings *fortSettings, QObject *parent) :
m_appInfoCache(new AppInfoCache(this)),
m_appListModel(new AppListModel(m_confManager, this)),
m_appStatModel(new AppStatModel(m_statManager, this)),
m_connListModel(new ConnListModel(m_confManager, this)),
m_zoneListModel(new ZoneListModel(m_confManager, this))
{
setupTranslationManager();
@ -320,12 +323,22 @@ bool FortManager::setupZonesWindow()
return true;
}
bool FortManager::setupConnectionsWindow()
{
m_connWindow = new ConnectionsWindow(this);
m_connWindowState->install(m_connWindow);
return true;
}
void FortManager::closeUi()
{
closeGraphWindow(true);
closeOptionsWindow();
closeProgramsWindow();
closeZonesWindow();
closeConnectionsWindow();
}
void FortManager::launch()
@ -504,6 +517,34 @@ void FortManager::updateGraphWindow()
m_graphWindow->updateWindowFlags();
}
void FortManager::showConnectionsWindow()
{
if (!(m_connWindow && m_connWindow->isVisible()))
return;
if (!m_connWindow) {
setupConnectionsWindow();
restoreConnWindowState();
}
m_connWindow->show();
m_connWindow->raise();
m_connWindow->activateWindow();
}
void FortManager::closeConnectionsWindow()
{
if (!m_connWindow)
return;
saveConnWindowState();
m_connWindow->hide();
m_connWindow->deleteLater();
m_connWindow = nullptr;
}
void FortManager::exit(int retcode)
{
if (!checkPassword())
@ -720,6 +761,22 @@ void FortManager::restoreGraphWindowState()
settings()->graphWindowMaximized());
}
void FortManager::saveConnWindowState()
{
settings()->setConnWindowGeometry(m_connWindowState->geometry());
settings()->setConnWindowMaximized(m_connWindowState->maximized());
emit afterSaveConnWindowState();
}
void FortManager::restoreConnWindowState()
{
m_connWindowState->restore(m_connWindow, QSize(1024, 768), settings()->connWindowGeometry(),
settings()->connWindowMaximized());
emit afterRestoreConnWindowState();
}
void FortManager::updateTrayIcon(bool alerted)
{
const auto icon = alerted
@ -769,6 +826,10 @@ void FortManager::createTrayMenu()
this, SLOT(switchGraphWindow()), true, (m_graphWindow != nullptr));
addHotKey(m_graphWindowAction, settings()->hotKeyGraph(), conf()->logStat());
m_connectionsAction = addAction(menu, IconCache::icon(":/icons/connect.png"), QString(), this,
SLOT(showConnectionsWindow()));
addHotKey(m_connectionsAction, settings()->hotKeyConnections(), hotKeyEnabled);
menu->addSeparator();
m_filterEnabledAction = addAction(menu, QIcon(), QString(), this, SLOT(saveTrayFlags()), true);
@ -837,6 +898,7 @@ void FortManager::retranslateTrayMenu()
m_optionsAction->setText(tr("Options"));
m_zonesAction->setText(tr("Zones"));
m_graphWindowAction->setText(tr("Traffic Graph"));
m_connectionsAction->setText(tr("Connections"));
m_filterEnabledAction->setText(tr("Filter Enabled"));
m_stopTrafficAction->setText(tr("Stop Traffic"));

View File

@ -12,6 +12,8 @@ class AppInfoCache;
class AppListModel;
class AppStatModel;
class ConfManager;
class ConnListModel;
class ConnectionsWindow;
class DriverManager;
class EnvManager;
class FirewallConf;
@ -52,6 +54,7 @@ public:
TaskManager *taskManager() const { return m_taskManager; }
AppListModel *appListModel() const { return m_appListModel; }
AppStatModel *appStatModel() const { return m_appStatModel; }
ConnListModel *connListModel() const { return m_connListModel; }
ZoneListModel *zoneListModel() const { return m_zoneListModel; }
signals:
@ -66,6 +69,9 @@ signals:
void afterSaveZoneWindowState();
void afterRestoreZoneWindowState();
void afterSaveConnWindowState();
void afterRestoreConnWindowState();
public slots:
void installDriver();
void removeDriver();
@ -91,6 +97,9 @@ public slots:
void switchGraphWindow();
void updateGraphWindow();
void showConnectionsWindow();
void closeConnectionsWindow();
void exit(int retcode = 0);
bool checkPassword();
@ -134,6 +143,7 @@ private:
bool setupProgramsWindow();
bool setupOptionsWindow();
bool setupZonesWindow();
bool setupConnectionsWindow();
void closeUi();
@ -157,6 +167,9 @@ private:
void saveGraphWindowState(bool visible);
void restoreGraphWindowState();
void saveConnWindowState();
void restoreConnWindowState();
void updateTrayIcon(bool alerted = false);
void updateTrayMenu(bool onlyFlags = false);
@ -195,10 +208,14 @@ private:
GraphWindow *m_graphWindow = nullptr;
WidgetWindowStateWatcher *m_graphWindowState = nullptr;
ConnectionsWindow *m_connWindow = nullptr;
WidgetWindowStateWatcher *m_connWindowState = nullptr;
QAction *m_programsAction = nullptr;
QAction *m_optionsAction = nullptr;
QAction *m_zonesAction = nullptr;
QAction *m_graphWindowAction = nullptr;
QAction *m_connectionsAction = nullptr;
QAction *m_filterEnabledAction = nullptr;
QAction *m_stopTrafficAction = nullptr;
QAction *m_stopInetTrafficAction = nullptr;
@ -220,6 +237,7 @@ private:
AppListModel *m_appListModel = nullptr;
AppStatModel *m_appStatModel = nullptr;
ConnListModel *m_connListModel = nullptr;
ZoneListModel *m_zoneListModel = nullptr;
};

View File

@ -208,6 +208,18 @@ public:
}
void setGraphWindowGridColor(const QColor &v) { setIniColor("graphWindow/gridColor", v); }
QRect connWindowGeometry() const { return iniValue("connWindow/geometry").toRect(); }
void setConnWindowGeometry(const QRect &v) { setIniValue("connWindow/geometry", v); }
bool connWindowMaximized() const { return iniBool("connWindow/maximized"); }
void setConnWindowMaximized(bool on) { setIniValue("connWindow/maximized", on); }
int connListHeaderVersion() const { return iniInt("connWindow/connListHeaderVersion"); }
void setConnListHeaderVersion(int v) { setIniValue("connWindow/connListHeaderVersion", v); }
QByteArray connListHeader() const { return iniByteArray("connWindow/connListHeader"); }
void setConnListHeader(const QByteArray &v) { setIniValue("connWindow/connListHeader", v); }
qint32 quotaDayAlerted() const { return iniInt("quota/dayAlerted"); }
void setQuotaDayAlerted(qint32 v) { setIniValue("quota/dayAlerted", v); }
@ -221,6 +233,7 @@ public:
QString hotKeyOptions() const { return iniText("hotKey/options"); }
QString hotKeyZones() const { return iniText("hotKey/zones"); }
QString hotKeyGraph() const { return iniText("hotKey/graph"); }
QString hotKeyConnections() const { return iniText("hotKey/connections"); }
QString hotKeyFilter() const { return iniText("hotKey/filter", "Ctrl+Alt+Shift+F"); }
QString hotKeyStopTraffic() const { return iniText("hotKey/stopTraffic"); }
QString hotKeyStopInetTraffic() const { return iniText("hotKey/stopInetTraffic"); }

BIN
src/ui/icons/connect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -9,6 +9,7 @@
#include "../fortmanager.h"
#include "../model/applistmodel.h"
#include "../model/appstatmodel.h"
#include "../model/connlistmodel.h"
#include "../util/dateutil.h"
#include "../util/osutil.h"
#include "logbuffer.h"
@ -33,6 +34,11 @@ AppStatModel *LogManager::appStatModel() const
return fortManager()->appStatModel();
}
ConnListModel *LogManager::connListModel() const
{
return fortManager()->connListModel();
}
DriverWorker *LogManager::driverWorker() const
{
return fortManager()->driverManager()->driverWorker();
@ -143,7 +149,7 @@ void LogManager::readLogEntries(LogBuffer *logBuffer)
case LogEntry::AppBlockedIp: {
LogEntryBlockedIp blockedIpEntry;
logBuffer->readEntryBlockedIp(&blockedIpEntry);
// connListModel()->handleLogBlockedIp(blockedIpEntry);
connListModel()->handleLogBlockedIp(blockedIpEntry);
break;
}
case LogEntry::ProcNew: {

View File

@ -5,6 +5,7 @@
class AppListModel;
class AppStatModel;
class ConnListModel;
class FortManager;
class DriverWorker;
class LogBuffer;
@ -21,6 +22,7 @@ public:
DriverWorker *driverWorker() const;
AppListModel *appListModel() const;
AppStatModel *appStatModel() const;
ConnListModel *connListModel() const;
void setActive(bool active);

View File

@ -61,12 +61,6 @@ void AppListModel::handleLogBlocked(const LogEntryBlocked &logEntry)
{
const QString appPath = logEntry.path();
#if 0
const QString ipText = NetUtil::ip4ToText(logEntry.ip())
+ ", " + NetUtil::protocolName(logEntry.proto())
+ ':' + QString::number(logEntry.port());
#endif
if (confManager()->appPathExists(appPath))
return; // already added by user

View File

@ -1,12 +1,33 @@
#include "connlistmodel.h"
ConnListModel::ConnListModel(QObject *parent) : StringListModel(parent) { }
#include "../log/logentryblockedip.h"
ConnListModel::ConnListModel(ConfManager *confManager, QObject *parent) :
StringListModel(parent), m_confManager(confManager)
{
}
void ConnListModel::setAppPath(const QString &appPath)
{
m_appPath = appPath;
}
void ConnListModel::handleLogBlockedIp(const LogEntryBlockedIp &logEntry)
{
const QString appPath = logEntry.path();
#if 0
const QString ipText = NetUtil::ip4ToText(logEntry.ip())
+ ", " + NetUtil::protocolName(logEntry.proto())
+ ':' + QString::number(logEntry.port());
if (confManager()->addApp(
appPath, QString(), QDateTime(), groupId, false, logEntry.blocked(), true)) {
reset();
}
#endif
}
void ConnListModel::clear()
{
m_appPath = QString();

View File

@ -3,22 +3,27 @@
#include "../util/model/stringlistmodel.h"
class ConfManager;
class LogEntryBlockedIp;
class ConnListModel : public StringListModel
{
Q_OBJECT
public:
explicit ConnListModel(QObject *parent = nullptr);
explicit ConnListModel(ConfManager *confManager, QObject *parent = nullptr);
QString appPath() const { return m_appPath; }
void setAppPath(const QString &appPath);
signals:
void handleLogBlockedIp(const LogEntryBlockedIp &logEntry);
public slots:
void clear() override;
private:
ConfManager *m_confManager = nullptr;
QString m_appPath;
};

View File

@ -15,7 +15,7 @@ class ConfAppsWalker;
class EnvManager;
class FirewallConf;
QT_FORWARD_DECLARE_STRUCT(fort_traf)
struct fort_traf;
using longs_arr_t = QVector<quint32>;
using shorts_arr_t = QVector<quint16>;