QmlDebugger: Buffer messages in QmlAdapter until client is ready

Don't 'loose' messages at startup because the client is not enabled
yet / sendMessage will silently fail.

Reviewed-by: Christiaan Janssen
This commit is contained in:
Kai Koehne
2010-09-30 15:03:42 +02:00
parent 226a82d3dc
commit a03e75726a
4 changed files with 28 additions and 9 deletions

View File

@@ -36,6 +36,8 @@
#include <QtCore/QTimer>
#include <QtCore/QDebug>
#include <utils/qtcassert.h>
namespace Debugger {
struct QmlAdapterPrivate {
@@ -49,6 +51,7 @@ struct QmlAdapterPrivate {
int m_connectionAttempts;
int m_maxConnectionAttempts;
QDeclarativeDebugConnection *m_conn;
QList<QByteArray> sendBuffer;
};
QmlAdapterPrivate::QmlAdapterPrivate(DebuggerEngine *engine, QmlAdapter *q) :
@@ -133,6 +136,16 @@ bool QmlAdapter::connectToViewer()
return true;
}
void QmlAdapter::sendMessage(const QByteArray &msg)
{
if (d->m_qmlClient->status() == QDeclarativeDebugClient::Enabled) {
flushSendBuffer();
d->m_qmlClient->sendMessage(msg);
} else {
d->sendBuffer.append(msg);
}
}
void QmlAdapter::connectionErrorOccurred(QAbstractSocket::SocketError socketError)
{
showConnectionErrorMessage(tr("Error: (%1) %2", "%1=error code, %2=error message")
@@ -151,6 +164,9 @@ void QmlAdapter::clientStatusChanged(QDeclarativeDebugClient::Status status)
}
logServiceStatusChange(serviceName, status);
if (status == QDeclarativeDebugClient::Enabled)
flushSendBuffer();
}
void QmlAdapter::connectionStateChanged()
@@ -199,7 +215,7 @@ void QmlAdapter::createDebuggerClient()
connect(d->m_qmlClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)),
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
connect(d->m_engine.data(), SIGNAL(sendMessage(QByteArray)),
d->m_qmlClient, SLOT(slotSendMessage(QByteArray)));
this, SLOT(sendMessage(QByteArray)));
connect(d->m_qmlClient, SIGNAL(messageWasReceived(QByteArray)),
d->m_engine.data(), SLOT(messageReceived(QByteArray)));
@@ -272,4 +288,13 @@ void QmlAdapter::logServiceStatusChange(const QString &service, QDeclarativeDebu
}
}
void QmlAdapter::flushSendBuffer()
{
QTC_ASSERT(d->m_qmlClient->status() == QDeclarativeDebugClient::Enabled, return);
foreach (const QByteArray &msg, d->sendBuffer) {
d->m_qmlClient->sendMessage(msg);
}
d->sendBuffer.clear();
}
} // namespace Debugger