summaryrefslogtreecommitdiffstats
path: root/src/remoteobjects/qremoteobjectsource.cpp
diff options
context:
space:
mode:
authorBrett Stottlemyer <bstottle@ford.com>2018-04-05 10:57:24 -0400
committerBrett Stottlemyer <bstottle@ford.com>2018-04-05 16:05:08 +0000
commit67ac9631dbb26394e6b9981494a0aaf6124284a9 (patch)
treefb24803268fea99892927a8ba9824d451740f614 /src/remoteobjects/qremoteobjectsource.cpp
parent80941e2ddabba1df8f90c68465b75929f7816fee (diff)
Allow recursive packetizing of types
We create a new type (QRO_) to allow storing a subclass as a variant. Thus when a QObject* property is marshalled, all of the pointed to properties can be sent as a single variant. This can be decoded into the proper type on the replica side. This required giving Node's private a new QRemoteObjectMetaObjectManager, a class to handle the building of dynamic metatypes. Change-Id: Ib83b1edb2fd37dd12defb066d4c2b69509985eaa Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'src/remoteobjects/qremoteobjectsource.cpp')
-rw-r--r--src/remoteobjects/qremoteobjectsource.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/remoteobjects/qremoteobjectsource.cpp b/src/remoteobjects/qremoteobjectsource.cpp
index aea3365..37a8044 100644
--- a/src/remoteobjects/qremoteobjectsource.cpp
+++ b/src/remoteobjects/qremoteobjectsource.cpp
@@ -272,7 +272,7 @@ void QRemoteObjectSourceBase::handleMetaCall(int index, QMetaObject::Call call,
const auto target = m_api->isAdapterProperty(index) ? m_adapter : m_object;
const QMetaProperty mp = target->metaObject()->property(propertyIndex);
qCDebug(QT_REMOTEOBJECT) << "Sending Invoke Property" << (m_api->isAdapterSignal(index) ? "via adapter" : "") << rawIndex << propertyIndex << mp.name() << mp.read(target);
- serializePropertyChangePacket(d->m_packet, m_api->name(), rawIndex, serializedProperty(mp, target));
+ serializePropertyChangePacket(this, index);
d->m_packet.baseAddress = d->m_packet.size;
propertyIndex = rawIndex;
}
@@ -290,14 +290,21 @@ void QRemoteObjectSourceBase::handleMetaCall(int index, QMetaObject::Call call,
void QRemoteObjectRootSource::addListener(ServerIoDevice *io, bool dynamic)
{
d->m_listeners.append(io);
+ d->isDynamic = dynamic;
if (dynamic) {
+ d->sentTypes.clear();
serializeInitDynamicPacket(d->m_packet, this);
io->write(d->m_packet.array, d->m_packet.size);
} else {
serializeInitPacket(d->m_packet, this);
io->write(d->m_packet.array, d->m_packet.size);
}
+
+ //Setting isDynamic == false will prevent class definitions from being sent if the
+ //QObject pointer is changed (setting a new subclass pointer). I.e., class definitions
+ //are only sent by serializeInitDynamicPacket, not propertyChangePackets.
+ d->isDynamic = false;
}
int QRemoteObjectRootSource::removeListener(ServerIoDevice *io, bool shouldSendRemove)