Merge PR #591: Allow registering list types without their contained objects on JSONRPC

pull/610/head
jenkins 2022-12-13 21:04:55 +01:00
commit 6cce82c088
3 changed files with 22 additions and 3 deletions

View File

@ -262,7 +262,7 @@ JsonValidator::Result JsonValidator::validateEntry(const QVariant &value, const
if (definition.type() == QVariant::Map) {
if (value.type() != QVariant::Map) {
return Result(false, "Invalid value. Expected a map bug received: " + value.toString());
return Result(false, "Invalid value. Expected a map but received: " + value.toString());
}
return validateMap(value.toMap(), definition.toMap(), api, openMode);
}

View File

@ -231,9 +231,8 @@ void JsonHandler::registerObject(const QMetaObject &metaObject)
m_metaObjects.insert(className, metaObject);
}
void JsonHandler::registerObject(const QMetaObject &metaObject, const QMetaObject &listMetaObject)
void JsonHandler::registerList(const QMetaObject &listMetaObject, const QMetaObject &metaObject)
{
registerObject(metaObject);
QString listTypeName = QString(listMetaObject.className()).split("::").last();
QString objectTypeName = QString(metaObject.className()).split("::").last();
m_objects.insert(listTypeName, QVariantList() << QVariant(QString("$ref:%1").arg(objectTypeName)));
@ -245,6 +244,12 @@ void JsonHandler::registerObject(const QMetaObject &metaObject, const QMetaObjec
Q_ASSERT_X(listMetaObject.indexOfMethod("put(QVariant)") >= 0, "JsonHandler", QString("List type %1 does not implement \"Q_INVOKABLE void put(QVariant variant)\" method!").arg(listTypeName).toUtf8());
}
void JsonHandler::registerObject(const QMetaObject &metaObject, const QMetaObject &listMetaObject)
{
registerObject(metaObject);
registerList(listMetaObject, metaObject);
}
QVariant JsonHandler::pack(const QMetaObject &metaObject, const void *value) const
{
QString className = QString(metaObject.className()).split("::").last();

View File

@ -98,7 +98,11 @@ protected:
template <typename Enum> void registerEnum();
template <typename Enum, typename Flags> void registerFlag();
// Registers the given object
template <typename ObjectType> void registerObject();
// Registers the given list type object as a container for the given object type, without registering the object type itself
template <typename ListType, typename ObjectType> void registerList();
// Registers an object and its list type object
template <typename ObjectType, typename ListType> void registerObject();
template <typename ObjectType> void registerUncreatableObject();
@ -117,6 +121,7 @@ protected:
private:
void registerObject(const QMetaObject &metaObject);
void registerList(const QMetaObject &listObject, const QMetaObject &metaObject);
void registerObject(const QMetaObject &metaObject, const QMetaObject &listMetaObject);
QVariant pack(const QMetaObject &metaObject, const void *gadget) const;
@ -168,6 +173,15 @@ void JsonHandler::registerObject()
registerObject(metaObject);
}
template<typename ListType, typename ObjectType>
void JsonHandler::registerList()
{
qRegisterMetaType<ListType>();
QMetaObject metaObject = ObjectType::staticMetaObject;
QMetaObject listMetaObject = ListType::staticMetaObject;
registerList(listMetaObject, metaObject);
}
template<typename ObjectType, typename ListType>
void JsonHandler::registerObject()
{