From 940069e463b149cee85a88f33d26ace46d16ec59 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 19 Sep 2011 12:29:10 +0200 Subject: QDeclarativeDebug: Allow reconnects to QML debugger port Allow a new client to attach once the old one was disconnected. Done by Aurindam Jana. Change-Id: Id85045204cc011ec6e02db2658173e652b75c07e Reviewed-on: http://codereview.qt-project.org/5132 Reviewed-by: Qt Sanity Bot Reviewed-by: Aurindam Jana --- .../debugger/qdeclarativedebugserver.cpp | 112 ++++++++++----------- .../qmltooling/qmldbg_tcp/qtcpserverconnection.cpp | 3 +- 2 files changed, 55 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/declarative/debugger/qdeclarativedebugserver.cpp b/src/declarative/debugger/qdeclarativedebugserver.cpp index 883e1a89b0..f815f332c2 100644 --- a/src/declarative/debugger/qdeclarativedebugserver.cpp +++ b/src/declarative/debugger/qdeclarativedebugserver.cpp @@ -243,75 +243,66 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message) Q_D(QDeclarativeDebugServer); QDataStream in(message); - if (!d->gotHello) { - QString name; - int op; - in >> name >> op; - - if (name != QLatin1String("QDeclarativeDebugServer") - || op != 0) { - qWarning("QDeclarativeDebugServer: Invalid hello message"); - d->connection->disconnect(); - return; - } - - int version; - in >> version >> d->clientPlugins; - - // Send the hello answer immediately, since it needs to arrive before - // the plugins below start sending messages. - QByteArray helloAnswer; - { - QDataStream out(&helloAnswer, QIODevice::WriteOnly); - out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys(); - } - d->connection->send(helloAnswer); - - d->gotHello = true; - - QHash::Iterator iter = d->plugins.begin(); - for (; iter != d->plugins.end(); ++iter) { - QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable; - if (d->clientPlugins.contains(iter.key())) - newStatus = QDeclarativeDebugService::Enabled; - iter.value()->d_func()->status = newStatus; - iter.value()->statusChanged(newStatus); - } + QString name; + + in >> name; + if (name == QLatin1String("QDeclarativeDebugServer")) { + int op = -1; + in >> op; + if (op == 0) { + int version; + in >> version >> d->clientPlugins; + + // Send the hello answer immediately, since it needs to arrive before + // the plugins below start sending messages. + QByteArray helloAnswer; + { + QDataStream out(&helloAnswer, QIODevice::WriteOnly); + out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << d->plugins.keys(); + } + d->connection->send(helloAnswer); - qWarning("QDeclarativeDebugServer: Connection established"); - } else { + d->gotHello = true; - QString debugServer(QLatin1String("QDeclarativeDebugServer")); + QHash::Iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) { + QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable; + if (d->clientPlugins.contains(iter.key())) + newStatus = QDeclarativeDebugService::Enabled; + iter.value()->d_func()->status = newStatus; + iter.value()->statusChanged(newStatus); + } - QString name; - in >> name; + qWarning("QDeclarativeDebugServer: Connection established"); - if (name == debugServer) { - int op = -1; - in >> op; + } else if (op == 1) { - if (op == 1) { - // Service Discovery - QStringList oldClientPlugins = d->clientPlugins; - in >> d->clientPlugins; + // Service Discovery + QStringList oldClientPlugins = d->clientPlugins; + in >> d->clientPlugins; - QHash::Iterator iter = d->plugins.begin(); - for (; iter != d->plugins.end(); ++iter) { - const QString pluginName = iter.key(); - QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable; - if (d->clientPlugins.contains(pluginName)) - newStatus = QDeclarativeDebugService::Enabled; + QHash::Iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) { + const QString pluginName = iter.key(); + QDeclarativeDebugService::Status newStatus = QDeclarativeDebugService::Unavailable; + if (d->clientPlugins.contains(pluginName)) + newStatus = QDeclarativeDebugService::Enabled; - if (oldClientPlugins.contains(pluginName) - != d->clientPlugins.contains(pluginName)) { - iter.value()->d_func()->status = newStatus; - iter.value()->statusChanged(newStatus); - } + if (oldClientPlugins.contains(pluginName) + != d->clientPlugins.contains(pluginName)) { + iter.value()->d_func()->status = newStatus; + iter.value()->statusChanged(newStatus); } - } else { - qWarning("QDeclarativeDebugServer: Invalid control message %d", op); } + } else { + qWarning("QDeclarativeDebugServer: Invalid control message %d", op); + d->connection->disconnect(); + return; + } + + } else { + if (d->gotHello) { QByteArray message; in >> message; @@ -328,7 +319,10 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message) Q_ARG(QString, name), Q_ARG(QByteArray, message)); } + } else { + qWarning("QDeclarativeDebugServer: Invalid hello message"); } + } } diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp index abc60e13a7..512ea6571d 100644 --- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp @@ -168,13 +168,14 @@ void QTcpServerConnection::newConnection() { Q_D(QTcpServerConnection); - if (d->socket) { + if (d->socket && d->socket->peerPort()) { qWarning("QDeclarativeDebugServer: Another client is already connected"); QTcpSocket *faultyConnection = d->tcpServer->nextPendingConnection(); delete faultyConnection; return; } + delete d->socket; d->socket = d->tcpServer->nextPendingConnection(); d->socket->setParent(this); d->protocol = new QPacketProtocol(d->socket, this); -- cgit v1.2.3