QBinaryTranslate/TranslateUI/extract_basic.h

247 lines
6.0 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>
/// <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;
};
namespace extract {
class AbstractExtractor : public ExtractUnit {
private:
QString _name_store;
DataType _type_store;
int _byte_offset, _byte_count;
public:
AbstractExtractor(const QString& name, DataType data);
/// <summary>
/// 设置偏移字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setOffsetSpan(int bytes);
virtual bool setCountWithin(int bytes);
// ExtractUnit ===========================
QString name() const override;
virtual DataType outType() const;
int offsetSpan() const override;
int countWithin() const override;
// Serializable ==============================
void loadFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
#define NAME(u) #u
#define INT32_SAVE(varx) obj[NAME(varx)] = varx;
#define INT32_PEAK(varx) varx = obj[NAME(varx)].toInt();
#define STRLIST_SAVE(list) obj[NAME(list)] = list.join(";");
#define STRLIST_PEAK(list) list = obj[NAME(list)].toString().split(";");
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
/// <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 {
private:
QHash<int, QString> _switch_options;
public:
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 {
private:
QTextCodec* _conv_with = nullptr;
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();
/// <summary>
/// 设置解析字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setCountWithin(int bytes) override;
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
class BytesAsDouble : public AbstractExtractor {
public:
BytesAsDouble();
/// <summary>
/// 设置解析字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setCountWithin(int bytes) override;
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
/// <summary>
/// 尺寸解析器
/// </summary>
class SizeProvider {
public:
/// <summary>
/// 获取值,如果该值无法预先计算得知,返回-1
/// </summary>
/// <returns>尺寸值</returns>
virtual int32_t value() const = 0;
virtual QString expression() const = 0;
};
class BytesAsList : public AbstractExtractor {
public:
std::shared_ptr<ExtractUnit> elementRule() const;
bool setElementRule(std::shared_ptr<ExtractUnit> u);
/// <summary>
/// 设置尺寸解析器,返回值标志是否接受该设置
/// </summary>
/// <param name="ins"></param>
/// <returns>true-有效false-无效</returns>
virtual bool setSizeProvider(std::shared_ptr<SizeProvider> ins) = 0;
public:
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
class RuleMatch {
public:
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
virtual bool checkpass() const = 0;
};
class BytesAsUnion : public AbstractExtractor {
protected:
std::shared_ptr<SizeProvider> _provider_ins = nullptr;
public:
bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
}