QmlDebugger: Log status of different services

Reviewed-by: Christiaan Janssen
This commit is contained in:
Kai Koehne
2010-09-30 14:05:20 +02:00
parent 8ad34357b8
commit 226a82d3dc
10 changed files with 102 additions and 23 deletions

View File

@@ -143,6 +143,16 @@ void QmlAdapter::connectionErrorOccurred(QAbstractSocket::SocketError socketErro
emit connectionError(socketError); emit connectionError(socketError);
} }
void QmlAdapter::clientStatusChanged(QDeclarativeDebugClient::Status status)
{
QString serviceName;
if (QDeclarativeDebugClient *client = qobject_cast<QDeclarativeDebugClient*>(sender())) {
serviceName = client->name();
}
logServiceStatusChange(serviceName, status);
}
void QmlAdapter::connectionStateChanged() void QmlAdapter::connectionStateChanged()
{ {
switch (d->m_conn->state()) { switch (d->m_conn->state()) {
@@ -165,6 +175,7 @@ void QmlAdapter::connectionStateChanged()
if (!d->m_mainClient) { if (!d->m_mainClient) {
d->m_mainClient = new QDeclarativeEngineDebug(d->m_conn, this); d->m_mainClient = new QDeclarativeEngineDebug(d->m_conn, this);
logServiceStatusChange(QLatin1String("QmlObserver"), static_cast<QDeclarativeDebugClient::Status>(d->m_mainClient->status()));
} }
createDebuggerClient(); createDebuggerClient();
@@ -185,11 +196,15 @@ void QmlAdapter::createDebuggerClient()
{ {
d->m_qmlClient = new Internal::QmlDebuggerClient(d->m_conn); d->m_qmlClient = new Internal::QmlDebuggerClient(d->m_conn);
connect(d->m_qmlClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)),
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
connect(d->m_engine.data(), SIGNAL(sendMessage(QByteArray)), connect(d->m_engine.data(), SIGNAL(sendMessage(QByteArray)),
d->m_qmlClient, SLOT(slotSendMessage(QByteArray))); d->m_qmlClient, SLOT(slotSendMessage(QByteArray)));
connect(d->m_qmlClient, SIGNAL(messageWasReceived(QByteArray)), connect(d->m_qmlClient, SIGNAL(messageWasReceived(QByteArray)),
d->m_engine.data(), SLOT(messageReceived(QByteArray))); d->m_engine.data(), SLOT(messageReceived(QByteArray)));
logServiceStatusChange(d->m_qmlClient->name(), d->m_qmlClient->status());
//engine->startSuccessful(); // FIXME: AAA: port to new debugger states //engine->startSuccessful(); // FIXME: AAA: port to new debugger states
} }
@@ -237,4 +252,24 @@ void QmlAdapter::setConnectionAttemptInterval(int interval)
d->m_connectionTimer->setInterval(interval); d->m_connectionTimer->setInterval(interval);
} }
void QmlAdapter::logServiceStatusChange(const QString &service, QDeclarativeDebugClient::Status newStatus)
{
switch (newStatus) {
case QDeclarativeDebugClient::Unavailable: {
showConnectionErrorMessage(tr("Error: Cannot connect to debug service '%1'. Debugging functionality will be limited.").arg(service));
emit serviceConnectionError(service);
break;
}
case QDeclarativeDebugClient::Enabled: {
showConnectionStatusMessage(tr("Connected to debug service '%1'.").arg(service));
break;
}
case QDeclarativeDebugClient::NotConnected: {
showConnectionStatusMessage(tr("Not connected to debug service '%1'.").arg(service));
break;
}
}
}
} // namespace Debugger } // namespace Debugger

View File

@@ -36,6 +36,7 @@
#include "debugger_global.h" #include "debugger_global.h"
#include <QtNetwork/QAbstractSocket> #include <QtNetwork/QAbstractSocket>
#include "qmldebuggerclient.h"
namespace QmlJsDebugClient { namespace QmlJsDebugClient {
class QDeclarativeEngineDebug; class QDeclarativeEngineDebug;
@@ -72,15 +73,19 @@ public:
void setMaxConnectionAttempts(int maxAttempts); void setMaxConnectionAttempts(int maxAttempts);
void setConnectionAttemptInterval(int interval); void setConnectionAttemptInterval(int interval);
void logServiceStatusChange(const QString &service, QDeclarativeDebugClient::Status newStatus);
signals: signals:
void aboutToDisconnect(); void aboutToDisconnect();
void connected(); void connected();
void disconnected(); void disconnected();
void connectionStartupFailed(); void connectionStartupFailed();
void connectionError(QAbstractSocket::SocketError socketError); void connectionError(QAbstractSocket::SocketError socketError);
void serviceConnectionError(const QString serviceName);
private slots: private slots:
void connectionErrorOccurred(QAbstractSocket::SocketError socketError); void connectionErrorOccurred(QAbstractSocket::SocketError socketError);
void clientStatusChanged(QDeclarativeDebugClient::Status status);
void connectionStateChanged(); void connectionStateChanged();
void pollInferior(); void pollInferior();

View File

@@ -43,6 +43,11 @@ QmlDebuggerClient::~QmlDebuggerClient()
{ {
} }
void QmlDebuggerClient::statusChanged(Status status)
{
emit newStatus(status);
}
void QmlDebuggerClient::messageReceived(const QByteArray &data) void QmlDebuggerClient::messageReceived(const QByteArray &data)
{ {
emit messageWasReceived(data); emit messageWasReceived(data);

View File

@@ -44,12 +44,14 @@ public:
virtual ~QmlDebuggerClient(); virtual ~QmlDebuggerClient();
signals: signals:
void newStatus(QDeclarativeDebugClient::Status status);
void messageWasReceived(const QByteArray &data); void messageWasReceived(const QByteArray &data);
private Q_SLOTS: private Q_SLOTS:
void slotSendMessage(const QByteArray &message); void slotSendMessage(const QByteArray &message);
protected: protected:
virtual void statusChanged(Status status);
virtual void messageReceived(const QByteArray &data); virtual void messageReceived(const QByteArray &data);
}; };

View File

@@ -218,6 +218,12 @@ void QmlEngine::connectionError(QAbstractSocket::SocketError socketError)
plugin()->showMessage(tr("QML Debugger: Remote host closed connection."), StatusBar); plugin()->showMessage(tr("QML Debugger: Remote host closed connection."), StatusBar);
} }
void QmlEngine::serviceConnectionError(const QString &serviceName)
{
plugin()->showMessage(tr("QML Debugger: Couldn't connect to service '%1'.").arg(serviceName), StatusBar);
}
void QmlEngine::runEngine() void QmlEngine::runEngine()
{ {
QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); QTC_ASSERT(state() == EngineRunRequested, qDebug() << state());
@@ -327,6 +333,7 @@ void QmlEngine::setupEngine()
d->m_adapter->setConnectionAttemptInterval(ConnectionAttemptDefaultInterval); d->m_adapter->setConnectionAttemptInterval(ConnectionAttemptDefaultInterval);
connect(d->m_adapter, SIGNAL(connectionError(QAbstractSocket::SocketError)), connect(d->m_adapter, SIGNAL(connectionError(QAbstractSocket::SocketError)),
SLOT(connectionError(QAbstractSocket::SocketError))); SLOT(connectionError(QAbstractSocket::SocketError)));
connect(d->m_adapter, SIGNAL(serviceConnectionError(QString)), SLOT(serviceConnectionError(QString)));
connect(d->m_adapter, SIGNAL(connected()), SLOT(connectionEstablished())); connect(d->m_adapter, SIGNAL(connected()), SLOT(connectionEstablished()));
connect(d->m_adapter, SIGNAL(connectionStartupFailed()), SLOT(connectionStartupFailed())); connect(d->m_adapter, SIGNAL(connectionStartupFailed()), SLOT(connectionStartupFailed()));

View File

@@ -117,6 +117,7 @@ private slots:
void connectionEstablished(); void connectionEstablished();
void connectionStartupFailed(); void connectionStartupFailed();
void connectionError(QAbstractSocket::SocketError error); void connectionError(QAbstractSocket::SocketError error);
void serviceConnectionError(const QString &service);
private: private:
void expandObject(const QByteArray &iname, quint64 objectId); void expandObject(const QByteArray &iname, quint64 objectId);

View File

@@ -65,8 +65,14 @@ ClientProxy::ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent)
void ClientProxy::connectToServer() void ClientProxy::connectToServer()
{ {
m_designClient = new QmlJSObserverClient(m_adapter->connection(), this); m_designClient = new QmlJSObserverClient(m_adapter->connection(), this);
emit connected();
if (m_designClient->status() == QDeclarativeDebugClient::Enabled)
emit connected();
m_adapter->logServiceStatusChange(m_designClient->name(), m_designClient->status());
connect(m_designClient, SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)),
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
connect(m_designClient, SIGNAL(currentObjectsChanged(QList<int>)), connect(m_designClient, SIGNAL(currentObjectsChanged(QList<int>)),
SLOT(onCurrentObjectsChanged(QList<int>))); SLOT(onCurrentObjectsChanged(QList<int>)));
connect(m_designClient, SIGNAL(colorPickerActivated()), connect(m_designClient, SIGNAL(colorPickerActivated()),
@@ -90,9 +96,24 @@ void ClientProxy::connectToServer()
reloadEngines(); reloadEngines();
} }
void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status)
{
QString serviceName;
if (QDeclarativeDebugClient *client = qobject_cast<QDeclarativeDebugClient*>(sender())) {
serviceName = client->name();
}
m_adapter->logServiceStatusChange(serviceName, status);
if (status == QDeclarativeDebugClient::Enabled)
emit connected();
}
void ClientProxy::disconnectFromServer() void ClientProxy::disconnectFromServer()
{ {
if (m_designClient) { if (m_designClient) {
disconnect(m_designClient, SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)),
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
disconnect(m_designClient, SIGNAL(currentObjectsChanged(QList<int>)), disconnect(m_designClient, SIGNAL(currentObjectsChanged(QList<int>)),
this, SLOT(onCurrentObjectsChanged(QList<int>))); this, SLOT(onCurrentObjectsChanged(QList<int>)));
disconnect(m_designClient, SIGNAL(colorPickerActivated()), disconnect(m_designClient, SIGNAL(colorPickerActivated()),
@@ -164,7 +185,7 @@ void ClientProxy::onCurrentObjectsChanged(const QList< int >& debugIds, bool req
void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs) void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs)
{ {
if (isConnected() && m_designClient) if (isConnected())
m_designClient->setSelectedItemsByObjectId(objectRefs); m_designClient->setSelectedItemsByObjectId(objectRefs);
} }
@@ -285,7 +306,7 @@ QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectD
void ClientProxy::clearComponentCache() void ClientProxy::clearComponentCache()
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->clearComponentCache(); m_designClient->clearComponentCache();
} }
@@ -365,7 +386,7 @@ void ClientProxy::objectTreeFetched(QDeclarativeDebugQuery::State state)
buildDebugIdHashRecursive(it); buildDebugIdHashRecursive(it);
emit objectTreeUpdated(); emit objectTreeUpdated();
if (isDesignClientConnected()) { if (isConnected()) {
if (!m_designClient->selectedItemIds().isEmpty()) if (!m_designClient->selectedItemIds().isEmpty())
onCurrentObjectsChanged(m_designClient->selectedItemIds(), false); onCurrentObjectsChanged(m_designClient->selectedItemIds(), false);
@@ -410,76 +431,70 @@ void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReferen
void ClientProxy::reloadQmlViewer() void ClientProxy::reloadQmlViewer()
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->reloadViewer(); m_designClient->reloadViewer();
} }
void ClientProxy::setDesignModeBehavior(bool inDesignMode) void ClientProxy::setDesignModeBehavior(bool inDesignMode)
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->setDesignModeBehavior(inDesignMode); m_designClient->setDesignModeBehavior(inDesignMode);
} }
void ClientProxy::setAnimationSpeed(qreal slowdownFactor) void ClientProxy::setAnimationSpeed(qreal slowdownFactor)
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->setAnimationSpeed(slowdownFactor); m_designClient->setAnimationSpeed(slowdownFactor);
} }
void ClientProxy::changeToColorPickerTool() void ClientProxy::changeToColorPickerTool()
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->changeToColorPickerTool(); m_designClient->changeToColorPickerTool();
} }
void ClientProxy::changeToZoomTool() void ClientProxy::changeToZoomTool()
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->changeToZoomTool(); m_designClient->changeToZoomTool();
} }
void ClientProxy::changeToSelectTool() void ClientProxy::changeToSelectTool()
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->changeToSelectTool(); m_designClient->changeToSelectTool();
} }
void ClientProxy::changeToSelectMarqueeTool() void ClientProxy::changeToSelectMarqueeTool()
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->changeToSelectMarqueeTool(); m_designClient->changeToSelectMarqueeTool();
} }
void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId, void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId,
const QStringList &imports, const QString &filename) const QStringList &imports, const QString &filename)
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->createQmlObject(qmlText, parentDebugId, imports, filename); m_designClient->createQmlObject(qmlText, parentDebugId, imports, filename);
} }
void ClientProxy::destroyQmlObject(int debugId) void ClientProxy::destroyQmlObject(int debugId)
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->destroyQmlObject(debugId); m_designClient->destroyQmlObject(debugId);
} }
void ClientProxy::reparentQmlObject(int debugId, int newParent) void ClientProxy::reparentQmlObject(int debugId, int newParent)
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->reparentQmlObject(debugId, newParent); m_designClient->reparentQmlObject(debugId, newParent);
} }
void ClientProxy::setContextPathIndex(int contextIndex) void ClientProxy::setContextPathIndex(int contextIndex)
{ {
if (isDesignClientConnected()) if (isConnected())
m_designClient->setContextPathIndex(contextIndex); m_designClient->setContextPathIndex(contextIndex);
} }
bool ClientProxy::isDesignClientConnected() const
{
return (m_designClient && m_adapter->isConnected());
}
void ClientProxy::reloadEngines() void ClientProxy::reloadEngines()
{ {
if (m_engineQuery) { if (m_engineQuery) {
@@ -518,7 +533,8 @@ Debugger::QmlAdapter *ClientProxy::qmlAdapter() const
bool ClientProxy::isConnected() const bool ClientProxy::isConnected() const
{ {
return m_adapter->isConnected(); return m_designClient && m_designClient->status() == QDeclarativeDebugClient::Enabled
&& m_client && m_client->status() == QDeclarativeEngineDebug::Enabled;
} }
void ClientProxy::newObjects() void ClientProxy::newObjects()

View File

@@ -125,6 +125,7 @@ public slots:
private slots: private slots:
void disconnectFromServer(); void disconnectFromServer();
void connectToServer(); void connectToServer();
void clientStatusChanged(QDeclarativeDebugClient::Status status);
void contextChanged(); void contextChanged();
@@ -135,7 +136,6 @@ private slots:
void newObjects(); void newObjects();
private: private:
bool isDesignClientConnected() const;
void reloadEngines(); void reloadEngines();
QList<QDeclarativeDebugObjectReference> objectReferences(const QDeclarativeDebugObjectReference &objectRef) const; QList<QDeclarativeDebugObjectReference> objectReferences(const QDeclarativeDebugObjectReference &objectRef) const;

View File

@@ -55,6 +55,11 @@ QmlJSObserverClient::QmlJSObserverClient(QDeclarativeDebugConnection *client,
{ {
} }
void QmlJSObserverClient::statusChanged(Status status)
{
emit connectedStatusChanged(status);
}
void QmlJSObserverClient::messageReceived(const QByteArray &message) void QmlJSObserverClient::messageReceived(const QByteArray &message)
{ {
QDataStream ds(message); QDataStream ds(message);

View File

@@ -80,6 +80,8 @@ public:
void clearComponentCache(); void clearComponentCache();
signals: signals:
void connectedStatusChanged(QDeclarativeDebugClient::Status status);
void currentObjectsChanged(const QList<int> &debugIds); void currentObjectsChanged(const QList<int> &debugIds);
void selectedColorChanged(const QColor &color); void selectedColorChanged(const QColor &color);
void colorPickerActivated(); void colorPickerActivated();
@@ -92,6 +94,7 @@ signals:
void contextPathUpdated(const QStringList &path); void contextPathUpdated(const QStringList &path);
protected: protected:
virtual void statusChanged(Status);
virtual void messageReceived(const QByteArray &); virtual void messageReceived(const QByteArray &);
private: private: