forked from qt-creator/qt-creator
QmlDebugger: Log status of different services
Reviewed-by: Christiaan Janssen
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
if (m_designClient->status() == QDeclarativeDebugClient::Enabled)
|
||||||
emit connected();
|
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()
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user