269 lines
6.5 KiB
C++
269 lines
6.5 KiB
C++
#pragma once
|
||
|
||
#include "common.h"
|
||
#include <QHash>
|
||
|
||
/// <summary>
|
||
/// 翻译单元抽象接口
|
||
/// </summary>
|
||
class ExtractUnit : public Serializable {
|
||
public:
|
||
virtual ~ExtractUnit() = default;
|
||
|
||
/// <summary>
|
||
/// 单元名称
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual QString name() const = 0;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual DataType outType() const = 0;
|
||
/// <summary>
|
||
/// 设置偏移字节数量
|
||
/// </summary>
|
||
/// <param name="bytes"></param>
|
||
virtual bool setOffsetSpan(int bytes) = 0;
|
||
/// <summary>
|
||
/// 从上一个单元字节偏移字节数量
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual int offsetSpan() const = 0;
|
||
/// <summary>
|
||
/// 解析所用的字节数量
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual int countWithin() const = 0;
|
||
|
||
/// <summary>
|
||
/// 执行解析过程
|
||
/// </summary>
|
||
/// <param name="bytes"></param>
|
||
/// <returns></returns>
|
||
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 尺寸解析器
|
||
/// </summary>
|
||
class SizeProvider {
|
||
public:
|
||
virtual QString name() const = 0;
|
||
/// <summary>
|
||
/// 获取值,如果该值无法预先计算得知,返回-1
|
||
/// </summary>
|
||
/// <returns>尺寸值</returns>
|
||
virtual int32_t value(const QString& expr) const = 0;
|
||
|
||
virtual void setExpression(const QString& expr) = 0;
|
||
virtual QString expression() const = 0;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 规则匹配器
|
||
/// </summary>
|
||
class RuleMatch {
|
||
public:
|
||
virtual QString name() const = 0;
|
||
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
|
||
virtual bool checkpass(const QByteArray& buffer) 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;
|
||
virtual DataType outType() const;
|
||
/// <summary>
|
||
/// 设置偏移字节数量
|
||
/// </summary>
|
||
/// <param name="bytes"></param>
|
||
virtual bool setOffsetSpan(int bytes);
|
||
int offsetSpan() const override;
|
||
int countWithin() const override;
|
||
|
||
// Serializable ==============================
|
||
void loadFrom(const QJsonObject& obj) override;
|
||
void saveTo(QJsonObject& obj) const override;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 转换源数值未16进制数值,默认分割方式
|
||
/// </summary>
|
||
class BytesAsHex : public AbstractExtractor {
|
||
public:
|
||
BytesAsHex();
|
||
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 转换源数值为位联合
|
||
/// </summary>
|
||
class BytesAsBitCombine : public AbstractExtractor {
|
||
public:
|
||
struct __Private {
|
||
QHash<int, QString> _switch_options;
|
||
} _combines;
|
||
|
||
BytesAsBitCombine();
|
||
|
||
bool setSwitchOption(int bit_index, const QString& keyword);
|
||
QHash<int, QString> switchOptions() const;
|
||
virtual void clearOptions();
|
||
|
||
// ExtractUnit ============================
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
|
||
// Serializable ==============================
|
||
void loadFrom(const QJsonObject& obj) override;
|
||
void saveTo(QJsonObject& obj) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 转换源数据为整形
|
||
/// </summary>
|
||
class BytesAsInteger : public AbstractExtractor {
|
||
public:
|
||
BytesAsInteger();
|
||
|
||
// ExtractUnit ============================
|
||
bool setCountWithin(int bytes) override;
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
|
||
// Serializable ==============================
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 转换源数据为整形
|
||
/// </summary>
|
||
class BytesAsUnsigned : public AbstractExtractor {
|
||
public:
|
||
BytesAsUnsigned();
|
||
|
||
// ExtractUnit ============================
|
||
bool setCountWithin(int bytes) override;
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
|
||
// Serializable ==============================
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 转换源数据为字符串
|
||
/// </summary>
|
||
class BytesAsString : public AbstractExtractor {
|
||
public:
|
||
struct __Private {
|
||
QTextCodec* _conv_with = nullptr;
|
||
} _strings;
|
||
|
||
public:
|
||
BytesAsString();
|
||
|
||
void setStrCodec(QTextCodec* ins);
|
||
QString codecName() const;
|
||
|
||
// ExtractUnit ============================
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
|
||
// Serializable ==============================
|
||
void loadFrom(const QJsonObject& obj) override;
|
||
void saveTo(QJsonObject& obj) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
class BytesAsFloat : public AbstractExtractor {
|
||
public:
|
||
BytesAsFloat();
|
||
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
class BytesAsDouble : public AbstractExtractor {
|
||
public:
|
||
BytesAsDouble();
|
||
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
|
||
class BytesAsList : public ExtractUnit {
|
||
public:
|
||
struct __Private {
|
||
std::shared_ptr<ExtractUnit> _bind_unit = nullptr;
|
||
int _bytes_offset = 0;
|
||
std::shared_ptr<SizeProvider> _bind_size_v = nullptr;
|
||
} _list;
|
||
|
||
public:
|
||
bool setOffsetSpan(int value);
|
||
std::shared_ptr<ExtractUnit> elementRule() const;
|
||
bool setElementRule(std::shared_ptr<ExtractUnit> u);
|
||
std::shared_ptr<SizeProvider> sizeProvider() const;
|
||
bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
|
||
|
||
public:
|
||
QString name() const override;
|
||
DataType outType() const override;
|
||
int offsetSpan() const override;
|
||
int countWithin() const override;
|
||
|
||
void loadFrom(const QJsonObject& obj) override;
|
||
void saveTo(QJsonObject& obj) const override;
|
||
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
|
||
};
|
||
|
||
class BytesAsUnion : public ExtractUnit {
|
||
public:
|
||
struct __Private {
|
||
int byte_offset, byte_count;
|
||
QList<std::shared_ptr<RuleMatch>> _rule_list;
|
||
} _union;
|
||
|
||
public:
|
||
bool setCountWithin(int bytes);
|
||
|
||
void clearRules();
|
||
QList<std::shared_ptr<RuleMatch>> elementRules() const;
|
||
bool setElementRule(std::shared_ptr<RuleMatch> u);
|
||
|
||
public:
|
||
QString name() const override;
|
||
DataType outType() const override;
|
||
bool setOffsetSpan(int value);
|
||
int offsetSpan() const override;
|
||
int countWithin() const override;
|
||
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
void loadFrom(const QJsonObject& obj) override;
|
||
|
||
void saveTo(QJsonObject& obj) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
|
||
};
|
||
}
|
||
|
||
|