From 89efa7333db4b5877cb58b16e511b690fe43507c Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 10 Mar 2015 15:01:21 -0700 Subject: QAbstractSocketEngine: introduce QIpPacketHeader for datagrams This commit changes the readDatagram() and writeDatagram() virtual functions to take a QIpPacketHeader as meta data, instead of a QHostAddress/quint16 pair. As previously, the header is an "out" parameter for readDatagram() and an "in" parameter for writeDatagram(). The header pointer in readDatagram() is allowed to be null if the PacketHeaderOptions indicates WantNone. Otherwise, it must not be null. The extra options parameter is introduced because we may not always want all the metadata upon reception. For sending, we know what to include or not based on what's set in the incoming header parameter. QIpPacketHeader splits sender and destination because we'll be able to return both on datagram reception. Change-Id: Iee8cbc07c4434ce9b560ffff13ca4213255008c7 Reviewed-by: Richard J. Moore --- src/network/socket/qabstractsocketengine_p.h | 38 +++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'src/network/socket/qabstractsocketengine_p.h') diff --git a/src/network/socket/qabstractsocketengine_p.h b/src/network/socket/qabstractsocketengine_p.h index f2a3149678..c485e80f5d 100644 --- a/src/network/socket/qabstractsocketengine_p.h +++ b/src/network/socket/qabstractsocketengine_p.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2015 Intel Corporation. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNetwork module of the Qt Toolkit. @@ -58,6 +59,26 @@ class QNetworkInterface; #endif class QNetworkProxy; +class QIpPacketHeader +{ +public: + QIpPacketHeader(const QHostAddress &dstAddr = QHostAddress(), quint16 port = 0) + : destinationAddress(dstAddr), destinationPort(port) + {} + + void clear() + { + senderAddress.clear(); + destinationAddress.clear(); + } + + QHostAddress senderAddress; + QHostAddress destinationAddress; + + quint16 senderPort; + quint16 destinationPort; +}; + class QAbstractSocketEngineReceiver { public: virtual ~QAbstractSocketEngineReceiver(){} @@ -96,6 +117,14 @@ public: TypeOfServiceOption }; + enum PacketHeaderOption { + WantNone = 0, + WantDatagramSender, + + WantAll = 0xff + }; + Q_DECLARE_FLAGS(PacketHeaderOptions, PacketHeaderOption) + virtual bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol) = 0; virtual bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) = 0; @@ -126,10 +155,9 @@ public: virtual bool setMulticastInterface(const QNetworkInterface &iface) = 0; #endif // QT_NO_NETWORKINTERFACE - virtual qint64 readDatagram(char *data, qint64 maxlen, QHostAddress *addr = 0, - quint16 *port = 0) = 0; - virtual qint64 writeDatagram(const char *data, qint64 len, const QHostAddress &addr, - quint16 port) = 0; + virtual qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader *header = 0, + PacketHeaderOptions = WantNone) = 0; + virtual qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &header) = 0; virtual bool hasPendingDatagrams() const = 0; virtual qint64 pendingDatagramSize() const = 0; #endif // QT_NO_UDPSOCKET @@ -225,6 +253,8 @@ private: friend class QAbstractSocketEngine; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocketEngine::PacketHeaderOptions) + QT_END_NAMESPACE #endif // QABSTRACTSOCKETENGINE_P_H -- cgit v1.2.3