aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@theqtcompany.com>2015-11-03 14:32:25 +0100
committerUlf Hermann <ulf.hermann@theqtcompany.com>2015-11-17 18:42:07 +0000
commit0b67dd7e132d7d618fa538e8c4a275c874543342 (patch)
tree3c6c7cdf8fbae8c6a7d0d333d96c22d130413980 /src/plugins
parente010b64d38cb8533d779ac0fe8d609f00a6793e7 (diff)
QmlDebug: Restructure QPacket and QPacketProtocol
We cannot use the same data stream version for the client and server versions of QPacket and QPacketProtocol should not deal with QPackets but with simple byte arrays because the underlying QDataStream is hard to copy. The new QQmlDebugPacket picks its data stream version from QQmlDebugConnector now, which adjusts it when connecting. As there can only ever be one QQmlDebugConnector, we can keep the version static. The clients need to query the connection for the correct version. We may connect to several different servers sequentially or we may have a server running while using a client, and we don't want to confuse the versions between those. With this in place, all remaining occurrences of QDataStream are replaced with QPacket or QQmlDebugPacket. Change-Id: I3f6ba73fcbfad5e8df917c5feb9308116738a614 Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/qmltooling/packetprotocol/packetprotocol.pro6
-rw-r--r--src/plugins/qmltooling/packetprotocol/qpacket.cpp112
-rw-r--r--src/plugins/qmltooling/packetprotocol/qpacket_p.h67
-rw-r--r--src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp31
-rw-r--r--src/plugins/qmltooling/packetprotocol/qpacketprotocol_p.h5
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qdebugmessageservice.cpp6
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qmldbg_debugger.pro3
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp13
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp8
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp9
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp12
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro3
-rw-r--r--src/plugins/qmltooling/qmldbg_native/qmldbg_native.pro6
-rw-r--r--src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.cpp12
-rw-r--r--src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.h1
-rw-r--r--src/plugins/qmltooling/qmldbg_profiler/qmldbg_profiler.pro3
-rw-r--r--src/plugins/qmltooling/qmldbg_profiler/qqmlenginecontrolservice.cpp6
-rw-r--r--src/plugins/qmltooling/qmldbg_profiler/qqmlprofileradapter.cpp5
-rw-r--r--src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp12
-rw-r--r--src/plugins/qmltooling/qmldbg_profiler/qv4profileradapter.cpp13
-rw-r--r--src/plugins/qmltooling/qmldbg_quickprofiler/qmldbg_quickprofiler.pro5
-rw-r--r--src/plugins/qmltooling/qmldbg_quickprofiler/qquickprofileradapter.cpp4
-rw-r--r--src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro3
-rw-r--r--src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp22
-rw-r--r--src/plugins/qmltooling/qmltooling.pro18
-rw-r--r--src/plugins/qmltooling/shared/qqmldebugpacket.h64
-rw-r--r--src/plugins/qmltooling/shared/qqmldebugserver.h2
27 files changed, 355 insertions, 96 deletions
diff --git a/src/plugins/qmltooling/packetprotocol/packetprotocol.pro b/src/plugins/qmltooling/packetprotocol/packetprotocol.pro
index a6b8f26bb1..383e32b54e 100644
--- a/src/plugins/qmltooling/packetprotocol/packetprotocol.pro
+++ b/src/plugins/qmltooling/packetprotocol/packetprotocol.pro
@@ -3,9 +3,11 @@ QT = core-private qml-private
CONFIG += static internal_module
HEADERS = \
- qpacketprotocol_p.h
+ qpacketprotocol_p.h \
+ qpacket_p.h
SOURCES = \
- qpacketprotocol.cpp
+ qpacketprotocol.cpp \
+ qpacket.cpp
load(qt_module)
diff --git a/src/plugins/qmltooling/packetprotocol/qpacket.cpp b/src/plugins/qmltooling/packetprotocol/qpacket.cpp
new file mode 100644
index 0000000000..1bb611ab25
--- /dev/null
+++ b/src/plugins/qmltooling/packetprotocol/qpacket.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** 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 "qpacket_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QPacket
+ \internal
+
+ \brief The QPacket class encapsulates an unfragmentable packet of data to be
+ transmitted by QPacketProtocol.
+
+ The QPacket class works together with QPacketProtocol to make it simple to
+ send arbitrary sized data "packets" across fragmented transports such as TCP
+ and UDP.
+
+ QPacket provides a QDataStream interface to an unfragmentable packet.
+ Applications should construct a QPacket, propagate it with data and then
+ transmit it over a QPacketProtocol instance. For example:
+ \code
+ int version = QDataStream::Qt_DefaultCompiledVersion;
+ QPacketProtocol protocol(...);
+
+ QPacket myPacket(version);
+ myPacket << "Hello world!" << 123;
+ protocol.send(myPacket.data());
+ \endcode
+
+ As long as both ends of the connection are using the QPacketProtocol class
+ and the same data stream version, the data within this packet will be
+ delivered unfragmented at the other end, ready for extraction.
+
+ \code
+ QByteArray greeting;
+ int count;
+
+ QPacket myPacket(version, protocol.read());
+
+ myPacket >> greeting >> count;
+ \endcode
+
+ Only packets constructed from raw byte arrays may be read from. Empty QPacket
+ instances are for transmission only and are considered "write only". Attempting
+ to read data from them will result in undefined behavior.
+
+ \ingroup io
+ \sa QPacketProtocol
+ */
+
+
+/*!
+ Constructs an empty write-only packet.
+ */
+QPacket::QPacket(int version)
+{
+ buf.open(QIODevice::WriteOnly);
+ setDevice(&buf);
+ setVersion(version);
+}
+
+/*!
+ Constructs a read-only packet.
+ */
+QPacket::QPacket(int version, const QByteArray &data)
+{
+ buf.setData(data);
+ buf.open(QIODevice::ReadOnly);
+ setDevice(&buf);
+ setVersion(version);
+}
+
+/*!
+ Returns raw packet data.
+ */
+QByteArray QPacket::data() const
+{
+ return buf.data();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/qmltooling/packetprotocol/qpacket_p.h b/src/plugins/qmltooling/packetprotocol/qpacket_p.h
new file mode 100644
index 0000000000..dda152dfd1
--- /dev/null
+++ b/src/plugins/qmltooling/packetprotocol/qpacket_p.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** 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 QPACKET_H
+#define QPACKET_H
+
+#include <QtCore/qdatastream.h>
+#include <QtCore/qbuffer.h>
+
+//
+// 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 QPacket : public QDataStream
+{
+public:
+ QPacket(int version);
+ explicit QPacket(int version, const QByteArray &ba);
+ QByteArray data() const;
+
+private:
+ void init(QIODevice::OpenMode mode);
+ QBuffer buf;
+};
+
+QT_END_NAMESPACE
+
+#endif // QPACKET_H
diff --git a/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp b/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp
index 9f9dbfee90..d576e74e53 100644
--- a/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp
+++ b/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp
@@ -36,7 +36,6 @@
#include <QtCore/QElapsedTimer>
#include <private/qiodevice_p.h>
#include <private/qobject_p.h>
-#include <private/qpacket_p.h>
QT_BEGIN_NAMESPACE
@@ -63,9 +62,8 @@ static const int MAX_PACKET_SIZE = 0x7FFFFFFF;
QPacketProtocol does not perform any communications itself. Instead it can
operate on any QIODevice that supports the QIODevice::readyRead() signal. A
- logical "packet" is encapsulated by the companion QPacket class. The
- following example shows two ways to send data using QPacketProtocol. The
- transmitted data is equivalent in both.
+ logical "packet" is simply a QByteArray. The following example how to send
+ data using QPacketProtocol.
\code
QTcpSocket socket;
@@ -74,9 +72,9 @@ static const int MAX_PACKET_SIZE = 0x7FFFFFFF;
QPacketProtocol protocol(&socket);
// Send a packet
- QPacket packet;
+ QDataStream packet;
packet << "Hello world" << 123;
- protocol.send(packet);
+ protocol.send(packet.data());
\endcode
Likewise, the following shows how to read data from QPacketProtocol, assuming
@@ -88,16 +86,12 @@ static const int MAX_PACKET_SIZE = 0x7FFFFFFF;
int a;
QByteArray b;
- // Receive packet the quick way
- protocol.read() >> a >> b;
-
- // Receive packet the longer way
- QPacket packet = protocol.read();
+ // Receive packet
+ QDataStream packet(protocol.read());
p >> a >> b;
\endcode
\ingroup io
- \sa QPacket
*/
class QPacketProtocolPrivate : public QObjectPrivate
@@ -133,15 +127,14 @@ QPacketProtocol::QPacketProtocol(QIODevice *dev, QObject *parent)
}
/*!
- \fn void QPacketProtocol::send(const QPacket & packet)
+ \fn void QPacketProtocol::send(const QByteArray &data)
Transmit the \a packet.
*/
-void QPacketProtocol::send(const QPacket & p)
+void QPacketProtocol::send(const QByteArray &data)
{
Q_D(QPacketProtocol);
- QByteArray data = p.data();
if (data.isEmpty())
return; // We don't send empty packets
qint64 sendSize = data.size() + sizeof(qint32);
@@ -165,15 +158,13 @@ qint64 QPacketProtocol::packetsAvailable() const
}
/*!
- Return the next unread packet, or an invalid QPacket instance if no packets
+ Return the next unread packet, or an empty QByteArray if no packets
are available. This method does NOT block.
*/
-QPacket QPacketProtocol::read()
+QByteArray QPacketProtocol::read()
{
Q_D(QPacketProtocol);
-
- // Hope for in-place construction here, until we get move semantics for QBuffer
- return QPacket(d->packets.isEmpty() ? QByteArray() : d->packets.takeFirst());
+ return d->packets.isEmpty() ? QByteArray() : d->packets.takeFirst();
}
/*!
diff --git a/src/plugins/qmltooling/packetprotocol/qpacketprotocol_p.h b/src/plugins/qmltooling/packetprotocol/qpacketprotocol_p.h
index 6ed803809f..20bbc66418 100644
--- a/src/plugins/qmltooling/packetprotocol/qpacketprotocol_p.h
+++ b/src/plugins/qmltooling/packetprotocol/qpacketprotocol_p.h
@@ -35,7 +35,6 @@
#define QPACKETPROTOCOL_P_H
#include <QtCore/qobject.h>
-#include <private/qpacket_p.h>
//
// W A R N I N G
@@ -60,9 +59,9 @@ class QPacketProtocol : public QObject
public:
explicit QPacketProtocol(QIODevice *dev, QObject *parent = 0);
- void send(const QPacket &);
+ void send(const QByteArray &data);
qint64 packetsAvailable() const;
- QPacket read();
+ QByteArray read();
bool waitForReadyRead(int msecs = 3000);
Q_SIGNALS:
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qdebugmessageservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qdebugmessageservice.cpp
index e7b9f24ae7..6300b2b9c6 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qdebugmessageservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qdebugmessageservice.cpp
@@ -32,10 +32,8 @@
****************************************************************************/
#include "qdebugmessageservice.h"
+#include "qqmldebugpacket.h"
#include <private/qqmldebugconnector_p.h>
-#include <private/qpacket_p.h>
-
-#include <QDataStream>
QT_BEGIN_NAMESPACE
@@ -64,7 +62,7 @@ void QDebugMessageServiceImpl::sendDebugMessage(QtMsgType type,
//We do not want to alter the message handling mechanism
//We just eavesdrop and forward the messages to a port
//only if a client is connected to it.
- QPacket ws;
+ QQmlDebugPacket ws;
ws << QByteArray("MESSAGE") << type << buf.toUtf8();
ws << QString::fromLatin1(ctxt.file).toUtf8();
ws << ctxt.line << QString::fromLatin1(ctxt.function).toUtf8();
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qmldbg_debugger.pro b/src/plugins/qmltooling/qmldbg_debugger/qmldbg_debugger.pro
index b0678ef2d9..9db38d2dfe 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qmldbg_debugger.pro
+++ b/src/plugins/qmltooling/qmldbg_debugger/qmldbg_debugger.pro
@@ -1,5 +1,5 @@
TARGET = qmldbg_debugger
-QT = qml-private core-private
+QT = qml-private core-private packetprotocol-private
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QQmlDebuggerServiceFactory
@@ -19,6 +19,7 @@ SOURCES += \
HEADERS += \
$$PWD/../shared/qqmlconfigurabledebugservice.h \
+ $$PWD/../shared/qqmldebugpacket.h \
$$PWD/qdebugmessageservice.h \
$$PWD/qqmldebuggerservicefactory.h \
$$PWD/qqmlenginedebugservice.h \
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp
index 09c352e8ad..48d940fe75 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp
@@ -33,6 +33,7 @@
#include "qqmlenginedebugservice.h"
#include "qqmlwatcher.h"
+#include "qqmldebugpacket.h"
#include <private/qqmldebugstatesdelegate_p.h>
#include <private/qqmlboundsignal_p.h>
@@ -45,7 +46,6 @@
#include <private/qqmlvaluetype_p.h>
#include <private/qqmlvmemetaobject_p.h>
#include <private/qqmlexpression_p.h>
-#include <private/qpacket_p.h>
#include <QtCore/qdebug.h>
#include <QtCore/qmetaobject.h>
@@ -90,8 +90,7 @@ QDataStream &operator<<(QDataStream &ds,
ds << (int)data.type << data.name;
// check first whether the data can be saved
// (otherwise we assert in QVariant::operator<<)
- QByteArray buffer;
- QDataStream fakeStream(&buffer, QIODevice::WriteOnly);
+ QQmlDebugPacket fakeStream;
if (QMetaType::save(fakeStream, data.value.type(), data.value.constData()))
ds << data.value;
else
@@ -441,13 +440,13 @@ QList<QObject*> QQmlEngineDebugServiceImpl::objectForLocationInfo(const QString
void QQmlEngineDebugServiceImpl::processMessage(const QByteArray &message)
{
- QPacket ds(message);
+ QQmlDebugPacket ds(message);
QByteArray type;
int queryId;
ds >> type >> queryId;
- QPacket rs;
+ QQmlDebugPacket rs;
if (type == "LIST_ENGINES") {
rs << QByteArray("LIST_ENGINES_R");
@@ -769,7 +768,7 @@ bool QQmlEngineDebugServiceImpl::setMethodBody(int objectId, const QString &meth
void QQmlEngineDebugServiceImpl::propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value)
{
- QPacket rs;
+ QQmlDebugPacket rs;
rs << QByteArray("UPDATE_WATCH") << id << objectId << QByteArray(property.name()) << valueContents(value);
emit messageToClient(name(), rs.data());
}
@@ -801,7 +800,7 @@ void QQmlEngineDebugServiceImpl::objectCreated(QQmlEngine *engine, QObject *obje
int objectId = QQmlDebugService::idForObject(object);
int parentId = QQmlDebugService::idForObject(object->parent());
- QPacket rs;
+ QQmlDebugPacket rs;
//unique queryId -1
rs << QByteArray("OBJECT_CREATED") << -1 << engineId << objectId << parentId;
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp
index f5cc78e77f..6d17ec2ad0 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp
@@ -32,6 +32,7 @@
****************************************************************************/
#include "qqmlnativedebugservice.h"
+#include "qqmldebugpacket.h"
#include <private/qqmldebugconnector_p.h>
#include <private/qv4debugging_p.h>
@@ -313,16 +314,15 @@ void NativeDebugger::handleCommand(QJsonObject *response, const QString &cmd,
static QString encodeContext(QV4::ExecutionContext *executionContext)
{
- QByteArray ba;
- QDataStream ds(&ba, QIODevice::WriteOnly);
+ QQmlDebugPacket ds;
ds << quintptr(executionContext);
- return QString::fromLatin1(ba.toHex());
+ return QString::fromLatin1(ds.data().toHex());
}
static void decodeContext(const QString &context, QV4::ExecutionContext **executionContext)
{
quintptr rawContext;
- QDataStream ds(QByteArray::fromHex(context.toLatin1()));
+ QQmlDebugPacket ds(QByteArray::fromHex(context.toLatin1()));
ds >> rawContext;
*executionContext = reinterpret_cast<QV4::ExecutionContext *>(rawContext);
}
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp
index 3a080be125..0c8de860ed 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp
@@ -33,11 +33,12 @@
#include "qv4debugservice.h"
#include "qqmlengine.h"
+#include "qqmldebugpacket.h"
+
#include <private/qv4engine_p.h>
#include <private/qv4isel_moth_p.h>
#include <private/qv4function_p.h>
#include <private/qqmldebugconnector_p.h>
-#include <private/qpacket_p.h>
#include <private/qv8engine_p.h>
#include <QtCore/QJsonArray>
@@ -694,7 +695,7 @@ void QV4DebugServiceImpl::messageReceived(const QByteArray &message)
{
QMutexLocker lock(&m_configMutex);
- QPacket ms(message);
+ QQmlDebugPacket ms(message);
QByteArray header;
ms >> header;
@@ -735,7 +736,7 @@ void QV4DebugServiceImpl::messageReceived(const QByteArray &message)
void QV4DebugServiceImpl::sendSomethingToSomebody(const char *type, int magicNumber)
{
- QPacket rs;
+ QQmlDebugPacket rs;
rs << QByteArray(type)
<< QByteArray::number(int(version())) << QByteArray::number(magicNumber);
emit messageToClient(name(), packMessage(type, rs.data()));
@@ -758,7 +759,7 @@ void QV4DebugServiceImpl::handleV8Request(const QByteArray &payload)
QByteArray QV4DebugServiceImpl::packMessage(const QByteArray &command, const QByteArray &message)
{
- QPacket rs;
+ QQmlDebugPacket rs;
static const QByteArray cmd("V8DEBUG");
rs << cmd << command << message;
return rs.data();
diff --git a/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp b/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp
index d1bba54969..daf620805f 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp
+++ b/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp
@@ -33,6 +33,7 @@
#include "abstractviewinspector.h"
#include "abstracttool.h"
+#include "qqmldebugpacket.h"
#include <QtCore/QDebug>
#include <QtQml/QQmlEngine>
@@ -40,7 +41,6 @@
#include <QtCore/private/qabstractanimation_p.h>
#include <QtQml/private/qqmldebugconnector_p.h>
#include <QtQml/private/qqmlcontext_p.h>
-#include <QtQml/private/qpacket_p.h>
#include <QtGui/QMouseEvent>
#include <QtGui/QTouchEvent>
@@ -263,7 +263,7 @@ void AbstractViewInspector::onQmlObjectDestroyed(QObject *object)
QPair<int, int> ids = m_hashObjectsTobeDestroyed.take(object);
- QPacket rs;
+ QQmlDebugPacket rs;
rs << QByteArray(RESPONSE) << ids.first << true << ids.second;
emit m_debugService->messageToClient(m_debugService->name(), rs.data());
@@ -272,7 +272,7 @@ void AbstractViewInspector::onQmlObjectDestroyed(QObject *object)
void AbstractViewInspector::handleMessage(const QByteArray &message)
{
bool success = true;
- QPacket ds(message);
+ QQmlDebugPacket ds(message);
QByteArray type;
ds >> type;
@@ -357,14 +357,14 @@ void AbstractViewInspector::handleMessage(const QByteArray &message)
}
- QPacket rs;
+ QQmlDebugPacket rs;
rs << QByteArray(RESPONSE) << requestId << success;
emit m_debugService->messageToClient(m_debugService->name(), rs.data());
}
void AbstractViewInspector::sendCurrentObjects(const QList<QObject*> &objects)
{
- QPacket ds;
+ QQmlDebugPacket ds;
ds << QByteArray(EVENT) << m_eventId++ << QByteArray(SELECT);
@@ -384,7 +384,7 @@ void AbstractViewInspector::sendQmlFileReloaded(bool success)
QByteArray response;
- QPacket rs;
+ QQmlDebugPacket rs;
rs << QByteArray(RESPONSE) << m_reloadEventId << success;
emit m_debugService->messageToClient(m_debugService->name(), rs.data());
diff --git a/src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro b/src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro
index 1c3e5f387b..dd5cc8ceef 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro
+++ b/src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro
@@ -1,5 +1,5 @@
TARGET = qmldbg_inspector
-QT += qml-private quick-private core-private gui-private
+QT += qml-private quick-private core-private gui-private packetprotocol-private
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QQmlInspectorServiceFactory
@@ -16,6 +16,7 @@ SOURCES += \
$$PWD/qqmlinspectorservice.cpp
HEADERS += \
+ $$PWD/../shared/qqmldebugpacket.h \
$$PWD/highlight.h \
$$PWD/qquickviewinspector.h \
$$PWD/qqmlinspectorservicefactory.h \
diff --git a/src/plugins/qmltooling/qmldbg_native/qmldbg_native.pro b/src/plugins/qmltooling/qmldbg_native/qmldbg_native.pro
index 8621238eff..d490d77e50 100644
--- a/src/plugins/qmltooling/qmldbg_native/qmldbg_native.pro
+++ b/src/plugins/qmltooling/qmldbg_native/qmldbg_native.pro
@@ -1,15 +1,19 @@
TARGET = qmldbg_native
-QT += qml-private core-private
+QT += qml-private core-private packetprotocol-private
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QQmlNativeDebugConnectorFactory
load(qt_plugin)
HEADERS += \
+ $$PWD/../shared/qqmldebugpacket.h \
$$PWD/qqmlnativedebugconnector.h
SOURCES += \
$$PWD/qqmlnativedebugconnector.cpp
+INCLUDEPATH += $$PWD \
+ $$PWD/../shared
+
OTHER_FILES += \
$$PWD/qqmlnativedebugconnector.json
diff --git a/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.cpp b/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.cpp
index faddaefdc7..7f5529636c 100644
--- a/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.cpp
+++ b/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.cpp
@@ -32,9 +32,9 @@
****************************************************************************/
#include "qqmlnativedebugconnector.h"
-#include <private/qhooks_p.h>
-#include <private/qpacket_p.h>
+#include "qqmldebugpacket.h"
+#include <private/qhooks_p.h>
#include <qqmlengine.h>
#include <QtCore/qdebug.h>
@@ -65,7 +65,7 @@ Q_DECL_EXPORT void qt_qmlDebugConnectorOpen();
// member to some other place.
Q_DECL_EXPORT void qt_qmlDebugSetStreamVersion(int version)
{
- QPacket::setDataStreamVersion(version);
+ QQmlNativeDebugConnector::setDataStreamVersion(version);
}
@@ -311,6 +311,12 @@ bool QQmlNativeDebugConnector::open(const QVariantHash &configuration)
return true;
}
+void QQmlNativeDebugConnector::setDataStreamVersion(int version)
+{
+ Q_ASSERT(version <= QDataStream::Qt_DefaultCompiledVersion);
+ s_dataStreamVersion = version;
+}
+
void QQmlNativeDebugConnector::sendMessage(const QString &name, const QByteArray &message)
{
(*responseBuffer) += name.toUtf8() + ' ' + QByteArray::number(message.size()) + ' ' + message;
diff --git a/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.h b/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.h
index f0d11957a7..d071d54368 100644
--- a/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.h
+++ b/src/plugins/qmltooling/qmldbg_native/qqmlnativedebugconnector.h
@@ -54,6 +54,7 @@ public:
bool addService(const QString &name, QQmlDebugService *service);
bool removeService(const QString &name);
bool open(const QVariantHash &configuration);
+ static void setDataStreamVersion(int version);
private slots:
void sendMessage(const QString &name, const QByteArray &message);
diff --git a/src/plugins/qmltooling/qmldbg_profiler/qmldbg_profiler.pro b/src/plugins/qmltooling/qmldbg_profiler/qmldbg_profiler.pro
index e1c4095d88..6efe9eacad 100644
--- a/src/plugins/qmltooling/qmldbg_profiler/qmldbg_profiler.pro
+++ b/src/plugins/qmltooling/qmldbg_profiler/qmldbg_profiler.pro
@@ -1,5 +1,5 @@
TARGET = qmldbg_profiler
-QT = qml-private core-private
+QT = qml-private core-private packetprotocol-private
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QQmlProfilerServiceFactory
@@ -14,6 +14,7 @@ SOURCES += \
HEADERS += \
$$PWD/../shared/qqmlconfigurabledebugservice.h \
+ $$PWD/../shared/qqmldebugpacket.h \
$$PWD/qqmlenginecontrolservice.h \
$$PWD/qqmlprofileradapter.h \
$$PWD/qqmlprofilerservice.h \
diff --git a/src/plugins/qmltooling/qmldbg_profiler/qqmlenginecontrolservice.cpp b/src/plugins/qmltooling/qmldbg_profiler/qqmlenginecontrolservice.cpp
index b4dfa86e56..61bf61eb13 100644
--- a/src/plugins/qmltooling/qmldbg_profiler/qqmlenginecontrolservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_profiler/qqmlenginecontrolservice.cpp
@@ -32,8 +32,8 @@
****************************************************************************/
#include "qqmlenginecontrolservice.h"
+#include "qqmldebugpacket.h"
#include <QQmlEngine>
-#include <private/qpacket_p.h>
QT_BEGIN_NAMESPACE
@@ -45,7 +45,7 @@ QQmlEngineControlServiceImpl::QQmlEngineControlServiceImpl(QObject *parent) :
void QQmlEngineControlServiceImpl::messageReceived(const QByteArray &message)
{
QMutexLocker lock(&dataMutex);
- QPacket d(message);
+ QQmlDebugPacket d(message);
int command;
int engineId;
d >> command >> engineId;
@@ -107,7 +107,7 @@ void QQmlEngineControlServiceImpl::engineRemoved(QQmlEngine *engine)
void QQmlEngineControlServiceImpl::sendMessage(QQmlEngineControlServiceImpl::MessageType type, QQmlEngine *engine)
{
- QPacket d;
+ QQmlDebugPacket d;
d << type << idForObject(engine);
emit messageToClient(name(), d.data());
}
diff --git a/src/plugins/qmltooling/qmldbg_profiler/qqmlprofileradapter.cpp b/src/plugins/qmltooling/qmldbg_profiler/qqmlprofileradapter.cpp
index 8da6854289..faa1726637 100644
--- a/src/plugins/qmltooling/qmldbg_profiler/qqmlprofileradapter.cpp
+++ b/src/plugins/qmltooling/qmldbg_profiler/qqmlprofileradapter.cpp
@@ -32,8 +32,9 @@
****************************************************************************/
#include "qqmlprofileradapter.h"
+#include "qqmldebugpacket.h"
+
#include <private/qqmldebugserviceinterfaces_p.h>
-#include <private/qpacket_p.h>
QT_BEGIN_NAMESPACE
@@ -74,7 +75,7 @@ static void qQmlProfilerDataToByteArrays(const QQmlProfilerData *d, QList<QByteA
continue;
//### using QDataStream is relatively expensive
- QPacket ds;
+ QQmlDebugPacket ds;
ds << d->time << decodedMessageType << decodedDetailType;
switch (decodedMessageType) {
diff --git a/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp b/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp
index 77503c5f06..3647a62682 100644
--- a/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp
@@ -35,11 +35,11 @@
#include "qv4profileradapter.h"
#include "qqmlprofileradapter.h"
#include "qqmlprofilerservicefactory.h"
+#include "qqmldebugpacket.h"
+
#include <private/qqmlengine_p.h>
-#include <private/qpacket_p.h>
#include <private/qqmldebugpluginmanager_p.h>
-#include <QtCore/qdatastream.h>
#include <QtCore/qurl.h>
#include <QtCore/qtimer.h>
#include <QtCore/qthread.h>
@@ -212,7 +212,7 @@ void QQmlProfilerServiceImpl::startProfiling(QQmlEngine *engine, quint64 feature
{
QMutexLocker lock(&m_configMutex);
- QPacket d;
+ QQmlDebugPacket d;
d << m_timer.nsecsElapsed() << (int)Event << (int)StartTrace;
bool startedAny = false;
@@ -308,7 +308,7 @@ void QQmlProfilerServiceImpl::sendMessages()
{
QList<QByteArray> messages;
- QPacket traceEnd;
+ QQmlDebugPacket traceEnd;
if (m_waitingForStop) {
traceEnd << m_timer.nsecsElapsed() << (int)Event << (int)EndTrace;
@@ -340,7 +340,7 @@ void QQmlProfilerServiceImpl::sendMessages()
//indicate completion
messages << traceEnd.data();
- QPacket ds;
+ QQmlDebugPacket ds;
ds << (qint64)-1 << (int)Complete;
messages << ds.data();
m_waitingForStop = false;
@@ -375,7 +375,7 @@ void QQmlProfilerServiceImpl::messageReceived(const QByteArray &message)
{
QMutexLocker lock(&m_configMutex);
- QPacket stream(message);
+ QQmlDebugPacket stream(message);
int engineId = -1;
quint64 features = std::numeric_limits<quint64>::max();
diff --git a/src/plugins/qmltooling/qmldbg_profiler/qv4profileradapter.cpp b/src/plugins/qmltooling/qmldbg_profiler/qv4profileradapter.cpp
index dd9e444748..2e7051b912 100644
--- a/src/plugins/qmltooling/qmldbg_profiler/qv4profileradapter.cpp
+++ b/src/plugins/qmltooling/qmldbg_profiler/qv4profileradapter.cpp
@@ -33,8 +33,7 @@
#include "qv4profileradapter.h"
#include "qqmlprofilerservice.h"
-
-#include <private/qpacket_p.h>
+#include "qqmldebugpacket.h"
QT_BEGIN_NAMESPACE
@@ -66,7 +65,7 @@ QV4ProfilerAdapter::QV4ProfilerAdapter(QQmlProfilerService *service, QV4::Execut
qint64 QV4ProfilerAdapter::appendMemoryEvents(qint64 until, QList<QByteArray> &messages)
{
while (m_memoryData.length() > m_memoryPos && m_memoryData[m_memoryPos].timestamp <= until) {
- QPacket d;
+ QQmlDebugPacket d;
QV4::Profiling::MemoryAllocationProperties &props = m_memoryData[m_memoryPos];
d << props.timestamp << MemoryAllocation << props.type << props.size;
++m_memoryPos;
@@ -104,7 +103,7 @@ qint64 QV4ProfilerAdapter::sendMessages(qint64 until, QList<QByteArray> &message
return finalizeMessages(until, messages, m_stack.top());
appendMemoryEvents(m_stack.top(), messages);
- QPacket d;
+ QQmlDebugPacket d;
d << m_stack.pop() << RangeEnd << Javascript;
messages.append(d.data());
}
@@ -117,14 +116,14 @@ qint64 QV4ProfilerAdapter::sendMessages(qint64 until, QList<QByteArray> &message
appendMemoryEvents(props.start, messages);
- QPacket d_start;
+ QQmlDebugPacket d_start;
d_start << props.start << RangeStart << Javascript;
messages.push_back(d_start.data());
- QPacket d_location;
+ QQmlDebugPacket d_location;
d_location << props.start << RangeLocation << Javascript << props.file << props.line
<< props.column;
messages.push_back(d_location.data());
- QPacket d_data;
+ QQmlDebugPacket d_data;
d_data << props.start << RangeData << Javascript << props.name;
messages.push_back(d_data.data());
m_stack.push(props.end);
diff --git a/src/plugins/qmltooling/qmldbg_quickprofiler/qmldbg_quickprofiler.pro b/src/plugins/qmltooling/qmldbg_quickprofiler/qmldbg_quickprofiler.pro
index 9cc51c5e70..6ca0a184ca 100644
--- a/src/plugins/qmltooling/qmldbg_quickprofiler/qmldbg_quickprofiler.pro
+++ b/src/plugins/qmltooling/qmldbg_quickprofiler/qmldbg_quickprofiler.pro
@@ -1,5 +1,5 @@
TARGET = qmldbg_quickprofiler
-QT += qml-private quick-private core-private
+QT += qml-private quick-private core-private packetprotocol-private
PLUGIN_TYPE = qmltooling
PLUGIN_CLASS_NAME = QQuickProfilerAdapterFactory
@@ -13,7 +13,8 @@ SOURCES += \
HEADERS += \
$$PWD/qquickprofileradapter.h \
- $$PWD/qquickprofileradapterfactory.h
+ $$PWD/qquickprofileradapterfactory.h \
+ $$PWD/../shared/qqmldebugpacket.h
OTHER_FILES += \
qquickprofileradapter.json
diff --git a/src/plugins/qmltooling/qmldbg_quickprofiler/qquickprofileradapter.cpp b/src/plugins/qmltooling/qmldbg_quickprofiler/qquickprofileradapter.cpp
index 053db9aa45..8438a6fb3a 100644
--- a/src/plugins/qmltooling/qmldbg_quickprofiler/qquickprofileradapter.cpp
+++ b/src/plugins/qmltooling/qmldbg_quickprofiler/qquickprofileradapter.cpp
@@ -32,9 +32,9 @@
****************************************************************************/
#include "qquickprofileradapter.h"
+#include "qqmldebugpacket.h"
#include <QCoreApplication>
#include <private/qqmldebugserviceinterfaces_p.h>
-#include <private/qpacket_p.h>
#include <private/qquickprofiler_p.h>
QT_BEGIN_NAMESPACE
@@ -86,7 +86,7 @@ static void qQuickProfilerDataToByteArrays(const QQuickProfilerData &data,
continue;
//### using QDataStream is relatively expensive
- QPacket ds;
+ QQmlDebugPacket ds;
ds << data.time << decodedMessageType << decodedDetailType;
switch (decodedMessageType) {
diff --git a/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro b/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro
index b419f9ca3e..923faa01f3 100644
--- a/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro
+++ b/src/plugins/qmltooling/qmldbg_server/qmldbg_server.pro
@@ -11,7 +11,8 @@ SOURCES += \
HEADERS += \
$$PWD/qqmldebugserverfactory.h \
$$PWD/../shared/qqmldebugserver.h \
- $$PWD/../shared/qqmldebugserverconnection.h
+ $$PWD/../shared/qqmldebugserverconnection.h \
+ $$PWD/../shared/qqmldebugpacket.h
INCLUDEPATH += $$PWD \
$$PWD/../shared
diff --git a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
index 513aedd568..ba36048802 100644
--- a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
+++ b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
@@ -34,6 +34,7 @@
#include "qqmldebugserver.h"
#include "qqmldebugserverfactory.h"
#include "qqmldebugserverconnection.h"
+#include "qqmldebugpacket.h"
#include <private/qqmldebugservice_p.h>
#include <private/qqmlengine_p.h>
@@ -41,7 +42,6 @@
#include <private/qqmldebugpluginmanager_p.h>
#include <private/qqmldebugserviceinterfaces_p.h>
#include <private/qpacketprotocol_p.h>
-#include <private/qpacket_p.h>
#include <QtCore/QAtomicInt>
#include <QtCore/QDir>
@@ -429,7 +429,7 @@ void QQmlDebugServerImpl::receiveMessage()
if (!m_protocol)
return;
- QPacket in(m_protocol->read().data());
+ QQmlDebugPacket in(m_protocol->read());
QString name;
@@ -443,17 +443,15 @@ void QQmlDebugServerImpl::receiveMessage()
//Get the supported QDataStream version
if (!in.atEnd()) {
- int dataStreamVersion;
- in >> dataStreamVersion;
- if (dataStreamVersion > QDataStream().version())
- dataStreamVersion = QDataStream().version();
- QPacket::setDataStreamVersion(dataStreamVersion);
+ in >> s_dataStreamVersion;
+ if (s_dataStreamVersion > QDataStream::Qt_DefaultCompiledVersion)
+ s_dataStreamVersion = QDataStream::Qt_DefaultCompiledVersion;
}
// Send the hello answer immediately, since it needs to arrive before
// the plugins below start sending messages.
- QPacket out;
+ QQmlDebugPacket out;
QStringList pluginNames;
QList<float> pluginVersions;
const int count = m_plugins.count();
@@ -466,9 +464,9 @@ void QQmlDebugServerImpl::receiveMessage()
}
out << QString(QStringLiteral("QDeclarativeDebugClient")) << 0 << protocolVersion
- << pluginNames << pluginVersions << QPacket::dataStreamVersion();
+ << pluginNames << pluginVersions << dataStreamVersion();
- m_protocol->send(out);
+ m_protocol->send(out.data());
m_connection->flush();
QMutexLocker helloLock(&m_helloMutex);
@@ -650,9 +648,9 @@ bool QQmlDebugServerImpl::canSendMessage(const QString &name)
void QQmlDebugServerImpl::doSendMessage(const QString &name, const QByteArray &message)
{
- QPacket out;
+ QQmlDebugPacket out;
out << name << message;
- m_protocol->send(out);
+ m_protocol->send(out.data());
}
void QQmlDebugServerImpl::sendMessage(const QString &name, const QByteArray &message)
diff --git a/src/plugins/qmltooling/qmltooling.pro b/src/plugins/qmltooling/qmltooling.pro
index 9345e46cf7..3728126dd9 100644
--- a/src/plugins/qmltooling/qmltooling.pro
+++ b/src/plugins/qmltooling/qmltooling.pro
@@ -1,5 +1,9 @@
TEMPLATE = subdirs
+# Utilities
+SUBDIRS += \
+ packetprotocol
+
# Connectors
SUBDIRS += \
qmldbg_native \
@@ -9,12 +13,18 @@ SUBDIRS += \
# Services
SUBDIRS += \
- packetprotocol \
qmldbg_debugger \
qmldbg_profiler
qmldbg_server.depends = packetprotocol
+qmldbg_native.depends = packetprotocol
+qmldbg_debugger.depends = packetprotocol
+qmldbg_profiler.depends = packetprotocol
-qtHaveModule(quick): SUBDIRS += \
- qmldbg_inspector \
- qmldbg_quickprofiler
+qtHaveModule(quick) {
+ SUBDIRS += \
+ qmldbg_inspector \
+ qmldbg_quickprofiler
+ qmldbg_inspector.depends = packetprotocol
+ qmldbg_quickprofiler.depends = packetprotocol
+}
diff --git a/src/plugins/qmltooling/shared/qqmldebugpacket.h b/src/plugins/qmltooling/shared/qqmldebugpacket.h
new file mode 100644
index 0000000000..459937f411
--- /dev/null
+++ b/src/plugins/qmltooling/shared/qqmldebugpacket.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** 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 QQMLDEBUGPACKET_P_H
+#define QQMLDEBUGPACKET_P_H
+
+#include <QtCore/qbuffer.h>
+#include <QtQml/private/qqmldebugconnector_p.h>
+#include <QtPacketProtocol/private/qpacket_p.h>
+
+//
+// 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
+
+// QPacket with a fixed data stream version, centrally set by QQmlDebugServer
+class QQmlDebugPacket : public QPacket
+{
+public:
+ QQmlDebugPacket() : QPacket(QQmlDebugConnector::dataStreamVersion()) {}
+ QQmlDebugPacket(const QByteArray &ba) : QPacket(QQmlDebugConnector::dataStreamVersion(), ba) {}
+};
+
+QT_END_NAMESPACE
+
+#endif // QQMLDEBUGPACKET_P_H
diff --git a/src/plugins/qmltooling/shared/qqmldebugserver.h b/src/plugins/qmltooling/shared/qqmldebugserver.h
index a7c17075d9..3807f12214 100644
--- a/src/plugins/qmltooling/shared/qqmldebugserver.h
+++ b/src/plugins/qmltooling/shared/qqmldebugserver.h
@@ -37,6 +37,8 @@
#include <private/qqmldebugconnector_p.h>
#include <private/qtqmlglobal_p.h>
+#include <QtCore/QIODevice>
+
//
// W A R N I N G
// -------------