From a3e4a28bee647f40702fd4d97bc6569688cb1763 Mon Sep 17 00:00:00 2001 From: Ulf Hermann <ulf.hermann@theqtcompany.com> Date: Mon, 16 Nov 2015 16:46:51 +0100 Subject: [PATCH] QmlDebug: Unify QPacket and QmlDebugStream and remove unused code There is no point in having both as they serve the same purpose. Also, most of the packet protocol API was never used or tested, and wrapping each byte to be sent into a QPacket is wasteful and unnecessary. Change-Id: Ia421eae33b644fe86a53bcd04092a84ea3000f0d Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com> --- src/libs/qmldebug/baseenginedebugclient.cpp | 68 +++---- .../qmldebug/declarativeenginedebugclient.cpp | 18 +- src/libs/qmldebug/qmldebugclient.cpp | 69 +++---- src/libs/qmldebug/qmldebugclient.h | 13 +- src/libs/qmldebug/qmlprofilertraceclient.cpp | 9 +- src/libs/qmldebug/qpacketprotocol.cpp | 190 ++---------------- src/libs/qmldebug/qpacketprotocol.h | 63 ++---- src/plugins/debugger/qml/qmlengine.cpp | 15 +- 8 files changed, 115 insertions(+), 330 deletions(-) diff --git a/src/libs/qmldebug/baseenginedebugclient.cpp b/src/libs/qmldebug/baseenginedebugclient.cpp index e04d60cb02..a3fea23b34 100644 --- a/src/libs/qmldebug/baseenginedebugclient.cpp +++ b/src/libs/qmldebug/baseenginedebugclient.cpp @@ -30,6 +30,7 @@ #include "baseenginedebugclient.h" #include "qmldebugconstants.h" +#include "qpacketprotocol.h" namespace QmlDebug { @@ -182,7 +183,7 @@ void BaseEngineDebugClient::stateChanged(State state) void BaseEngineDebugClient::messageReceived(const QByteArray &data) { - QmlDebugStream ds(data); + QPacket ds(connection()->currentDataStreamVersion(), data); int queryId; QByteArray type; ds >> type >> queryId; @@ -254,11 +255,10 @@ quint32 BaseEngineDebugClient::addWatch(const PropertyReference &property) quint32 id = 0; if (state() == Enabled) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("WATCH_PROPERTY") << id << property.m_objectDebugId << property.m_name.toUtf8(); - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -276,10 +276,9 @@ quint32 BaseEngineDebugClient::addWatch(const ObjectReference &object, quint32 id = 0; if (state() == Enabled) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("WATCH_EXPR_OBJECT") << id << object.m_debugId << expr; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -289,10 +288,9 @@ quint32 BaseEngineDebugClient::addWatch(int objectDebugId) quint32 id = 0; if (state() == Enabled) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("WATCH_OBJECT") << id << objectDebugId; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -306,10 +304,9 @@ quint32 BaseEngineDebugClient::addWatch(const FileReference &/*file*/) void BaseEngineDebugClient::removeWatch(quint32 id) { if (state() == Enabled) { - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("NO_WATCH") << id; - sendMessage(message); + sendMessage(ds.data()); } } @@ -318,10 +315,9 @@ quint32 BaseEngineDebugClient::queryAvailableEngines() quint32 id = 0; if (state() == Enabled) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("LIST_ENGINES") << id; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -331,10 +327,9 @@ quint32 BaseEngineDebugClient::queryRootContexts(const EngineReference &engine) quint32 id = 0; if (state() == Enabled && engine.m_debugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("LIST_OBJECTS") << id << engine.m_debugId; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -344,11 +339,10 @@ quint32 BaseEngineDebugClient::queryObject(int objectId) quint32 id = 0; if (state() == Enabled && objectId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("FETCH_OBJECT") << id << objectId << false << true; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -358,11 +352,10 @@ quint32 BaseEngineDebugClient::queryObjectRecursive(int objectId) quint32 id = 0; if (state() == Enabled && objectId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("FETCH_OBJECT") << id << objectId << true << true; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -374,11 +367,10 @@ quint32 BaseEngineDebugClient::queryExpressionResult(int objectDebugId, quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("EVAL_EXPRESSION") << id << objectDebugId << expr << engineId; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -393,11 +385,10 @@ quint32 BaseEngineDebugClient::setBindingForObject( quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("SET_BINDING") << id << objectDebugId << propertyName << bindingExpression << isLiteralValue << source << line; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -409,10 +400,9 @@ quint32 BaseEngineDebugClient::resetBindingForObject( quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("RESET_BINDING") << id << objectDebugId << propertyName; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -424,11 +414,10 @@ quint32 BaseEngineDebugClient::setMethodBody( quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("SET_METHOD_BODY") << id << objectDebugId << methodName << methodBody; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -439,12 +428,11 @@ quint32 BaseEngineDebugClient::queryObjectsForLocation( quint32 id = 0; if (state() == Enabled) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("FETCH_OBJECTS_FOR_LOCATION") << id << fileName << lineNumber << columnNumber << false << true; - sendMessage(message); + sendMessage(ds.data()); } return id; } diff --git a/src/libs/qmldebug/declarativeenginedebugclient.cpp b/src/libs/qmldebug/declarativeenginedebugclient.cpp index 1e77b4d869..d9dff061e0 100644 --- a/src/libs/qmldebug/declarativeenginedebugclient.cpp +++ b/src/libs/qmldebug/declarativeenginedebugclient.cpp @@ -31,6 +31,7 @@ #include "declarativeenginedebugclient.h" #include "qmldebugconstants.h" #include "qmldebugclient.h" +#include "qpacketprotocol.h" namespace QmlDebug { @@ -50,11 +51,10 @@ quint32 DeclarativeEngineDebugClient::setBindingForObject( quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("SET_BINDING") << objectDebugId << propertyName << bindingExpression << isLiteralValue << source << line; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -66,10 +66,9 @@ quint32 DeclarativeEngineDebugClient::resetBindingForObject( quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("RESET_BINDING") << objectDebugId << propertyName; - sendMessage(message); + sendMessage(ds.data()); } return id; } @@ -81,18 +80,17 @@ quint32 DeclarativeEngineDebugClient::setMethodBody( quint32 id = 0; if (state() == Enabled && objectDebugId != -1) { id = getId(); - QByteArray message; - QmlDebugStream ds(&message, QIODevice::WriteOnly); + QPacket ds(connection()->currentDataStreamVersion()); ds << QByteArray("SET_METHOD_BODY") << objectDebugId << methodName << methodBody; - sendMessage(message); + sendMessage(ds.data()); } return id; } void DeclarativeEngineDebugClient::messageReceived(const QByteArray &data) { - QmlDebugStream ds(data); + QPacket ds(connection()->currentDataStreamVersion(), data); QByteArray type; ds >> type; diff --git a/src/libs/qmldebug/qmldebugclient.cpp b/src/libs/qmldebug/qmldebugclient.cpp index 6c23d80d59..bb18843cca 100644 --- a/src/libs/qmldebug/qmldebugclient.cpp +++ b/src/libs/qmldebug/qmldebugclient.cpp @@ -39,7 +39,6 @@ namespace QmlDebug { const int protocolVersion = 1; -int QmlDebugClient::s_dataStreamVersion = QDataStream::Qt_4_7; const QString serverId = QLatin1String("QDeclarativeDebugServer"); const QString clientId = QLatin1String("QDeclarativeDebugClient"); @@ -67,6 +66,9 @@ public: QHash <QString, float> serverPlugins; QHash<QString, QmlDebugClient *> plugins; + int currentDataStreamVersion; + int maximumDataStreamVersion; + void advertisePlugins(); void flush(); @@ -79,7 +81,9 @@ public slots: }; QmlDebugConnectionPrivate::QmlDebugConnectionPrivate(QmlDebugConnection *c) - : QObject(c), q(c), protocol(0), device(0), gotHello(false) + : QObject(c), q(c), protocol(0), device(0), gotHello(false), + currentDataStreamVersion(QDataStream::Qt_4_7), + maximumDataStreamVersion(QDataStream::Qt_DefaultCompiledVersion) { } @@ -88,17 +92,17 @@ void QmlDebugConnectionPrivate::advertisePlugins() if (!q->isOpen()) return; - QPacket pack; + QPacket pack(currentDataStreamVersion); pack << serverId << 1 << plugins.keys(); - protocol->send(pack); + protocol->send(pack.data()); flush(); } void QmlDebugConnectionPrivate::connected() { - QPacket pack; - pack << serverId << 0 << protocolVersion << plugins.keys() << QDataStream().version(); - protocol->send(pack); + QPacket pack(currentDataStreamVersion); + pack << serverId << 0 << protocolVersion << plugins.keys() << maximumDataStreamVersion; + protocol->send(pack.data()); flush(); } @@ -134,7 +138,7 @@ void QmlDebugConnectionPrivate::error(QAbstractSocket::SocketError socketError) void QmlDebugConnectionPrivate::readyRead() { if (!gotHello) { - QPacket pack = protocol->read(); + QPacket pack(currentDataStreamVersion, protocol->read()); QString name; pack >> name; @@ -150,7 +154,7 @@ void QmlDebugConnectionPrivate::readyRead() QStringList pluginNames; QList<float> pluginVersions; pack >> pluginNames; - if (!pack.isEmpty()) + if (!pack.atEnd()) pack >> pluginVersions; const int pluginNamesSize = pluginNames.size(); @@ -163,9 +167,8 @@ void QmlDebugConnectionPrivate::readyRead() } if (!pack.atEnd()) { - pack >> QmlDebugClient::s_dataStreamVersion; - if (QmlDebugClient::s_dataStreamVersion - > QDataStream().version()) + pack >> currentDataStreamVersion; + if (currentDataStreamVersion > maximumDataStreamVersion) qWarning() << "Server returned invalid data stream version!"; } validHello = true; @@ -192,7 +195,7 @@ void QmlDebugConnectionPrivate::readyRead() } while (protocol && protocol->packetsAvailable()) { - QPacket pack = protocol->read(); + QPacket pack(currentDataStreamVersion, protocol->read()); QString name; pack >> name; @@ -208,7 +211,7 @@ void QmlDebugConnectionPrivate::readyRead() QStringList pluginNames; QList<float> pluginVersions; pack >> pluginNames; - if (!pack.isEmpty()) + if (!pack.atEnd()) pack >> pluginVersions; const int pluginNamesSize = pluginNames.size(); @@ -334,7 +337,15 @@ void QmlDebugConnection::connectToHost(const QString &hostName, quint16 port) socket->connectToHost(hostName, port); } -// +int QmlDebugConnection::currentDataStreamVersion() const +{ + return d->currentDataStreamVersion; +} + +void QmlDebugConnection::setMaximumDataStreamVersion(int maximumVersion) +{ + d->maximumDataStreamVersion = maximumVersion; +} QmlDebugClientPrivate::QmlDebugClientPrivate() : connection(0) @@ -412,9 +423,9 @@ void QmlDebugClient::sendMessage(const QByteArray &message) if (state() != Enabled) return; - QPacket pack; + QPacket pack(d->connection->currentDataStreamVersion()); pack << d->name << message; - d->connection->d->protocol->send(pack); + d->connection->d->protocol->send(pack.data()); d->connection->d->flush(); } @@ -426,30 +437,6 @@ void QmlDebugClient::messageReceived(const QByteArray &) { } -QmlDebugStream::QmlDebugStream() - : QDataStream() -{ - setVersion(QmlDebugClient::s_dataStreamVersion); -} - -QmlDebugStream::QmlDebugStream(QIODevice *d) - : QDataStream(d) -{ - setVersion(QmlDebugClient::s_dataStreamVersion); -} - -QmlDebugStream::QmlDebugStream(QByteArray *ba, QIODevice::OpenMode flags) - : QDataStream(ba, flags) -{ - setVersion(QmlDebugClient::s_dataStreamVersion); -} - -QmlDebugStream::QmlDebugStream(const QByteArray &ba) - : QDataStream(ba) -{ - setVersion(QmlDebugClient::s_dataStreamVersion); -} - } // namespace QmlDebug #include <qmldebugclient.moc> diff --git a/src/libs/qmldebug/qmldebugclient.h b/src/libs/qmldebug/qmldebugclient.h index 001689a760..55ae29d9e0 100644 --- a/src/libs/qmldebug/qmldebugclient.h +++ b/src/libs/qmldebug/qmldebugclient.h @@ -56,6 +56,9 @@ public: void connectToHost(const QString &hostName, quint16 port); + int currentDataStreamVersion() const; + void setMaximumDataStreamVersion(int maximumVersion); + bool isOpen() const; bool isConnecting() const; void close(); @@ -103,17 +106,7 @@ private: friend class QmlDebugConnectionPrivate; QScopedPointer<QmlDebugClientPrivate> d_ptr; -public: - static int s_dataStreamVersion; -}; -class QMLDEBUG_EXPORT QmlDebugStream : public QDataStream -{ -public: - QmlDebugStream(); - explicit QmlDebugStream(QIODevice *d); - QmlDebugStream(QByteArray *ba, QIODevice::OpenMode flags); - QmlDebugStream(const QByteArray &ba); }; } // namespace QmlDebug diff --git a/src/libs/qmldebug/qmlprofilertraceclient.cpp b/src/libs/qmldebug/qmlprofilertraceclient.cpp index e5662a313d..6c97f36832 100644 --- a/src/libs/qmldebug/qmlprofilertraceclient.cpp +++ b/src/libs/qmldebug/qmlprofilertraceclient.cpp @@ -31,6 +31,7 @@ #include "qmlprofilertraceclient.h" #include "qmlenginecontrolclient.h" #include "qdebugmessageclient.h" +#include "qpacketprotocol.h" namespace QmlDebug { @@ -76,12 +77,11 @@ static const int GAP_TIME = 150; void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId) { - QByteArray ba; - QmlDebugStream stream(&ba, QIODevice::WriteOnly); + QPacket stream(q->connection()->currentDataStreamVersion()); stream << recording << engineId; // engineId -1 is OK. It means "all of them" if (recording) stream << requestedFeatures << flushInterval; - q->sendMessage(ba); + q->sendMessage(stream.data()); } QmlProfilerTraceClient::QmlProfilerTraceClient(QmlDebugConnection *client, quint64 features) @@ -201,8 +201,7 @@ void QmlProfilerTraceClient::stateChanged(State /*status*/) void QmlProfilerTraceClient::messageReceived(const QByteArray &data) { - QByteArray rwData = data; - QmlDebugStream stream(&rwData, QIODevice::ReadOnly); + QPacket stream(connection()->currentDataStreamVersion(), data); qint64 time; int messageType; diff --git a/src/libs/qmldebug/qpacketprotocol.cpp b/src/libs/qmldebug/qpacketprotocol.cpp index 4848fa7d48..0bf46b6ba5 100644 --- a/src/libs/qmldebug/qpacketprotocol.cpp +++ b/src/libs/qmldebug/qpacketprotocol.cpp @@ -30,7 +30,6 @@ #include "qpacketprotocol.h" -#include <qbuffer.h> #include <qelapsedtimer.h> namespace QmlDebug { @@ -111,8 +110,6 @@ public: QObject::connect(this, &QPacketProtocolPrivate::readyRead, parent, &QPacketProtocol::readyRead); - QObject::connect(this, &QPacketProtocolPrivate::packetWritten, - parent, &QPacketProtocol::packetWritten); QObject::connect(this, &QPacketProtocolPrivate::invalidPacket, parent, &QPacketProtocol::invalidPacket); QObject::connect(dev, &QIODevice::readyRead, @@ -125,7 +122,6 @@ public: signals: void readyRead(); - void packetWritten(); void invalidPacket(); public slots: @@ -147,7 +143,6 @@ public slots: } else { bytes -= sendingPackets.at(0); sendingPackets.removeFirst(); - emit packetWritten(); } } } @@ -217,70 +212,22 @@ QPacketProtocol::QPacketProtocol(QIODevice *dev, QObject *parent) Q_ASSERT(dev); } -/*! - Destroys the QPacketProtocol instance. - */ -QPacketProtocol::~QPacketProtocol() -{ -} - -/*! - Returns the maximum packet size allowed. By default this is - 2,147,483,647 bytes. - - If a packet claiming to be larger than the maximum packet size is received, - the QPacketProtocol::invalidPacket() signal is emitted. - - \sa QPacketProtocol::setMaximumPacketSize() - */ -qint32 QPacketProtocol::maximumPacketSize() const -{ - return d->maxPacketSize; -} - -/*! - Sets the maximum allowable packet size to \a max. - - \sa QPacketProtocol::maximumPacketSize() - */ -qint32 QPacketProtocol::setMaximumPacketSize(qint32 max) -{ - if (max > (signed)sizeof(qint32)) - d->maxPacketSize = max; - return d->maxPacketSize; -} - -/*! - Returns a streamable object that is transmitted on destruction. For example - - \code - protocol.send() << "Hello world" << 123; - \endcode - - will send a packet containing "Hello world" and 123. To construct more - complex packets, explicitly construct a QPacket instance. - */ -QPacketAutoSend QPacketProtocol::send() -{ - return QPacketAutoSend(this); -} - /*! Transmits the packet \a p. */ -void QPacketProtocol::send(const QPacket & p) +void QPacketProtocol::send(const QByteArray &p) { - if (p.b.isEmpty()) + if (p.isEmpty()) return; // We don't send empty packets - qint64 sendSize = p.b.size() + sizeof(qint32); + qint64 sendSize = p.size() + sizeof(qint32); d->sendingPackets.append(sendSize); qint32 sendSize32 = sendSize; qint64 writeBytes = d->dev->write((char *)&sendSize32, sizeof(qint32)); Q_ASSERT(writeBytes == sizeof(qint32)); - writeBytes = d->dev->write(p.b); - Q_ASSERT(writeBytes == p.b.size()); + writeBytes = d->dev->write(p); + Q_ASSERT(writeBytes == p.size()); Q_UNUSED(writeBytes); // For building in release mode. } @@ -292,26 +239,16 @@ qint64 QPacketProtocol::packetsAvailable() const return d->packets.count(); } -/*! - Discards any unread packets. - */ -void QPacketProtocol::clear() -{ - d->packets.clear(); -} - /*! Returns the next unread packet, or an invalid QPacket instance if no packets are available. This function does NOT block. */ -QPacket QPacketProtocol::read() +QByteArray QPacketProtocol::read() { if (0 == d->packets.count()) - return QPacket(); + return QByteArray(); - QPacket rv(d->packets.at(0)); - d->packets.removeFirst(); - return rv; + return d->packets.takeFirst(); } @@ -357,14 +294,6 @@ bool QPacketProtocol::waitForReadyRead(int msecs) } while (true); } -/*! - Returns the QIODevice passed to the QPacketProtocol constructor. -*/ -QIODevice *QPacketProtocol::device() -{ - return d->dev; -} - /*! \fn void QPacketProtocol::readyRead() @@ -380,13 +309,6 @@ QIODevice *QPacketProtocol::device() further packets will be received. */ -/*! - \fn void QPacketProtocol::packetWritten() - - Emitted each time a packet is completely written to the device. This signal - may be used for communications flow control. - */ - /*! \class QPacket \internal @@ -434,55 +356,22 @@ QIODevice *QPacketProtocol::device() /*! Constructs an empty write-only packet. */ -QPacket::QPacket() - : QDataStream(), buf(0) +QPacket::QPacket(int version) { - buf = new QBuffer(&b); - buf->open(QIODevice::WriteOnly); - setDevice(buf); - setVersion(QDataStream::Qt_4_7); + buf.open(QIODevice::WriteOnly); + setDevice(&buf); + setVersion(version); } /*! - Destroys the QPacket instance. - */ -QPacket::~QPacket() -{ - if (buf) { - delete buf; - buf = 0; - } -} - -/*! - Creates a copy of \a other. The initial stream positions are shared, but the - two packets are otherwise independent. + Constructs a read-only packet. */ -QPacket::QPacket(const QPacket & other) - : QDataStream(), b(other.b), buf(0) +QPacket::QPacket(int version, const QByteArray &data) { - buf = new QBuffer(&b); - buf->open(other.buf->openMode()); - setDevice(buf); -} - -/*! - \internal - */ -QPacket::QPacket(const QByteArray & ba) - : QDataStream(), b(ba), buf(0) -{ - buf = new QBuffer(&b); - buf->open(QIODevice::ReadOnly); - setDevice(buf); -} - -/*! - Returns true if this packet is empty - that is, contains no data. - */ -bool QPacket::isEmpty() const -{ - return b.isEmpty(); + buf.setData(data); + buf.open(QIODevice::ReadOnly); + setDevice(&buf); + setVersion(version); } /*! @@ -490,48 +379,7 @@ bool QPacket::isEmpty() const */ QByteArray QPacket::data() const { - return b; -} - -/*! - Clears data in the packet. This is useful for reusing one writable packet. - For example - \code - QPacketProtocol protocol(...); - - QPacket packet; - - packet << "Hello world!" << 123; - protocol.send(packet); - - packet.clear(); - packet << "Goodbyte world!" << 789; - protocol.send(packet); - \endcode - */ -void QPacket::clear() -{ - QBuffer::OpenMode oldMode = buf->openMode(); - buf->close(); - b.clear(); - buf->setBuffer(&b); // reset QBuffer internals with new size of b. - buf->open(oldMode); -} - -/*! - \class QPacketAutoSend - \internal - - */ -QPacketAutoSend::QPacketAutoSend(QPacketProtocol *_p) - : QPacket(), p(_p) -{ -} - -QPacketAutoSend::~QPacketAutoSend() -{ - if (!b.isEmpty()) - p->send(*this); + return buf.data(); } } // namespace QmlDebug diff --git a/src/libs/qmldebug/qpacketprotocol.h b/src/libs/qmldebug/qpacketprotocol.h index 523611a66e..dcb80aaefe 100644 --- a/src/libs/qmldebug/qpacketprotocol.h +++ b/src/libs/qmldebug/qpacketprotocol.h @@ -31,81 +31,54 @@ #ifndef QPACKETPROTOCOL_H #define QPACKETPROTOCOL_H +#include "qmldebug_global.h" + #include <qobject.h> #include <qdatastream.h> +#include <qbuffer.h> QT_BEGIN_NAMESPACE class QIODevice; -class QBuffer; QT_END_NAMESPACE namespace QmlDebug { -class QPacket; -class QPacketAutoSend; - class QPacketProtocolPrivate; - -class QPacketProtocol : public QObject +class QMLDEBUG_EXPORT QPacketProtocol : public QObject { Q_OBJECT - + Q_DECLARE_PRIVATE(QPacketProtocol) public: explicit QPacketProtocol(QIODevice *dev, QObject *parent = 0); - virtual ~QPacketProtocol(); - - qint32 maximumPacketSize() const; - qint32 setMaximumPacketSize(qint32); - - QPacketAutoSend send(); - void send(const QPacket &); + void send(const QByteArray &data); qint64 packetsAvailable() const; - QPacket read(); - + QByteArray read(); bool waitForReadyRead(int msecs = 3000); - void clear(); - - QIODevice *device(); - -signals: +Q_SIGNALS: void readyRead(); void invalidPacket(); - void packetWritten(); + +private Q_SLOTS: + void aboutToClose(); + void bytesWritten(qint64 bytes); + void readyToRead(); private: QPacketProtocolPrivate *d; }; - -class QPacket : public QDataStream +class QMLDEBUG_EXPORT QPacket : public QDataStream { public: - QPacket(); - QPacket(const QPacket &); - virtual ~QPacket(); - - void clear(); - bool isEmpty() const; + QPacket(int version); + explicit QPacket(int version, const QByteArray &ba); QByteArray data() const; -protected: - friend class QPacketProtocol; - QPacket(const QByteArray &ba); - QByteArray b; - QBuffer *buf; -}; - -class QPacketAutoSend : public QPacket -{ -public: - virtual ~QPacketAutoSend(); - private: - friend class QPacketProtocol; - QPacketAutoSend(QPacketProtocol *); - QPacketProtocol *p; + void init(QIODevice::OpenMode mode); + QBuffer buf; }; } // QmlDebug diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index c4b6fcf7c7..a715204d5d 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -57,6 +57,7 @@ #include <qmljseditor/qmljseditorconstants.h> #include <qmljs/qmljsmodelmanagerinterface.h> #include <qmljs/consolemanagerinterface.h> +#include <qmldebug/qpacketprotocol.h> #include <texteditor/textdocument.h> #include <texteditor/texteditor.h> @@ -1504,11 +1505,10 @@ void QmlEnginePrivate::setBreakpoint(const QString type, const QString target, // } // } if (type == _(EVENT)) { - QByteArray params; - QmlDebugStream rs(¶ms, QIODevice::WriteOnly); + QPacket rs(connection->currentDataStreamVersion()); rs << target.toUtf8() << enabled; engine->showMessage(QString(_("%1 %2 %3")).arg(_(BREAKONSIGNAL), target, enabled ? _("enabled") : _("disabled")), LogInput); - runDirectCommand(BREAKONSIGNAL, params); + runDirectCommand(BREAKONSIGNAL, rs.data()); } else { DebuggerCommand cmd(SETBREAKPOINT); @@ -1704,14 +1704,13 @@ void QmlEnginePrivate::runDirectCommand(const QByteArray &type, const QByteArray engine->showMessage(QString::fromLatin1("%1 %2").arg(_(type), _(msg)), LogInput); - QByteArray request; - QmlDebugStream rs(&request, QIODevice::WriteOnly); + QPacket rs(connection->currentDataStreamVersion()); rs << cmd << type << msg; if (state() == Enabled) - sendMessage(request); + sendMessage(rs.data()); else - sendBuffer.append(request); + sendBuffer.append(rs.data()); } void QmlEnginePrivate::memorizeRefs(const QVariant &refs) @@ -1727,7 +1726,7 @@ void QmlEnginePrivate::memorizeRefs(const QVariant &refs) void QmlEnginePrivate::messageReceived(const QByteArray &data) { - QmlDebugStream ds(data); + QPacket ds(connection->currentDataStreamVersion(), data); QByteArray command; ds >> command; -- GitLab