QBinaryTranslate/TranslateUI/TranslateBasic.h

225 lines
6.0 KiB
C
Raw Normal View History

2025-07-14 17:35:53 +00:00
#pragma once
2025-08-01 01:47:41 +00:00
#include "extract_basic.h"
2025-08-02 02:04:30 +00:00
#include "convert_basic.h"
2025-08-03 00:04:12 +00:00
#include <QVariant>
2025-08-05 03:50:14 +00:00
#include <QList>
2025-08-02 02:04:30 +00:00
2025-08-03 00:04:12 +00:00
/// <summary>
/// <20><>Χ<EFBFBD>ֶλ<D6B6>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class ScopeFieldsGetter {
public:
/// <summary>
/// <20>󶨵<EFBFBD>ǰ<EFBFBD>ֶ<EFBFBD>
/// </summary>
/// <param name="unique_key"></param>
/// <returns></returns>
virtual bool bindCurrent(const QString& unique_key) = 0;
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ֶο<D6B6><CEBF><EFBFBD><EFBFBD>ֶ<EFBFBD>
/// </summary>
/// <returns></returns>
virtual QHash<QString, DataType> prevFields() const = 0;
};
/// <summary>
/// <20><>Χ<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class ScopeFieldsSetter {
public:
/// <summary>
/// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
/// </summary>
/// <param name="name"></param>
/// <param name="type"></param>
virtual void setField(const QString& name, DataType type) = 0;
2025-08-04 01:27:04 +00:00
virtual void clear() = 0;
2025-08-03 00:04:12 +00:00
};
2025-08-02 02:04:30 +00:00
2025-08-03 00:04:12 +00:00
// ================================================================
2025-08-02 02:04:30 +00:00
/// <summary>
2025-08-03 00:04:12 +00:00
/// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class DataAccessContext {
public:
/// <summary>
/// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
/// </summary>
/// <param name="value"></param>
virtual void append(const QVariant& value) = 0;
/// <summary>
/// ͨ<><CDA8>unique_key<65><79>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="unique_key"></param>
/// <returns></returns>
virtual QVariant get(const QString& unique_key) const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="field"></param>
/// <param name="inst"></param>
virtual void setChild(const QString& field, std::shared_ptr<DataAccessContext> inst) = 0;
};
// ==================================================================
/// <summary>
/// <20>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class SizeProvider : public Serializable {
public:
virtual void bindInput(std::shared_ptr<DataAccessContext> inst) = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
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 Serializable {
public:
virtual QString name() const = 0;
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
virtual void bindRule(std::shared_ptr<ExtractUnit> rule) = 0;
virtual bool checkpass(const QByteArray& buffer) const = 0;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><EBBBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-08-02 02:04:30 +00:00
/// </summary>
class TranslateBasic {
private:
QHash<QString, std::shared_ptr<ExtractUnit>> _extractor_types;
std::shared_ptr<ExtractUnit> _default_translate_rule = nullptr;
2025-08-03 00:04:12 +00:00
2025-08-02 02:04:30 +00:00
QHash<QString, std::shared_ptr<SizeProvider>> _size_provider_types;
std::shared_ptr<SizeProvider> _default_size_provider = nullptr;
2025-08-02 07:02:35 +00:00
QHash<QString, std::shared_ptr<RuleMatch>> _rule_match_types;
std::shared_ptr<RuleMatch> _default_rule_match = nullptr;
2025-08-05 03:50:14 +00:00
QList<std::shared_ptr<extract::BytesAsRuleSet>> _custom_rule_types;
2025-08-03 00:04:12 +00:00
2025-08-02 02:04:30 +00:00
public:
TranslateBasic();
std::shared_ptr<SizeProvider> defaultSizeProvider() const;
2025-08-02 07:02:35 +00:00
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviderList() const;
std::shared_ptr<RuleMatch> defaultRuleMatch() const;
QHash<QString, std::shared_ptr<RuleMatch>> ruleMatchList() const;
std::shared_ptr<ExtractUnit> defaultExtractUnit() const;
QHash<QString, std::shared_ptr<ExtractUnit>> extractUnitList() const;
2025-08-03 00:04:12 +00:00
2025-08-05 03:50:14 +00:00
void setCustomRule(const QString& name, std::shared_ptr<extract::BytesAsRuleSet> inst);
2025-08-03 01:59:00 +00:00
void removeCustomRule(const QString& name);
2025-08-05 03:50:14 +00:00
QHash<QString, std::shared_ptr<extract::BytesAsRuleSet>> customRules() const;
2025-08-02 02:04:30 +00:00
};
2025-08-05 11:26:19 +00:00
namespace size_provider {
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class ConstNumberProvider : public SizeProvider {
public:
struct __Private {
QString _value_string;
} _number;
2025-08-05 11:26:19 +00:00
public:
QString name() const override;
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
void bindInput(std::shared_ptr<DataAccessContext> inst) override;
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
int32_t value(const QString& expr) const override;
void setExpression(const QString& expr) override;
QString expression() const override;
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
std::shared_ptr<Serializable> newDefault() const override;
};
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9>
/// </summary>
class InterpretedNumberPrivider : public SizeProvider {
public:
struct __Private {
QString _field_refer;
std::shared_ptr<DataAccessContext> _context_inst;
} _refer;
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
public:
QString name() const override;
2025-08-05 11:26:19 +00:00
void bindInput(std::shared_ptr<DataAccessContext> inst) override;
2025-08-03 00:04:12 +00:00
2025-08-05 11:26:19 +00:00
int32_t value(const QString& expr) const override;
void setExpression(const QString& expr) override;
QString expression() const override;
2025-08-02 07:02:35 +00:00
2025-08-05 11:26:19 +00:00
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
2025-08-02 07:02:35 +00:00
2025-08-05 11:26:19 +00:00
std::shared_ptr<Serializable> newDefault() const override;
};
}
2025-08-03 00:04:12 +00:00
2025-08-05 12:51:12 +00:00
class ValueAccessContext : public DataAccessContext,
public std::enable_shared_from_this<ValueAccessContext> {
2025-08-03 00:04:12 +00:00
public:
struct __Private {
QString _current_field = "";
QVariant _current_value;
QHash<QString, std::shared_ptr<DataAccessContext>> _children_context;
} _cascade;
void init(const QString& field, std::shared_ptr<DataAccessContext> parent);
void setChild(const QString& field, std::shared_ptr<DataAccessContext> inst) override;
void append(const QVariant& value) override;
public:
QVariant get(const QString& unique_key) const override;
};
2025-08-04 01:27:04 +00:00
class FieldManagerLayer : public ScopeFieldsSetter, public ScopeFieldsGetter {
2025-08-03 00:04:12 +00:00
public:
struct __Private {
QString _rule_name;
2025-08-04 01:27:04 +00:00
std::shared_ptr<ScopeFieldsSetter> _parent_setter = nullptr;
static QList<std::pair<QString, DataType>> _fields_map;
2025-08-03 00:04:12 +00:00
}_setter;
2025-08-04 01:27:04 +00:00
bool bindCurrent(const QString& unique_key) override;
QHash<QString, DataType> prevFields() const override;
void clear() override;
2025-08-03 00:04:12 +00:00
public:
2025-08-04 01:27:04 +00:00
FieldManagerLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp);
2025-08-03 00:04:12 +00:00
void setField(const QString& name, DataType type) override;
2025-08-04 01:27:04 +00:00
};