QBinaryTranslate/TranslateUI/TranslateBasic.h

224 lines
5.3 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 <QVariant>
#include <QJsonObject>
#include <memory>
/// <summary>
/// 序列化实体
/// </summary>
class Serializable {
public:
virtual ~Serializable() = default;
/// <summary>
/// 反序列化
/// </summary>
/// <param name="obj"></param>
virtual void loadFrom(const QJsonObject& obj) = 0;
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
virtual void saveTo(QJsonObject& obj) const = 0;
/// <summary>
/// 创建默认副本
/// </summary>
/// <returns></returns>
virtual std::shared_ptr<Serializable> newDefault() const = 0;
};
/// <summary>
/// 内部使用的数据类型
/// </summary>
enum class DataType {
ValueSequenceString,
TextString,
Int64,
Flt32,
Dbl64,
};
/// <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 offsetFromPrevious() const = 0;
/// <summary>
/// 解析所用的字节数量
/// </summary>
/// <returns></returns>
virtual int countWithinParse() const = 0;
/// <summary>
/// 执行解析过程
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
virtual QVariant parse(const QByteArray& bytes) const = 0;
};
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 setOffsetFromPrevious(int bytes);
/// <summary>
/// 设置解析字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setCountWithinParse(int bytes);
// ExtractUnit ===========================
QString name() const override;
virtual DataType outType() const;
int offsetFromPrevious() const override;
int countWithinParse() 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(";");
/// <summary>
/// 转换源数值未16进制数值默认分割方式
/// </summary>
class BytesAsHex : public AbstractExtractor {
public:
BytesAsHex();
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
#include <QHash>
/// <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 {
private:
bool unsigned_mark = false;
public:
BytesAsInteger();
void setUnsignedMark(bool ste);
bool unsignedMark() const;
// ExtractUnit ============================
bool setCountWithinParse(int bytes) override;
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;
};
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
/// <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;
};
/// <summary>
/// 数值转换抽象接口
/// </summary>
class ValueConvert : public Serializable {
public:
virtual ~ValueConvert() = default;
virtual QString name() const = 0;
virtual DataType inType() const = 0;
virtual DataType outType() const = 0;
virtual QVariant convert(const QVariant &value) const = 0;
};
class AbstractValueConvert : public ValueConvert {
private:
QString _name_store;
DataType _in_type, _out_type;
public:
AbstractValueConvert(const QString &nm, DataType in, DataType out);
QString name() const override;
DataType inType() const override;
DataType outType() const override;
void loadFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};