QBinaryTranslate/TranslateUI/extract_basic.h

379 lines
10 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>
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) const = 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) const 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) 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<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:
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<ScopeFieldsSetter> inst) const 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:
static QString topic();
QString baseType() const;
QString name() const override;
void setName(const QString& name) override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) const 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:
static QString topic();
QString baseType() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> 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<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;
};
}