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>
This commit is contained in:
parent
ff7d5809f1
commit
69c31f6f68
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user