summaryrefslogtreecommitdiff
path: root/src/webchannel/qmetaobjectpublisher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/webchannel/qmetaobjectpublisher.cpp')
-rw-r--r--src/webchannel/qmetaobjectpublisher.cpp36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/webchannel/qmetaobjectpublisher.cpp b/src/webchannel/qmetaobjectpublisher.cpp
index 3621fca..27c7d70 100644
--- a/src/webchannel/qmetaobjectpublisher.cpp
+++ b/src/webchannel/qmetaobjectpublisher.cpp
@@ -140,8 +140,8 @@ void QMetaObjectPublisherPrivate::initializePropertyUpdates(const QObject *const
qWarning() << "Invalid property info encountered:" << propertyInfoVar;
continue;
}
- const QString &propertyName = propertyInfo.at(0).toString();
- const QJsonArray &signalData = propertyInfo.at(1).toArray();
+ const int propertyIndex = propertyInfo.at(0).toInt();
+ const QJsonArray &signalData = propertyInfo.at(2).toArray();
if (signalData.isEmpty()) {
// Property without NOTIFY signal
@@ -150,14 +150,14 @@ void QMetaObjectPublisherPrivate::initializePropertyUpdates(const QObject *const
const int signalIndex = signalData.at(1).toInt();
- QSet<QString> &connectedProperties = signalToPropertyMap[object][signalIndex];
+ QSet<int> &connectedProperties = signalToPropertyMap[object][signalIndex];
// Only connect for a property update once
if (connectedProperties.isEmpty()) {
signalHandler.connectTo(object, signalIndex);
}
- connectedProperties.insert(propertyName);
+ connectedProperties.insert(propertyIndex);
}
// also always connect to destroyed signal
@@ -184,17 +184,12 @@ void QMetaObjectPublisherPrivate::sendPendingPropertyUpdates()
QJsonObject sigs;
const SignalToArgumentsMap::const_iterator sigEnd = it.value().constEnd();
for (SignalToArgumentsMap::const_iterator sigIt = it.value().constBegin(); sigIt != sigEnd; ++sigIt) {
- // TODO: use property indices
- foreach (const QString &propertyName, objectsSignalToPropertyMap.value(sigIt.key())) {
- int propertyIndex = metaObject->indexOfProperty(qPrintable(propertyName));
- if (propertyIndex == -1) {
- qWarning("Unknown property %d encountered", propertyIndex);
- continue;
- }
+ // TODO: can we get rid of the int <-> string conversions here?
+ foreach (const int propertyIndex, objectsSignalToPropertyMap.value(sigIt.key())) {
const QMetaProperty &property = metaObject->property(propertyIndex);
- properties[QString::fromLatin1(property.name())] = QJsonValue::fromVariant(property.read(object));
+ Q_ASSERT(property.isValid());
+ properties[QString::number(propertyIndex)] = QJsonValue::fromVariant(property.read(object));
}
- // TODO: can we get rid of the int <-> string conversions here?
sigs[QString::number(sigIt.key())] = QJsonArray::fromVariantList(sigIt.value());
}
QJsonObject obj;
@@ -390,6 +385,7 @@ QJsonObject QMetaObjectPublisher::classInfoForObject(QObject *object) const
const QMetaProperty &prop = metaObject->property(i);
QJsonArray propertyInfo;
const QString &propertyName = QString::fromLatin1(prop.name());
+ propertyInfo.append(i);
propertyInfo.append(propertyName);
identifiers << propertyName;
QJsonArray signalInfo;
@@ -520,14 +516,16 @@ bool QMetaObjectPublisher::handleRequest(const QJsonObject &message)
d->signalHandler.disconnectFrom(object, payload.value(KEY_SIGNAL).toInt(-1));
return true;
} else if (type == TYPE_SET_PROPERTY) {
- // TODO: use property indices
- const QString &propertyName = payload.value(KEY_PROPERTY).toString();
- const int propertyIdx = object->metaObject()->indexOfProperty(qPrintable(propertyName));
- if (propertyIdx == -1) {
- qWarning() << "Cannot set unknown property" << propertyName << "of object" << objectName;
+ const int propertyIdx = payload.value(KEY_PROPERTY).toInt(-1);
+ QMetaProperty property = object->metaObject()->property(propertyIdx);
+ if (!property.isValid()) {
+ qWarning() << "Cannot set unknown property" << payload.value(KEY_PROPERTY) << "of object" << objectName;
+ return false;
+ } else if (!object->metaObject()->property(propertyIdx).write(object, payload.value(KEY_VALUE).toVariant())) {
+ qWarning() << "Could not write value " << payload.value(KEY_VALUE)
+ << "to property" << property.name() << "of object" << objectName;
return false;
}
- object->metaObject()->property(propertyIdx).write(object, payload.value(KEY_VALUE).toVariant());
return true;
}
}