From 489d2d4bd6c4602729f2dfe75f4a3b966b693c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20H=C3=B6ltt=C3=A4?= Date: Thu, 26 Oct 2017 10:52:35 +0200 Subject: Add stream serialization functions for generated structs and enums Add stream operators and equality-operators for the struct template. Change existing enum stream operators to check values outside of the enums range. These are needed for serializing of types eg. when using generated types over QTRO. Change-Id: I169b3d598b65eaae2de8562507a66ee996b81081 Reviewed-by: Dominik Holland --- .../templates_control_panel/module.cpp.tpl | 30 ++++++++++++++++--- .../templates_control_panel/module.h.tpl | 2 +- .../ivigenerator/templates_frontend/module.cpp.tpl | 35 ++++++++++++++++++---- .../ivigenerator/templates_frontend/module.h.tpl | 2 +- .../ivigenerator/templates_frontend/struct.cpp.tpl | 31 +++++++++++++++++++ .../ivigenerator/templates_frontend/struct.h.tpl | 10 +++++++ 6 files changed, 99 insertions(+), 11 deletions(-) diff --git a/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl b/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl index 66978f9..6659acb 100644 --- a/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl +++ b/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl @@ -68,6 +68,24 @@ QObject* {{class|lower}}_singletontype_provider(QQmlEngine*, QJSEngine*) { } +{% for enum in module.enums %} +{{class}}::{{enum}} {{class}}::to{{enum}}(quint8 v, bool *ok) { + if (ok) { + *ok = true; + } + switch (v) { +{% for member in enum.members %} + case {{member.value}}: return {{member.name}}; +{% endfor %} + default: + if (ok) { + *ok = false; + } + return {{enum.members|first}}; + } +} +{% endfor %} + /*! \internal */ void {{class}}::registerTypes() { @@ -109,14 +127,18 @@ QSimulatorServer *{{class}}::simulationServer() {% for enum in module.enums %} QDataStream &operator<<(QDataStream &out, {{class}}::{{enum|flag_type}} var) { - out << (int)var; + out << (quint8)var; return out; } QDataStream &operator>>(QDataStream &in, {{class}}::{{enum|flag_type}} &var) { - int temp; - in >> temp; - var = ({{class}}::{{enum|flag_type}})temp; + bool ok; + quint8 val; + in >> val; + var = {{class}}::to{{enum}}(val, &ok); + if (!ok) { + qWarning() << "Received an invalid enum value for type {{class}}::{{enum|flag_type}}, value =" << var; + } return in; } {% endfor %} diff --git a/src/tools/ivigenerator/templates_control_panel/module.h.tpl b/src/tools/ivigenerator/templates_control_panel/module.h.tpl index bd23ccc..15f81f2 100644 --- a/src/tools/ivigenerator/templates_control_panel/module.h.tpl +++ b/src/tools/ivigenerator/templates_control_panel/module.h.tpl @@ -68,7 +68,7 @@ public: {% else %} Q_ENUM({{enum}}) {% endif %} - + static {{enum}} to{{enum}}(quint8 v, bool *ok); {% endfor %} static void registerTypes(); diff --git a/src/tools/ivigenerator/templates_frontend/module.cpp.tpl b/src/tools/ivigenerator/templates_frontend/module.cpp.tpl index 2ce7b9b..2a2d7b9 100644 --- a/src/tools/ivigenerator/templates_frontend/module.cpp.tpl +++ b/src/tools/ivigenerator/templates_frontend/module.cpp.tpl @@ -46,6 +46,7 @@ #include "{{interface|lower}}.h" {% endfor %} #include +#include #include QT_BEGIN_NAMESPACE @@ -79,6 +80,24 @@ QObject* {{class|lower}}_singletontype_provider(QQmlEngine*, QJSEngine*) { } +{% for enum in module.enums %} +{{class}}::{{enum}} {{class}}::to{{enum}}(quint8 v, bool *ok) { + if (ok) { + *ok = true; + } + switch (v) { +{% for member in enum.members %} + case {{member.value}}: return {{member.name}}; +{% endfor %} + default: + if (ok) { + *ok = false; + } + return {{enum.members|first}}; + } +} + +{% endfor %} /*! \internal */ void {{class}}::registerTypes() { @@ -88,6 +107,7 @@ void {{class}}::registerTypes() {% endfor %} {% for struct in module.structs %} qRegisterMetaType<{{struct}}>(); + qRegisterMetaTypeStreamOperators<{{struct}}>(); {% endfor %} } @@ -101,18 +121,23 @@ void {{class}}::registerQmlTypes(const QString& uri, int majorVersion, int minor {{interface}}::registerQmlTypes(uri, majorVersion, minorVersion); {% endfor %} } - {% for enum in module.enums %} + QDataStream &operator<<(QDataStream &out, {{class}}::{{enum|flag_type}} var) { - out << (int)var; + out << (quint8)var; return out; } + QDataStream &operator>>(QDataStream &in, {{class}}::{{enum|flag_type}} &var) { - int temp; - in >> temp; - var = ({{class}}::{{enum|flag_type}})temp; + bool ok; + quint8 val; + in >> val; + var = {{class}}::to{{enum}}(val, &ok); + if (!ok) { + qWarning() << "Received an invalid enum value for type {{class}}::{{enum|flag_type}}, value =" << var; + } return in; } {% endfor %} diff --git a/src/tools/ivigenerator/templates_frontend/module.h.tpl b/src/tools/ivigenerator/templates_frontend/module.h.tpl index 6520091..7869ea5 100644 --- a/src/tools/ivigenerator/templates_frontend/module.h.tpl +++ b/src/tools/ivigenerator/templates_frontend/module.h.tpl @@ -71,7 +71,7 @@ public: {% else %} Q_ENUM({{enum}}) {% endif %} - + static {{enum}} to{{enum}}(quint8 v, bool *ok); {% endfor %} static void registerTypes(); diff --git a/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl b/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl index d1134a4..ca0c7f8 100644 --- a/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl +++ b/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl @@ -93,4 +93,35 @@ void {{class}}::set{{field|upperfirst}}({{ field|parameter_type }}) {% endfor %} +bool operator==(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW +{ + return ( +{% for field in struct.fields %} + left.{{field}}() == right.{{field}}() {% if not loop.last %}&&{% endif %} + +{% endfor %} + ); +} + +bool operator!=(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW +{ + return !(left == right); +} + +QDataStream &operator<<(QDataStream &stream, const {{class}} &obj) +{ +{% for field in struct.fields %} + stream << obj.{{field}}(); +{% endfor %} + return stream; +} + +QDataStream &operator>>(QDataStream &stream, {{class}} &obj) +{ +{% for field in struct.fields %} + stream >> obj.m_{{field}}; +{% endfor %} + return stream; +} + QT_END_NAMESPACE diff --git a/src/tools/ivigenerator/templates_frontend/struct.h.tpl b/src/tools/ivigenerator/templates_frontend/struct.h.tpl index 84b8c4f..0438a87 100644 --- a/src/tools/ivigenerator/templates_frontend/struct.h.tpl +++ b/src/tools/ivigenerator/templates_frontend/struct.h.tpl @@ -47,6 +47,7 @@ #include "{{module.module_name|lower}}module.h" #include +#include QT_BEGIN_NAMESPACE @@ -69,12 +70,21 @@ public: {% endif %} {% endfor %} + private: {% for field in struct.fields %} {{field|return_type}} m_{{field}}; {% endfor %} + + friend QDataStream &operator>>(QDataStream &stream, {{class}} &obj); }; +bool operator==(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW; +bool operator!=(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW; + +QDataStream &operator<<(QDataStream &stream, const {{class}} &obj); +QDataStream &operator>>(QDataStream &stream, {{class}} &obj); + QT_END_NAMESPACE Q_DECLARE_METATYPE({{class}}) -- cgit v1.2.3