UI: StatisticsPage: Show traffic.

This commit is contained in:
Nodir Temirkhodjaev 2017-12-11 11:05:49 +05:00
parent d050e5e7de
commit 04509a5815
18 changed files with 360 additions and 126 deletions

View File

@ -1,6 +1,9 @@
include(../common/Test.pri) include(../common/Test.pri)
SOURCES += \ SOURCES += \
$$UIPATH/conf/addressgroup.cpp \
$$UIPATH/conf/appgroup.cpp \
$$UIPATH/conf/firewallconf.cpp \
$$UIPATH/db/databasemanager.cpp \ $$UIPATH/db/databasemanager.cpp \
$$UIPATH/db/databasesql.cpp \ $$UIPATH/db/databasesql.cpp \
$$UIPATH/fortcommon.cpp \ $$UIPATH/fortcommon.cpp \
@ -8,6 +11,9 @@ SOURCES += \
$$UIPATH/util/fileutil.cpp $$UIPATH/util/fileutil.cpp
HEADERS += \ HEADERS += \
$$UIPATH/conf/addressgroup.h \
$$UIPATH/conf/appgroup.h \
$$UIPATH/conf/firewallconf.h \
$$UIPATH/db/databasemanager.h \ $$UIPATH/db/databasemanager.h \
$$UIPATH/db/databasesql.h \ $$UIPATH/db/databasesql.h \
$$UIPATH/fortcommon.h \ $$UIPATH/fortcommon.h \

View File

@ -12,6 +12,10 @@ FirewallConf::FirewallConf(QObject *parent) :
m_logStat(false), m_logStat(false),
m_appBlockAll(true), m_appBlockAll(true),
m_appAllowAll(false), m_appAllowAll(false),
m_trafHourKeepDays(DEFAULT_TRAF_HOUR_KEEP_DAYS),
m_trafDayKeepDays(DEFAULT_TRAF_DAY_KEEP_DAYS),
m_trafMonthKeepMonths(DEFAULT_TRAF_MONTH_KEEP_MONTHS),
m_trafUnit(UnitAdaptive),
m_ipInclude(new AddressGroup(this)), m_ipInclude(new AddressGroup(this)),
m_ipExclude(new AddressGroup(this)) m_ipExclude(new AddressGroup(this))
{ {
@ -73,6 +77,38 @@ void FirewallConf::setAppAllowAll(bool appAllowAll)
} }
} }
void FirewallConf::setTrafHourKeepDays(int trafHourKeepDays)
{
if (m_trafHourKeepDays != trafHourKeepDays) {
m_trafHourKeepDays = trafHourKeepDays;
emit trafHourKeepDaysChanged();
}
}
void FirewallConf::setTrafDayKeepDays(int trafDayKeepDays)
{
if (m_trafDayKeepDays != trafDayKeepDays) {
m_trafDayKeepDays = trafDayKeepDays;
emit trafDayKeepDaysChanged();
}
}
void FirewallConf::setTrafMonthKeepMonths(int trafMonthKeepMonths)
{
if (m_trafMonthKeepMonths != trafMonthKeepMonths) {
m_trafMonthKeepMonths = trafMonthKeepMonths;
emit trafMonthKeepMonthsChanged();
}
}
void FirewallConf::setTrafUnit(int trafUnit)
{
if (m_trafUnit != trafUnit) {
m_trafUnit = static_cast<TrafUnit>(trafUnit);
emit trafUnitChanged();
}
}
quint32 FirewallConf::appGroupBits() const quint32 FirewallConf::appGroupBits() const
{ {
quint32 groupBits = 0; quint32 groupBits = 0;
@ -146,14 +182,15 @@ void FirewallConf::copyFlags(const FirewallConf &o)
setAppAllowAll(o.appAllowAll()); setAppAllowAll(o.appAllowAll());
setAppGroupBits(o.appGroupBits()); setAppGroupBits(o.appGroupBits());
copyImmediateFlags(o); copyImmediateValues(o);
} }
void FirewallConf::copyImmediateFlags(const FirewallConf &o) void FirewallConf::copyImmediateValues(const FirewallConf &o)
{ {
setResolveAddress(o.resolveAddress()); setResolveAddress(o.resolveAddress());
setLogBlocked(o.logBlocked()); setLogBlocked(o.logBlocked());
setLogStat(o.logStat()); setLogStat(o.logStat());
setTrafUnit(o.trafUnit());
} }
QVariant FirewallConf::toVariant() const QVariant FirewallConf::toVariant() const

View File

@ -8,6 +8,11 @@
QT_FORWARD_DECLARE_CLASS(AddressGroup) QT_FORWARD_DECLARE_CLASS(AddressGroup)
QT_FORWARD_DECLARE_CLASS(AppGroup) QT_FORWARD_DECLARE_CLASS(AppGroup)
#define DEFAULT_APP_GROUP_BITS 0xFFFF
#define DEFAULT_TRAF_HOUR_KEEP_DAYS 90 // ~3 months
#define DEFAULT_TRAF_DAY_KEEP_DAYS 356 // ~1 year
#define DEFAULT_TRAF_MONTH_KEEP_MONTHS 360 // ~3 years
class FirewallConf : public QObject class FirewallConf : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -18,12 +23,26 @@ class FirewallConf : public QObject
Q_PROPERTY(bool logStat READ logStat WRITE setLogStat NOTIFY logStatChanged) Q_PROPERTY(bool logStat READ logStat WRITE setLogStat NOTIFY logStatChanged)
Q_PROPERTY(bool appBlockAll READ appBlockAll WRITE setAppBlockAll NOTIFY appBlockAllChanged) Q_PROPERTY(bool appBlockAll READ appBlockAll WRITE setAppBlockAll NOTIFY appBlockAllChanged)
Q_PROPERTY(bool appAllowAll READ appAllowAll WRITE setAppAllowAll NOTIFY appAllowAllChanged) Q_PROPERTY(bool appAllowAll READ appAllowAll WRITE setAppAllowAll NOTIFY appAllowAllChanged)
Q_PROPERTY(int trafHourKeepDays READ trafHourKeepDays WRITE setTrafHourKeepDays NOTIFY trafHourKeepDaysChanged)
Q_PROPERTY(int trafDayKeepDays READ trafDayKeepDays WRITE setTrafDayKeepDays NOTIFY trafDayKeepDaysChanged)
Q_PROPERTY(int trafMonthKeepMonths READ trafMonthKeepMonths WRITE setTrafMonthKeepMonths NOTIFY trafMonthKeepMonthsChanged)
Q_PROPERTY(int trafUnit READ trafUnit WRITE setTrafUnit NOTIFY trafUnitChanged)
Q_PROPERTY(AddressGroup *ipInclude READ ipInclude CONSTANT) Q_PROPERTY(AddressGroup *ipInclude READ ipInclude CONSTANT)
Q_PROPERTY(AddressGroup *ipExclude READ ipExclude CONSTANT) Q_PROPERTY(AddressGroup *ipExclude READ ipExclude CONSTANT)
Q_PROPERTY(QQmlListProperty<AppGroup> appGroups READ appGroups NOTIFY appGroupsChanged) Q_PROPERTY(QQmlListProperty<AppGroup> appGroups READ appGroups NOTIFY appGroupsChanged)
Q_CLASSINFO("DefaultProperty", "appGroups") Q_CLASSINFO("DefaultProperty", "appGroups")
public: public:
enum TrafUnit {
UnitAdaptive = 0,
UnitBytes,
UnitKB,
UnitMB,
UnitGB,
UnitTB
};
Q_ENUM(TrafUnit)
explicit FirewallConf(QObject *parent = nullptr); explicit FirewallConf(QObject *parent = nullptr);
bool provBoot() const { return m_provBoot; } bool provBoot() const { return m_provBoot; }
@ -47,6 +66,18 @@ public:
bool appAllowAll() const { return m_appAllowAll; } bool appAllowAll() const { return m_appAllowAll; }
void setAppAllowAll(bool appAllowAll); void setAppAllowAll(bool appAllowAll);
int trafHourKeepDays() const { return m_trafHourKeepDays; }
void setTrafHourKeepDays(int trafHourKeepDays);
int trafDayKeepDays() const { return m_trafDayKeepDays; }
void setTrafDayKeepDays(int trafDayKeepDays);
int trafMonthKeepMonths() const { return m_trafMonthKeepMonths; }
void setTrafMonthKeepMonths(int trafMonthKeepMonths);
int trafUnit() const { return m_trafUnit; }
void setTrafUnit(int trafUnit);
quint32 appGroupBits() const; quint32 appGroupBits() const;
void setAppGroupBits(quint32 groupBits); void setAppGroupBits(quint32 groupBits);
@ -57,7 +88,7 @@ public:
QQmlListProperty<AppGroup> appGroups(); QQmlListProperty<AppGroup> appGroups();
void copyFlags(const FirewallConf &o); void copyFlags(const FirewallConf &o);
void copyImmediateFlags(const FirewallConf &o); void copyImmediateValues(const FirewallConf &o);
QVariant toVariant() const; QVariant toVariant() const;
void fromVariant(const QVariant &v); void fromVariant(const QVariant &v);
@ -70,6 +101,10 @@ signals:
void logStatChanged(); void logStatChanged();
void appBlockAllChanged(); void appBlockAllChanged();
void appAllowAllChanged(); void appAllowAllChanged();
void trafHourKeepDaysChanged();
void trafDayKeepDaysChanged();
void trafMonthKeepMonthsChanged();
void trafUnitChanged();
void appGroupsChanged(); void appGroupsChanged();
public slots: public slots:
@ -90,6 +125,12 @@ private:
uint m_appBlockAll : 1; uint m_appBlockAll : 1;
uint m_appAllowAll : 1; uint m_appAllowAll : 1;
int m_trafHourKeepDays;
int m_trafDayKeepDays;
int m_trafMonthKeepMonths;
TrafUnit m_trafUnit;
AddressGroup *m_ipInclude; AddressGroup *m_ipInclude;
AddressGroup *m_ipExclude; AddressGroup *m_ipExclude;

View File

@ -1,5 +1,6 @@
#include "databasemanager.h" #include "databasemanager.h"
#include "../conf/firewallconf.h"
#include "../util/dateutil.h" #include "../util/dateutil.h"
#include "../util/fileutil.h" #include "../util/fileutil.h"
#include "databasesql.h" #include "databasesql.h"
@ -14,6 +15,7 @@ DatabaseManager::DatabaseManager(const QString &filePath,
m_lastTrafDay(0), m_lastTrafDay(0),
m_lastTrafMonth(0), m_lastTrafMonth(0),
m_filePath(filePath), m_filePath(filePath),
m_conf(nullptr),
m_sqliteDb(new SqliteDb()) m_sqliteDb(new SqliteDb())
{ {
SqliteEngine::initialize(); SqliteEngine::initialize();
@ -28,6 +30,15 @@ DatabaseManager::~DatabaseManager()
SqliteEngine::shutdown(); SqliteEngine::shutdown();
} }
void DatabaseManager::setFirewallConf(const FirewallConf *conf)
{
m_conf = conf;
if (m_conf && !m_conf->logStat()) {
logClear();
}
}
bool DatabaseManager::initialize() bool DatabaseManager::initialize()
{ {
const bool fileExists = FileUtil::fileExists(m_filePath); const bool fileExists = FileUtil::fileExists(m_filePath);
@ -40,8 +51,11 @@ bool DatabaseManager::initialize()
return fileExists || createTables(); return fileExists || createTables();
} }
void DatabaseManager::logProcNew(const QString &appPath, bool &isNew) qint64 DatabaseManager::logProcNew(const QString &appPath, bool &isNew)
{ {
if (m_conf && !m_conf->logStat())
return 0;
qint64 appId = getAppId(appPath); qint64 appId = getAppId(appPath);
if (appId == 0) { if (appId == 0) {
appId = createAppId(appPath); appId = createAppId(appPath);
@ -50,6 +64,8 @@ void DatabaseManager::logProcNew(const QString &appPath, bool &isNew)
m_appPaths.prepend(appPath); m_appPaths.prepend(appPath);
m_appIds.prepend(appId); m_appIds.prepend(appId);
return appId;
} }
void DatabaseManager::logStatTraf(quint16 procCount, const quint8 *procBits, void DatabaseManager::logStatTraf(quint16 procCount, const quint8 *procBits,
@ -57,6 +73,9 @@ void DatabaseManager::logStatTraf(quint16 procCount, const quint8 *procBits,
{ {
Q_ASSERT(procCount == m_appIds.size()); Q_ASSERT(procCount == m_appIds.size());
if (m_conf && !m_conf->logStat())
return;
QVector<quint16> delProcIndexes; QVector<quint16> delProcIndexes;
const qint64 unixTime = DateUtil::getUnixTime(); const qint64 unixTime = DateUtil::getUnixTime();
@ -78,28 +97,28 @@ void DatabaseManager::logStatTraf(quint16 procCount, const quint8 *procBits,
m_sqliteDb->beginTransaction(); m_sqliteDb->beginTransaction();
// Insert Statemets // Insert Statemets
QStmtList insertTrafAppStmts = QStmtList() const QStmtList insertTrafAppStmts = QStmtList()
<< getTrafficStmt(DatabaseSql::sqlInsertTrafficAppHour, trafHour) << getTrafficStmt(DatabaseSql::sqlInsertTrafAppHour, trafHour)
<< getTrafficStmt(DatabaseSql::sqlInsertTrafficAppDay, trafDay) << getTrafficStmt(DatabaseSql::sqlInsertTrafAppDay, trafDay)
<< getTrafficStmt(DatabaseSql::sqlInsertTrafficAppMonth, trafMonth) << getTrafficStmt(DatabaseSql::sqlInsertTrafAppMonth, trafMonth)
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficAppTotal, -1); << getTrafficStmt(DatabaseSql::sqlUpdateTrafAppTotal, -1);
QStmtList insertTrafStmts = QStmtList() const QStmtList insertTrafStmts = QStmtList()
<< getTrafficStmt(DatabaseSql::sqlInsertTrafficHour, trafHour) << getTrafficStmt(DatabaseSql::sqlInsertTrafHour, trafHour)
<< getTrafficStmt(DatabaseSql::sqlInsertTrafficDay, trafDay) << getTrafficStmt(DatabaseSql::sqlInsertTrafDay, trafDay)
<< getTrafficStmt(DatabaseSql::sqlInsertTrafficMonth, trafMonth); << getTrafficStmt(DatabaseSql::sqlInsertTrafMonth, trafMonth);
// Update Statemets // Update Statemets
QStmtList updateTrafAppStmts = QStmtList() const QStmtList updateTrafAppStmts = QStmtList()
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficAppHour, trafHour) << getTrafficStmt(DatabaseSql::sqlUpdateTrafAppHour, trafHour)
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficAppDay, trafDay) << getTrafficStmt(DatabaseSql::sqlUpdateTrafAppDay, trafDay)
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficAppMonth, trafMonth) << getTrafficStmt(DatabaseSql::sqlUpdateTrafAppMonth, trafMonth)
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficAppTotal, -1); << getTrafficStmt(DatabaseSql::sqlUpdateTrafAppTotal, -1);
QStmtList updateTrafStmts = QStmtList() const QStmtList updateTrafStmts = QStmtList()
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficHour, trafHour) << getTrafficStmt(DatabaseSql::sqlUpdateTrafHour, trafHour)
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficDay, trafDay) << getTrafficStmt(DatabaseSql::sqlUpdateTrafDay, trafDay)
<< getTrafficStmt(DatabaseSql::sqlUpdateTrafficMonth, trafMonth); << getTrafficStmt(DatabaseSql::sqlUpdateTrafMonth, trafMonth);
for (quint16 i = 0; i < procCount; ++i) { for (quint16 i = 0; i < procCount; ++i) {
const bool active = procBits[i / 8] & (1 << (i & 7)); const bool active = procBits[i / 8] & (1 << (i & 7));
@ -124,6 +143,30 @@ void DatabaseManager::logStatTraf(quint16 procCount, const quint8 *procBits,
} }
} }
// Delete old data
if (isNewDay) {
const qint32 oldTrafHour = trafHour
- 24 * (m_conf ? m_conf->trafHourKeepDays()
: DEFAULT_TRAF_HOUR_KEEP_DAYS);
const qint32 oldTrafDay = trafHour
- 24 * (m_conf ? m_conf->trafDayKeepDays()
: DEFAULT_TRAF_DAY_KEEP_DAYS);
const qint32 oldTrafMonth = DateUtil::addUnixMonths(
trafHour, -(m_conf ? m_conf->trafMonthKeepMonths()
: DEFAULT_TRAF_MONTH_KEEP_MONTHS));
// Delete Statemets
const QStmtList deleteTrafStmts = QStmtList()
<< getTrafficStmt(DatabaseSql::sqlDeleteTrafAppHour, oldTrafHour)
<< getTrafficStmt(DatabaseSql::sqlDeleteTrafAppDay, oldTrafDay)
<< getTrafficStmt(DatabaseSql::sqlDeleteTrafAppMonth, oldTrafMonth)
<< getTrafficStmt(DatabaseSql::sqlDeleteTrafHour, oldTrafHour)
<< getTrafficStmt(DatabaseSql::sqlDeleteTrafDay, oldTrafDay)
<< getTrafficStmt(DatabaseSql::sqlDeleteTrafMonth, oldTrafMonth);
deleteTrafficList(deleteTrafStmts);
}
m_sqliteDb->commitTransaction(); m_sqliteDb->commitTransaction();
// Delete inactive processes // Delete inactive processes
@ -237,6 +280,14 @@ bool DatabaseManager::updateTraffic(SqliteStmt *stmt, quint32 inBytes,
&& m_sqliteDb->changes() != 0; && m_sqliteDb->changes() != 0;
} }
void DatabaseManager::deleteTrafficList(const QStmtList &deleteStmtList)
{
foreach (SqliteStmt *stmtDelete, deleteStmtList) {
stmtDelete->step();
stmtDelete->reset();
}
}
qint32 DatabaseManager::getTrafficTime(const char *sql, qint64 appId) qint32 DatabaseManager::getTrafficTime(const char *sql, qint64 appId)
{ {
qint32 trafTime = 0; qint32 trafTime = 0;

View File

@ -6,6 +6,7 @@
#include <QStringList> #include <QStringList>
#include <QVector> #include <QVector>
QT_FORWARD_DECLARE_CLASS(FirewallConf)
QT_FORWARD_DECLARE_CLASS(SqliteDb) QT_FORWARD_DECLARE_CLASS(SqliteDb)
QT_FORWARD_DECLARE_CLASS(SqliteStmt) QT_FORWARD_DECLARE_CLASS(SqliteStmt)
@ -18,11 +19,14 @@ public:
QObject *parent = nullptr); QObject *parent = nullptr);
virtual ~DatabaseManager(); virtual ~DatabaseManager();
bool initialize(); const FirewallConf *firewallConf() const { return m_conf; }
void setFirewallConf(const FirewallConf *conf);
SqliteDb *sqliteDb() const { return m_sqliteDb; } SqliteDb *sqliteDb() const { return m_sqliteDb; }
void logProcNew(const QString &appPath, bool &isNew); bool initialize();
qint64 logProcNew(const QString &appPath, bool &isNew);
void logStatTraf(quint16 procCount, const quint8 *procBits, void logStatTraf(quint16 procCount, const quint8 *procBits,
const quint32 *trafBytes); const quint32 *trafBytes);
void logClear(); void logClear();
@ -56,6 +60,8 @@ private:
bool updateTraffic(SqliteStmt *stmt, quint32 inBytes, bool updateTraffic(SqliteStmt *stmt, quint32 inBytes,
quint32 outBytes, qint64 appId = 0); quint32 outBytes, qint64 appId = 0);
void deleteTrafficList(const QStmtList &deleteStmtList);
SqliteStmt *getTrafficStmt(const char *sql, qint32 trafTime); SqliteStmt *getTrafficStmt(const char *sql, qint32 trafTime);
SqliteStmt *getSqliteStmt(const char *sql); SqliteStmt *getSqliteStmt(const char *sql);
@ -67,6 +73,8 @@ private:
QString m_filePath; QString m_filePath;
const FirewallConf *m_conf;
SqliteDb *m_sqliteDb; SqliteDb *m_sqliteDb;
QHash<const char *, SqliteStmt *> m_sqliteStmts; QHash<const char *, SqliteStmt *> m_sqliteStmts;

View File

@ -72,79 +72,79 @@ const char * const DatabaseSql::sqlSelectAppPaths =
"SELECT app_id, path FROM app ORDER BY creat_time;" "SELECT app_id, path FROM app ORDER BY creat_time;"
; ;
const char * const DatabaseSql::sqlInsertTrafficAppHour = const char * const DatabaseSql::sqlInsertTrafAppHour =
"INSERT INTO traffic_app_hour(app_id, traf_time, in_bytes, out_bytes)" "INSERT INTO traffic_app_hour(app_id, traf_time, in_bytes, out_bytes)"
" VALUES(?4, ?1, ?2, ?3);" " VALUES(?4, ?1, ?2, ?3);"
; ;
const char * const DatabaseSql::sqlInsertTrafficAppDay = const char * const DatabaseSql::sqlInsertTrafAppDay =
"INSERT INTO traffic_app_day(app_id, traf_time, in_bytes, out_bytes)" "INSERT INTO traffic_app_day(app_id, traf_time, in_bytes, out_bytes)"
" VALUES(?4, ?1, ?2, ?3);" " VALUES(?4, ?1, ?2, ?3);"
; ;
const char * const DatabaseSql::sqlInsertTrafficAppMonth = const char * const DatabaseSql::sqlInsertTrafAppMonth =
"INSERT INTO traffic_app_month(app_id, traf_time, in_bytes, out_bytes)" "INSERT INTO traffic_app_month(app_id, traf_time, in_bytes, out_bytes)"
" VALUES(?4, ?1, ?2, ?3);" " VALUES(?4, ?1, ?2, ?3);"
; ;
const char * const DatabaseSql::sqlInsertTrafficHour = const char * const DatabaseSql::sqlInsertTrafHour =
"INSERT INTO traffic_hour(traf_time, in_bytes, out_bytes)" "INSERT INTO traffic_hour(traf_time, in_bytes, out_bytes)"
" VALUES(?1, ?2, ?3);" " VALUES(?1, ?2, ?3);"
; ;
const char * const DatabaseSql::sqlInsertTrafficDay = const char * const DatabaseSql::sqlInsertTrafDay =
"INSERT INTO traffic_day(traf_time, in_bytes, out_bytes)" "INSERT INTO traffic_day(traf_time, in_bytes, out_bytes)"
" VALUES(?1, ?2, ?3);" " VALUES(?1, ?2, ?3);"
; ;
const char * const DatabaseSql::sqlInsertTrafficMonth = const char * const DatabaseSql::sqlInsertTrafMonth =
"INSERT INTO traffic_month(traf_time, in_bytes, out_bytes)" "INSERT INTO traffic_month(traf_time, in_bytes, out_bytes)"
" VALUES(?1, ?2, ?3);" " VALUES(?1, ?2, ?3);"
; ;
const char * const DatabaseSql::sqlUpdateTrafficAppHour = const char * const DatabaseSql::sqlUpdateTrafAppHour =
"UPDATE traffic_app_hour" "UPDATE traffic_app_hour"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
" WHERE app_id = ?4 and traf_time = ?1;" " WHERE app_id = ?4 and traf_time = ?1;"
; ;
const char * const DatabaseSql::sqlUpdateTrafficAppDay = const char * const DatabaseSql::sqlUpdateTrafAppDay =
"UPDATE traffic_app_day" "UPDATE traffic_app_day"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
" WHERE app_id = ?4 and traf_time = ?1;" " WHERE app_id = ?4 and traf_time = ?1;"
; ;
const char * const DatabaseSql::sqlUpdateTrafficAppMonth = const char * const DatabaseSql::sqlUpdateTrafAppMonth =
"UPDATE traffic_app_month" "UPDATE traffic_app_month"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
" WHERE app_id = ?4 and traf_time = ?1;" " WHERE app_id = ?4 and traf_time = ?1;"
; ;
const char * const DatabaseSql::sqlUpdateTrafficAppTotal = const char * const DatabaseSql::sqlUpdateTrafAppTotal =
"UPDATE app" "UPDATE app"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
" WHERE app_id = ?4 and 0 != ?1;" " WHERE app_id = ?4 and 0 != ?1;"
; ;
const char * const DatabaseSql::sqlUpdateTrafficHour = const char * const DatabaseSql::sqlUpdateTrafHour =
"UPDATE traffic_hour" "UPDATE traffic_hour"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
" WHERE traf_time = ?1;" " WHERE traf_time = ?1;"
; ;
const char * const DatabaseSql::sqlUpdateTrafficDay = const char * const DatabaseSql::sqlUpdateTrafDay =
"UPDATE traffic_day" "UPDATE traffic_day"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
" WHERE traf_time = ?1;" " WHERE traf_time = ?1;"
; ;
const char * const DatabaseSql::sqlUpdateTrafficMonth = const char * const DatabaseSql::sqlUpdateTrafMonth =
"UPDATE traffic_month" "UPDATE traffic_month"
" SET in_bytes = in_bytes + ?2," " SET in_bytes = in_bytes + ?2,"
" out_bytes = out_bytes + ?3" " out_bytes = out_bytes + ?3"
@ -229,3 +229,33 @@ const char * const DatabaseSql::sqlSelectTrafTotal =
"SELECT sum(in_bytes), sum(out_bytes)" "SELECT sum(in_bytes), sum(out_bytes)"
" FROM app WHERE 0 != ?1;" " FROM app WHERE 0 != ?1;"
; ;
const char * const DatabaseSql::sqlDeleteTrafAppHour =
"DELETE FROM traffic_app_hour"
" WHERE traf_time < ?1"
" and app_id in (SELECT app_id FROM app);"
;
const char * const DatabaseSql::sqlDeleteTrafAppDay =
"DELETE FROM traffic_app_day"
" WHERE traf_time < ?1"
" and app_id in (SELECT app_id FROM app);"
;
const char * const DatabaseSql::sqlDeleteTrafAppMonth =
"DELETE FROM traffic_app_month"
" WHERE traf_time < ?1"
" and app_id in (SELECT app_id FROM app);"
;
const char * const DatabaseSql::sqlDeleteTrafHour =
"DELETE FROM traffic_hour WHERE traf_time < ?1;"
;
const char * const DatabaseSql::sqlDeleteTrafDay =
"DELETE FROM traffic_day WHERE traf_time < ?1;"
;
const char * const DatabaseSql::sqlDeleteTrafMonth =
"DELETE FROM traffic_month WHERE traf_time < ?1;"
;

View File

@ -12,23 +12,23 @@ public:
static const char * const sqlSelectAppPaths; static const char * const sqlSelectAppPaths;
static const char * const sqlInsertTrafficAppHour; static const char * const sqlInsertTrafAppHour;
static const char * const sqlInsertTrafficAppDay; static const char * const sqlInsertTrafAppDay;
static const char * const sqlInsertTrafficAppMonth; static const char * const sqlInsertTrafAppMonth;
static const char * const sqlInsertTrafficHour; static const char * const sqlInsertTrafHour;
static const char * const sqlInsertTrafficDay; static const char * const sqlInsertTrafDay;
static const char * const sqlInsertTrafficMonth; static const char * const sqlInsertTrafMonth;
static const char * const sqlUpdateTrafficAppHour; static const char * const sqlUpdateTrafAppHour;
static const char * const sqlUpdateTrafficAppDay; static const char * const sqlUpdateTrafAppDay;
static const char * const sqlUpdateTrafficAppMonth; static const char * const sqlUpdateTrafAppMonth;
static const char * const sqlUpdateTrafficHour; static const char * const sqlUpdateTrafHour;
static const char * const sqlUpdateTrafficDay; static const char * const sqlUpdateTrafDay;
static const char * const sqlUpdateTrafficMonth; static const char * const sqlUpdateTrafMonth;
static const char * const sqlUpdateTrafficAppTotal; static const char * const sqlUpdateTrafAppTotal;
static const char * const sqlSelectMinTrafAppHour; static const char * const sqlSelectMinTrafAppHour;
static const char * const sqlSelectMinTrafAppDay; static const char * const sqlSelectMinTrafAppDay;
@ -49,6 +49,14 @@ public:
static const char * const sqlSelectTrafDay; static const char * const sqlSelectTrafDay;
static const char * const sqlSelectTrafMonth; static const char * const sqlSelectTrafMonth;
static const char * const sqlSelectTrafTotal; static const char * const sqlSelectTrafTotal;
static const char * const sqlDeleteTrafAppHour;
static const char * const sqlDeleteTrafAppDay;
static const char * const sqlDeleteTrafAppMonth;
static const char * const sqlDeleteTrafHour;
static const char * const sqlDeleteTrafDay;
static const char * const sqlDeleteTrafMonth;
}; };
#endif // DATABASESQL_H #endif // DATABASESQL_H

View File

@ -245,11 +245,11 @@ bool FortManager::applyConf(bool onlyFlags)
return saveSettings(newConf, onlyFlags); return saveSettings(newConf, onlyFlags);
} }
bool FortManager::applyConfImmediateFlags() bool FortManager::applyConfImmediateValues()
{ {
Q_ASSERT(m_firewallConfToEdit != nullConf()); Q_ASSERT(m_firewallConfToEdit != nullConf());
m_firewallConf->copyImmediateFlags(*m_firewallConfToEdit); m_firewallConf->copyImmediateValues(*m_firewallConfToEdit);
return saveSettings(m_firewallConf, true, true); return saveSettings(m_firewallConf, true, true);
} }
@ -276,9 +276,9 @@ bool FortManager::loadSettings(FirewallConf *conf)
} }
bool FortManager::saveSettings(FirewallConf *newConf, bool onlyFlags, bool FortManager::saveSettings(FirewallConf *newConf, bool onlyFlags,
bool immediateFlags) bool immediateValues)
{ {
if (!(onlyFlags ? m_fortSettings->writeConfFlags(*newConf) if (!(onlyFlags ? m_fortSettings->writeConfIni(*newConf)
: m_fortSettings->writeConf(*newConf))) { : m_fortSettings->writeConf(*newConf))) {
showErrorBox("Save Settings: " + m_fortSettings->errorMessage()); showErrorBox("Save Settings: " + m_fortSettings->errorMessage());
return false; return false;
@ -289,7 +289,7 @@ bool FortManager::saveSettings(FirewallConf *newConf, bool onlyFlags,
m_firewallConf = newConf; m_firewallConf = newConf;
} }
if (!immediateFlags) { if (!immediateValues) {
updateTrayMenu(); updateTrayMenu();
} }
@ -308,7 +308,7 @@ bool FortManager::updateDriverConf(FirewallConf *conf)
return false; return false;
} }
updateLogManager(conf); updateDatabaseManager(conf);
return true; return true;
} }
@ -324,19 +324,14 @@ bool FortManager::updateDriverConfFlags(FirewallConf *conf)
return false; return false;
} }
updateLogManager(conf); updateDatabaseManager(conf);
return true; return true;
} }
void FortManager::updateLogManager(FirewallConf *conf) void FortManager::updateDatabaseManager(FirewallConf *conf)
{ {
if (!conf->logStat()) { m_databaseManager->setFirewallConf(conf);
m_databaseManager->logClear();
}
m_logManager->setLogBlockedEnabled(conf->logBlocked());
m_logManager->setLogStatEnabled(conf->logStat());
} }
void FortManager::setLanguage(int language) void FortManager::setLanguage(int language)
@ -360,7 +355,7 @@ void FortManager::saveTrayFlags()
++i; ++i;
} }
m_fortSettings->writeConfFlags(*m_firewallConf); m_fortSettings->writeConfIni(*m_firewallConf);
updateDriverConfFlags(m_firewallConf); updateDriverConfFlags(m_firewallConf);
} }

View File

@ -54,7 +54,7 @@ public slots:
bool saveOriginConf(const QString &message); bool saveOriginConf(const QString &message);
bool saveConf(bool onlyFlags = false); bool saveConf(bool onlyFlags = false);
bool applyConf(bool onlyFlags = false); bool applyConf(bool onlyFlags = false);
bool applyConfImmediateFlags(); bool applyConfImmediateValues();
void setLanguage(int language); void setLanguage(int language);
@ -78,12 +78,12 @@ private:
bool loadSettings(FirewallConf *conf); bool loadSettings(FirewallConf *conf);
bool saveSettings(FirewallConf *newConf, bool onlyFlags = false, bool saveSettings(FirewallConf *newConf, bool onlyFlags = false,
bool immediateFlags = false); bool immediateValues = false);
bool updateDriverConf(FirewallConf *conf); bool updateDriverConf(FirewallConf *conf);
bool updateDriverConfFlags(FirewallConf *conf); bool updateDriverConfFlags(FirewallConf *conf);
void updateLogManager(FirewallConf *conf); void updateDatabaseManager(FirewallConf *conf);
FirewallConf *cloneConf(const FirewallConf &conf); FirewallConf *cloneConf(const FirewallConf &conf);

View File

@ -140,7 +140,7 @@ bool FortSettings::readConf(FirewallConf &conf)
return (!(fileExists || backupFileExists) return (!(fileExists || backupFileExists)
|| (fileExists && tryToReadConf(conf, filePath)) || (fileExists && tryToReadConf(conf, filePath))
|| tryToReadConf(conf, backupFilePath)) || tryToReadConf(conf, backupFilePath))
&& readConfFlags(conf); // read flags at the end to use correct app groups && readConfIni(conf); // read flags at the end to use correct app groups
} }
bool FortSettings::tryToReadConf(FirewallConf &conf, const QString &filePath) bool FortSettings::tryToReadConf(FirewallConf &conf, const QString &filePath)
@ -165,7 +165,7 @@ bool FortSettings::writeConf(const FirewallConf &conf)
const QString filePath = confFilePath(); const QString filePath = confFilePath();
const QString backupFilePath = confBackupFilePath(); const QString backupFilePath = confBackupFilePath();
if (!writeConfFlags(conf)) { if (!writeConfIni(conf)) {
setErrorMessage(tr("Can't write .ini file")); setErrorMessage(tr("Can't write .ini file"));
return false; return false;
} }
@ -204,7 +204,7 @@ bool FortSettings::tryToWriteConf(const FirewallConf &conf, const QString &fileP
return true; return true;
} }
bool FortSettings::readConfFlags(FirewallConf &conf) const bool FortSettings::readConfIni(FirewallConf &conf) const
{ {
m_ini->beginGroup("confFlags"); m_ini->beginGroup("confFlags");
conf.setProvBoot(iniBool("provBoot")); conf.setProvBoot(iniBool("provBoot"));
@ -216,13 +216,20 @@ bool FortSettings::readConfFlags(FirewallConf &conf) const
conf.ipExclude()->setUseAll(iniBool("ipExcludeAll")); conf.ipExclude()->setUseAll(iniBool("ipExcludeAll"));
conf.setAppBlockAll(iniBool("appBlockAll", true)); conf.setAppBlockAll(iniBool("appBlockAll", true));
conf.setAppAllowAll(iniBool("appAllowAll")); conf.setAppAllowAll(iniBool("appAllowAll"));
conf.setAppGroupBits(iniUInt("appGroupBits", 0xFFFF)); conf.setAppGroupBits(iniUInt("appGroupBits", DEFAULT_APP_GROUP_BITS));
m_ini->endGroup();
m_ini->beginGroup("stat");
conf.setTrafHourKeepDays(iniInt("trafHourKeepDays", DEFAULT_TRAF_HOUR_KEEP_DAYS));
conf.setTrafDayKeepDays(iniInt("trafDayKeepDays", DEFAULT_TRAF_DAY_KEEP_DAYS));
conf.setTrafMonthKeepMonths(iniInt("trafMonthKeepMonths", DEFAULT_TRAF_MONTH_KEEP_MONTHS));
conf.setTrafUnit(iniInt("trafUnit"));
m_ini->endGroup(); m_ini->endGroup();
return true; return true;
} }
bool FortSettings::writeConfFlags(const FirewallConf &conf) bool FortSettings::writeConfIni(const FirewallConf &conf)
{ {
m_ini->beginGroup("confFlags"); m_ini->beginGroup("confFlags");
setIniValue("provBoot", conf.provBoot()); setIniValue("provBoot", conf.provBoot());
@ -234,7 +241,14 @@ bool FortSettings::writeConfFlags(const FirewallConf &conf)
setIniValue("ipExcludeAll", conf.ipExclude()->useAll()); setIniValue("ipExcludeAll", conf.ipExclude()->useAll());
setIniValue("appBlockAll", conf.appBlockAll()); setIniValue("appBlockAll", conf.appBlockAll());
setIniValue("appAllowAll", conf.appAllowAll()); setIniValue("appAllowAll", conf.appAllowAll());
setIniValue("appGroupBits", conf.appGroupBits()); setIniValue("appGroupBits", conf.appGroupBits(), DEFAULT_APP_GROUP_BITS);
m_ini->endGroup();
m_ini->beginGroup("stat");
setIniValue("trafHourKeepDays", conf.trafHourKeepDays(), DEFAULT_TRAF_HOUR_KEEP_DAYS);
setIniValue("trafDayKeepDays", conf.trafDayKeepDays(), DEFAULT_TRAF_DAY_KEEP_DAYS);
setIniValue("trafMonthKeepMonths", conf.trafMonthKeepMonths(), DEFAULT_TRAF_MONTH_KEEP_MONTHS);
setIniValue("trafUnit", conf.trafUnit());
m_ini->endGroup(); m_ini->endGroup();
return iniSync(); return iniSync();
@ -250,7 +264,7 @@ int FortSettings::iniInt(const QString &key, int defaultValue) const
return iniValue(key, defaultValue).toInt(); return iniValue(key, defaultValue).toInt();
} }
int FortSettings::iniUInt(const QString &key, int defaultValue) const uint FortSettings::iniUInt(const QString &key, int defaultValue) const
{ {
return iniValue(key, defaultValue).toUInt(); return iniValue(key, defaultValue).toUInt();
} }

View File

@ -54,8 +54,8 @@ public slots:
bool readConf(FirewallConf &conf); bool readConf(FirewallConf &conf);
bool writeConf(const FirewallConf &conf); bool writeConf(const FirewallConf &conf);
bool readConfFlags(FirewallConf &conf) const; bool readConfIni(FirewallConf &conf) const;
bool writeConfFlags(const FirewallConf &conf); bool writeConfIni(const FirewallConf &conf);
private: private:
void processArguments(const QStringList &args); void processArguments(const QStringList &args);
@ -71,7 +71,7 @@ private:
bool iniBool(const QString &key, bool defaultValue = false) const; bool iniBool(const QString &key, bool defaultValue = false) const;
int iniInt(const QString &key, int defaultValue = 0) const; int iniInt(const QString &key, int defaultValue = 0) const;
int iniUInt(const QString &key, int defaultValue = 0) const; uint iniUInt(const QString &key, int defaultValue = 0) const;
int iniReal(const QString &key, qreal defaultValue = 0) const; int iniReal(const QString &key, qreal defaultValue = 0) const;
QString iniText(const QString &key, const QString &defaultValue = QString()) const; QString iniText(const QString &key, const QString &defaultValue = QString()) const;
QStringList iniList(const QString &key) const; QStringList iniList(const QString &key) const;

View File

@ -14,8 +14,6 @@ LogManager::LogManager(DatabaseManager *databaseManager,
QObject *parent) : QObject *parent) :
QObject(parent), QObject(parent),
m_active(false), m_active(false),
m_logBlockedEnabled(false),
m_logStatEnabled(false),
m_driverWorker(driverWorker), m_driverWorker(driverWorker),
m_appBlockedModel(new AppBlockedModel(this)), m_appBlockedModel(new AppBlockedModel(this)),
m_appStatModel(new AppStatModel(databaseManager, this)) m_appStatModel(new AppStatModel(databaseManager, this))
@ -39,22 +37,6 @@ void LogManager::setActive(bool active)
} }
} }
void LogManager::setLogBlockedEnabled(bool enabled)
{
if (m_logBlockedEnabled != enabled) {
m_logBlockedEnabled = enabled;
emit logBlockedEnabledChanged();
}
}
void LogManager::setLogStatEnabled(bool enabled)
{
if (m_logStatEnabled != enabled) {
m_logStatEnabled = enabled;
emit logStatEnabledChanged();
}
}
void LogManager::setErrorMessage(const QString &errorMessage) void LogManager::setErrorMessage(const QString &errorMessage)
{ {
if (m_errorMessage != errorMessage) { if (m_errorMessage != errorMessage) {
@ -120,26 +102,20 @@ void LogManager::readLogEntries(LogBuffer *logBuffer)
switch (logBuffer->peekEntryType()) { switch (logBuffer->peekEntryType()) {
case LogEntry::AppBlocked: { case LogEntry::AppBlocked: {
logBuffer->readEntryBlocked(&entryBlocked); logBuffer->readEntryBlocked(&entryBlocked);
if (m_logBlockedEnabled) { m_appBlockedModel->addLogEntry(entryBlocked);
m_appBlockedModel->addLogEntry(entryBlocked);
}
break; break;
} }
case LogEntry::ProcNew: { case LogEntry::ProcNew: {
logBuffer->readEntryProcNew(&entryProcNew); logBuffer->readEntryProcNew(&entryProcNew);
if (m_logStatEnabled) { m_appStatModel->handleProcNew(entryProcNew.path());
m_appStatModel->handleProcNew(entryProcNew.path());
}
break; break;
} }
case LogEntry::StatTraf: { case LogEntry::StatTraf: {
logBuffer->readEntryStatTraf(&entryStatTraf); logBuffer->readEntryStatTraf(&entryStatTraf);
if (m_logStatEnabled) { m_appStatModel->handleStatTraf(
m_appStatModel->handleStatTraf( entryStatTraf.procCount(),
entryStatTraf.procCount(), entryStatTraf.procBits(),
entryStatTraf.procBits(), entryStatTraf.trafBytes());
entryStatTraf.trafBytes());
}
break; break;
} }
default: default:

View File

@ -27,20 +27,12 @@ public:
void setActive(bool active); void setActive(bool active);
bool logBlockedEnabled() const { return m_logBlockedEnabled; }
void setLogBlockedEnabled(bool enabled);
bool logStatEnabled() const { return m_logStatEnabled; }
void setLogStatEnabled(bool enabled);
QString errorMessage() const { return m_errorMessage; } QString errorMessage() const { return m_errorMessage; }
void initialize(); void initialize();
signals: signals:
void activeChanged(); void activeChanged();
void logBlockedEnabledChanged();
void logStatEnabledChanged();
void errorMessageChanged(); void errorMessageChanged();
public slots: public slots:
@ -63,8 +55,6 @@ private:
private: private:
bool m_active; bool m_active;
bool m_logBlockedEnabled;
bool m_logStatEnabled;
DriverWorker *m_driverWorker; DriverWorker *m_driverWorker;
QList<LogBuffer *> m_freeBuffers; QList<LogBuffer *> m_freeBuffers;

View File

@ -18,8 +18,10 @@ void AppStatModel::initialize()
TrafListModel *AppStatModel::trafListModel(int trafType, int row) const TrafListModel *AppStatModel::trafListModel(int trafType, int row) const
{ {
Q_ASSERT(row < m_appIds.size());
m_trafListModel->setType(static_cast<TrafListModel::TrafType>(trafType)); m_trafListModel->setType(static_cast<TrafListModel::TrafType>(trafType));
m_trafListModel->setAppId(row == -1 ? 0 : m_appIds.at(row)); m_trafListModel->setAppId(row < 0 ? 0 : m_appIds.at(row));
m_trafListModel->reset(); m_trafListModel->reset();
return m_trafListModel; return m_trafListModel;
@ -46,9 +48,10 @@ void AppStatModel::updateList()
void AppStatModel::handleProcNew(const QString &appPath) void AppStatModel::handleProcNew(const QString &appPath)
{ {
bool isNew = false; bool isNew = false;
m_databaseManager->logProcNew(appPath, isNew); const qint64 appId = m_databaseManager->logProcNew(appPath, isNew);
if (isNew) { if (isNew) {
m_appIds.append(appId);
insert(appPath); insert(appPath);
} }
} }

View File

@ -1,5 +1,8 @@
#include "traflistmodel.h" #include "traflistmodel.h"
#include <QLocale>
#include "../../conf/firewallconf.h"
#include "../../db/databasemanager.h" #include "../../db/databasemanager.h"
#include "../../db/databasesql.h" #include "../../db/databasesql.h"
#include "../../util/dateutil.h" #include "../../util/dateutil.h"
@ -65,9 +68,10 @@ QVariant TrafListModel::data(const QModelIndex &index, int role) const
switch (role) { switch (role) {
case DateTimeRole: return formatTrafTime(m_rowCache.trafTime); case DateTimeRole: return formatTrafTime(m_rowCache.trafTime);
case DownloadRole: return m_rowCache.inBytes; case DownloadRole: return formatTrafUnit(m_rowCache.inBytes);
case UploadRole: return m_rowCache.outBytes; case UploadRole: return formatTrafUnit(m_rowCache.outBytes);
case SumRole: return m_rowCache.inBytes + m_rowCache.outBytes; case SumRole: return formatTrafUnit(m_rowCache.inBytes
+ m_rowCache.outBytes);
} }
} }
return QVariant(); return QVariant();
@ -102,6 +106,36 @@ void TrafListModel::updateRowCache(int row) const
m_appId); m_appId);
} }
QString TrafListModel::formatTrafUnit(qint64 bytes) const
{
static const QVector<qint64> unitMults = {
1, // Adaptive
1, // Bytes
1024, // KB
1024 * 1024, // MB
qint64(1024) * 1024 * 1024, // GB
qint64(1024) * 1024 * 1024 * 1024 // TB
};
if (bytes == 0) {
return QLatin1String("0");
}
const FirewallConf *conf = m_databaseManager->firewallConf();
const int trafUnit = conf ? conf->trafUnit() : 0;
const int trafPrec = (trafUnit == FirewallConf::UnitBytes) ? 0 : 2;
QLocale locale;
if (trafUnit == FirewallConf::UnitAdaptive) {
return locale.formattedDataSize(bytes, trafPrec);
}
const qint64 unitMult = unitMults.at(trafUnit);
return locale.toString(qreal(bytes) / unitMult, 'f', trafPrec);
}
QString TrafListModel::formatTrafTime(qint32 trafTime) const QString TrafListModel::formatTrafTime(qint32 trafTime) const
{ {
const qint64 unixTime = DateUtil::toUnixTime(trafTime); const qint64 unixTime = DateUtil::toUnixTime(trafTime);

View File

@ -61,6 +61,7 @@ public slots:
private: private:
void updateRowCache(int row) const; void updateRowCache(int row) const;
QString formatTrafUnit(qint64 bytes) const;
QString formatTrafTime(qint32 trafTime) const; QString formatTrafTime(qint32 trafTime) const;
qint32 getTrafTime(int row) const; qint32 getTrafTime(int row) const;

View File

@ -31,6 +31,8 @@ BasePage {
spacing: 10 spacing: 10
RowLayout { RowLayout {
spacing: 15
Button { Button {
enabled: appListView.count enabled: appListView.count
text: translationManager.dummyBool text: translationManager.dummyBool
@ -48,7 +50,7 @@ BasePage {
firewallConf.resolveAddress = checked; firewallConf.resolveAddress = checked;
fortManager.applyConfImmediateFlags(); fortManager.applyConfImmediateValues();
hostInfoCache.cacheChanged(); // refresh ipListView hostInfoCache.cacheChanged(); // refresh ipListView
} }
@ -69,7 +71,7 @@ BasePage {
firewallConf.logBlocked = checked; firewallConf.logBlocked = checked;
fortManager.applyConfImmediateFlags(); fortManager.applyConfImmediateValues();
} }
} }
} }

View File

@ -24,11 +24,24 @@ BasePage {
trafsContainer.width * 0.2 trafsContainer.width * 0.2
] ]
readonly property var trafUnitNames:
translationManager.dummyBool
&& [
qsTranslate("qml", "Adaptive"),
qsTranslate("qml", "Bytes"),
qsTranslate("qml", "KiB"),
qsTranslate("qml", "MiB"),
qsTranslate("qml", "GiB"),
qsTranslate("qml", "TiB")
]
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
spacing: 10 spacing: 10
RowLayout { RowLayout {
spacing: 15
Button { Button {
enabled: appListView.currentIndex >= 0 enabled: appListView.currentIndex >= 0
text: translationManager.dummyBool text: translationManager.dummyBool
@ -36,6 +49,31 @@ BasePage {
onClicked: trafListModel.refresh() onClicked: trafListModel.refresh()
} }
Row {
spacing: 5
Label {
anchors.verticalCenter: parent.verticalCenter
text: translationManager.dummyBool
&& qsTranslate("qml", "Units:")
}
ComboBox {
id: comboTrafUnit
currentIndex: firewallConf.trafUnit
model: trafUnitNames
onActivated: {
firewallConf.trafUnit = index;
fortManager.applyConfImmediateValues();
trafListModel.refresh();
}
}
}
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
@ -52,7 +90,7 @@ BasePage {
firewallConf.logStat = checked; firewallConf.logStat = checked;
fortManager.applyConfImmediateFlags(); fortManager.applyConfImmediateValues();
} }
} }
} }