diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/webchannel/qmetaobjectpublisher.cpp | 45 | ||||
-rw-r--r-- | src/webchannel/qmetaobjectpublisher_p.h | 6 | ||||
-rw-r--r-- | src/webchannel/qwebchannel.js | 29 |
3 files changed, 29 insertions, 51 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp index eeab014..527b3df 100644 --- a/src/webchannel/qmetaobjectpublisher.cpp +++ b/src/webchannel/qmetaobjectpublisher.cpp @@ -73,6 +73,15 @@ const QString KEY_ARGS = QStringLiteral("args"); const QString KEY_PROPERTY = QStringLiteral("property"); const QString KEY_VALUE = QStringLiteral("value"); +QJsonObject createResponse(const QJsonValue &id, const QJsonValue &data) +{ + QJsonObject response; + response[KEY_TYPE] = TypeResponse; + response[KEY_ID] = id; + response[KEY_DATA] = data; + return response; +} + /// TODO: what is the proper value here? const int PROPERTY_UPDATE_INTERVAL = 50; } @@ -83,7 +92,6 @@ QMetaObjectPublisher::QMetaObjectPublisher(QWebChannel *webChannel) , signalHandler(this) , clientIsIdle(false) , blockUpdates(false) - , pendingInit(false) , propertyUpdatesInitialized(false) { } @@ -208,12 +216,8 @@ void QMetaObjectPublisher::setClientIsIdle(bool isIdle) } } -void QMetaObjectPublisher::initializeClients() +QJsonObject QMetaObjectPublisher::initializeClient() { - if (!webChannel) { - return; - } - QJsonObject objectInfos; { const QHash<QString, QObject *>::const_iterator end = registeredObjects.constEnd(); @@ -225,12 +229,8 @@ void QMetaObjectPublisher::initializeClients() objectInfos[it.key()] = info; } } - QJsonObject message; - message[KEY_TYPE] = TypeInit; - message[KEY_DATA] = objectInfos; - broadcastMessage(message); propertyUpdatesInitialized = true; - pendingInit = false; + return objectInfos; } void QMetaObjectPublisher::initializePropertyUpdates(const QObject *const object, const QJsonObject &objectInfo) @@ -474,11 +474,12 @@ void QMetaObjectPublisher::handleMessage(const QJsonObject &message, QWebChannel if (type == TypeIdle) { setClientIsIdle(true); } else if (type == TypeInit) { - if (!blockUpdates) { - initializeClients(); - } else { - pendingInit = true; + if (!message.contains(KEY_ID)) { + qWarning("JSON message object is missing the id property: %s", + QJsonDocument(message).toJson().constData()); + return; } + transport->sendMessage(createResponse(message.value(KEY_ID), initializeClient())); } else if (type == TypeDebug) { static QTextStream out(stdout); out << "DEBUG: " << message.value(KEY_DATA).toString() << endl; @@ -496,11 +497,9 @@ void QMetaObjectPublisher::handleMessage(const QJsonObject &message, QWebChannel QJsonDocument(message).toJson().constData()); return; } - QJsonObject response; - response[KEY_TYPE] = TypeResponse; - response[KEY_ID] = message.value(KEY_ID); - response[KEY_DATA] = invokeMethod(object, message.value(KEY_METHOD).toInt(-1), message.value(KEY_ARGS).toArray()); - transport->sendMessage(response); + transport->sendMessage(createResponse(message.value(KEY_ID), + invokeMethod(object, message.value(KEY_METHOD).toInt(-1), + message.value(KEY_ARGS).toArray()))); } else if (type == TypeConnectToSignal) { signalHandler.connectTo(object, message.value(KEY_SIGNAL).toInt(-1)); } else if (type == TypeDisconnectFromSignal) { @@ -526,11 +525,7 @@ void QMetaObjectPublisher::setBlockUpdates(bool block) blockUpdates = block; if (!blockUpdates) { - if (pendingInit) { - initializeClients(); - } else { - sendPendingPropertyUpdates(); - } + sendPendingPropertyUpdates(); } else if (timer.isActive()) { timer.stop(); } diff --git a/src/webchannel/qmetaobjectpublisher_p.h b/src/webchannel/qmetaobjectpublisher_p.h index a7cdda7..eda17d9 100644 --- a/src/webchannel/qmetaobjectpublisher_p.h +++ b/src/webchannel/qmetaobjectpublisher_p.h @@ -108,7 +108,7 @@ public: * * Furthermore, if that was not done already, connect to their property notify signals. */ - void initializeClients(); + QJsonObject initializeClient(); /** * Go through all properties of the given object and connect to their notify signal. @@ -195,10 +195,6 @@ private: // true when no property updates should be sent, false otherwise bool blockUpdates; - // true when at least one client needs to be initialized, - // i.e. when a Qt.init came in which was not handled yet. - bool pendingInit; - // true when at least one client was initialized and thus // the property updates have been initialized and the // object info map set. diff --git a/src/webchannel/qwebchannel.js b/src/webchannel/qwebchannel.js index d2c6525..13e9da5 100644 --- a/src/webchannel/qwebchannel.js +++ b/src/webchannel/qwebchannel.js @@ -82,9 +82,6 @@ var QWebChannel = function(transport, initCallback) case QWebChannelMessageTypes.propertyUpdate: channel.handlePropertyUpdate(data); break; - case QWebChannelMessageTypes.init: - channel.handleInit(data); - break; default: console.error("invalid message received:", message.data); break; @@ -149,30 +146,20 @@ var QWebChannel = function(transport, initCallback) channel.exec({type: QWebChannelMessageTypes.idle}); } - // prevent multiple initialization which might happen with multiple webchannel clients. - this.initialized = false; - this.handleInit = function(message) + this.debug = function(message) { - if (channel.initialized) { - return; - } - channel.initialized = true; - for (var objectName in message.data) { - var data = message.data[objectName]; - var object = new QObject(objectName, data, channel); + channel.send({type: QWebChannelMessageTypes.debug, data: message}); + }; + + channel.exec({type: QWebChannelMessageTypes.init}, function(data) { + for (var objectName in data) { + var object = new QObject(objectName, data[objectName], channel); } if (initCallback) { initCallback(channel); } channel.exec({type: QWebChannelMessageTypes.idle}); - } - - this.debug = function(message) - { - channel.send({type: QWebChannelMessageTypes.debug, data: message}); - }; - - channel.exec({type: QWebChannelMessageTypes.init}); + }); }; function QObject(name, data, webChannel) |