summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntti Hölttä <AHoelttae@luxoft.com>2017-10-26 10:52:35 +0200
committerDominik Holland <dominik.holland@pelagicore.com>2017-11-02 07:50:14 +0000
commit489d2d4bd6c4602729f2dfe75f4a3b966b693c9c (patch)
tree86d9c7b4ff4afab6b1aa90d31e9fb31c03a6acfb
parent585bb90e6cf2098d42039fb04354a3223b9e10ef (diff)
downloadqtivi-5.10.tar.gz
Add stream serialization functions for generated structs and enums5.10
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 <dominik.holland@pelagicore.com>
-rw-r--r--src/tools/ivigenerator/templates_control_panel/module.cpp.tpl30
-rw-r--r--src/tools/ivigenerator/templates_control_panel/module.h.tpl2
-rw-r--r--src/tools/ivigenerator/templates_frontend/module.cpp.tpl35
-rw-r--r--src/tools/ivigenerator/templates_frontend/module.h.tpl2
-rw-r--r--src/tools/ivigenerator/templates_frontend/struct.cpp.tpl31
-rw-r--r--src/tools/ivigenerator/templates_frontend/struct.h.tpl10
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 <QQmlEngine>
+#include <QDebug>
#include <QDataStream>
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 <QObject>
+#include <QDataStream>
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}})