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-02 02:42:39 +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-02 02:42:39 +00:00
|
|
|
|
|
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-02 02:42:39 +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-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
|
|
|
|
|
|
|
|
|
class ValueAccess : public DataAccessContext,
|
|
|
|
|
std::enable_shared_from_this<ValueAccess> {
|
|
|
|
|
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
|
|
|
|
};
|