#pragma once #include "common.h" #include class ScopeFieldsSetter; class DataContext; /// /// 解析解构 /// class ExtractStruct : public Serializable { public: /// /// 注册自身 /// /// virtual void registSubField(std::shared_ptr inst) const = 0; /// /// 解析所用的字节数量 /// /// virtual int countWithin() const = 0; /// /// 执行解析过程 /// /// /// virtual void parse(const QByteArray& bytes, std::shared_ptr out) const = 0; }; /// /// 翻译单元抽象接口 /// class ExtractDelegate : public ExtractStruct { public: /// /// 基础类型 /// /// virtual QString unitType() const = 0; /// /// 输出数据类型 /// /// virtual DataType outType() const = 0; /// /// 单元类型名称 /// /// virtual QString aliasName() const = 0; /// /// 设置单元类型名称 /// /// virtual void setAlias(const QString& name) = 0; }; /// /// 字段代理 /// class ExtractUnit : public ExtractStruct { public: /// /// 基础单元类型 /// /// virtual QString baseType() const = 0; /// /// 字段名称 /// /// virtual QString name() const = 0; virtual void setName(const QString& name) = 0; /// /// 设置偏移字节数量 /// /// virtual bool setOffsetSpan(int bytes) = 0; /// /// 获取解析偏移字节数量 /// /// virtual int offsetSpan() const = 0; }; class SizeProvider; class RuleMatch; namespace extract { class AbstractExtractor : public ExtractDelegate { private: struct __Private { QString typename_store = ""; DataType type_store = DataType::Integer; QString name_alias = ""; int byte_count = 1; } _abs_data; public: AbstractExtractor(const QString& name, DataType data); virtual bool setCountWithin(int bytes); // ExtractDelegate =========================== QString unitType() const override; virtual DataType outType() const; int countWithin() const override; QString aliasName() const override; void setAlias(const QString& name) override; // ExtractStruct ============================ void registSubField(std::shared_ptr inst) const override; // Serializable ============================== void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 转换源数值未16进制数值,默认分割方式 /// class AsHex : public AbstractExtractor { public: static QString topic(); AsHex(); void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; /// /// 转换源数值为位联合 /// class AsBitCombine : public AbstractExtractor { private: struct __Private { QHash _switch_options; } _combine; public: static QString topic(); AsBitCombine(); bool setSwitchOption(int bit_index, const QString& keyword); QHash switchOptions() const; virtual void clearOptions(); // ExtractDelegate ============================ void parse(const QByteArray& bytes, std::shared_ptr out) const override; // Serializable ============================== void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; /// /// 转换源数据为整形 /// class AsInteger : public AbstractExtractor { public: static QString topic(); AsInteger(); // ExtractDelegate ============================ bool setCountWithin(int bytes) override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; // Serializable ============================== std::shared_ptr newDefault() const override; }; /// /// 转换源数据为整形 /// class AsUnsigned : public AbstractExtractor { public: static QString topic(); AsUnsigned(); // ExtractDelegate ============================ bool setCountWithin(int bytes) override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; // Serializable ============================== std::shared_ptr newDefault() const override; }; /// /// 转换源数据为字符串 /// class AsString : public AbstractExtractor { private: struct __Private { QTextCodec* _conv_with = nullptr; } _strings; public: static QString topic(); AsString(); void setStrCodec(QTextCodec* ins); QString codecName() const; // ExtractDelegate ============================ void parse(const QByteArray& bytes, std::shared_ptr out) const override; // Serializable ============================== void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; class AsFloat : public AbstractExtractor { public: static QString topic(); AsFloat(); void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; class AsDouble : public AbstractExtractor { public: static QString topic(); AsDouble(); void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; class AsRuleSet : public ExtractDelegate { private: struct __Private { QString alias_name = ""; QList> sub_units; int count_within_rt = 0; }_bind; public: static QString topic(); QList fieldNames() const; std::shared_ptr operator[](const QString& field) const; int memberCount() const; std::shared_ptr operator[](int index) const; void replace(int index, std::shared_ptr inst); void removeAt(int index); AsRuleSet& append(std::shared_ptr u); public: QString unitType() const override; void registSubField(std::shared_ptr inst) const override; DataType outType() const override; int countWithin() const override; QString aliasName() const override; void setAlias(const QString& name) override; void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; class SingleBasedUnit : public ExtractUnit { private: struct __Private { QString _field_name = ""; int _bytes_offset = 0; std::shared_ptr _delegate_inst = nullptr; } _inst; public: std::shared_ptr delegateInst() const; void setDelegate(std::shared_ptr inst); public: static QString topic(); QString baseType() const; QString name() const override; void setName(const QString& name) override; bool setOffsetSpan(int bytes) override; int offsetSpan() const override; virtual int countWithin() const; void registSubField(std::shared_ptr inst) const override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; class ListBasedUnit : public ExtractUnit { private: struct __Private { QString field_name = ""; int bytes_offset = 0; std::shared_ptr size_provider_inst = nullptr; std::shared_ptr delegate_inst = nullptr; int count_with_runtime = 0; } _list; public: void setSizeProvider(std::shared_ptr inst); std::shared_ptr sizeProvider() const; void setDelegate(std::shared_ptr inst); std::shared_ptr delegateInst() const; public: static QString topic(); QString baseType() const; QString name() const override; void setName(const QString& name) override; void registSubField(std::shared_ptr inst) const override; bool setOffsetSpan(int bytes) override; int offsetSpan() const override; int countWithin() const override; void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; class UnionBasedUnit : public ExtractUnit { private: struct __Private { int bytes_offset = 0; int bytes_count = 1; QString alias_name = ""; QList> rulematch_list; } _union; public: void updateMatch(int index, std::shared_ptr rule); QList> matchRules() const; void clearRules(); void setCountWithin(int count); public: static QString topic(); QString baseType() const override; void registSubField(std::shared_ptr inst) const override; QString name() const override; void setName(const QString& name) override; bool setOffsetSpan(int bytes) override; int offsetSpan() const override; int countWithin() const override; void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; }