QBinaryTranslate/TranslateUI/extract_basic.h

268 lines
6.7 KiB
C
Raw Normal View History

2025-08-01 01:47:41 +00:00
#pragma once
#include "common.h"
#include <QHash>
/// <summary>
/// <20><><EFBFBD>뵥Ԫ<EBB5A5><D4AA><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
/// </summary>
class ExtractUnit : public Serializable {
public:
virtual ~ExtractUnit() = default;
/// <summary>
/// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual QString name() const = 0;
/// <summary>
///
/// </summary>
/// <returns></returns>
virtual DataType outType() const = 0;
2025-08-01 23:06:42 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="bytes"></param>
virtual bool setOffsetSpan(int bytes) = 0;
2025-08-01 01:47:41 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ԫ<EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual int offsetSpan() const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual int countWithin() const = 0;
/// <summary>
/// ִ<>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
virtual QVariant parse(const QByteArray& bytes) const = 0;
};
2025-08-02 02:04:30 +00:00
/// <summary>
/// <20>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class SizeProvider {
public:
virtual QString name() const = 0;
/// <summary>
/// <20><>ȡֵ<C8A1><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>޷<EFBFBD>Ԥ<EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
/// </summary>
/// <returns><3E>ߴ<EFBFBD>ֵ</returns>
virtual int32_t value(const QString& expr) const = 0;
virtual void setExpression(const QString& expr) = 0;
virtual QString expression() const = 0;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
/// </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;
};
2025-08-01 01:47:41 +00:00
namespace extract {
class AbstractExtractor : public ExtractUnit {
public:
2025-08-02 02:04:30 +00:00
struct __Private {
QString name_store = "";
DataType type_store = DataType::Integer;
int byte_offset = 0, byte_count = 1;
} _abs_data;
2025-08-01 01:47:41 +00:00
AbstractExtractor(const QString& name, DataType data);
virtual bool setCountWithin(int bytes);
// ExtractUnit ===========================
QString name() const override;
virtual DataType outType() const;
2025-08-01 23:06:42 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="bytes"></param>
virtual bool setOffsetSpan(int bytes);
2025-08-01 01:47:41 +00:00
int offsetSpan() const override;
int countWithin() const override;
// Serializable ==============================
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
2025-08-01 01:47:41 +00:00
void saveTo(QJsonObject& obj) const override;
};
/// <summary>
/// ת<><D7AA>Դ<EFBFBD><D4B4>ֵδ16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ĭ<EFBFBD>Ϸָʽ
/// </summary>
class BytesAsHex : public AbstractExtractor {
public:
BytesAsHex();
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
/// <summary>
/// ת<><D7AA>Դ<EFBFBD><D4B4>ֵΪλ<CEAA><CEBB><EFBFBD><EFBFBD>
/// </summary>
class BytesAsBitCombine : public AbstractExtractor {
public:
2025-08-02 02:04:30 +00:00
struct __Private {
QHash<int, QString> _switch_options;
} _combine;
2025-08-02 02:04:30 +00:00
2025-08-01 01:47:41 +00:00
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(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
2025-08-01 01:47:41 +00:00
void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
/// <summary>
/// ת<><D7AA>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
/// </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;
};
2025-08-02 02:04:30 +00:00
2025-08-01 01:47:41 +00:00
/// <summary>
/// ת<><D7AA>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
/// </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>
/// ת<><D7AA>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
/// </summary>
class BytesAsString : public AbstractExtractor {
2025-08-02 02:04:30 +00:00
public:
struct __Private {
QTextCodec* _conv_with = nullptr;
} _strings;
2025-08-01 01:47:41 +00:00
public:
BytesAsString();
void setStrCodec(QTextCodec* ins);
QString codecName() const;
// ExtractUnit ============================
QVariant parse(const QByteArray& bytes) const override;
// Serializable ==============================
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
2025-08-01 01:47:41 +00:00
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;
};
2025-08-01 23:06:42 +00:00
class BytesAsList : public ExtractUnit {
2025-08-02 02:04:30 +00:00
public:
struct __Private {
std::shared_ptr<ExtractUnit> _bind_unit = nullptr;
int _bytes_offset = 0;
std::shared_ptr<SizeProvider> _bind_size_v = nullptr;
} _list;
2025-08-01 01:47:41 +00:00
public:
2025-08-01 23:06:42 +00:00
bool setOffsetSpan(int value);
2025-08-01 01:47:41 +00:00
std::shared_ptr<ExtractUnit> elementRule() const;
bool appendElementRule(std::shared_ptr<ExtractUnit> u);
2025-08-01 23:06:42 +00:00
std::shared_ptr<SizeProvider> sizeProvider() const;
bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
2025-08-01 01:47:41 +00:00
2025-08-01 23:06:42 +00:00
public:
QString name() const override;
DataType outType() const override;
int offsetSpan() const override;
int countWithin() const override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
2025-08-01 23:06:42 +00:00
void saveTo(QJsonObject& obj) const override;
2025-08-01 01:47:41 +00:00
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
2025-08-02 02:04:30 +00:00
class BytesAsUnion : public ExtractUnit {
2025-08-01 01:47:41 +00:00
public:
2025-08-02 02:04:30 +00:00
struct __Private {
int byte_offset = 0, byte_count = 1;
2025-08-02 02:04:30 +00:00
QList<std::shared_ptr<RuleMatch>> _rule_list;
} _union;
2025-08-01 01:47:41 +00:00
public:
2025-08-02 02:04:30 +00:00
bool setCountWithin(int bytes);
2025-08-01 01:47:41 +00:00
2025-08-02 02:04:30 +00:00
void clearRules();
QList<std::shared_ptr<RuleMatch>> elementRules() const;
bool appendElementRule(std::shared_ptr<RuleMatch> u);
2025-08-01 01:47:41 +00:00
2025-08-02 02:04:30 +00:00
public:
QString name() const override;
DataType outType() const override;
bool setOffsetSpan(int value);
int offsetSpan() const override;
int countWithin() const override;
2025-08-01 01:47:41 +00:00
2025-08-02 02:04:30 +00:00
QVariant parse(const QByteArray& bytes) const override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
2025-08-02 02:04:30 +00:00
void saveTo(QJsonObject& obj) const override;
2025-08-01 01:47:41 +00:00
std::shared_ptr<Serializable> newDefault() const override;
2025-08-01 01:47:41 +00:00
};
}