summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/auto/integration_multiprocess/ExtPodInterface.rep1
-rw-r--r--tests/auto/integration_multiprocess/MyInterface.rep4
-rw-r--r--tests/auto/integration_multiprocess/client/CMakeLists.txt5
-rw-r--r--tests/auto/integration_multiprocess/client/main.cpp16
-rw-r--r--tests/auto/integration_multiprocess/server/CMakeLists.txt4
-rw-r--r--tests/auto/integration_multiprocess/server/mytestserver.cpp5
-rw-r--r--tests/auto/integration_multiprocess/server/mytestserver.h1
-rw-r--r--tools/repc/repcodegenerator.cpp15
8 files changed, 51 insertions, 0 deletions
diff --git a/tests/auto/integration_multiprocess/ExtPodInterface.rep b/tests/auto/integration_multiprocess/ExtPodInterface.rep
new file mode 100644
index 0000000..0c9ad56
--- /dev/null
+++ b/tests/auto/integration_multiprocess/ExtPodInterface.rep
@@ -0,0 +1 @@
+POD ExtPOD(int i, float f, QString s)
diff --git a/tests/auto/integration_multiprocess/MyInterface.rep b/tests/auto/integration_multiprocess/MyInterface.rep
index a10dbcf..5101529 100644
--- a/tests/auto/integration_multiprocess/MyInterface.rep
+++ b/tests/auto/integration_multiprocess/MyInterface.rep
@@ -1,4 +1,5 @@
#include <QtCore>
+#include "rep_ExtPodInterface_merged.h"
class MyInterface
{
@@ -15,4 +16,7 @@ class MyInterface
SIGNAL(advance())
SIGNAL(testEnumParamsInSignals(Enum1 enumSignalParam, bool signalParam2, QString))
+
+ SLOT(void testExtPODListSlot(const QList<ExtPOD> &))
+ SIGNAL(testExtPODListSignal(const QList<ExtPOD> &))
};
diff --git a/tests/auto/integration_multiprocess/client/CMakeLists.txt b/tests/auto/integration_multiprocess/client/CMakeLists.txt
index 4ea8af0..88fdb34 100644
--- a/tests/auto/integration_multiprocess/client/CMakeLists.txt
+++ b/tests/auto/integration_multiprocess/client/CMakeLists.txt
@@ -13,6 +13,11 @@ qt_internal_add_executable(integration_multiprocess_client
Qt::RemoteObjects
Qt::Test
)
+
+qt6_add_repc_merged(integration_multiprocess_client
+ ../ExtPodInterface.rep
+)
+
qt6_add_repc_replicas(integration_multiprocess_client
../MyInterface.rep
)
diff --git a/tests/auto/integration_multiprocess/client/main.cpp b/tests/auto/integration_multiprocess/client/main.cpp
index 979c3d5..e07cefc 100644
--- a/tests/auto/integration_multiprocess/client/main.cpp
+++ b/tests/auto/integration_multiprocess/client/main.cpp
@@ -27,6 +27,7 @@
****************************************************************************/
#include "rep_MyInterface_replica.h"
+#include "rep_ExtPodInterface_merged.h"
#include <QCoreApplication>
#include <QtRemoteObjects/qremoteobjectnode.h>
@@ -159,6 +160,21 @@ private Q_SLOTS:
QTRY_COMPARE(rep->started(), false);
}
+ void testExtPodListSignals()
+ {
+ QScopedPointer<MyInterfaceReplica> rep(new MyInterfaceReplica());
+ rep->setNode(m_repNode.get());
+ QVERIFY(rep->waitForSource());
+
+ auto list = QList { ExtPOD(1, 1.1f, QStringLiteral("v1")),
+ ExtPOD(2, 2.2f, QStringLiteral("v2")) };
+ rep->testExtPODListSlot(list);
+ QSignalSpy spy(rep.data(), &MyInterfaceReplica::testExtPODListSignal);
+ connect(rep.data(), &MyInterfaceReplica::testExtPODListSignal,
+ [list](const QList<ExtPOD> &l) { QCOMPARE(l, list); });
+ QTRY_COMPARE(spy.count(), 1);
+ }
+
void testPod()
{
QScopedPointer<QRemoteObjectDynamicReplica> podRep(m_repNode->acquireDynamic("PodInterface"));
diff --git a/tests/auto/integration_multiprocess/server/CMakeLists.txt b/tests/auto/integration_multiprocess/server/CMakeLists.txt
index bb5a9f0..3ed2421 100644
--- a/tests/auto/integration_multiprocess/server/CMakeLists.txt
+++ b/tests/auto/integration_multiprocess/server/CMakeLists.txt
@@ -14,6 +14,10 @@ qt_internal_add_executable(integration_multiprocess_server
Qt::RemoteObjects
Qt::Test
)
+qt6_add_repc_merged(integration_multiprocess_server
+ ../ExtPodInterface.rep
+)
+
qt6_add_repc_sources(integration_multiprocess_server
../MyInterface.rep
../PodInterface.rep
diff --git a/tests/auto/integration_multiprocess/server/mytestserver.cpp b/tests/auto/integration_multiprocess/server/mytestserver.cpp
index c97a13a..500a6fe 100644
--- a/tests/auto/integration_multiprocess/server/mytestserver.cpp
+++ b/tests/auto/integration_multiprocess/server/mytestserver.cpp
@@ -67,3 +67,8 @@ void MyTestServer::testEnumParamsInSlots(Enum1 enumSlotParam, bool slotParam2, i
setStarted(slotParam2);
emit testEnumParamsInSignals(enum1(), started(), QString::number(number));
}
+
+void MyTestServer::testExtPODListSlot(const QList<ExtPOD> &l)
+{
+ emit testExtPODListSignal(l);
+}
diff --git a/tests/auto/integration_multiprocess/server/mytestserver.h b/tests/auto/integration_multiprocess/server/mytestserver.h
index cbdd1c0..9bc47ae 100644
--- a/tests/auto/integration_multiprocess/server/mytestserver.h
+++ b/tests/auto/integration_multiprocess/server/mytestserver.h
@@ -49,6 +49,7 @@ public Q_SLOTS:
bool stop() override;
bool quit() override;
void testEnumParamsInSlots(Enum1 enumSlotParam, bool slotParam2, int __repc_variable_1) override;
+ void testExtPODListSlot(const QList<ExtPOD> &l) override;
Q_SIGNALS:
void quitApp();
diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp
index 175ac43..e3b9ad3 100644
--- a/tools/repc/repcodegenerator.cpp
+++ b/tools/repc/repcodegenerator.cpp
@@ -205,6 +205,21 @@ void RepCodeGenerator::generate(Mode mode, QString fileName)
pendingMetaTypes << function.returnType;
for (const ASTDeclaration &decl : function.params) {
classMetaTypes << decl.type;
+
+ // Collect types packaged by Qt containers, to register their metatypes if needed
+ QRegularExpression re(
+ QStringLiteral("(QList|QMap|QHash)<\\s*([\\w]+)\\s*(,\\s*([\\w]+))?\\s*>"));
+ QRegularExpressionMatch m = re.match(decl.type);
+ if (m.hasMatch()) {
+ if (auto captured = m.captured(2);
+ !captured.isNull() && !metaTypes.contains(captured)) {
+ classMetaTypes << captured;
+ }
+ if (auto captured = m.captured(4);
+ !captured.isNull() && !metaTypes.contains(captured)) {
+ classMetaTypes << captured;
+ }
+ }
}
};
for (const ASTFunction &function : astClass.signalsList)