From fab51c4220b84d15d517e698da59cfb05da02729 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 20 Jun 2011 11:52:18 +0200 Subject: QDeclarativeDebug: Fix cases where multiple packets arrive in one go Make sure no packets get 'lost' when they're arriving in one go through the TCP/IP socket. Reviewed-by: Christiaan Janssen --- src/declarative/debugger/qpacketprotocol.cpp | 19 +++++++++++++------ .../qmltooling/qmldbg_tcp/qtcpserverconnection.cpp | 21 ++++++++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/declarative/debugger/qpacketprotocol.cpp b/src/declarative/debugger/qpacketprotocol.cpp index 9caaa79..f53d2a3 100644 --- a/src/declarative/debugger/qpacketprotocol.cpp +++ b/src/declarative/debugger/qpacketprotocol.cpp @@ -164,12 +164,16 @@ public Q_SLOTS: void readyToRead() { + bool gotPackets = false; while (true) { - // Need to get trailing data + // Get size header (if not in progress) if (-1 == inProgressSize) { // We need a size header of sizeof(qint32) - if (sizeof(qint32) > (uint)dev->bytesAvailable()) - return; + if (sizeof(qint32) > (uint)dev->bytesAvailable()) { + if (gotPackets) + emit readyRead(); + return; // no more data available + } // Read size header int read = dev->read((char *)&inProgressSize, sizeof(qint32)); @@ -200,9 +204,12 @@ public Q_SLOTS: inProgress.clear(); waitingForPacket = false; - emit readyRead(); - } else - return; + gotPackets = true; + } else { + if (gotPackets) + emit readyRead(); + return; // packet in progress is not yet complete + } } } } diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp index abc60e1..283f7d4 100644 --- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp @@ -125,7 +125,13 @@ void QTcpServerConnection::disconnect() bool QTcpServerConnection::waitForMessage() { Q_D(QTcpServerConnection); - return d->protocol->waitForReadyRead(-1); + if (d->protocol->packetsAvailable() > 0) { + QPacket packet = d->protocol->read(); + d->debugServer->receiveMessage(packet.data()); + return true; + } else { + return d->protocol->waitForReadyRead(-1); + } } void QTcpServerConnection::setPort(int port, bool block) @@ -145,10 +151,11 @@ void QTcpServerConnection::listen() d->tcpServer = new QTcpServer(this); QObject::connect(d->tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection())); - if (d->tcpServer->listen(QHostAddress::Any, d->port)) + if (d->tcpServer->listen(QHostAddress::Any, d->port)) { qWarning("QDeclarativeDebugServer: Waiting for connection on port %d...", d->port); - else + } else { qWarning("QDeclarativeDebugServer: Unable to listen on port %d", d->port); + } } @@ -158,10 +165,10 @@ void QTcpServerConnection::readyRead() if (!d->protocol) return; - QPacket packet = d->protocol->read(); - - QByteArray content = packet.data(); - d->debugServer->receiveMessage(content); + while (d->protocol->packetsAvailable() > 0) { + QPacket packet = d->protocol->read(); + d->debugServer->receiveMessage(packet.data()); + } } void QTcpServerConnection::newConnection() -- cgit v0.12