diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2023-01-26 08:48:48 +0100 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2023-02-14 18:49:45 +0100 |
commit | 69c31f6f68a1399c1fc1e545e318eaa40966fe85 (patch) | |
tree | 0982c815e6481760ac5616869fd044dcc768c07c /examples/network/torrent/peerwireclient.cpp | |
parent | ff7d5809f1c8b27d62201c77fd1ea556a4fe3cc8 (diff) |
Torrent example: Remove manual little-big endian conversion
... and use QtEndian instead.
The conversion would be done even on a big-endian system, so the
example would not work correctly on such machines.
Task-number: QTBUG-110622
Pick-to: 6.5
Change-Id: I6a660ff68fa5a8d9b4c1faf9e264d937c605c47e
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'examples/network/torrent/peerwireclient.cpp')
-rw-r--r-- | examples/network/torrent/peerwireclient.cpp | 67 |
1 files changed, 24 insertions, 43 deletions
diff --git a/examples/network/torrent/peerwireclient.cpp b/examples/network/torrent/peerwireclient.cpp index 4ff33102d7..56feec5959 100644 --- a/examples/network/torrent/peerwireclient.cpp +++ b/examples/network/torrent/peerwireclient.cpp @@ -5,6 +5,7 @@ #include <QHostAddress> #include <QTimerEvent> +#include <QtEndian> static const int PendingRequestTimeout = 60 * 1000; static const int ClientTimeout = 120 * 1000; @@ -15,26 +16,6 @@ static const int MinimalHeaderSize = 48; static const char ProtocolId[] = "BitTorrent protocol"; static const char ProtocolIdSize = 19; -// Reads a 32bit unsigned int from data in network order. -static inline quint32 fromNetworkData(const char *data) -{ - const unsigned char *udata = (const unsigned char *)data; - return (quint32(udata[0]) << 24) - | (quint32(udata[1]) << 16) - | (quint32(udata[2]) << 8) - | (quint32(udata[3])); -} - -// Writes a 32bit unsigned int from num to data in network order. -static inline void toNetworkData(quint32 num, char *data) -{ - unsigned char *udata = (unsigned char *)data; - udata[3] = (num & 0xff); - udata[2] = (num & 0xff00) >> 8; - udata[1] = (num & 0xff0000) >> 16; - udata[0] = (num & 0xff000000) >> 24; -} - // Constructs an unconnected PeerWire client and starts the connect timer. PeerWireClient::PeerWireClient(const QByteArray &peerId, QObject *parent) : QTcpSocket(parent), pendingBlockSizes(0), @@ -165,7 +146,7 @@ void PeerWireClient::sendPieceNotification(int piece) sendHandShake(); char message[] = {0, 0, 0, 5, 4, 0, 0, 0, 0}; - toNetworkData(piece, &message[5]); + qToBigEndian(piece, &message[5]); write(message, sizeof(message)); } @@ -194,7 +175,7 @@ void PeerWireClient::sendPieceList(const QBitArray &bitField) } char message[] = {0, 0, 0, 1, 5}; - toNetworkData(bits.size() + 1, &message[0]); + qToBigEndian(bits.size() + 1, &message[0]); write(message, sizeof(message)); write(bits); } @@ -203,13 +184,13 @@ void PeerWireClient::sendPieceList(const QBitArray &bitField) void PeerWireClient::requestBlock(int piece, int offset, int length) { char message[] = {0, 0, 0, 1, 6}; - toNetworkData(13, &message[0]); + qToBigEndian(13, &message[0]); write(message, sizeof(message)); char numbers[4 * 3]; - toNetworkData(piece, &numbers[0]); - toNetworkData(offset, &numbers[4]); - toNetworkData(length, &numbers[8]); + qToBigEndian(piece, &numbers[0]); + qToBigEndian(offset, &numbers[4]); + qToBigEndian(length, &numbers[8]); write(numbers, sizeof(numbers)); incoming << TorrentBlock(piece, offset, length); @@ -226,13 +207,13 @@ void PeerWireClient::requestBlock(int piece, int offset, int length) void PeerWireClient::cancelRequest(int piece, int offset, int length) { char message[] = {0, 0, 0, 1, 8}; - toNetworkData(13, &message[0]); + qToBigEndian(13, &message[0]); write(message, sizeof(message)); char numbers[4 * 3]; - toNetworkData(piece, &numbers[0]); - toNetworkData(offset, &numbers[4]); - toNetworkData(length, &numbers[8]); + qToBigEndian(piece, &numbers[0]); + qToBigEndian(offset, &numbers[4]); + qToBigEndian(length, &numbers[8]); write(numbers, sizeof(numbers)); incoming.removeAll(TorrentBlock(piece, offset, length)); @@ -244,12 +225,12 @@ void PeerWireClient::sendBlock(int piece, int offset, const QByteArray &data) QByteArray block; char message[] = {0, 0, 0, 1, 7}; - toNetworkData(9 + data.size(), &message[0]); + qToBigEndian(9 + data.size(), &message[0]); block += QByteArray(message, sizeof(message)); char numbers[4 * 2]; - toNetworkData(piece, &numbers[0]); - toNetworkData(offset, &numbers[4]); + qToBigEndian(piece, &numbers[0]); + qToBigEndian(offset, &numbers[4]); block += QByteArray(numbers, sizeof(numbers)); block += data; @@ -468,7 +449,7 @@ void PeerWireClient::processIncomingData() char tmp[4]; read(tmp, sizeof(tmp)); - nextPacketLength = fromNetworkData(tmp); + nextPacketLength = qFromBigEndian<qint32>(tmp); if (nextPacketLength < 0 || nextPacketLength > 200000) { // Prevent DoS @@ -520,7 +501,7 @@ void PeerWireClient::processIncomingData() break; case HavePacket: { // The peer has a new piece available. - quint32 index = fromNetworkData(&packet.data()[1]); + quint32 index = qFromBigEndian<quint32>(&packet.data()[1]); if (index < quint32(peerPieces.size())) { // Only accept indexes within the valid range. peerPieces.setBit(int(index)); @@ -548,15 +529,15 @@ void PeerWireClient::processIncomingData() break; case RequestPacket: { // The peer requests a block. - quint32 index = fromNetworkData(&packet.data()[1]); - quint32 begin = fromNetworkData(&packet.data()[5]); - quint32 length = fromNetworkData(&packet.data()[9]); + quint32 index = qFromBigEndian<quint32>(&packet.data()[1]); + quint32 begin = qFromBigEndian<quint32>(&packet.data()[5]); + quint32 length = qFromBigEndian<quint32>(&packet.data()[9]); emit blockRequested(int(index), int(begin), int(length)); break; } case PiecePacket: { - int index = int(fromNetworkData(&packet.data()[1])); - int begin = int(fromNetworkData(&packet.data()[5])); + int index = int(qFromBigEndian<quint32>(&packet.data()[1])); + int begin = int(qFromBigEndian<quint32>(&packet.data()[5])); incoming.removeAll(TorrentBlock(index, begin, packet.size() - 9)); @@ -572,9 +553,9 @@ void PeerWireClient::processIncomingData() } case CancelPacket: { // The peer cancels a block request. - quint32 index = fromNetworkData(&packet.data()[1]); - quint32 begin = fromNetworkData(&packet.data()[5]); - quint32 length = fromNetworkData(&packet.data()[9]); + quint32 index = qFromBigEndian<quint32>(&packet.data()[1]); + quint32 begin = qFromBigEndian<quint32>(&packet.data()[5]); + quint32 length = qFromBigEndian<quint32>(&packet.data()[9]); for (int i = 0; i < pendingBlocks.size(); ++i) { const BlockInfo &blockInfo = pendingBlocks.at(i); if (blockInfo.pieceIndex == int(index) |