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