为集成化序列化和反序列话构建
This commit is contained in:
parent
0e68e0c66e
commit
33cb4a12b5
|
@ -66,7 +66,7 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx)
|
|||
if (typeid(*new_inst.get()) == typeid(BytesAsList)) {
|
||||
auto conv = std::dynamic_pointer_cast<BytesAsList>(new_inst);
|
||||
if (!conv->elementRule()) {
|
||||
conv->setElementRule(this->base->defaultRule());
|
||||
conv->appendElementRule(this->base->defaultRule());
|
||||
}
|
||||
|
||||
if (!conv->sizeProvider()) {
|
||||
|
@ -153,59 +153,6 @@ void SequenceRulesView::removeTranslateUnit()
|
|||
_sequence_model->removeRow(idx_curr.row());
|
||||
}
|
||||
|
||||
TranslateBasic::TranslateBasic()
|
||||
{
|
||||
// extractor type-list
|
||||
std::shared_ptr<ExtractUnit> u_ptr = std::make_shared<BytesAsBitCombine>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsInteger>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsUnsigned>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsString>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsHex>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
this->_default_translate_rule = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsFloat>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsDouble>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsList>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
// size-provider type-list
|
||||
auto sz_ptr = std::make_shared<ConstNumberProvider>();
|
||||
this->_default_size_provider = sz_ptr;
|
||||
_size_provider_types[sz_ptr->name()] = sz_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
|
||||
{
|
||||
return _default_translate_rule;
|
||||
}
|
||||
|
||||
std::shared_ptr<SizeProvider> TranslateBasic::defaultSizeProvider() const
|
||||
{
|
||||
return _default_size_provider;
|
||||
}
|
||||
|
||||
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extactors() const
|
||||
{
|
||||
return _extractor_types;
|
||||
}
|
||||
|
||||
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviders() const
|
||||
{
|
||||
return _size_provider_types;
|
||||
}
|
||||
|
||||
RuleSelectDelegate::RuleSelectDelegate(std::shared_ptr<TranslateBasic> ins)
|
||||
:_kernel(ins) {
|
||||
|
@ -239,23 +186,3 @@ void RuleSelectDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptio
|
|||
{
|
||||
editor->setGeometry(option.rect);
|
||||
}
|
||||
|
||||
QString ConstNumberProvider::name() const
|
||||
{
|
||||
return NAME(ConstNumberProvider);
|
||||
}
|
||||
|
||||
int32_t ConstNumberProvider::value(const QString& expr) const
|
||||
{
|
||||
return expr.toInt();
|
||||
}
|
||||
|
||||
void ConstNumberProvider::setExpression(const QString& expr)
|
||||
{
|
||||
this->_number_value = expr;
|
||||
}
|
||||
|
||||
QString ConstNumberProvider::expression() const
|
||||
{
|
||||
return this->_number_value;
|
||||
}
|
||||
|
|
|
@ -52,18 +52,6 @@ public:
|
|||
virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
|
||||
};
|
||||
|
||||
class ConstNumberProvider : public SizeProvider {
|
||||
private:
|
||||
QString _number_value;
|
||||
|
||||
public:
|
||||
QString name() const override;
|
||||
|
||||
int32_t value(const QString& expr) const override;
|
||||
void setExpression(const QString &expr) override;
|
||||
QString expression() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// ÐòÁл¯¹æÔòÊÓͼ
|
||||
/// </summary>
|
||||
|
|
|
@ -1 +1,78 @@
|
|||
#include "TranslateBasic.h"
|
||||
|
||||
using namespace extract;
|
||||
|
||||
|
||||
TranslateBasic::TranslateBasic()
|
||||
{
|
||||
// extractor type-list
|
||||
std::shared_ptr<ExtractUnit> u_ptr = std::make_shared<BytesAsBitCombine>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsInteger>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsUnsigned>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsString>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsHex>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
this->_default_translate_rule = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsFloat>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsDouble>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsList>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
// size-provider type-list
|
||||
auto sz_ptr = std::make_shared<ConstNumberProvider>();
|
||||
this->_default_size_provider = sz_ptr;
|
||||
_size_provider_types[sz_ptr->name()] = sz_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
|
||||
{
|
||||
return _default_translate_rule;
|
||||
}
|
||||
|
||||
std::shared_ptr<SizeProvider> TranslateBasic::defaultSizeProvider() const
|
||||
{
|
||||
return _default_size_provider;
|
||||
}
|
||||
|
||||
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extactors() const
|
||||
{
|
||||
return _extractor_types;
|
||||
}
|
||||
|
||||
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviders() const
|
||||
{
|
||||
return _size_provider_types;
|
||||
}
|
||||
|
||||
QString ConstNumberProvider::name() const
|
||||
{
|
||||
return NAME(ConstNumberProvider);
|
||||
}
|
||||
|
||||
int32_t ConstNumberProvider::value(const QString& expr) const
|
||||
{
|
||||
return expr.toInt();
|
||||
}
|
||||
|
||||
void ConstNumberProvider::setExpression(const QString& expr)
|
||||
{
|
||||
this->_number_value = expr;
|
||||
}
|
||||
|
||||
QString ConstNumberProvider::expression() const
|
||||
{
|
||||
return this->_number_value;
|
||||
}
|
||||
|
|
|
@ -22,3 +22,15 @@ public:
|
|||
QHash<QString, std::shared_ptr<ExtractUnit>> extactors() const;
|
||||
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviders() const;
|
||||
};
|
||||
|
||||
class ConstNumberProvider : public SizeProvider {
|
||||
private:
|
||||
QString _number_value;
|
||||
|
||||
public:
|
||||
QString name() const override;
|
||||
|
||||
int32_t value(const QString& expr) const override;
|
||||
void setExpression(const QString& expr) override;
|
||||
QString expression() const override;
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
|
||||
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
|
||||
|
||||
class TranslateBasic;
|
||||
/// <summary>
|
||||
/// 序列化实体
|
||||
/// </summary>
|
||||
|
@ -21,7 +22,7 @@ public:
|
|||
/// 反序列化
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
virtual void loadFrom(const QJsonObject& obj) = 0;
|
||||
virtual void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) = 0;
|
||||
/// <summary>
|
||||
/// 序列化
|
||||
/// </summary>
|
||||
|
|
|
@ -24,7 +24,7 @@ DataType AbstractValueConvert::outType() const
|
|||
return _out_type;
|
||||
}
|
||||
|
||||
void AbstractValueConvert::loadFrom(const QJsonObject& obj)
|
||||
void AbstractValueConvert::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
|
||||
{
|
||||
auto int_in_type = (int)_in_type;
|
||||
INT32_PEAK(int_in_type);
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace convert {
|
|||
DataType inType() const override;
|
||||
DataType outType() const override;
|
||||
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
};
|
||||
|
||||
|
|
|
@ -42,7 +42,8 @@ int AbstractExtractor::countWithin() const
|
|||
return this->_abs_data.byte_count;
|
||||
}
|
||||
|
||||
void AbstractExtractor::loadFrom(const QJsonObject& obj)
|
||||
void AbstractExtractor::loadFrom(
|
||||
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
|
||||
{
|
||||
INT32_PEAK(_abs_data.byte_offset);
|
||||
INT32_PEAK(_abs_data.byte_count);
|
||||
|
@ -82,7 +83,7 @@ BytesAsBitCombine::BytesAsBitCombine()
|
|||
bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
|
||||
{
|
||||
if (bit_index >= 0 && bit_index <= this->countWithin() * 8) {
|
||||
_combines._switch_options[bit_index] = keyword;
|
||||
_combine._switch_options[bit_index] = keyword;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -90,17 +91,17 @@ bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
|
|||
|
||||
QHash<int, QString> BytesAsBitCombine::switchOptions() const
|
||||
{
|
||||
return _combines._switch_options;
|
||||
return _combine._switch_options;
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::clearOptions()
|
||||
{
|
||||
_combines._switch_options.clear();
|
||||
_combine._switch_options.clear();
|
||||
}
|
||||
|
||||
QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
|
||||
{
|
||||
auto keys = _combines._switch_options.keys();
|
||||
auto keys = _combine._switch_options.keys();
|
||||
std::sort(keys.begin(), keys.end());
|
||||
|
||||
QString result;
|
||||
|
@ -109,23 +110,24 @@ QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
|
|||
auto bit_idx = idx % 8;
|
||||
auto char_v = bytes.at(byte_idx);
|
||||
if (char_v & (0x1u << bit_idx))
|
||||
result += QString("%1<%2>;").arg(_combines._switch_options[idx], "Y");
|
||||
result += QString("%1<%2>;").arg(_combine._switch_options[idx], "Y");
|
||||
else
|
||||
result += QString("%1<%2>;").arg(_combines._switch_options[idx], "N");
|
||||
result += QString("%1<%2>;").arg(_combine._switch_options[idx], "N");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::loadFrom(const QJsonObject& obj)
|
||||
void BytesAsBitCombine::loadFrom(
|
||||
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
|
||||
{
|
||||
AbstractExtractor::loadFrom(obj);
|
||||
AbstractExtractor::loadFrom(core, obj);
|
||||
|
||||
QStringList value_list;
|
||||
STRLIST_PEAK(value_list);
|
||||
_combines._switch_options.clear();
|
||||
_combine._switch_options.clear();
|
||||
for (auto pair : value_list) {
|
||||
auto items = pair.split("=");
|
||||
_combines._switch_options[items.first().toInt()] = items.last();
|
||||
_combine._switch_options[items.first().toInt()] = items.last();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,9 +136,9 @@ void BytesAsBitCombine::saveTo(QJsonObject& obj) const
|
|||
AbstractExtractor::saveTo(obj);
|
||||
|
||||
QStringList value_list;
|
||||
for (auto key : _combines._switch_options.keys()) {
|
||||
for (auto key : _combine._switch_options.keys()) {
|
||||
auto pair_str = QString("%1=%2").arg(key)
|
||||
.arg(_combines._switch_options[key]);
|
||||
.arg(_combine._switch_options[key]);
|
||||
value_list << pair_str;
|
||||
}
|
||||
STRLIST_SAVE(value_list);
|
||||
|
@ -207,9 +209,9 @@ QVariant BytesAsString::parse(const QByteArray& bytes) const
|
|||
return _strings._conv_with->toUnicode(bytes);
|
||||
}
|
||||
|
||||
void BytesAsString::loadFrom(const QJsonObject& obj)
|
||||
void BytesAsString::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
|
||||
{
|
||||
AbstractExtractor::loadFrom(obj);
|
||||
AbstractExtractor::loadFrom(core, obj);
|
||||
|
||||
QString codec_name;
|
||||
STRING_PEAK(codec_name);
|
||||
|
@ -302,7 +304,7 @@ std::shared_ptr<ExtractUnit> BytesAsList::elementRule() const
|
|||
return this->_list._bind_unit;
|
||||
}
|
||||
|
||||
bool BytesAsList::setElementRule(std::shared_ptr<ExtractUnit> u)
|
||||
bool BytesAsList::appendElementRule(std::shared_ptr<ExtractUnit> u)
|
||||
{
|
||||
this->_list._bind_unit = u;
|
||||
return true;
|
||||
|
@ -345,25 +347,32 @@ int BytesAsList::countWithin() const
|
|||
* this->_list._bind_unit->countWithin();
|
||||
}
|
||||
|
||||
void BytesAsList::loadFrom(const QJsonObject& obj)
|
||||
#include "TranslateBasic.h"
|
||||
void BytesAsList::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
|
||||
{
|
||||
INT32_PEAK(_list._bytes_offset);
|
||||
|
||||
QString bind_unit_name = "";
|
||||
QString bind_size_provider_name = "";
|
||||
STRING_PEAK(bind_unit_name);
|
||||
STRING_PEAK(bind_size_provider_name);
|
||||
this->_list._bind_size_v = core->sizeProviders()[bind_size_provider_name];
|
||||
this->_list._bind_unit = core->extactors()[bind_unit_name];
|
||||
|
||||
QString bind_provider_expr = "";
|
||||
STRING_SAVE(bind_provider_expr);
|
||||
if (this->_list._bind_size_v)
|
||||
this->_list._bind_size_v->setExpression(bind_provider_expr);
|
||||
this->_list._bind_size_v->setExpression(bind_provider_expr);
|
||||
}
|
||||
|
||||
void BytesAsList::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
INT32_SAVE(_list._bytes_offset);
|
||||
|
||||
QString bind_unit_name = "";
|
||||
if (this->_list._bind_unit)
|
||||
bind_unit_name = this->_list._bind_unit->name();
|
||||
STRING_SAVE(bind_unit_name);
|
||||
|
||||
INT32_SAVE(_list._bytes_offset);
|
||||
|
||||
QString bind_size_provider_name = "";
|
||||
QString bind_provider_expr = "";
|
||||
if (this->_list._bind_size_v) {
|
||||
|
@ -425,9 +434,11 @@ QVariant BytesAsUnion::parse(const QByteArray& bytes) const
|
|||
return QVariant();
|
||||
}
|
||||
|
||||
void BytesAsUnion::loadFrom(const QJsonObject& obj)
|
||||
void BytesAsUnion::loadFrom(
|
||||
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
|
||||
{
|
||||
throw std::logic_error("The method or operation is not implemented.");
|
||||
INT32_PEAK(_union.byte_count);
|
||||
INT32_PEAK(_union.byte_offset);
|
||||
}
|
||||
|
||||
void BytesAsUnion::saveTo(QJsonObject& obj) const
|
||||
|
@ -446,7 +457,7 @@ QList<std::shared_ptr<RuleMatch>> BytesAsUnion::elementRules() const
|
|||
return _union._rule_list;
|
||||
}
|
||||
|
||||
bool BytesAsUnion::setElementRule(std::shared_ptr<RuleMatch> u)
|
||||
bool BytesAsUnion::appendElementRule(std::shared_ptr<RuleMatch> u)
|
||||
{
|
||||
this->_union._rule_list << u;
|
||||
return true;
|
||||
|
|
|
@ -96,7 +96,7 @@ namespace extract {
|
|||
int countWithin() const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
};
|
||||
|
||||
|
@ -118,7 +118,7 @@ namespace extract {
|
|||
public:
|
||||
struct __Private {
|
||||
QHash<int, QString> _switch_options;
|
||||
} _combines;
|
||||
} _combine;
|
||||
|
||||
BytesAsBitCombine();
|
||||
|
||||
|
@ -130,7 +130,7 @@ namespace extract {
|
|||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
@ -184,7 +184,7 @@ namespace extract {
|
|||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
@ -217,7 +217,7 @@ namespace extract {
|
|||
public:
|
||||
bool setOffsetSpan(int value);
|
||||
std::shared_ptr<ExtractUnit> elementRule() const;
|
||||
bool setElementRule(std::shared_ptr<ExtractUnit> u);
|
||||
bool appendElementRule(std::shared_ptr<ExtractUnit> u);
|
||||
std::shared_ptr<SizeProvider> sizeProvider() const;
|
||||
bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
|
||||
|
||||
|
@ -227,7 +227,7 @@ namespace extract {
|
|||
int offsetSpan() const override;
|
||||
int countWithin() const override;
|
||||
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
@ -238,7 +238,7 @@ namespace extract {
|
|||
class BytesAsUnion : public ExtractUnit {
|
||||
public:
|
||||
struct __Private {
|
||||
int byte_offset, byte_count;
|
||||
int byte_offset = 0, byte_count = 1;
|
||||
QList<std::shared_ptr<RuleMatch>> _rule_list;
|
||||
} _union;
|
||||
|
||||
|
@ -247,7 +247,7 @@ namespace extract {
|
|||
|
||||
void clearRules();
|
||||
QList<std::shared_ptr<RuleMatch>> elementRules() const;
|
||||
bool setElementRule(std::shared_ptr<RuleMatch> u);
|
||||
bool appendElementRule(std::shared_ptr<RuleMatch> u);
|
||||
|
||||
public:
|
||||
QString name() const override;
|
||||
|
@ -257,11 +257,10 @@ namespace extract {
|
|||
int countWithin() const override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
|
||||
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue