From 79ed2f70f05d30b82c0cec8843f5431cf8224f1c Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 16 Sep 2015 16:28:24 +0200 Subject: Move QQmlDebugClient into separate static library Change-Id: Ib3daf9da2cf6798bd022cfcf54d11e565c9cb4ca Reviewed-by: Simon Hausmann --- src/qmldebug/qmldebug.pro | 14 + src/qmldebug/qqmldebugclient.cpp | 118 +++++ src/qmldebug/qqmldebugclient_p.h | 83 ++++ src/qmldebug/qqmldebugclient_p_p.h | 66 +++ src/qmldebug/qqmldebugconnection.cpp | 409 ++++++++++++++++ src/qmldebug/qqmldebugconnection_p.h | 93 ++++ src/src.pro | 1 + sync.profile | 1 + .../tst_qdebugmessageservice.cpp | 10 +- .../qqmldebugclient/tst_qqmldebugclient.cpp | 22 +- .../tst_qqmldebuggingenabler.cpp | 24 +- .../qqmldebuggingenablerserver.cpp | 6 +- .../qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp | 24 +- .../debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp | 20 +- .../qqmldebugservice/tst_qqmldebugservice.cpp | 25 +- .../qqmlenginecontrol/tst_qqmlenginecontrol.cpp | 16 +- .../tst_qqmlenginedebuginspectorintegration.cpp | 24 +- .../tst_qqmlenginedebugservice.cpp | 36 +- .../debugger/qqmlinspector/tst_qqmlinspector.cpp | 21 +- .../tst_qqmlprofilerservice.cpp | 16 +- tests/auto/qml/debugger/shared/debugutil.cpp | 50 +- tests/auto/qml/debugger/shared/debugutil.pri | 10 +- tests/auto/qml/debugger/shared/debugutil_p.h | 24 +- tests/auto/qml/debugger/shared/qqmldebugclient.cpp | 539 --------------------- tests/auto/qml/debugger/shared/qqmldebugclient.h | 112 ----- .../qml/debugger/shared/qqmlenginedebugclient.cpp | 2 + .../qml/debugger/shared/qqmlenginedebugclient.h | 4 +- .../qml/debugger/shared/qqmlinspectorclient.cpp | 2 + .../auto/qml/debugger/shared/qqmlinspectorclient.h | 2 +- tools/qmlprofiler/qmlprofiler.pro | 6 +- tools/qmlprofiler/qmlprofilerapplication.cpp | 17 +- tools/qmlprofiler/qmlprofilerapplication.h | 13 +- tools/qmlprofiler/qmlprofilerclient.h | 5 +- tools/qmlprofiler/qqmldebugclient.cpp | 405 ---------------- tools/qmlprofiler/qqmldebugclient.h | 101 ---- 35 files changed, 1001 insertions(+), 1320 deletions(-) create mode 100644 src/qmldebug/qmldebug.pro create mode 100644 src/qmldebug/qqmldebugclient.cpp create mode 100644 src/qmldebug/qqmldebugclient_p.h create mode 100644 src/qmldebug/qqmldebugclient_p_p.h create mode 100644 src/qmldebug/qqmldebugconnection.cpp create mode 100644 src/qmldebug/qqmldebugconnection_p.h delete mode 100644 tests/auto/qml/debugger/shared/qqmldebugclient.cpp delete mode 100644 tests/auto/qml/debugger/shared/qqmldebugclient.h delete mode 100644 tools/qmlprofiler/qqmldebugclient.cpp delete mode 100644 tools/qmlprofiler/qqmldebugclient.h diff --git a/src/qmldebug/qmldebug.pro b/src/qmldebug/qmldebug.pro new file mode 100644 index 0000000000..6166e85e82 --- /dev/null +++ b/src/qmldebug/qmldebug.pro @@ -0,0 +1,14 @@ +TARGET = QtQmlDebug +QT = core-private network packetprotocol-private +CONFIG += static internal_module + +load(qt_module) + +SOURCES += \ + qqmldebugclient.cpp \ + qqmldebugconnection.cpp + +HEADERS += \ + qqmldebugclient_p.h \ + qqmldebugclient_p_p.h \ + qqmldebugconnection_p.h diff --git a/src/qmldebug/qqmldebugclient.cpp b/src/qmldebug/qqmldebugclient.cpp new file mode 100644 index 0000000000..6f27cede4b --- /dev/null +++ b/src/qmldebug/qqmldebugclient.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qqmldebugclient_p_p.h" +#include "qqmldebugconnection_p.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +QQmlDebugClient::QQmlDebugClient(const QString &name, QQmlDebugConnection *parent) : + QObject(*(new QQmlDebugClientPrivate(name, parent)), parent) +{ + Q_D(QQmlDebugClient); + d->addToConnection(); +} + +QQmlDebugClient::QQmlDebugClient(QQmlDebugClientPrivate &dd) : + QObject(dd, dd.connection.data()) +{ + Q_D(QQmlDebugClient); + d->addToConnection(); +} + +QQmlDebugClient::~QQmlDebugClient() +{ + Q_D(QQmlDebugClient); + if (d->connection && !d->connection->removeClient(d->name)) + qWarning() << "QQmlDebugClient: Plugin not registered" << d->name; +} + +QQmlDebugClientPrivate::QQmlDebugClientPrivate(const QString &name, + QQmlDebugConnection *connection) : + name(name), connection(connection) +{ +} + +void QQmlDebugClientPrivate::addToConnection() +{ + Q_Q(QQmlDebugClient); + if (connection && !connection->addClient(name, q)) { + qWarning() << "QQmlDebugClient: Conflicting plugin name" << name; + connection = 0; + } +} + +QString QQmlDebugClient::name() const +{ + Q_D(const QQmlDebugClient); + return d->name; +} + +float QQmlDebugClient::serviceVersion() const +{ + Q_D(const QQmlDebugClient); + return d->connection->serviceVersion(d->name); +} + +QQmlDebugClient::State QQmlDebugClient::state() const +{ + Q_D(const QQmlDebugClient); + if (!d->connection || !d->connection->isConnected()) + return NotConnected; + + if (d->connection->serviceVersion(d->name) != -1) + return Enabled; + + return Unavailable; +} + +void QQmlDebugClient::sendMessage(const QByteArray &message) +{ + Q_D(QQmlDebugClient); + d->connection->sendMessage(d->name, message); +} + +void QQmlDebugClient::stateChanged(QQmlDebugClient::State state) +{ + Q_UNUSED(state); +} + +void QQmlDebugClient::messageReceived(const QByteArray &message) +{ + Q_UNUSED(message); +} + +QT_END_NAMESPACE diff --git a/src/qmldebug/qqmldebugclient_p.h b/src/qmldebug/qqmldebugclient_p.h new file mode 100644 index 0000000000..997e6879cf --- /dev/null +++ b/src/qmldebug/qqmldebugclient_p.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQMLDEBUGCLIENT_P_H +#define QQMLDEBUGCLIENT_P_H + +#include + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +class QQmlDebugConnection; +class QQmlDebugClientPrivate; +class QQmlDebugClient : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QQmlDebugClient) + Q_DECLARE_PRIVATE(QQmlDebugClient) + +public: + enum State { NotConnected, Unavailable, Enabled }; + + QQmlDebugClient(const QString &name, QQmlDebugConnection *parent); + ~QQmlDebugClient(); + + QString name() const; + float serviceVersion() const; + State state() const; + void sendMessage(const QByteArray &message); + +protected: + QQmlDebugClient(QQmlDebugClientPrivate &dd); + +private: + friend class QQmlDebugConnection; + + virtual void stateChanged(State state); + virtual void messageReceived(const QByteArray &message); +}; + +QT_END_NAMESPACE + +#endif // QQMLDEBUGCLIENT_P_H diff --git a/src/qmldebug/qqmldebugclient_p_p.h b/src/qmldebug/qqmldebugclient_p_p.h new file mode 100644 index 0000000000..66a4f4e0c3 --- /dev/null +++ b/src/qmldebug/qqmldebugclient_p_p.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQMLDEBUGCLIENT_P_P_H +#define QQMLDEBUGCLIENT_P_P_H + +#include "qqmldebugclient_p.h" +#include + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +class QQmlDebugClientPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QQmlDebugClient) +public: + QQmlDebugClientPrivate(const QString &name, QQmlDebugConnection *connection); + void addToConnection(); + + QString name; + QPointer connection; +}; + +QT_END_NAMESPACE + +#endif // QQMLDEBUGCLIENT_P_P_H diff --git a/src/qmldebug/qqmldebugconnection.cpp b/src/qmldebug/qqmldebugconnection.cpp new file mode 100644 index 0000000000..b4ced0580e --- /dev/null +++ b/src/qmldebug/qqmldebugconnection.cpp @@ -0,0 +1,409 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qqmldebugconnection_p.h" +#include "qqmldebugclient_p.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +static const int protocolVersion = 1; +static const QString serverId = QLatin1String("QDeclarativeDebugServer"); +static const QString clientId = QLatin1String("QDeclarativeDebugClient"); + +class QQmlDebugConnectionPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QQmlDebugConnection) + +public: + QQmlDebugConnectionPrivate(); + QPacketProtocol *protocol; + QIODevice *device; + QLocalServer *server; + QEventLoop handshakeEventLoop; + QTimer handshakeTimer; + + bool gotHello; + int dataStreamVersion; + QHash serverPlugins; + QHash plugins; + QStringList removedPlugins; + + void advertisePlugins(); + void connectDeviceSignals(); + void flush(); +}; + +QQmlDebugConnectionPrivate::QQmlDebugConnectionPrivate() : + protocol(0), device(0), server(0), gotHello(false), dataStreamVersion(QDataStream::Qt_5_0) +{ + handshakeTimer.setSingleShot(true); + handshakeTimer.setInterval(3000); +} + +void QQmlDebugConnectionPrivate::advertisePlugins() +{ + Q_Q(QQmlDebugConnection); + if (!q->isConnected()) + return; + + QPacket pack; + pack << serverId << 1 << plugins.keys(); + protocol->send(pack); + flush(); +} + +void QQmlDebugConnection::socketConnected() +{ + Q_D(QQmlDebugConnection); + QPacket pack; + pack << serverId << 0 << protocolVersion << d->plugins.keys() << d->dataStreamVersion; + d->protocol->send(pack); + d->flush(); +} + +void QQmlDebugConnection::socketDisconnected() +{ + Q_D(QQmlDebugConnection); + d->gotHello = false; +} + +void QQmlDebugConnection::protocolReadyRead() +{ + Q_D(QQmlDebugConnection); + if (!d->gotHello) { + QPacket pack = d->protocol->read(); + QString name; + + pack >> name; + + bool validHello = false; + if (name == clientId) { + int op = -1; + pack >> op; + if (op == 0) { + int version = -1; + pack >> version; + if (version == protocolVersion) { + QStringList pluginNames; + QList pluginVersions; + pack >> pluginNames; + if (!pack.atEnd()) + pack >> pluginVersions; + + const int pluginNamesSize = pluginNames.size(); + const int pluginVersionsSize = pluginVersions.size(); + for (int i = 0; i < pluginNamesSize; ++i) { + float pluginVersion = 1.0; + if (i < pluginVersionsSize) + pluginVersion = pluginVersions.at(i); + d->serverPlugins.insert(pluginNames.at(i), pluginVersion); + } + + pack >> d->dataStreamVersion; + validHello = true; + } + } + } + + if (!validHello) { + qWarning("QQmlDebugConnection: Invalid hello message"); + QObject::disconnect(d->protocol, SIGNAL(protocolReadyRead()), this, SLOT(protocolReadyRead())); + return; + } + d->gotHello = true; + emit connected(); + + QHash::Iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) { + QQmlDebugClient::State newState = QQmlDebugClient::Unavailable; + if (d->serverPlugins.contains(iter.key())) + newState = QQmlDebugClient::Enabled; + iter.value()->stateChanged(newState); + } + + d->handshakeTimer.stop(); + d->handshakeEventLoop.quit(); + } + + while (d->protocol->packetsAvailable()) { + QPacket pack = d->protocol->read(); + QString name; + pack >> name; + + if (name == clientId) { + int op = -1; + pack >> op; + + if (op == 1) { + // Service Discovery + QHash oldServerPlugins = d->serverPlugins; + d->serverPlugins.clear(); + + QStringList pluginNames; + QList pluginVersions; + pack >> pluginNames; + if (!pack.atEnd()) + pack >> pluginVersions; + + const int pluginNamesSize = pluginNames.size(); + const int pluginVersionsSize = pluginVersions.size(); + for (int i = 0; i < pluginNamesSize; ++i) { + float pluginVersion = 1.0; + if (i < pluginVersionsSize) + pluginVersion = pluginVersions.at(i); + d->serverPlugins.insert(pluginNames.at(i), pluginVersion); + } + + QHash::Iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) { + const QString pluginName = iter.key(); + QQmlDebugClient::State newSate = QQmlDebugClient::Unavailable; + if (d->serverPlugins.contains(pluginName)) + newSate = QQmlDebugClient::Enabled; + + if (oldServerPlugins.contains(pluginName) + != d->serverPlugins.contains(pluginName)) { + iter.value()->stateChanged(newSate); + } + } + } else { + qWarning() << "QQmlDebugConnection: Unknown control message id" << op; + } + } else { + QByteArray message; + pack >> message; + + QHash::Iterator iter = d->plugins.find(name); + if (iter == d->plugins.end()) { + // We can get more messages for plugins we have removed because it takes time to + // send the advertisement message but the removal is instant locally. + if (!d->removedPlugins.contains(name)) + qWarning() << "QQmlDebugConnection: Message received for missing plugin" + << name; + } else { + (*iter)->messageReceived(message); + } + } + } +} + +void QQmlDebugConnection::handshakeTimeout() +{ + Q_D(QQmlDebugConnection); + if (!d->gotHello) { + qWarning() << "QQmlDebugConnection: Did not get handshake answer in time"; + d->handshakeEventLoop.quit(); + } +} + +QQmlDebugConnection::QQmlDebugConnection(QObject *parent) : + QObject(*(new QQmlDebugConnectionPrivate), parent) +{ + Q_D(QQmlDebugConnection); + connect(&d->handshakeTimer, SIGNAL(timeout()), this, SLOT(handshakeTimeout())); +} + +QQmlDebugConnection::~QQmlDebugConnection() +{ + Q_D(QQmlDebugConnection); + QHash::iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) + iter.value()->stateChanged(QQmlDebugClient::NotConnected); +} + +void QQmlDebugConnection::setDataStreamVersion(int dataStreamVersion) +{ + Q_D(QQmlDebugConnection); + d->dataStreamVersion = dataStreamVersion; +} + +int QQmlDebugConnection::dataStreamVersion() +{ + Q_D(QQmlDebugConnection); + return d->dataStreamVersion; +} + +bool QQmlDebugConnection::isConnected() const +{ + Q_D(const QQmlDebugConnection); + return d->gotHello; +} + +void QQmlDebugConnection::close() +{ + Q_D(QQmlDebugConnection); + if (d->gotHello) { + d->gotHello = false; + d->device->close(); + + QHash::iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) + iter.value()->stateChanged(QQmlDebugClient::NotConnected); + } + + if (d->device) { + d->device->deleteLater(); + d->device = 0; + } +} + +bool QQmlDebugConnection::waitForConnected(int msecs) +{ + Q_D(QQmlDebugConnection); + QAbstractSocket *socket = qobject_cast(d->device); + if (!socket) { + if (!d->server || (!d->server->hasPendingConnections() && + !d->server->waitForNewConnection(msecs))) + return false; + } else if (!socket->waitForConnected(msecs)) { + return false; + } + // wait for handshake + d->handshakeTimer.start(); + d->handshakeEventLoop.exec(); + return d->gotHello; +} + +QQmlDebugClient *QQmlDebugConnection::client(const QString &name) const +{ + Q_D(const QQmlDebugConnection); + return d->plugins.value(name, 0); +} + +bool QQmlDebugConnection::addClient(const QString &name, QQmlDebugClient *client) +{ + Q_D(QQmlDebugConnection); + if (d->plugins.contains(name)) + return false; + d->removedPlugins.removeAll(name); + d->plugins.insert(name, client); + d->advertisePlugins(); + return true; +} + +bool QQmlDebugConnection::removeClient(const QString &name) +{ + Q_D(QQmlDebugConnection); + if (!d->plugins.contains(name)) + return false; + d->plugins.remove(name); + d->removedPlugins.append(name); + d->advertisePlugins(); + return true; +} + +float QQmlDebugConnection::serviceVersion(const QString &serviceName) const +{ + Q_D(const QQmlDebugConnection); + return d->serverPlugins.value(serviceName, -1); +} + +bool QQmlDebugConnection::sendMessage(const QString &name, const QByteArray &message) +{ + Q_D(QQmlDebugConnection); + if (!isConnected() || !d->serverPlugins.contains(name)) + return false; + + QPacket pack; + pack << name << message; + d->protocol->send(pack); + d->flush(); + + return true; +} + +void QQmlDebugConnectionPrivate::flush() +{ + QAbstractSocket *socket = qobject_cast(device); + if (socket) + socket->flush(); +} + +void QQmlDebugConnection::connectToHost(const QString &hostName, quint16 port) +{ + Q_D(QQmlDebugConnection); + if (d->gotHello) + close(); + QTcpSocket *socket = new QTcpSocket(this); + d->device = socket; + d->connectDeviceSignals(); + connect(socket, SIGNAL(connected()), this, SLOT(socketConnected())); + connect(socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); + socket->connectToHost(hostName, port); +} + +void QQmlDebugConnection::startLocalServer(const QString &fileName) +{ + Q_D(QQmlDebugConnection); + if (d->gotHello) + close(); + if (d->server) + d->server->deleteLater(); + d->server = new QLocalServer(this); + // QueuedConnection so that waitForNewConnection() returns true. + connect(d->server, SIGNAL(newConnection()), this, SLOT(newConnection()), Qt::QueuedConnection); + d->server->listen(fileName); +} + +void QQmlDebugConnection::newConnection() +{ + Q_D(QQmlDebugConnection); + delete d->device; + QLocalSocket *socket = d->server->nextPendingConnection(); + d->server->close(); + d->device = socket; + d->connectDeviceSignals(); + socketConnected(); +} + +void QQmlDebugConnectionPrivate::connectDeviceSignals() +{ + Q_Q(QQmlDebugConnection); + delete protocol; + protocol = new QPacketProtocol(device, q); + QObject::connect(protocol, SIGNAL(readyRead()), q, SLOT(protocolReadyRead())); + QObject::connect(device, SIGNAL(disconnected()), q, SLOT(socketDisconnected())); +} + +QT_END_NAMESPACE diff --git a/src/qmldebug/qqmldebugconnection_p.h b/src/qmldebug/qqmldebugconnection_p.h new file mode 100644 index 0000000000..b3845b95a0 --- /dev/null +++ b/src/qmldebug/qqmldebugconnection_p.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQMLDEBUGCONNECTION_P_H +#define QQMLDEBUGCONNECTION_P_H + +#include + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +class QQmlDebugClient; +class QQmlDebugConnectionPrivate; +class QQmlDebugConnection : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QQmlDebugConnection) + Q_DECLARE_PRIVATE(QQmlDebugConnection) +public: + QQmlDebugConnection(QObject *parent = 0); + ~QQmlDebugConnection(); + + void connectToHost(const QString &hostName, quint16 port); + void startLocalServer(const QString &fileName); + + void setDataStreamVersion(int dataStreamVersion); + int dataStreamVersion(); + + bool isConnected() const; + void close(); + bool waitForConnected(int msecs = 30000); + + QQmlDebugClient *client(const QString &name) const; + bool addClient(const QString &name, QQmlDebugClient *client); + bool removeClient(const QString &name); + + float serviceVersion(const QString &serviceName) const; + bool sendMessage(const QString &name, const QByteArray &message); + +signals: + void connected(); + +private Q_SLOTS: + void newConnection(); + void socketConnected(); + void socketDisconnected(); + void protocolReadyRead(); + void handshakeTimeout(); +}; + +QT_END_NAMESPACE + +#endif // QQMLDEBUGCONNECTION_P_H diff --git a/src/src.pro b/src/src.pro index ac48f017e6..18e9ba6704 100644 --- a/src/src.pro +++ b/src/src.pro @@ -14,6 +14,7 @@ qtHaveModule(gui):contains(QT_CONFIG, opengl(es1|es2)?) { SUBDIRS += \ plugins \ + qmldebug \ imports \ qmldevtools diff --git a/sync.profile b/sync.profile index 6695d98f27..46280ade96 100644 --- a/sync.profile +++ b/sync.profile @@ -6,6 +6,7 @@ "QtQuickTest" => "$basedir/src/qmltest", "QtQmlDevTools" => "$basedir/src/qmldevtools", "QtPacketProtocol" => "$basedir/src/plugins/qmltooling/packetprotocol", + "QtQmlDebug" => "$basedir/src/qmldebug", ); %moduleheaders = ( # restrict the module headers to those found in relative path "QtQmlDevTools" => "../qml/parser;../qml/jsruntime;../qml/qml/ftw;../qml/compiler;../qml/memory;.", diff --git a/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp b/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp index 0f8b7ef9f2..779ab8c2a1 100644 --- a/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp +++ b/tests/auto/qml/debugger/qdebugmessageservice/tst_qdebugmessageservice.cpp @@ -31,14 +31,16 @@ ** ****************************************************************************/ -#include "qqmldebugclient.h" - //QQmlDebugTest #include "debugutil_p.h" #include "../../../shared/util.h" -#include -#include +#include +#include + +#include +#include +#include const char *NORMALMODE = "-qmljsdebugger=port:3777,3787,block"; const char *QMLFILE = "test.qml"; diff --git a/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp b/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp index abdc2483ea..1bf03dbdee 100644 --- a/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp +++ b/tests/auto/qml/debugger/qqmldebugclient/tst_qqmldebugclient.cpp @@ -30,19 +30,20 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include - -#include #include "debugutil_p.h" #include "qqmldebugtestservice.h" #include +#include + +#include +#include +#include +#include +#include +#include +#include #define PORT 13770 #define STR_PORT "13770" @@ -154,7 +155,9 @@ void tst_QQmlDebugClient::parallelConnect() QTest::ignoreMessage(QtWarningMsg, "QML Debugger: Another client is already connected."); // will connect & immediately disconnect connection2.connectToHost("127.0.0.1", PORT); - QTRY_COMPARE(connection2.state(), QAbstractSocket::UnconnectedState); + QTest::ignoreMessage(QtWarningMsg, "QQmlDebugConnection: Did not get handshake answer in time"); + QVERIFY(!connection2.waitForConnected(1000)); + QVERIFY(!connection2.isConnected()); QVERIFY(m_conn->isConnected()); } @@ -165,7 +168,6 @@ void tst_QQmlDebugClient::sequentialConnect() m_conn->close(); QVERIFY(!m_conn->isConnected()); - QCOMPARE(m_conn->state(), QAbstractSocket::UnconnectedState); // Make sure that the disconnect is actually delivered to the server QTest::qWait(100); diff --git a/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp b/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp index e809a46009..27a64842e9 100644 --- a/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp +++ b/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenabler/tst_qqmldebuggingenabler.cpp @@ -31,18 +31,20 @@ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include - #include "debugutil_p.h" -#include "qqmldebugclient.h" #include "../../../shared/util.h" +#include +#include + +#include +#include +#include +#include +#include +#include +#include + class tst_QQmlDebuggingEnabler : public QQmlDataTest { Q_OBJECT @@ -176,7 +178,7 @@ void tst_QQmlDebuggingEnabler::qmlscene() QFETCH(QStringList, services); connection = new QQmlDebugConnection(); - QList clients = connection->createOtherClients(); + QList clients = QQmlDebugTest::createOtherClients(connection); process = new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene", this); process->setMaximumBindErrors(1); @@ -208,7 +210,7 @@ void tst_QQmlDebuggingEnabler::custom() const int portTo = 5565; connection = new QQmlDebugConnection(); - QList clients = connection->createOtherClients(); + QList clients = QQmlDebugTest::createOtherClients(connection); process = new QQmlDebugProcess(QCoreApplication::applicationDirPath() + QLatin1String("/qqmldebuggingenablerserver"), this); process->setMaximumBindErrors(portTo - portFrom); diff --git a/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenablerserver/qqmldebuggingenablerserver.cpp b/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenablerserver/qqmldebuggingenablerserver.cpp index e08461346f..f4fef7ff16 100644 --- a/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenablerserver/qqmldebuggingenablerserver.cpp +++ b/tests/auto/qml/debugger/qqmldebuggingenabler/qqmldebuggingenablerserver/qqmldebuggingenablerserver.cpp @@ -31,8 +31,10 @@ ** ****************************************************************************/ -#include "debugutil_p.h" -#include +#include +#include +#include +#include int main(int argc, char *argv[]) { diff --git a/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp b/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp index c22adbcc36..d6facc4200 100644 --- a/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp +++ b/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp @@ -31,20 +31,22 @@ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include - //QQmlDebugTest #include "debugutil_p.h" -#include "qqmldebugclient.h" #include "../../../shared/util.h" +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + #if defined (Q_OS_WINCE) #undef IN #undef OUT @@ -831,7 +833,7 @@ void tst_QQmlDebugJS::init(const QString &qmlFile, bool blockMode, bool restrict connection = new QQmlDebugConnection(); process = new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene", this); client = new QJSDebugClient(connection); - QList others = connection->createOtherClients(); + QList others = QQmlDebugTest::createOtherClients(connection); const char *args = 0; if (blockMode) diff --git a/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp b/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp index 0343ea77ee..083e6de09e 100644 --- a/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp +++ b/tests/auto/qml/debugger/qqmldebuglocal/tst_qqmldebuglocal.cpp @@ -31,18 +31,20 @@ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include - -#include "debugutil_p.h" #include "qqmldebugtestservice.h" +#include "debugutil_p.h" #include +#include + +#include +#include +#include +#include +#include +#include + +#include QString fileName; diff --git a/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp b/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp index 166a079201..80eb5fbb3c 100644 --- a/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp +++ b/tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp @@ -30,22 +30,25 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include "../../../shared/util.h" -#include "debugutil_p.h" -#include "qqmldebugclient.h" #include "qqmldebugtestservice.h" +#include "debugutil_p.h" +#include "../../../shared/util.h" + +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include + #define PORT 3769 #define STR_PORT "3769" diff --git a/tests/auto/qml/debugger/qqmlenginecontrol/tst_qqmlenginecontrol.cpp b/tests/auto/qml/debugger/qqmlenginecontrol/tst_qqmlenginecontrol.cpp index 6c21ba27d7..961fe2f50c 100644 --- a/tests/auto/qml/debugger/qqmlenginecontrol/tst_qqmlenginecontrol.cpp +++ b/tests/auto/qml/debugger/qqmlenginecontrol/tst_qqmlenginecontrol.cpp @@ -31,13 +31,15 @@ ** ****************************************************************************/ -#include -#include - #include "debugutil_p.h" -#include "qqmldebugclient.h" #include "../../../shared/util.h" +#include +#include + +#include +#include + #define STR_PORT_FROM "13773" #define STR_PORT_TO "13783" @@ -167,7 +169,7 @@ void tst_QQmlEngineControl::connect(const QString &testFile, bool restrictServic m_connection = new QQmlDebugConnection(); m_client = new QQmlEngineControlClient(m_connection); - QList others = m_connection->createOtherClients(); + QList others = QQmlDebugTest::createOtherClients(m_connection); const int port = m_process->debugPort(); m_connection->connectToHost(QLatin1String("127.0.0.1"), port); @@ -184,8 +186,8 @@ void tst_QQmlEngineControl::cleanup() if (QTest::currentTestFailed()) { qDebug() << "Process State:" << (m_process ? m_process->state() : QLatin1String("null")); qDebug() << "Application Output:" << (m_process ? m_process->output() : QLatin1String("null")); - qDebug() << "Connection State:" << (m_connection ? m_connection->stateString() : QLatin1String("null")); - qDebug() << "Client State:" << (m_client ? m_client->stateString() : QLatin1String("null")); + qDebug() << "Connection State:" << QQmlDebugTest::connectionStateString(m_connection); + qDebug() << "Client State:" << QQmlDebugTest::clientStateString(m_client); } delete m_process; m_process = 0; diff --git a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp index adf46c8dab..04b068161b 100644 --- a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp @@ -31,18 +31,20 @@ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include - -#include "../shared/debugutil_p.h" -#include "../../../shared/util.h" #include "qqmlinspectorclient.h" #include "qqmlenginedebugclient.h" +#include "../shared/debugutil_p.h" +#include "../../../shared/util.h" + +#include + +#include +#include +#include +#include +#include +#include +#include #define STR_PORT_FROM "3776" #define STR_PORT_TO "3786" @@ -111,7 +113,7 @@ void tst_QQmlEngineDebugInspectorIntegration::init(bool restrictServices) QQmlDebugConnection *m_connection = new QQmlDebugConnection(this); m_inspectorClient = new QQmlInspectorClient(m_connection); m_engineDebugClient = new QQmlEngineDebugClient(m_connection); - QList others = m_connection->createOtherClients(); + QList others = QQmlDebugTest::createOtherClients(m_connection); m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort()); QVERIFY(m_connection->waitForConnected()); diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp index 653af61be5..fe4000bbb4 100644 --- a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp @@ -30,31 +30,33 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "qqmlenginedebugclient.h" +#include "debugutil_p.h" +#include "../../../shared/util.h" #include #include #include #include #include +#include -#include "debugutil_p.h" -#include "qqmlenginedebugclient.h" +#include +#include -#include "../../../shared/util.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include #define QVERIFYOBJECT(statement) \ do {\ @@ -352,7 +354,7 @@ void tst_QQmlEngineDebugService::initTestCase() bool ok = m_conn->waitForConnected(); QVERIFY(ok); m_dbg = new QQmlEngineDebugClient(m_conn); - QList others = m_conn->createOtherClients(); + QList others = QQmlDebugTest::createOtherClients(m_conn); QTRY_COMPARE(m_dbg->state(), QQmlEngineDebugClient::Enabled); foreach (QQmlDebugClient *other, others) QCOMPARE(other->state(), QQmlDebugClient::Unavailable); diff --git a/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp b/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp index 5d3583a5d2..d5aa1f41ad 100644 --- a/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp +++ b/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp @@ -30,17 +30,20 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include +#include "qqmlinspectorclient.h" #include "../shared/debugutil_p.h" #include "../../../shared/util.h" -#include "qqmlinspectorclient.h" + +#include + +#include +#include +#include +#include +#include +#include +#include #define STR_PORT_FROM "3772" #define STR_PORT_TO "3782" @@ -91,7 +94,7 @@ void tst_QQmlInspector::startQmlsceneProcess(const char * /* qmlFile */, bool re m_connection = new QQmlDebugConnection(); m_client = new QQmlInspectorClient(m_connection); - QList others = m_connection->createOtherClients(); + QList others = QQmlDebugTest::createOtherClients(m_connection); m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort()); QVERIFY(m_client); diff --git a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp index 17e3260026..86926e59ec 100644 --- a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp +++ b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp @@ -31,13 +31,15 @@ ** ****************************************************************************/ -#include -#include - #include "debugutil_p.h" -#include "qqmldebugclient.h" #include "../../../shared/util.h" +#include +#include + +#include +#include + #define STR_PORT_FROM "13773" #define STR_PORT_TO "13783" @@ -373,7 +375,7 @@ void tst_QQmlProfilerService::connect(bool block, const QString &testFile, bool m_connection = new QQmlDebugConnection(); m_client = new QQmlProfilerClient(m_connection); - QList others = m_connection->createOtherClients(); + QList others = QQmlDebugTest::createOtherClients(m_connection); const int port = m_process->debugPort(); m_connection->connectToHost(QLatin1String("127.0.0.1"), port); @@ -555,8 +557,8 @@ void tst_QQmlProfilerService::cleanup() qDebug() << " "; qDebug() << "Process State:" << (m_process ? m_process->state() : QLatin1String("null")); qDebug() << "Application Output:" << (m_process ? m_process->output() : QLatin1String("null")); - qDebug() << "Connection State:" << (m_connection ? m_connection->stateString() : QLatin1String("null")); - qDebug() << "Client State:" << m_client->stateString(); + qDebug() << "Connection State:" << QQmlDebugTest::connectionStateString(m_connection); + qDebug() << "Client State:" << QQmlDebugTest::clientStateString(m_client); } delete m_process; m_process = 0; diff --git a/tests/auto/qml/debugger/shared/debugutil.cpp b/tests/auto/qml/debugger/shared/debugutil.cpp index 51d706b818..54720fc848 100644 --- a/tests/auto/qml/debugger/shared/debugutil.cpp +++ b/tests/auto/qml/debugger/shared/debugutil.cpp @@ -33,10 +33,12 @@ #include "debugutil_p.h" -#include -#include -#include -#include +#include + +#include +#include +#include +#include bool QQmlDebugTest::waitForSignal(QObject *receiver, const char *member, int timeout) { QEventLoop loop; @@ -51,6 +53,46 @@ bool QQmlDebugTest::waitForSignal(QObject *receiver, const char *member, int tim return timer.isActive(); } +QList QQmlDebugTest::createOtherClients(QQmlDebugConnection *connection) +{ + QList ret; + foreach (const QString &service, QQmlDebuggingEnabler::debuggerServices()) { + if (!connection->client(service)) + ret << new QQmlDebugClient(service, connection); + } + foreach (const QString &service, QQmlDebuggingEnabler::inspectorServices()) { + if (!connection->client(service)) + ret << new QQmlDebugClient(service, connection); + } + foreach (const QString &service, QQmlDebuggingEnabler::profilerServices()) { + if (!connection->client(service)) + ret << new QQmlDebugClient(service, connection); + } + return ret; +} + +QString QQmlDebugTest::clientStateString(const QQmlDebugClient *client) +{ + if (!client) + return QLatin1String("null"); + + switch (client->state()) { + case QQmlDebugClient::NotConnected: return QLatin1String("Not connected"); + case QQmlDebugClient::Unavailable: return QLatin1String("Unavailable"); + case QQmlDebugClient::Enabled: return QLatin1String("Enabled"); + default: return QLatin1String("Invalid"); + } + +} + +QString QQmlDebugTest::connectionStateString(const QQmlDebugConnection *connection) +{ + if (!connection) + return QLatin1String("null"); + + return connection->isConnected() ? QLatin1String("connected") : QLatin1String("not connected"); +} + QQmlDebugTestClient::QQmlDebugTestClient(const QString &s, QQmlDebugConnection *c) : QQmlDebugClient(s, c) { diff --git a/tests/auto/qml/debugger/shared/debugutil.pri b/tests/auto/qml/debugger/shared/debugutil.pri index 73ed647061..1983f3583e 100644 --- a/tests/auto/qml/debugger/shared/debugutil.pri +++ b/tests/auto/qml/debugger/shared/debugutil.pri @@ -1,8 +1,4 @@ -QT += packetprotocol-private - -HEADERS += $$PWD/debugutil_p.h \ - $$PWD/qqmldebugclient.h \ - -SOURCES += $$PWD/debugutil.cpp \ - $$PWD/qqmldebugclient.cpp \ +QT += qmldebug-private +HEADERS += $$PWD/debugutil_p.h +SOURCES += $$PWD/debugutil.cpp diff --git a/tests/auto/qml/debugger/shared/debugutil_p.h b/tests/auto/qml/debugger/shared/debugutil_p.h index d544a89ff2..7ab817a509 100644 --- a/tests/auto/qml/debugger/shared/debugutil_p.h +++ b/tests/auto/qml/debugger/shared/debugutil_p.h @@ -32,8 +32,8 @@ ** ****************************************************************************/ -#ifndef DEBUGUTIL_H -#define DEBUGUTIL_H +#ifndef DEBUGUTIL_P_H +#define DEBUGUTIL_P_H // // W A R N I N G @@ -46,21 +46,23 @@ // We mean it. // -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include -#include "qqmldebugclient.h" - class QQmlDebugTest { public: static bool waitForSignal(QObject *receiver, const char *member, int timeout = 5000); + static QList createOtherClients(QQmlDebugConnection *connection); + static QString clientStateString(const QQmlDebugClient *client); + static QString connectionStateString(const QQmlDebugConnection *connection); }; class QQmlDebugTestClient : public QQmlDebugClient @@ -128,4 +130,4 @@ private: int m_receivedBindErrors; }; -#endif // DEBUGUTIL_H +#endif // DEBUGUTIL_P_H diff --git a/tests/auto/qml/debugger/shared/qqmldebugclient.cpp b/tests/auto/qml/debugger/shared/qqmldebugclient.cpp deleted file mode 100644 index 00de8f9f7e..0000000000 --- a/tests/auto/qml/debugger/shared/qqmldebugclient.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qqmldebugclient.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -const int protocolVersion = 1; -const QString serverId = QLatin1String("QDeclarativeDebugServer"); -const QString clientId = QLatin1String("QDeclarativeDebugClient"); - -class QQmlDebugClientPrivate -{ -public: - QQmlDebugClientPrivate(); - - QString name; - QQmlDebugConnection *connection; -}; - -class QQmlDebugConnectionPrivate : public QObject -{ - Q_OBJECT -public: - QQmlDebugConnectionPrivate(QQmlDebugConnection *c); - QQmlDebugConnection *q; - QPacketProtocol *protocol; - QIODevice *device; - QLocalServer *server; - QEventLoop handshakeEventLoop; - QTimer handshakeTimer; - - bool gotHello; - QHash serverPlugins; - QHash plugins; - QStringList removedPlugins; - - void advertisePlugins(); - void connectDeviceSignals(); - -public Q_SLOTS: - void forwardStateChange(QLocalSocket::LocalSocketState state); - void forwardError(QLocalSocket::LocalSocketError error); - - void newConnection(); - void connected(); - void readyRead(); - void deviceAboutToClose(); - void handshakeTimeout(); -}; - -QQmlDebugConnectionPrivate::QQmlDebugConnectionPrivate(QQmlDebugConnection *c) - : QObject(c), q(c), protocol(0), device(0), server(0), gotHello(false) -{ - protocol = new QPacketProtocol(q, this); - QObject::connect(c, SIGNAL(connected()), this, SLOT(connected())); - QObject::connect(protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); - - handshakeTimer.setSingleShot(true); - handshakeTimer.setInterval(3000); - connect(&handshakeTimer, SIGNAL(timeout()), SLOT(handshakeTimeout())); -} - -void QQmlDebugConnectionPrivate::advertisePlugins() -{ - if (!q->isConnected()) - return; - - QPacket pack; - pack << serverId << 1 << plugins.keys(); - protocol->send(pack); - q->flush(); -} - -void QQmlDebugConnectionPrivate::connected() -{ - QPacket pack; - pack << serverId << 0 << protocolVersion << plugins.keys() - << q->m_dataStreamVersion; - protocol->send(pack); - q->flush(); -} - -void QQmlDebugConnectionPrivate::readyRead() -{ - if (!gotHello) { - QPacket pack = protocol->read(); - QString name; - - pack >> name; - - bool validHello = false; - if (name == clientId) { - int op = -1; - pack >> op; - if (op == 0) { - int version = -1; - pack >> version; - if (version == protocolVersion) { - QStringList pluginNames; - QList pluginVersions; - pack >> pluginNames; - if (!pack.atEnd()) - pack >> pluginVersions; - - const int pluginNamesSize = pluginNames.size(); - const int pluginVersionsSize = pluginVersions.size(); - for (int i = 0; i < pluginNamesSize; ++i) { - float pluginVersion = 1.0; - if (i < pluginVersionsSize) - pluginVersion = pluginVersions.at(i); - serverPlugins.insert(pluginNames.at(i), pluginVersion); - } - - pack >> q->m_dataStreamVersion; - validHello = true; - } - } - } - - if (!validHello) { - qWarning("QQmlDebugConnection: Invalid hello message"); - QObject::disconnect(protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); - return; - } - gotHello = true; - - QHash::Iterator iter = plugins.begin(); - for (; iter != plugins.end(); ++iter) { - QQmlDebugClient::State newState = QQmlDebugClient::Unavailable; - if (serverPlugins.contains(iter.key())) - newState = QQmlDebugClient::Enabled; - iter.value()->stateChanged(newState); - } - - handshakeTimer.stop(); - handshakeEventLoop.quit(); - } - - while (protocol->packetsAvailable()) { - QPacket pack = protocol->read(); - QString name; - pack >> name; - - if (name == clientId) { - int op = -1; - pack >> op; - - if (op == 1) { - // Service Discovery - QHash oldServerPlugins = serverPlugins; - serverPlugins.clear(); - - QStringList pluginNames; - QList pluginVersions; - pack >> pluginNames; - if (!pack.atEnd()) - pack >> pluginVersions; - - const int pluginNamesSize = pluginNames.size(); - const int pluginVersionsSize = pluginVersions.size(); - for (int i = 0; i < pluginNamesSize; ++i) { - float pluginVersion = 1.0; - if (i < pluginVersionsSize) - pluginVersion = pluginVersions.at(i); - serverPlugins.insert(pluginNames.at(i), pluginVersion); - } - - QHash::Iterator iter = plugins.begin(); - for (; iter != plugins.end(); ++iter) { - const QString pluginName = iter.key(); - QQmlDebugClient::State newSate = QQmlDebugClient::Unavailable; - if (serverPlugins.contains(pluginName)) - newSate = QQmlDebugClient::Enabled; - - if (oldServerPlugins.contains(pluginName) - != serverPlugins.contains(pluginName)) { - iter.value()->stateChanged(newSate); - } - } - } else { - qWarning() << "QQmlDebugConnection: Unknown control message id" << op; - } - } else { - QByteArray message; - pack >> message; - - QHash::Iterator iter = - plugins.find(name); - if (iter == plugins.end()) { - // We can get more messages for plugins we have removed because it takes time to - // send the advertisement message but the removal is instant locally. - if (!removedPlugins.contains(name)) - qWarning() << "QQmlDebugConnection: Message received for missing plugin" - << name; - } else { - (*iter)->messageReceived(message); - } - } - } -} - -void QQmlDebugConnectionPrivate::deviceAboutToClose() -{ - // This is nasty syntax but we want to emit our own aboutToClose signal (by calling QIODevice::close()) - // without calling the underlying device close fn as that would cause an infinite loop - q->QIODevice::close(); -} - -void QQmlDebugConnectionPrivate::handshakeTimeout() -{ - if (!gotHello) { - qWarning() << "Qml Debug Client: Did not get handshake answer in time"; - handshakeEventLoop.quit(); - } -} - -QQmlDebugConnection::QQmlDebugConnection(QObject *parent) - : QIODevice(parent), d(new QQmlDebugConnectionPrivate(this)), - m_dataStreamVersion(QDataStream::Qt_5_0) -{ -} - -QQmlDebugConnection::~QQmlDebugConnection() -{ - QHash::iterator iter = d->plugins.begin(); - for (; iter != d->plugins.end(); ++iter) { - iter.value()->d->connection = 0; - iter.value()->stateChanged(QQmlDebugClient::NotConnected); - } -} - -void QQmlDebugConnection::setDataStreamVersion(int dataStreamVersion) -{ - m_dataStreamVersion = dataStreamVersion; -} - -int QQmlDebugConnection::dataStreamVersion() -{ - return m_dataStreamVersion; -} - -bool QQmlDebugConnection::isConnected() const -{ - return state() == QAbstractSocket::ConnectedState; -} - -qint64 QQmlDebugConnection::readData(char *data, qint64 maxSize) -{ - return d->device->read(data, maxSize); -} - -qint64 QQmlDebugConnection::writeData(const char *data, qint64 maxSize) -{ - return d->device->write(data, maxSize); -} - -qint64 QQmlDebugConnection::bytesAvailable() const -{ - return d->device->bytesAvailable(); -} - -bool QQmlDebugConnection::isSequential() const -{ - return true; -} - -void QQmlDebugConnection::close() -{ - if (isOpen()) { - QIODevice::close(); - d->device->close(); - emit stateChanged(QAbstractSocket::UnconnectedState); - - QHash::iterator iter = d->plugins.begin(); - for (; iter != d->plugins.end(); ++iter) { - iter.value()->stateChanged(QQmlDebugClient::NotConnected); - } - } -} - -bool QQmlDebugConnection::waitForConnected(int msecs) -{ - QAbstractSocket *socket = qobject_cast(d->device); - if (!socket) { - if (!d->server || (!d->server->hasPendingConnections() && - !d->server->waitForNewConnection(msecs))) - return false; - } else if (!socket->waitForConnected(msecs)) { - return false; - } - // wait for handshake - d->handshakeTimer.start(); - d->handshakeEventLoop.exec(); - return d->gotHello; -} - -QString QQmlDebugConnection::stateString() const -{ - QString state; - - if (isConnected()) - state = "Connected"; - else - state = "Not connected"; - - if (d->gotHello) - state += ", got hello"; - else - state += ", did not get hello!"; - - return state; -} - -QAbstractSocket::SocketState QQmlDebugConnection::state() const -{ - QAbstractSocket *abstractSocket = qobject_cast(d->device); - if (abstractSocket) - return abstractSocket->state(); - - QLocalSocket *localSocket = qobject_cast(d->device); - if (localSocket) - return static_cast(localSocket->state()); - - return QAbstractSocket::UnconnectedState; -} - -void QQmlDebugConnection::flush() -{ - QAbstractSocket *socket = qobject_cast(d->device); - if (socket) { - socket->flush(); - return; - } -} - -void QQmlDebugConnection::connectToHost(const QString &hostName, quint16 port) -{ - QTcpSocket *socket = new QTcpSocket(d); - socket->setProxy(QNetworkProxy::NoProxy); - d->device = socket; - d->connectDeviceSignals(); - d->gotHello = false; - connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SIGNAL(stateChanged(QAbstractSocket::SocketState))); - connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SIGNAL(error(QAbstractSocket::SocketError))); - connect(socket, SIGNAL(connected()), this, SIGNAL(connected())); - socket->connectToHost(hostName, port); - QIODevice::open(ReadWrite | Unbuffered); -} - -void QQmlDebugConnection::startLocalServer(const QString &fileName) -{ - d->gotHello = false; - d->server = new QLocalServer(d); - // QueuedConnection so that waitForNewConnection() returns true. - connect(d->server, SIGNAL(newConnection()), d, SLOT(newConnection()), Qt::QueuedConnection); - d->server->listen(fileName); - QIODevice::open(ReadWrite | Unbuffered); -} - -void QQmlDebugConnectionPrivate::newConnection() -{ - QLocalSocket *socket = server->nextPendingConnection(); - server->close(); - device = socket; - connectDeviceSignals(); - connect(socket, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)), - this, SLOT(forwardStateChange(QLocalSocket::LocalSocketState))); - connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)), - this, SLOT(forwardError(QLocalSocket::LocalSocketError))); - emit q->connected(); -} - -void QQmlDebugConnectionPrivate::connectDeviceSignals() -{ - connect(device, SIGNAL(bytesWritten(qint64)), q, SIGNAL(bytesWritten(qint64))); - connect(device, SIGNAL(readyRead()), q, SIGNAL(readyRead())); - connect(device, SIGNAL(aboutToClose()), this, SLOT(deviceAboutToClose())); -} - -void QQmlDebugConnectionPrivate::forwardStateChange(QLocalSocket::LocalSocketState state) -{ - emit q->stateChanged(static_cast(state)); -} - -void QQmlDebugConnectionPrivate::forwardError(QLocalSocket::LocalSocketError error) -{ - emit q->error(static_cast(error)); -} - -QQmlDebugClientPrivate::QQmlDebugClientPrivate() - : connection(0) -{ -} - -QQmlDebugClient::QQmlDebugClient(const QString &name, - QQmlDebugConnection *parent) - : QObject(parent), - d(new QQmlDebugClientPrivate) -{ - d->name = name; - d->connection = parent; - - if (!d->connection) - return; - - if (d->connection->d->plugins.contains(name)) { - qWarning() << "QQmlDebugClient: Conflicting plugin name" << name; - d->connection = 0; - } else { - d->connection->d->removedPlugins.removeAll(name); - d->connection->d->plugins.insert(name, this); - d->connection->d->advertisePlugins(); - } -} - -QQmlDebugClient::~QQmlDebugClient() -{ - if (d->connection && d->connection->d) { - d->connection->d->plugins.remove(d->name); - d->connection->d->removedPlugins.append(d->name); - d->connection->d->advertisePlugins(); - } - delete d; -} - -QString QQmlDebugClient::name() const -{ - return d->name; -} - -float QQmlDebugClient::serviceVersion() const -{ - if (d->connection->d->serverPlugins.contains(d->name)) - return d->connection->d->serverPlugins.value(d->name); - return -1; -} - -QQmlDebugClient::State QQmlDebugClient::state() const -{ - if (!d->connection - || !d->connection->isConnected() - || !d->connection->d->gotHello) - return NotConnected; - - if (d->connection->d->serverPlugins.contains(d->name)) - return Enabled; - - return Unavailable; -} - -QString QQmlDebugClient::stateString() const -{ - switch (state()) { - case NotConnected: return QLatin1String("Not connected"); - case Unavailable: return QLatin1String("Unavailable"); - case Enabled: return QLatin1String("Enabled"); - } - return QLatin1String("Invalid"); -} - -void QQmlDebugClient::sendMessage(const QByteArray &message) -{ - if (state() != Enabled) - return; - - QPacket pack; - pack << d->name << message; - d->connection->d->protocol->send(pack); - d->connection->flush(); -} - -QList QQmlDebugConnection::createOtherClients() -{ - QList ret; - foreach (const QString &service, QQmlDebuggingEnabler::debuggerServices()) { - if (!d->plugins.contains(service)) - ret << new QQmlDebugClient(service, this); - } - foreach (const QString &service, QQmlDebuggingEnabler::inspectorServices()) { - if (!d->plugins.contains(service)) - ret << new QQmlDebugClient(service, this); - } - foreach (const QString &service, QQmlDebuggingEnabler::profilerServices()) { - if (!d->plugins.contains(service)) - ret << new QQmlDebugClient(service, this); - } - return ret; -} - -void QQmlDebugClient::stateChanged(State) -{ -} - -void QQmlDebugClient::messageReceived(const QByteArray &) -{ -} - -#include diff --git a/tests/auto/qml/debugger/shared/qqmldebugclient.h b/tests/auto/qml/debugger/shared/qqmldebugclient.h deleted file mode 100644 index 659f7c8631..0000000000 --- a/tests/auto/qml/debugger/shared/qqmldebugclient.h +++ /dev/null @@ -1,112 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QQMLDEBUGCLIENT_H -#define QQMLDEBUGCLIENT_H - -#include - -class QQmlDebugClient; -class QQmlDebugConnectionPrivate; -class QQmlDebugConnection : public QIODevice -{ - Q_OBJECT - Q_DISABLE_COPY(QQmlDebugConnection) -public: - QQmlDebugConnection(QObject * = 0); - ~QQmlDebugConnection(); - - void connectToHost(const QString &hostName, quint16 port); - void startLocalServer(const QString &fileName); - - void setDataStreamVersion(int dataStreamVersion); - int dataStreamVersion(); - - qint64 bytesAvailable() const; - bool isConnected() const; - QAbstractSocket::SocketState state() const; - void flush(); - bool isSequential() const; - void close(); - bool waitForConnected(int msecs = 30000); - - QString stateString() const; - QList createOtherClients(); - -signals: - void connected(); - void stateChanged(QAbstractSocket::SocketState socketState); - void error(QAbstractSocket::SocketError socketError); - -protected: - qint64 readData(char *data, qint64 maxSize); - qint64 writeData(const char *data, qint64 maxSize); - -private: - QQmlDebugConnectionPrivate *d; - int m_dataStreamVersion; - friend class QQmlDebugClient; - friend class QQmlDebugClientPrivate; - friend class QQmlDebugConnectionPrivate; -}; - -class QQmlDebugClientPrivate; -class QQmlDebugClient : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(QQmlDebugClient) - -public: - enum State { NotConnected, Unavailable, Enabled }; - - QQmlDebugClient(const QString &, QQmlDebugConnection *parent); - ~QQmlDebugClient(); - - QString name() const; - float serviceVersion() const; - State state() const; - QString stateString() const; - - virtual void sendMessage(const QByteArray &); - -protected: - virtual void stateChanged(State); - virtual void messageReceived(const QByteArray &); - -private: - QQmlDebugClientPrivate *d; - friend class QQmlDebugConnection; - friend class QQmlDebugConnectionPrivate; -}; - -#endif // QQMLDEBUGCLIENT_H diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp index 9b48b40c07..7db0d9055d 100644 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp +++ b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp @@ -34,6 +34,8 @@ #include "qqmlenginedebugclient.h" #include "qdatastream.h" +#include + struct QmlObjectData { QUrl url; int lineNumber; diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h index 28adb8b159..60f5a7e66b 100644 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h +++ b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h @@ -34,13 +34,11 @@ #ifndef QQMLENGINEDEBUGCLIENT_H #define QQMLENGINEDEBUGCLIENT_H -#include "qqmldebugclient.h" +#include #include #include -class QQmlDebugConnection; - struct QmlDebugPropertyReference { QmlDebugPropertyReference() diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp b/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp index a46bd9012b..0c7ab60f5e 100644 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp +++ b/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp @@ -34,6 +34,8 @@ #include "qqmlinspectorclient.h" #include "qdatastream.h" +#include + void QQmlInspectorClient::setShowAppOnTop(bool showOnTop) { QByteArray message; diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.h b/tests/auto/qml/debugger/shared/qqmlinspectorclient.h index a8b42c8430..964dac7701 100644 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.h +++ b/tests/auto/qml/debugger/shared/qqmlinspectorclient.h @@ -33,7 +33,7 @@ #ifndef QQMLINSPECTORCLIENT_H #define QQMLINSPECTORCLIENT_H -#include "qqmldebugclient.h" +#include class QQmlInspectorClient : public QQmlDebugClient { diff --git a/tools/qmlprofiler/qmlprofiler.pro b/tools/qmlprofiler/qmlprofiler.pro index e38ba928e2..84e298fe9b 100644 --- a/tools/qmlprofiler/qmlprofiler.pro +++ b/tools/qmlprofiler/qmlprofiler.pro @@ -1,10 +1,9 @@ -QT = qml qml-private network core-private packetprotocol-private +QT = qml-private network core qmldebug-private CONFIG += no_import_scan SOURCES += main.cpp \ qmlprofilerapplication.cpp \ commandlistener.cpp \ - qqmldebugclient.cpp \ qmlprofilerdata.cpp \ qmlprofilerclient.cpp @@ -14,7 +13,6 @@ HEADERS += \ constants.h \ qmlprofilerdata.h \ qmlprofilerclient.h \ - qmlprofilereventlocation.h \ - qqmldebugclient.h + qmlprofilereventlocation.h load(qt_tool) diff --git a/tools/qmlprofiler/qmlprofilerapplication.cpp b/tools/qmlprofiler/qmlprofilerapplication.cpp index 11718d60ad..dbc145e8b7 100644 --- a/tools/qmlprofiler/qmlprofilerapplication.cpp +++ b/tools/qmlprofiler/qmlprofilerapplication.cpp @@ -90,8 +90,6 @@ QmlProfilerApplication::QmlProfilerApplication(int &argc, char **argv) : connect(&m_connectTimer, SIGNAL(timeout()), this, SLOT(tryToConnect())); connect(&m_connection, SIGNAL(connected()), this, SLOT(connected())); - connect(&m_connection, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(connectionStateChanged(QAbstractSocket::SocketState))); - connect(&m_connection, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError(QAbstractSocket::SocketError))); connect(&m_qmlProfilerClient, SIGNAL(enabledChanged(bool)), this, SLOT(traceClientEnabledChanged(bool))); @@ -500,7 +498,7 @@ void QmlProfilerApplication::tryToConnect() QString::number(m_connectionAttempts))); } - if (m_connection.state() == QAbstractSocket::UnconnectedState) { + if (!m_connection.isConnected()) { logStatus(QString("Connecting to %1:%2 ...").arg(m_hostName, QString::number(m_port))); m_connection.connectToHost(m_hostName, m_port); @@ -515,19 +513,6 @@ void QmlProfilerApplication::connected() .arg(m_hostName).arg((m_port)).arg(m_recording ? tr("on") : tr("off"))); } -void QmlProfilerApplication::connectionStateChanged( - QAbstractSocket::SocketState state) -{ - if (m_verbose) - qDebug() << state; -} - -void QmlProfilerApplication::connectionError(QAbstractSocket::SocketError error) -{ - if (m_verbose) - qDebug() << error; -} - void QmlProfilerApplication::processHasOutput() { Q_ASSERT(m_process); diff --git a/tools/qmlprofiler/qmlprofilerapplication.h b/tools/qmlprofiler/qmlprofilerapplication.h index 1f06108673..ca36dd5981 100644 --- a/tools/qmlprofiler/qmlprofilerapplication.h +++ b/tools/qmlprofiler/qmlprofilerapplication.h @@ -34,13 +34,16 @@ #ifndef QMLPROFILERAPPLICATION_H #define QMLPROFILERAPPLICATION_H -#include -#include -#include - #include "qmlprofilerclient.h" #include "qmlprofilerdata.h" +#include + +#include +#include +#include +#include + enum PendingRequest { REQUEST_QUIT, REQUEST_FLUSH_FILE, @@ -73,8 +76,6 @@ private slots: void run(); void tryToConnect(); void connected(); - void connectionStateChanged(QAbstractSocket::SocketState state); - void connectionError(QAbstractSocket::SocketError error); void processHasOutput(); void processFinished(); diff --git a/tools/qmlprofiler/qmlprofilerclient.h b/tools/qmlprofiler/qmlprofilerclient.h index b4bf97fdf3..daaf624d7d 100644 --- a/tools/qmlprofiler/qmlprofilerclient.h +++ b/tools/qmlprofiler/qmlprofilerclient.h @@ -34,9 +34,10 @@ #ifndef QMLPROFILERCLIENT_H #define QMLPROFILERCLIENT_H -#include "qqmldebugclient.h" #include "qmlprofilereventlocation.h" -#include + +#include +#include class QmlProfilerClient : public QQmlDebugClient { diff --git a/tools/qmlprofiler/qqmldebugclient.cpp b/tools/qmlprofiler/qqmldebugclient.cpp deleted file mode 100644 index d661c71e1c..0000000000 --- a/tools/qmlprofiler/qqmldebugclient.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qqmldebugclient.h" - -#include -#include - -#include -#include -#include - -const int protocolVersion = 1; -const QString serverId = QLatin1String("QDeclarativeDebugServer"); -const QString clientId = QLatin1String("QDeclarativeDebugClient"); - -class QQmlDebugClientPrivate -{ -public: - QQmlDebugClientPrivate(); - - QString name; - QQmlDebugConnection *connection; -}; - -class QQmlDebugConnectionPrivate : public QObject -{ - Q_OBJECT -public: - QQmlDebugConnectionPrivate(QQmlDebugConnection *c); - QQmlDebugConnection *q; - QPacketProtocol *protocol; - QIODevice *device; - - bool gotHello; - QHash serverPlugins; - QHash plugins; - - void advertisePlugins(); - void connectDeviceSignals(); - -public Q_SLOTS: - void connected(); - void readyRead(); - void deviceAboutToClose(); -}; - -QQmlDebugConnectionPrivate::QQmlDebugConnectionPrivate(QQmlDebugConnection *c) - : QObject(c), q(c), protocol(0), device(0), gotHello(false) -{ - protocol = new QPacketProtocol(q, this); - QObject::connect(c, SIGNAL(connected()), this, SLOT(connected())); - QObject::connect(protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); -} - -void QQmlDebugConnectionPrivate::advertisePlugins() -{ - if (!q->isConnected()) - return; - - QPacket pack; - pack << serverId << 1 << plugins.keys(); - protocol->send(pack); - q->flush(); -} - -void QQmlDebugConnectionPrivate::connected() -{ - QPacket pack; - pack << serverId << 0 << protocolVersion << plugins.keys(); - protocol->send(pack); - q->flush(); -} - -void QQmlDebugConnectionPrivate::readyRead() -{ - if (!gotHello) { - QPacket pack = protocol->read(); - QString name; - - pack >> name; - - bool validHello = false; - if (name == clientId) { - int op = -1; - pack >> op; - if (op == 0) { - int version = -1; - pack >> version; - if (version == protocolVersion) { - QStringList pluginNames; - QList pluginVersions; - pack >> pluginNames; - if (!pack.atEnd()) - pack >> pluginVersions; - - const int pluginNamesSize = pluginNames.size(); - const int pluginVersionsSize = pluginVersions.size(); - for (int i = 0; i < pluginNamesSize; ++i) { - float pluginVersion = 1.0; - if (i < pluginVersionsSize) - pluginVersion = pluginVersions.at(i); - serverPlugins.insert(pluginNames.at(i), pluginVersion); - } - - validHello = true; - } - } - } - - if (!validHello) { - qWarning("QQmlDebugConnection: Invalid hello message"); - QObject::disconnect(protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); - return; - } - gotHello = true; - - QHash::Iterator iter = plugins.begin(); - for (; iter != plugins.end(); ++iter) { - QQmlDebugClient::State newState = QQmlDebugClient::Unavailable; - if (serverPlugins.contains(iter.key())) - newState = QQmlDebugClient::Enabled; - iter.value()->stateChanged(newState); - } - } - - while (protocol->packetsAvailable()) { - QPacket pack = protocol->read(); - QString name; - pack >> name; - - if (name == clientId) { - int op = -1; - pack >> op; - - if (op == 1) { - // Service Discovery - QHash oldServerPlugins = serverPlugins; - serverPlugins.clear(); - - QStringList pluginNames; - QList pluginVersions; - pack >> pluginNames; - if (!pack.atEnd()) - pack >> pluginVersions; - - const int pluginNamesSize = pluginNames.size(); - const int pluginVersionsSize = pluginVersions.size(); - for (int i = 0; i < pluginNamesSize; ++i) { - float pluginVersion = 1.0; - if (i < pluginVersionsSize) - pluginVersion = pluginVersions.at(i); - serverPlugins.insert(pluginNames.at(i), pluginVersion); - } - - QHash::Iterator iter = plugins.begin(); - for (; iter != plugins.end(); ++iter) { - const QString pluginName = iter.key(); - QQmlDebugClient::State newSate = QQmlDebugClient::Unavailable; - if (serverPlugins.contains(pluginName)) - newSate = QQmlDebugClient::Enabled; - - if (oldServerPlugins.contains(pluginName) - != serverPlugins.contains(pluginName)) { - iter.value()->stateChanged(newSate); - } - } - } else { - qWarning() << "QQmlDebugConnection: Unknown control message id" << op; - } - } else { - QByteArray message; - pack >> message; - - QHash::Iterator iter = - plugins.find(name); - if (iter == plugins.end()) { - qWarning() << "QQmlDebugConnection: Message received for missing plugin" << name; - } else { - (*iter)->messageReceived(message); - } - } - } -} - -void QQmlDebugConnectionPrivate::deviceAboutToClose() -{ - // This is nasty syntax but we want to emit our own aboutToClose signal (by calling QIODevice::close()) - // without calling the underlying device close fn as that would cause an infinite loop - q->QIODevice::close(); -} - -QQmlDebugConnection::QQmlDebugConnection(QObject *parent) - : QIODevice(parent), d(new QQmlDebugConnectionPrivate(this)) -{ -} - -QQmlDebugConnection::~QQmlDebugConnection() -{ - QHash::iterator iter = d->plugins.begin(); - for (; iter != d->plugins.end(); ++iter) { - iter.value()->d->connection = 0; - iter.value()->stateChanged(QQmlDebugClient::NotConnected); - } -} - -bool QQmlDebugConnection::isConnected() const -{ - return state() == QAbstractSocket::ConnectedState; -} - -qint64 QQmlDebugConnection::readData(char *data, qint64 maxSize) -{ - return d->device->read(data, maxSize); -} - -qint64 QQmlDebugConnection::writeData(const char *data, qint64 maxSize) -{ - return d->device->write(data, maxSize); -} - -qint64 QQmlDebugConnection::bytesAvailable() const -{ - return d->device->bytesAvailable(); -} - -bool QQmlDebugConnection::isSequential() const -{ - return true; -} - -void QQmlDebugConnection::close() -{ - if (isOpen()) { - QIODevice::close(); - d->device->close(); - emit stateChanged(QAbstractSocket::UnconnectedState); - - QHash::iterator iter = d->plugins.begin(); - for (; iter != d->plugins.end(); ++iter) { - iter.value()->stateChanged(QQmlDebugClient::NotConnected); - } - } -} - -bool QQmlDebugConnection::waitForConnected(int msecs) -{ - QAbstractSocket *socket = qobject_cast(d->device); - if (socket) - return socket->waitForConnected(msecs); - return false; -} - -QAbstractSocket::SocketState QQmlDebugConnection::state() const -{ - QAbstractSocket *socket = qobject_cast(d->device); - if (socket) - return socket->state(); - - return QAbstractSocket::UnconnectedState; -} - -void QQmlDebugConnection::flush() -{ - QAbstractSocket *socket = qobject_cast(d->device); - if (socket) { - socket->flush(); - return; - } -} - -void QQmlDebugConnection::connectToHost(const QString &hostName, quint16 port) -{ - QTcpSocket *socket = new QTcpSocket(d); -#ifndef QT_NO_NETWORKPROXY - socket->setProxy(QNetworkProxy::NoProxy); -#endif - d->device = socket; - d->connectDeviceSignals(); - d->gotHello = false; - connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SIGNAL(stateChanged(QAbstractSocket::SocketState))); - connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SIGNAL(error(QAbstractSocket::SocketError))); - connect(socket, SIGNAL(connected()), this, SIGNAL(connected())); - socket->connectToHost(hostName, port); - QIODevice::open(ReadWrite | Unbuffered); -} - -void QQmlDebugConnectionPrivate::connectDeviceSignals() -{ - connect(device, SIGNAL(bytesWritten(qint64)), q, SIGNAL(bytesWritten(qint64))); - connect(device, SIGNAL(readyRead()), q, SIGNAL(readyRead())); - connect(device, SIGNAL(aboutToClose()), this, SLOT(deviceAboutToClose())); -} - -// - -QQmlDebugClientPrivate::QQmlDebugClientPrivate() - : connection(0) -{ -} - -QQmlDebugClient::QQmlDebugClient(const QString &name, - QQmlDebugConnection *parent) - : QObject(parent), - d(new QQmlDebugClientPrivate) -{ - d->name = name; - d->connection = parent; - - if (!d->connection) - return; - - if (d->connection->d->plugins.contains(name)) { - qWarning() << "QQmlDebugClient: Conflicting plugin name" << name; - d->connection = 0; - } else { - d->connection->d->plugins.insert(name, this); - d->connection->d->advertisePlugins(); - } -} - -QQmlDebugClient::~QQmlDebugClient() -{ - if (d->connection && d->connection->d) { - d->connection->d->plugins.remove(d->name); - d->connection->d->advertisePlugins(); - } - delete d; -} - -QString QQmlDebugClient::name() const -{ - return d->name; -} - -float QQmlDebugClient::serviceVersion() const -{ - if (d->connection->d->serverPlugins.contains(d->name)) - return d->connection->d->serverPlugins.value(d->name); - return -1; -} - -QQmlDebugClient::State QQmlDebugClient::state() const -{ - if (!d->connection - || !d->connection->isConnected() - || !d->connection->d->gotHello) - return NotConnected; - - if (d->connection->d->serverPlugins.contains(d->name)) - return Enabled; - - return Unavailable; -} - -void QQmlDebugClient::sendMessage(const QByteArray &message) -{ - if (state() != Enabled) - return; - - QPacket pack; - pack << d->name << message; - d->connection->d->protocol->send(pack); - d->connection->flush(); -} - -void QQmlDebugClient::stateChanged(State) -{ -} - -void QQmlDebugClient::messageReceived(const QByteArray &) -{ -} - -#include diff --git a/tools/qmlprofiler/qqmldebugclient.h b/tools/qmlprofiler/qqmldebugclient.h deleted file mode 100644 index 522f6bca2f..0000000000 --- a/tools/qmlprofiler/qqmldebugclient.h +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QQMLDEBUGCLIENT_H -#define QQMLDEBUGCLIENT_H - -#include - -class QQmlDebugConnectionPrivate; -class QQmlDebugConnection : public QIODevice -{ - Q_OBJECT - Q_DISABLE_COPY(QQmlDebugConnection) -public: - QQmlDebugConnection(QObject * = 0); - ~QQmlDebugConnection(); - - void connectToHost(const QString &hostName, quint16 port); - - qint64 bytesAvailable() const; - bool isConnected() const; - QAbstractSocket::SocketState state() const; - void flush(); - bool isSequential() const; - void close(); - bool waitForConnected(int msecs = 30000); - -signals: - void connected(); - void stateChanged(QAbstractSocket::SocketState socketState); - void error(QAbstractSocket::SocketError socketError); - -protected: - qint64 readData(char *data, qint64 maxSize); - qint64 writeData(const char *data, qint64 maxSize); - -private: - QQmlDebugConnectionPrivate *d; - friend class QQmlDebugClient; - friend class QQmlDebugClientPrivate; -}; - -class QQmlDebugClientPrivate; -class QQmlDebugClient : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(QQmlDebugClient) - -public: - enum State { NotConnected, Unavailable, Enabled }; - - QQmlDebugClient(const QString &, QQmlDebugConnection *parent); - ~QQmlDebugClient(); - - QString name() const; - float serviceVersion() const; - State state() const; - - virtual void sendMessage(const QByteArray &); - -protected: - virtual void stateChanged(State); - virtual void messageReceived(const QByteArray &); - -private: - QQmlDebugClientPrivate *d; - friend class QQmlDebugConnection; - friend class QQmlDebugConnectionPrivate; -}; - -#endif // QQMLDEBUGCLIENT_H -- cgit v1.2.3