From 9501fef5da5f3e5f0d02d9e78d014a5462d27389 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 20 Nov 2014 15:26:36 +1000 Subject: Fix DBus signature generation for complex types. When generating the DBus signature of a registered custom type the marshaller appends the signatures of the map entries and array items after the map/array causing an invalid DBus signature to be generated. This happens because beginArray() and beginMap() output the full signature of the data. Fixed by suppressing changes to the signature within beginArray()/endArray() and beginMap()/endMap() blocks. Change-Id: Icaf23b2fe58a3e1f575b81e4a100f02684f68452 Reviewed-by: Thiago Macieira --- .../auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'tests') diff --git a/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp b/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp index fc20b47768..f80a969384 100644 --- a/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp +++ b/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp @@ -69,6 +69,19 @@ struct Struct4 // (ssa(ss)sayasx) QStringList m6; qlonglong m7; }; +struct Struct5 // a{sa{sv}} - non-standard outer struct is used as a local +{ // container, see marshalling operator below. + QVariantMap m1; + QVariantMap m2; + QVariantMap m3; +}; +struct Struct6 // av - non-standard outer struct is used as a local container, +{ // see marshalling operator below. + QVariant v1; + QVariant v2; + QVariant v3; +}; + struct Invalid0 { }; // empty struct Invalid1 { }; // s @@ -84,6 +97,8 @@ Q_DECLARE_METATYPE(Struct2) Q_DECLARE_METATYPE(Struct3) Q_DECLARE_METATYPE(Struct4) Q_DECLARE_METATYPE(StringPair) +Q_DECLARE_METATYPE(Struct5) +Q_DECLARE_METATYPE(Struct6) Q_DECLARE_METATYPE(Invalid0) Q_DECLARE_METATYPE(Invalid1) @@ -141,6 +156,34 @@ QDBusArgument &operator<<(QDBusArgument &arg, const Struct4 &s) return arg; } +QDBusArgument &operator<<(QDBusArgument &arg, const Struct5 &s) +{ + arg.beginMap(qMetaTypeId(), qMetaTypeId()); + + arg.beginMapEntry(); + arg << QStringLiteral("map1") << s.m1; + arg.endMapEntry(); + + arg.beginMapEntry(); + arg << QStringLiteral("map2") << s.m2; + arg.endMapEntry(); + + arg.beginMapEntry(); + arg << QStringLiteral("map3") << s.m3; + arg.endMapEntry(); + + arg.endMap(); + return arg; +} + +QDBusArgument &operator<<(QDBusArgument &arg, const Struct6 &s) +{ + arg.beginArray(qMetaTypeId()); + arg << QDBusVariant(s.v1) << QDBusVariant(s.v2) << QDBusVariant(s.v3); + arg.endArray(); + return arg; +} + QDBusArgument &operator<<(QDBusArgument &arg, const Invalid0 &) { return arg; @@ -194,6 +237,10 @@ const QDBusArgument &operator>>(const QDBusArgument &arg, Struct3 &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Struct4 &) { return arg; } +const QDBusArgument &operator>>(const QDBusArgument &arg, Struct5 &) +{ return arg; } +const QDBusArgument &operator>>(const QDBusArgument &arg, Struct6 &) +{ return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, StringPair &) { return arg; } const QDBusArgument &operator>>(const QDBusArgument &arg, Invalid0 &) @@ -220,6 +267,8 @@ void tst_QDBusMetaType::initTestCase() qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); @@ -297,6 +346,10 @@ void tst_QDBusMetaType::dynamicTypes_data() QTest::newRow("Struct4") << QVariant::Type(qMetaTypeId()) << "(ssa(ss)sayasx)"; QTest::newRow("QList") << QVariant::Type(qMetaTypeId >()) << "a(ssa(ss)sayasx)"; + QTest::newRow("Struct5") << QVariant::Type(qMetaTypeId()) << "a{sa{sv}}"; + + QTest::newRow("Struct6") << QVariant::Type(qMetaTypeId()) << "av"; + QTest::newRow("QMap") << QVariant::Type(intStringMap) << "a{is}"; QTest::newRow("QMap") << QVariant::Type(stringStringMap) << "a{ss}"; QTest::newRow("QMap") << QVariant::Type(stringStruct1Map) << "a{s(s)}"; -- cgit v1.2.3