QBinaryTranslate/TranslateUI/extract_basic.h

269 lines
6.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
};
}