diff options
author | Brett Stottlemyer <bstottle@ford.com> | 2018-04-05 10:57:24 -0400 |
---|---|---|
committer | Brett Stottlemyer <bstottle@ford.com> | 2018-04-05 16:05:08 +0000 |
commit | 67ac9631dbb26394e6b9981494a0aaf6124284a9 (patch) | |
tree | fb24803268fea99892927a8ba9824d451740f614 /src/remoteobjects/qremoteobjectsource.cpp | |
parent | 80941e2ddabba1df8f90c68465b75929f7816fee (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.cpp | 9 |
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) |