#pragma once #include "common.h" #include class SizeProvider; class RuleMatch; class ScopeFieldsSetter; class DataAccessContext; /// /// 翻译单元抽象接口 /// class ExtractUnit : public Serializable { public: /// /// 单元名称 /// /// virtual QString name() const = 0; /// /// 注册自身 /// /// virtual void registSubField(std::shared_ptr inst) = 0; /// /// /// /// virtual DataType outType() const = 0; /// /// 设置偏移字节数量 /// /// virtual bool setOffsetSpan(int bytes) = 0; /// /// 从上一个单元字节偏移字节数量 /// /// virtual int offsetSpan() const = 0; /// /// 解析所用的字节数量 /// /// virtual int countWithin() const = 0; /// /// 执行解析过程 /// /// /// virtual void parse(const QByteArray& bytes, std::shared_ptr out) const = 0; }; namespace extract { class AbstractExtractor : public ExtractUnit { public: struct __Private { QString name_store = ""; DataType type_store = DataType::Integer; int byte_offset = 0, byte_count = 1; } _abs_data; AbstractExtractor(const QString& name, DataType data); virtual bool setCountWithin(int bytes); // ExtractUnit =========================== QString name() const override; void registSubField(std::shared_ptr inst) override; virtual DataType outType() const; /// /// 设置偏移字节数量 /// /// virtual bool setOffsetSpan(int bytes); int offsetSpan() const override; int countWithin() const override; // Serializable ============================== void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 转换源数值未16进制数值,默认分割方式 /// class BytesAsHex : public AbstractExtractor { public: BytesAsHex(); void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; /// /// 转换源数值为位联合 /// class BytesAsBitCombine : public AbstractExtractor { public: struct __Private { QHash _switch_options; } _combine; BytesAsBitCombine(); bool setSwitchOption(int bit_index, const QString& keyword); QHash switchOptions() const; virtual void clearOptions(); // ExtractUnit ============================ 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 BytesAsInteger : public AbstractExtractor { public: BytesAsInteger(); // ExtractUnit ============================ bool setCountWithin(int bytes) override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; // Serializable ============================== std::shared_ptr newDefault() const override; }; /// /// 转换源数据为整形 /// class BytesAsUnsigned : public AbstractExtractor { public: BytesAsUnsigned(); // ExtractUnit ============================ bool setCountWithin(int bytes) override; void parse(const QByteArray& bytes, std::shared_ptr out) const override; // Serializable ============================== std::shared_ptr newDefault() const override; }; /// /// 转换源数据为字符串 /// class BytesAsString : public AbstractExtractor { public: struct __Private { QTextCodec* _conv_with = nullptr; } _strings; public: BytesAsString(); void setStrCodec(QTextCodec* ins); QString codecName() const; // ExtractUnit ============================ 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 BytesAsFloat : public AbstractExtractor { public: BytesAsFloat(); void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; class BytesAsDouble : public AbstractExtractor { public: BytesAsDouble(); void parse(const QByteArray& bytes, std::shared_ptr out) const override; std::shared_ptr newDefault() const override; }; class BytesAsList : public ExtractUnit { public: struct __Private { std::shared_ptr _bind_unit = nullptr; int _bytes_offset = 0; std::shared_ptr _bind_size_v = nullptr; } _list; public: bool setOffsetSpan(int value); std::shared_ptr elementRule() const; bool appendElementRule(std::shared_ptr u); std::shared_ptr sizeProvider() const; bool setSizeProvider(std::shared_ptr ins); public: QString name() const override; void registSubField(std::shared_ptr inst) override; DataType outType() const 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 BytesAsUnion : public ExtractUnit { public: struct __Private { int byte_offset = 0, byte_count = 1; QList> _rule_list; } _union; public: bool setCountWithin(int bytes); void clearRules(); QList> elementRules() const; bool appendElementRule(std::shared_ptr u); public: QString name() const override; void registSubField(std::shared_ptr inst) override; DataType outType() const override; bool setOffsetSpan(int value); int offsetSpan() const override; int countWithin() 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 BytesAsRuleSet : public ExtractUnit { public: struct __Private { int _byte_offset = 0, _byte_count = 1; QString _name_store; QList>> sub_units; QList fieldNames() const; std::shared_ptr operator[](const QString &field) const; std::pair> operator[](int index) const; void replace(int index, std::pair> inst); void removeAt(int index); __Private& append(const QString& nm, std::shared_ptr u); }_bind; void setCustomName(const QString& name); QString customName() const; public: QString name() const override; void registSubField(std::shared_ptr inst) override; DataType outType() const override; bool setOffsetSpan(int bytes) override; int offsetSpan() const override; int countWithin() const override; std::shared_ptr newDefault() 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; }; }