From 8c21c6d07ff7f3085b621c3cd4c9e7c4e5b85826 Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Wed, 20 Nov 2024 18:31:31 +0800
Subject: [PATCH] logs-output complete
---
PenetrateBasic/PenetrateBasic.vcxproj | 2 +
PenetrateBasic/PenetrateBasic.vcxproj.filters | 6 +++
PenetrateBasic/dispatch.cpp | 19 +++++--
PenetrateBasic/dispatch.h | 8 ++-
PenetrateBasic/logs_port.cpp | 54 +++++++++++++++++++
PenetrateBasic/logs_port.h | 40 ++++++++++++++
PenetrateBasic/main.cpp | 50 ++++++++---------
7 files changed, 148 insertions(+), 31 deletions(-)
create mode 100644 PenetrateBasic/logs_port.cpp
create mode 100644 PenetrateBasic/logs_port.h
diff --git a/PenetrateBasic/PenetrateBasic.vcxproj b/PenetrateBasic/PenetrateBasic.vcxproj
index f4b86e0..34cc85b 100644
--- a/PenetrateBasic/PenetrateBasic.vcxproj
+++ b/PenetrateBasic/PenetrateBasic.vcxproj
@@ -93,6 +93,7 @@
+
@@ -101,6 +102,7 @@
+
diff --git a/PenetrateBasic/PenetrateBasic.vcxproj.filters b/PenetrateBasic/PenetrateBasic.vcxproj.filters
index b0688ee..36eefd2 100644
--- a/PenetrateBasic/PenetrateBasic.vcxproj.filters
+++ b/PenetrateBasic/PenetrateBasic.vcxproj.filters
@@ -32,6 +32,9 @@
Source Files
+
+ Source Files
+
@@ -58,5 +61,8 @@
Header Files
+
+ Header Files
+
\ No newline at end of file
diff --git a/PenetrateBasic/dispatch.cpp b/PenetrateBasic/dispatch.cpp
index 0c47720..d46d256 100644
--- a/PenetrateBasic/dispatch.cpp
+++ b/PenetrateBasic/dispatch.cpp
@@ -9,6 +9,10 @@ Dispatch* dispatch::Dispatch::unique() {
return _unique_inst;
}
+void dispatch::Dispatch::loadOutput(std::shared_ptr out_ins) {
+ this->_output_list << out_ins;
+}
+
QList Dispatch::allCmds() const {
return _cmds_map.keys();
}
@@ -37,12 +41,19 @@ QString Dispatch::getCmdDefault(quint64 addr) const {
return "";
}
+#include "validate_depict.h"
void Dispatch::runWith(IRunbase* unit) {
+ depict::ValidateDocObject obj;
+
auto addrs = unit->address();
- if (_cmds_validators.contains(addrs)) {
- auto validate_templet = _cmds_validators[addrs];
- if (!validate_templet->doValidate(unit))
- return;
+ if (_cmds_validators.contains(addrs) && !_cmds_validators[addrs]->doValidate(unit)) {
+ unit->saveTo(obj);
+ auto args_content = obj.toText();
+ std::for_each(_output_list.begin(), _output_list.end(), [&](std::shared_ptr ins) {
+ ins->write(u8"命令校验信息", u8"命令执行参数校验失败", args_content);
+ ins->flush();
+ });
+ return;
}
unit->run();
}
diff --git a/PenetrateBasic/dispatch.h b/PenetrateBasic/dispatch.h
index 76699d2..dbc3ea6 100644
--- a/PenetrateBasic/dispatch.h
+++ b/PenetrateBasic/dispatch.h
@@ -2,6 +2,7 @@
#include
#include
+#include
#include "cmds_basic.h"
#include "validate_basic.h"
@@ -10,7 +11,8 @@ namespace dispatch {
public:
virtual ~IOutput() = default;
- virtual void write(const QString& title, const QString& desc) = 0;
+ virtual void write(const QString &type, const QString& title, const QString& desc) = 0;
+ virtual void flush() = 0;
};
@@ -20,13 +22,15 @@ namespace dispatch {
QHash _cmds_validators;
QHash> _events_map;
- QList _output_list;
+ QList> _output_list;
static Dispatch* _unique_inst;
public:
static Dispatch* unique();
+ void loadOutput(std::shared_ptr out_ins);
+
QList allCmds() const;
void registerCmd(quint64 addr, Inlet::IRunbase* unit);
void setCmdAlias(quint64 addr, const QString& alias);
diff --git a/PenetrateBasic/logs_port.cpp b/PenetrateBasic/logs_port.cpp
new file mode 100644
index 0000000..28c310e
--- /dev/null
+++ b/PenetrateBasic/logs_port.cpp
@@ -0,0 +1,54 @@
+#include "logs_port.h"
+
+#include
+#include
+
+logs::LogsOutput::LogsOutput(const QDir& target, int size) : _cache_size(size) {
+ auto dt = QDateTime::currentDateTime();
+ auto base_name = QString(u8"logs_%1.u8txt").arg(dt.toString(u8"yyyyMMdd_hhmmss"));
+ auto full_path = target.filePath(base_name);
+
+ _target_file = std::make_shared(full_path);
+ if (!_target_file->open(QIODevice::WriteOnly | QIODevice::Text)) {
+ throw - 1;
+ }
+}
+
+void logs::LogsOutput::write(const QString& type, const QString& title, const QString& msg) {
+ auto dt = QDateTime::currentDateTime();
+
+ _mutex.lock();
+ _message_buffer << QString(u8"%1[%2]:%3:%4").arg(type, dt.toString(u8"hh:mm:ss"), title, msg);
+ _mutex.unlock();
+
+ flush();
+}
+
+void logs::LogsOutput::information(const QString& title, const QString& msg) {
+ write(u8"Information", title, msg);
+}
+
+void logs::LogsOutput::warning(const QString& title, const QString& msg) {
+ write(u8"Warning", title, msg);
+}
+
+void logs::LogsOutput::error(const QString& title, const QString& msg) {
+ write(u8"Error", title, msg);
+ flush(true);
+}
+
+#include
+void logs::LogsOutput::flush(bool fouce) {
+ QMutexLocker l(&_mutex);
+
+ if (!fouce && _message_buffer.size() < _cache_size)
+ return;
+
+ QTextStream tout(_target_file.get());
+ tout.setCodec(u8"UTF-8");
+ for (auto& line : _message_buffer) {
+ tout << line << u8"\n";
+ }
+ tout.flush();
+ _message_buffer.clear();
+}
diff --git a/PenetrateBasic/logs_port.h b/PenetrateBasic/logs_port.h
new file mode 100644
index 0000000..07fec8b
--- /dev/null
+++ b/PenetrateBasic/logs_port.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+namespace logs {
+ class LogsPort {
+ public:
+ virtual ~LogsPort() = default;
+
+ virtual void write(const QString& type, const QString& title, const QString& msg) = 0;
+ virtual void information(const QString& title, const QString& msg) = 0;
+ virtual void warning(const QString& title, const QString& msg) = 0;
+ virtual void error(const QString& title, const QString& msg) = 0;
+
+ virtual void flush(bool fouce = false) = 0;
+ };
+
+ class LogsOutput : public LogsPort {
+ public:
+ LogsOutput(const QDir& target, int cache_size = 200);
+
+ // 通过 LogsPort 继承
+ void write(const QString& type, const QString& title, const QString& msg) override;
+ void information(const QString& title, const QString& msg) override;
+ void warning(const QString& title, const QString& msg) override;
+ void error(const QString& title, const QString& msg) override;
+
+ virtual void flush(bool fouce = false);
+
+ private:
+ QMutex _mutex;
+ int _cache_size;
+ std::shared_ptr _target_file;
+
+ QList _message_buffer;
+ };
+}
diff --git a/PenetrateBasic/main.cpp b/PenetrateBasic/main.cpp
index 76d3a9d..3f56aa4 100644
--- a/PenetrateBasic/main.cpp
+++ b/PenetrateBasic/main.cpp
@@ -8,35 +8,35 @@
#include "validate_impl.h"
#include "validate_depict.h"
-int vp(int c) {
- qDebug() << c;
- return c;
-}
-verify::T::Validate vp_check;
-auto args0 = vp_check.pos<0>() & new impls::Int32Limit(u8"Hello World", 0, 3);
-
-cmds::T::Cmd entry("hello");
-
-
-namespace xproc {
- int xmp(int arg) {
- qDebug() << "xmp";
- return 3;
- }
-}
-cmds::T::Cmd xvv("sfaf");
-
-template<> void datas::dataSet(IDataObject& object, const QString& key, int value) { }
-template<> int datas::dataGet(IDataObject& object, const QString& key) {
- return 0;
-}
-
+//int vp(int c) {
+// qDebug() << c;
+// return c;
+//}
+//verify::T::Validate vp_check;
+//auto args0 = vp_check.pos<0>() & new impls::Int32Limit(u8"Hello World", 0, 3);
+//
+//cmds::T::Cmd entry("hello");
+//
+//
+//namespace xproc {
+// int xmp(int arg) {
+// qDebug() << "xmp";
+// return 3;
+// }
+//}
+//cmds::T::Cmd xvv("sfaf");
+//
+//template<> void datas::dataSet(IDataObject& object, const QString& key, int value) { }
+//template<> int datas::dataGet(IDataObject& object, const QString& key) {
+// return 0;
+//}
+#include "logs_port.h"
using namespace Inlet;
int main(int argc, char* argv[]) {
QCoreApplication a(argc, argv);
- SignatureImpl v(3);
+ /*SignatureImpl v(3);
v.execute(vp);
Callable vptr = vp;
@@ -52,7 +52,7 @@ int main(int argc, char* argv[]) {
depict::ValidateDocObject doc;
dispatch::Dispatch::unique()->getValidateDepict(doc);
- qDebug().noquote() << doc.toText();
+ qDebug().noquote() << doc.toText();*/
return a.exec();
}