summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kdab.com>2017-10-20 09:32:24 +0300
committerMichael Brasser <michael.brasser@live.com>2017-10-24 00:35:59 +0000
commit4f86dbe54d493cf33c1121e88dd7f64ab678343a (patch)
tree1508b0e2a0f47436fe959eb2b81785760277b8db
parenta3e68cda27ff01ab8fab73978f3f09db21222a98 (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.cpp1
-rw-r--r--src/remoteobjects/qconnectionfactories_p.h3
-rw-r--r--src/remoteobjects/qremoteobjectnode.cpp19
-rw-r--r--src/remoteobjects/qremoteobjectnode.h3
-rw-r--r--src/remoteobjects/qremoteobjectnode_p.h1
-rw-r--r--src/remoteobjects/qremoteobjectpacket.cpp7
-rw-r--r--src/remoteobjects/qremoteobjectpacket_p.h1
-rw-r--r--src/remoteobjects/qremoteobjectsourceio.cpp3
-rw-r--r--src/remoteobjects/qtremoteobjectglobal.h1
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,