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(); }