aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.cpp54
-rw-r--r--src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.h8
-rw-r--r--src/plugins/qmltooling/qmldbg_local/qmldbg_local.pro8
-rw-r--r--src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro2
-rw-r--r--src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp89
-rw-r--r--src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro8
-rw-r--r--src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp61
-rw-r--r--src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h8
-rw-r--r--src/plugins/qmltooling/shared/qqmldebugserver.h2
-rw-r--r--src/plugins/qmltooling/shared/qqmldebugserverconnection.h4
10 files changed, 92 insertions, 152 deletions
diff --git a/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.cpp b/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.cpp
index 266f450720..cf4512cc6e 100644
--- a/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.cpp
+++ b/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.cpp
@@ -47,14 +47,12 @@ public:
bool block;
QString filename;
QLocalSocket *socket;
- QPacketProtocol *protocol;
QQmlDebugServer *debugServer;
};
QLocalClientConnectionPrivate::QLocalClientConnectionPrivate() :
block(false),
socket(0),
- protocol(0),
debugServer(0)
{
}
@@ -83,21 +81,6 @@ bool QLocalClientConnection::isConnected() const
return d->socket && d->socket->state() == QLocalSocket::ConnectedState;
}
-void QLocalClientConnection::send(const QList<QByteArray> &messages)
-{
- Q_D(QLocalClientConnection);
-
- if (!isConnected() || !d->protocol || !d->socket)
- return;
-
- foreach (const QByteArray &message, messages) {
- QPacket pack;
- pack.writeRawData(message.data(), message.length());
- d->protocol->send(pack);
- }
- d->socket->flush();
-}
-
void QLocalClientConnection::disconnect()
{
Q_D(QLocalClientConnection);
@@ -105,19 +88,10 @@ void QLocalClientConnection::disconnect()
while (d->socket && d->socket->bytesToWrite() > 0)
d->socket->waitForBytesWritten();
- // protocol might still be processing packages at this point
- d->protocol->deleteLater();
- d->protocol = 0;
d->socket->deleteLater();
d->socket = 0;
}
-bool QLocalClientConnection::waitForMessage()
-{
- Q_D(QLocalClientConnection);
- return d->protocol->waitForReadyRead(-1);
-}
-
bool QLocalClientConnection::setPortRange(int portFrom, int portTo, bool block,
const QString &hostaddress)
{
@@ -133,7 +107,7 @@ bool QLocalClientConnection::setFileName(const QString &filename, bool block)
Q_D(QLocalClientConnection);
d->filename = filename;
d->block = block;
- return connect();
+ return connectToServer();
}
void QLocalClientConnection::waitForConnection()
@@ -142,7 +116,7 @@ void QLocalClientConnection::waitForConnection()
d->socket->waitForConnected(-1);
}
-bool QLocalClientConnection::connect()
+bool QLocalClientConnection::connectToServer()
{
Q_D(QLocalClientConnection);
@@ -155,33 +129,17 @@ bool QLocalClientConnection::connect()
return true;
}
-void QLocalClientConnection::readyRead()
+void QLocalClientConnection::flush()
{
Q_D(QLocalClientConnection);
- if (!d->protocol)
- return;
-
- QPacket packet = d->protocol->read();
-
- QByteArray content = packet.data();
- d->debugServer->receiveMessage(content);
+ if (d->socket)
+ d->socket->flush();
}
void QLocalClientConnection::connectionEstablished()
{
Q_D(QLocalClientConnection);
-
- d->protocol = new QPacketProtocol(d->socket, this);
- QObject::connect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead()));
- QObject::connect(d->protocol, SIGNAL(invalidPacket()), this, SLOT(invalidPacket()));
-
- if (d->block)
- d->protocol->waitForReadyRead(-1);
-}
-
-void QLocalClientConnection::invalidPacket()
-{
- qWarning("QML Debugger: Received a corrupted packet! Giving up ...");
+ d->debugServer->setDevice(d->socket);
}
QT_END_NAMESPACE
diff --git a/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.h b/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.h
index afc86a22ef..4d20b8db2f 100644
--- a/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.h
+++ b/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.h
@@ -56,19 +56,17 @@ public:
bool setFileName(const QString &filename, bool block);
bool isConnected() const;
- void send(const QList<QByteArray> &messages);
void disconnect();
- bool waitForMessage();
void waitForConnection();
- bool connect();
+ void flush();
private Q_SLOTS:
- void readyRead();
void connectionEstablished();
- void invalidPacket();
private:
+ bool connectToServer();
+
QLocalClientConnectionPrivate *d_ptr;
};
diff --git a/src/plugins/qmltooling/qmldbg_local/qmldbg_local.pro b/src/plugins/qmltooling/qmldbg_local/qmldbg_local.pro
index d8eb5ed5b6..4fa05234e6 100644
--- a/src/plugins/qmltooling/qmldbg_local/qmldbg_local.pro
+++ b/src/plugins/qmltooling/qmldbg_local/qmldbg_local.pro
@@ -1,19 +1,17 @@
TARGET = qmldbg_local
-QT = qml-private core-private
+QT = qml-private
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QLocalClientConnection
load(qt_plugin)
SOURCES += \
- $$PWD/qlocalclientconnection.cpp \
- $$PWD/../shared/qpacketprotocol.cpp
+ $$PWD/qlocalclientconnection.cpp
HEADERS += \
$$PWD/qlocalclientconnection.h \
$$PWD/../shared/qqmldebugserver.h \
- $$PWD/../shared/qqmldebugserverconnection.h \
- $$PWD/../shared/qpacketprotocol.h
+ $$PWD/../shared/qqmldebugserverconnection.h
INCLUDEPATH += $$PWD \
$$PWD/../shared
diff --git a/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro b/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro
index 034f29c522..5e2d0874df 100644
--- a/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro
+++ b/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro
@@ -7,10 +7,12 @@ load(qt_plugin)
SOURCES += \
$$PWD/qqmldebugserver.cpp \
+ $$PWD/../shared/qpacketprotocol.cpp
HEADERS += \
$$PWD/qqmldebugserverfactory.h \
$$PWD/../shared/qqmldebugserver.h \
+ $$PWD/../shared/qpacketprotocol.h \
$$PWD/../shared/qqmldebugserverconnection.h
INCLUDEPATH += $$PWD \
diff --git a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
index af77e6875b..4a4af77064 100644
--- a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
+++ b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
@@ -33,6 +33,7 @@
#include "qqmldebugserver.h"
#include "qqmldebugserverfactory.h"
+#include "qpacketprotocol.h"
#include "qqmldebugserverconnection.h"
#include <private/qqmldebugservice_p.h>
@@ -101,8 +102,7 @@ public:
bool removeService(QQmlDebugService *service);
bool open(const QVariantHash &configuration);
-
- void receiveMessage(const QByteArray &message);
+ void setDevice(QIODevice *socket);
template<class Action>
bool enable(Action action);
@@ -116,6 +116,8 @@ private slots:
void sendMessages(const QString &name, const QList<QByteArray> &messages);
void changeServiceState(const QString &serviceName, QQmlDebugService::State state);
void removeThread();
+ void receiveMessage();
+ void invalidPacket();
private:
friend struct StartTcpServerAction;
@@ -139,6 +141,8 @@ private:
bool init(const QString &pluginName, bool block);
+ bool canSendMessage(const QString &name);
+ void doSendMessage(const QString &name, const QByteArray &message);
QQmlDebugServerConnection *loadConnectionPlugin(const QString &pluginName);
QQmlDebugServerConnection *m_connection;
@@ -152,6 +156,7 @@ private:
QMutex m_helloMutex;
QWaitCondition m_helloCondition;
QQmlDebugServerThread *m_thread;
+ QPacketProtocol *m_protocol;
#ifndef QT_NO_LIBRARY
QPluginLoader m_loader;
#endif
@@ -478,14 +483,17 @@ bool QQmlDebugServerImpl::enableFromArguments()
return false;
}
-void QQmlDebugServerImpl::receiveMessage(const QByteArray &message)
+void QQmlDebugServerImpl::receiveMessage()
{
typedef QHash<QString, QQmlDebugService*>::const_iterator DebugServiceConstIt;
// to be executed in debugger thread
Q_ASSERT(QThread::currentThread() == thread());
- QQmlDebugStream in(message);
+ if (!m_protocol)
+ return;
+
+ QQmlDebugStream in(m_protocol->read().data());
QString name;
@@ -523,7 +531,10 @@ void QQmlDebugServerImpl::receiveMessage(const QByteArray &message)
out << QString(QStringLiteral("QDeclarativeDebugClient")) << 0 << protocolVersion
<< pluginNames << pluginVersions << QQmlDebugStream::s_dataStreamVersion;
- m_connection->send(QList<QByteArray>() << helloAnswer);
+ QPacket pack;
+ pack.writeRawData(helloAnswer.data(), helloAnswer.length());
+ m_protocol->send(pack);
+ m_connection->flush();
QMutexLocker helloLock(&m_helloMutex);
m_gotHello = true;
@@ -558,7 +569,7 @@ void QQmlDebugServerImpl::receiveMessage(const QByteArray &message)
} else {
qWarning("QML Debugger: Invalid control message %d.", op);
- m_connection->disconnect();
+ invalidPacket();
return;
}
@@ -700,34 +711,39 @@ bool QQmlDebugServerImpl::removeService(QQmlDebugService *service)
return true;
}
-void QQmlDebugServerImpl::sendMessage(const QString &name, const QByteArray &message)
+bool QQmlDebugServerImpl::canSendMessage(const QString &name)
{
- sendMessages(name, QList<QByteArray>() << message);
+ // to be executed in debugger thread
+ Q_ASSERT(QThread::currentThread() == thread());
+ return m_connection && m_connection->isConnected() && m_protocol &&
+ m_clientPlugins.contains(name);
}
-void QQmlDebugServerImpl::sendMessages(const QString &name, const QList<QByteArray> &messages)
+void QQmlDebugServerImpl::doSendMessage(const QString &name, const QByteArray &message)
{
- // to be executed in debugger thread
- Q_ASSERT(QThread::currentThread() == thread());
+ QByteArray prefixed;
+ QQmlDebugStream out(&prefixed, QIODevice::WriteOnly);
+ out << name << message;
- if (!m_connection)
- return;
+ QPacket pack;
+ pack.writeRawData(prefixed.data(), prefixed.length());
+ m_protocol->send(pack);
+}
- if (!name.isEmpty()) {
- if (!m_clientPlugins.contains(name))
- return;
- QList<QByteArray> prefixedMessages;
- prefixedMessages.reserve(messages.count());
- foreach (const QByteArray &message, messages) {
- QByteArray prefixed;
- QQmlDebugStream out(&prefixed, QIODevice::WriteOnly);
- out << name << message;
- prefixedMessages << prefixed;
- }
+void QQmlDebugServerImpl::sendMessage(const QString &name, const QByteArray &message)
+{
+ if (canSendMessage(name)) {
+ doSendMessage(name, message);
+ m_connection->flush();
+ }
+}
- m_connection->send(prefixedMessages);
- } else {
- m_connection->send(messages);
+void QQmlDebugServerImpl::sendMessages(const QString &name, const QList<QByteArray> &messages)
+{
+ if (canSendMessage(name)) {
+ foreach (const QByteArray &message, messages)
+ doSendMessage(name, message);
+ m_connection->flush();
}
}
@@ -769,6 +785,25 @@ void QQmlDebugServerImpl::EngineCondition::wake()
Q_ASSERT_X(numServices >=0, Q_FUNC_INFO, "Woken more often than #services.");
}
+void QQmlDebugServerImpl::setDevice(QIODevice *socket)
+{
+ m_protocol = new QPacketProtocol(socket, this);
+ QObject::connect(m_protocol, SIGNAL(readyRead()), this, SLOT(receiveMessage()));
+ QObject::connect(m_protocol, SIGNAL(invalidPacket()), this, SLOT(invalidPacket()));
+
+ if (blockingMode())
+ m_protocol->waitForReadyRead(-1);
+}
+
+void QQmlDebugServerImpl::invalidPacket()
+{
+ qWarning("QML Debugger: Received a corrupted packet! Giving up ...");
+ m_connection->disconnect();
+ // protocol might still be processing packages at this point
+ m_protocol->deleteLater();
+ m_protocol = 0;
+}
+
QQmlDebugConnector *QQmlDebugServerFactory::create(const QString &key)
{
// Cannot parent it to this because it gets moved to another thread
diff --git a/src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro b/src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro
index cb5d1f3045..15ba7c730a 100644
--- a/src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro
+++ b/src/plugins/qmltooling/qmldbg_tcp/qmldbg_tcp.pro
@@ -1,19 +1,17 @@
TARGET = qmldbg_tcp
-QT = qml-private core-private network
+QT = qml-private network
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QTcpServerConnection
load(qt_plugin)
SOURCES += \
- $$PWD/qtcpserverconnection.cpp \
- $$PWD/../shared/qpacketprotocol.cpp
+ $$PWD/qtcpserverconnection.cpp
HEADERS += \
$$PWD/qtcpserverconnection.h \
$$PWD/../shared/qqmldebugserver.h \
- $$PWD/../shared/qqmldebugserverconnection.h \
- $$PWD/../shared/qpacketprotocol.h
+ $$PWD/../shared/qqmldebugserverconnection.h
INCLUDEPATH += $$PWD \
$$PWD/../shared
diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
index 4333a9c7e9..7734e5ed0d 100644
--- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
+++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
@@ -32,7 +32,6 @@
****************************************************************************/
#include "qtcpserverconnection.h"
-#include "qpacketprotocol.h"
#include "qqmldebugserver.h"
#include <QtCore/qplugin.h>
@@ -50,7 +49,6 @@ public:
bool block;
QString hostaddress;
QTcpSocket *socket;
- QPacketProtocol *protocol;
QTcpServer *tcpServer;
QQmlDebugServer *debugServer;
@@ -61,7 +59,6 @@ QTcpServerConnectionPrivate::QTcpServerConnectionPrivate() :
portTo(0),
block(false),
socket(0),
- protocol(0),
tcpServer(0),
debugServer(0)
{
@@ -92,22 +89,6 @@ bool QTcpServerConnection::isConnected() const
return d->socket && d->socket->state() == QTcpSocket::ConnectedState;
}
-void QTcpServerConnection::send(const QList<QByteArray> &messages)
-{
- Q_D(QTcpServerConnection);
-
- if (!isConnected()
- || !d->protocol || !d->socket)
- return;
-
- foreach (const QByteArray &message, messages) {
- QPacket pack;
- pack.writeRawData(message.data(), message.length());
- d->protocol->send(pack);
- }
- d->socket->flush();
-}
-
void QTcpServerConnection::disconnect()
{
Q_D(QTcpServerConnection);
@@ -120,19 +101,10 @@ void QTcpServerConnection::disconnect()
}
}
- // protocol might still be processing packages at this point
- d->protocol->deleteLater();
- d->protocol = 0;
d->socket->deleteLater();
d->socket = 0;
}
-bool QTcpServerConnection::waitForMessage()
-{
- Q_D(QTcpServerConnection);
- return d->protocol->waitForReadyRead(-1);
-}
-
bool QTcpServerConnection::setPortRange(int portFrom, int portTo, bool block,
const QString &hostaddress)
{
@@ -158,6 +130,13 @@ void QTcpServerConnection::waitForConnection()
d->tcpServer->waitForNewConnection(-1);
}
+void QTcpServerConnection::flush()
+{
+ Q_D(QTcpServerConnection);
+ if (d->socket)
+ d->socket->flush();
+}
+
bool QTcpServerConnection::listen()
{
Q_D(QTcpServerConnection);
@@ -193,19 +172,6 @@ bool QTcpServerConnection::listen()
}
}
-
-void QTcpServerConnection::readyRead()
-{
- Q_D(QTcpServerConnection);
- if (!d->protocol)
- return;
-
- QPacket packet = d->protocol->read();
-
- QByteArray content = packet.data();
- d->debugServer->receiveMessage(content);
-}
-
void QTcpServerConnection::newConnection()
{
Q_D(QTcpServerConnection);
@@ -220,18 +186,7 @@ void QTcpServerConnection::newConnection()
delete d->socket;
d->socket = d->tcpServer->nextPendingConnection();
d->socket->setParent(this);
- d->protocol = new QPacketProtocol(d->socket, this);
- QObject::connect(d->protocol, SIGNAL(readyRead()), this, SLOT(readyRead()));
- QObject::connect(d->protocol, SIGNAL(invalidPacket()), this, SLOT(invalidPacket()));
-
- if (d->block) {
- d->protocol->waitForReadyRead(-1);
- }
-}
-
-void QTcpServerConnection::invalidPacket()
-{
- qWarning("QML Debugger: Received a corrupted packet! Giving up ...");
+ d->debugServer->setDevice(d->socket);
}
QT_END_NAMESPACE
diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
index 68271abfe6..8b2aed0b55 100644
--- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
+++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
@@ -56,19 +56,17 @@ public:
bool setFileName(const QString &fileName, bool block);
bool isConnected() const;
- void send(const QList<QByteArray> &messages);
void disconnect();
- bool waitForMessage();
- bool listen();
void waitForConnection();
+ void flush();
private Q_SLOTS:
- void readyRead();
void newConnection();
- void invalidPacket();
private:
+ bool listen();
+
QTcpServerConnectionPrivate *d_ptr;
};
diff --git a/src/plugins/qmltooling/shared/qqmldebugserver.h b/src/plugins/qmltooling/shared/qqmldebugserver.h
index 574930aacc..a7c17075d9 100644
--- a/src/plugins/qmltooling/shared/qqmldebugserver.h
+++ b/src/plugins/qmltooling/shared/qqmldebugserver.h
@@ -54,7 +54,7 @@ class QQmlDebugServer : protected QQmlDebugConnector
{
Q_OBJECT
public:
- virtual void receiveMessage(const QByteArray &message) = 0;
+ virtual void setDevice(QIODevice *socket) = 0;
};
QT_END_NAMESPACE
diff --git a/src/plugins/qmltooling/shared/qqmldebugserverconnection.h b/src/plugins/qmltooling/shared/qqmldebugserverconnection.h
index 592a1d6295..04e4c056ac 100644
--- a/src/plugins/qmltooling/shared/qqmldebugserverconnection.h
+++ b/src/plugins/qmltooling/shared/qqmldebugserverconnection.h
@@ -55,17 +55,15 @@ class QQmlDebugServer;
class QQmlDebugServerConnection
{
public:
- QQmlDebugServerConnection() {}
virtual ~QQmlDebugServerConnection() {}
virtual void setServer(QQmlDebugServer *server) = 0;
virtual bool setPortRange(int portFrom, int portTo, bool bock, const QString &hostaddress) = 0;
virtual bool setFileName(const QString &fileName, bool block) = 0;
virtual bool isConnected() const = 0;
- virtual void send(const QList<QByteArray> &messages) = 0;
virtual void disconnect() = 0;
virtual void waitForConnection() = 0;
- virtual bool waitForMessage() = 0;
+ virtual void flush() = 0;
};
#define QQmlDebugServerConnection_iid "org.qt-project.Qt.QQmlDebugServerConnection"