diff --git a/src/libs/qmldebug/baseenginedebugclient.cpp b/src/libs/qmldebug/baseenginedebugclient.cpp index e04d60cb02511a0fe52e51e9e1c26dd4fb7faa7f..a3fea23b34b17c2485cfde25933c5a9b293e0d26 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 1e77b4d869a9fcdf83b2e9fe34545ce55654d819..d9dff061e0f34edf3b3bae661be038ca06ddd110 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 6c23d80d59200c8f6f4ea19fb386b0dc0e6faab1..bb18843cca5a5b94fd1be4ac3f2138e30c115ad9 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 001689a760f8a21c50e4e94f96a40adbe00e33cc..55ae29d9e0ce55f0d8e34a6e0a6c6068572e514c 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 e5662a313d916bacab44c5d42d8d25f1598c1b1b..6c97f36832b74921e3e48cdf18743a54d09fc2db 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 4848fa7d4806004e13684abaafba17159acfede3..0bf46b6ba5e8916d29edd48c2adf8b8239777954 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 523611a66e8016367e3d5ab2d11fa3b53b690737..dcb80aaefe5bb5b5cd8bf26be178b6644aedac04 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 c4b6fcf7c77555cf6981538d8ca03732c9297682..a715204d5db506bd43eae49fb7afa3a5e88d6f03 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;