summaryrefslogtreecommitdiff
path: root/src/webchannel/qmetaobjectpublisher.cpp
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2014-07-30 12:20:08 +0200
committerLutz Schönemann <lutz.schoenemann@basyskom.com>2014-12-08 16:02:45 +0100
commit0a43a43a166d2e2b551f543de61090637bd8b387 (patch)
treeb27ead870eef7af20f3d35a717d57bd0d262a911 /src/webchannel/qmetaobjectpublisher.cpp
parente50edc952ce15f3c11f4cdfad74ec984043cb080 (diff)
downloadqtwebchannel-0a43a43a166d2e2b551f543de61090637bd8b387.tar.gz
Do not broadcast initialization data to all clients.
Instead, send the data as a response to the initialization request message. This simplifies the code and makes it more predictable, as we do not spam all clients with initialization broadcasts anymore. Note that the pending initialization "feature" is removed, but I don't see a need for it anymore. If you want to delay client initialization, do it on the client side. Change-Id: I1ab71fd6c9e809ccb6085f1a3fbac3eb9b2e910b Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'src/webchannel/qmetaobjectpublisher.cpp')
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp45
1 files changed, 20 insertions, 25 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();
}