diff options
author | BogDan Vatra <bogdan@kdab.com> | 2017-10-20 09:32:24 +0300 |
---|---|---|
committer | Michael Brasser <michael.brasser@live.com> | 2017-10-24 00:35:59 +0000 |
commit | 4f86dbe54d493cf33c1121e88dd7f64ab678343a (patch) | |
tree | 1508b0e2a0f47436fe959eb2b81785760277b8db | |
parent | a3e68cda27ff01ab8fab73978f3f09db21222a98 (diff) |
Send and check the protocol versionv5.10.0-beta3
[ChangeLog] This is a backwards incompatible change, but is required for
future changes to the underlying datastream protocol
Change-Id: I7399977b99ede6308ecfa81dbdd2387027b2007b
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
-rw-r--r-- | src/remoteobjects/qconnectionfactories.cpp | 1 | ||||
-rw-r--r-- | src/remoteobjects/qconnectionfactories_p.h | 3 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectnode.cpp | 19 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectnode.h | 3 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectnode_p.h | 1 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectpacket.cpp | 7 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectpacket_p.h | 1 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectsourceio.cpp | 3 | ||||
-rw-r--r-- | src/remoteobjects/qtremoteobjectglobal.h | 1 |
9 files changed, 36 insertions, 3 deletions
diff --git a/src/remoteobjects/qconnectionfactories.cpp b/src/remoteobjects/qconnectionfactories.cpp index 6be1e17..0290780 100644 --- a/src/remoteobjects/qconnectionfactories.cpp +++ b/src/remoteobjects/qconnectionfactories.cpp @@ -67,6 +67,7 @@ inline bool fromDataStream(QDataStream &in, QRemoteObjectPacketTypeEnum &type, Q in >> _type; type = Invalid; switch (_type) { + case Handshake: type = Handshake; break; case InitPacket: type = InitPacket; break; case InitDynamicPacket: type = InitDynamicPacket; break; case AddObject: type = AddObject; break; diff --git a/src/remoteobjects/qconnectionfactories_p.h b/src/remoteobjects/qconnectionfactories_p.h index 305c567..c1da4bb 100644 --- a/src/remoteobjects/qconnectionfactories_p.h +++ b/src/remoteobjects/qconnectionfactories_p.h @@ -57,7 +57,8 @@ QT_BEGIN_NAMESPACE namespace QtRemoteObjects { -const int dataStreamVersion = QDataStream::Qt_5_1; +static const int dataStreamVersion = QDataStream::Qt_5_6; +static const QLatin1String protocolVersion("QtRO 1.0"); } diff --git a/src/remoteobjects/qremoteobjectnode.cpp b/src/remoteobjects/qremoteobjectnode.cpp index 408ac6a..b8eac7f 100644 --- a/src/remoteobjects/qremoteobjectnode.cpp +++ b/src/remoteobjects/qremoteobjectnode.cpp @@ -455,11 +455,27 @@ void QRemoteObjectNodePrivate::onClientRead(QObject *obj) Q_ASSERT(connection); do { - if (!connection->read(packetType, rxName)) return; + if (packetType != Handshake && !m_handshakeReceived) { + qROPrivWarning() << "Expected Handshake, got " << packetType; + setLastError(QRemoteObjectNode::ProtocolMismatch); + connection->close(); + break; + } + switch (packetType) { + case Handshake: + if (rxName != QtRemoteObjects::protocolVersion) { + qROPrivWarning() << "Protocol Mismatch, closing connection. Got" << rxObjects << "expected" << QtRemoteObjects::protocolVersion; + setLastError(QRemoteObjectNode::ProtocolMismatch); + connection->close(); + } else { + m_handshakeReceived = true; + } + break; + case ObjectList: { deserializeObjectListPacket(connection->stream(), rxObjects); @@ -702,6 +718,7 @@ void QRemoteObjectNodePrivate::onClientRead(QObject *obj) \value SourceNotRegistered The given QRemoteObjectSource is not registered on this node. \value MissingObjectName The given QObject does not have objectName() set. \value HostUrlInvalid The given url has an invalid or unrecognized scheme. + \value ProtocolMismatch The client and the server have different protocol versions. */ /*! diff --git a/src/remoteobjects/qremoteobjectnode.h b/src/remoteobjects/qremoteobjectnode.h index f8ca6b4..d9e056c 100644 --- a/src/remoteobjects/qremoteobjectnode.h +++ b/src/remoteobjects/qremoteobjectnode.h @@ -83,7 +83,8 @@ public: OperationNotValidOnClientNode, SourceNotRegistered, MissingObjectName, - HostUrlInvalid + HostUrlInvalid, + ProtocolMismatch }; Q_ENUM(ErrorCode) enum StorageOwnership { diff --git a/src/remoteobjects/qremoteobjectnode_p.h b/src/remoteobjects/qremoteobjectnode_p.h index 89d6bf8..8e6d489 100644 --- a/src/remoteobjects/qremoteobjectnode_p.h +++ b/src/remoteobjects/qremoteobjectnode_p.h @@ -128,6 +128,7 @@ public: QVariant rxValue; QRemoteObjectPersistedStore *persistedStore; QRemoteObjectNode::StorageOwnership persistedStoreOwnership; + bool m_handshakeReceived = false; Q_DECLARE_PUBLIC(QRemoteObjectNode) }; diff --git a/src/remoteobjects/qremoteobjectpacket.cpp b/src/remoteobjects/qremoteobjectpacket.cpp index c504171..5842f6c 100644 --- a/src/remoteobjects/qremoteobjectpacket.cpp +++ b/src/remoteobjects/qremoteobjectpacket.cpp @@ -71,6 +71,13 @@ QVariant deserializedProperty(const QVariant &in, const QMetaProperty &property) } } +void serializeHandshakePacket(DataStreamPacket &ds) +{ + ds.setId(Handshake); + ds << QString(protocolVersion); + ds.finishPacket(); +} + void serializeInitPacket(DataStreamPacket &ds, const QRemoteObjectSource *object) { const SourceApiMap *api = object->m_api; diff --git a/src/remoteobjects/qremoteobjectpacket_p.h b/src/remoteobjects/qremoteobjectpacket_p.h index 5b81df9..e996b0e 100644 --- a/src/remoteobjects/qremoteobjectpacket_p.h +++ b/src/remoteobjects/qremoteobjectpacket_p.h @@ -138,6 +138,7 @@ private: QVariant serializedProperty(const QMetaProperty &property, const QObject *object); QVariant deserializedProperty(const QVariant &in, const QMetaProperty &property); +void serializeHandshakePacket(DataStreamPacket &ds); void serializeInitPacket(DataStreamPacket&, const QRemoteObjectSource*); void deserializeInitPacket(QDataStream&, QVariantList&); diff --git a/src/remoteobjects/qremoteobjectsourceio.cpp b/src/remoteobjects/qremoteobjectsourceio.cpp index c7e8026..989a2ee 100644 --- a/src/remoteobjects/qremoteobjectsourceio.cpp +++ b/src/remoteobjects/qremoteobjectsourceio.cpp @@ -255,6 +255,9 @@ void QRemoteObjectSourceIo::handleConnection() onServerRead(conn); }); + serializeHandshakePacket(m_packet); + conn->write(m_packet.array, m_packet.size); + QRemoteObjectPackets::ObjectInfoList infos; foreach (auto remoteObject, m_remoteObjects) { infos << QRemoteObjectPackets::ObjectInfo{remoteObject->m_api->name(), remoteObject->m_api->typeName(), remoteObject->m_api->objectSignature()}; diff --git a/src/remoteobjects/qtremoteobjectglobal.h b/src/remoteobjects/qtremoteobjectglobal.h index b08f1f7..995a96f 100644 --- a/src/remoteobjects/qtremoteobjectglobal.h +++ b/src/remoteobjects/qtremoteobjectglobal.h @@ -155,6 +155,7 @@ void copyStoredProperties(QDataStream &src, T *dst) enum QRemoteObjectPacketTypeEnum { Invalid = 0, + Handshake, InitPacket, InitDynamicPacket, AddObject, |