diff --git a/libnymea-core/jsonrpc/devicehandler.cpp b/libnymea-core/jsonrpc/devicehandler.cpp index 281869a7..8d52bf3d 100644 --- a/libnymea-core/jsonrpc/devicehandler.cpp +++ b/libnymea-core/jsonrpc/devicehandler.cpp @@ -58,7 +58,7 @@ DeviceHandler::DeviceHandler(QObject *parent) : registerEnum(); registerEnum(); registerEnum(); - registerEnum(); + registerFlag(); registerEnum(); registerEnum(); registerEnum(); diff --git a/libnymea-core/jsonrpc/integrationshandler.cpp b/libnymea-core/jsonrpc/integrationshandler.cpp index 20c92a6f..abcbe0da 100644 --- a/libnymea-core/jsonrpc/integrationshandler.cpp +++ b/libnymea-core/jsonrpc/integrationshandler.cpp @@ -57,7 +57,7 @@ IntegrationsHandler::IntegrationsHandler(ThingManager *thingManager, QObject *pa registerEnum(); registerEnum(); registerEnum(); - registerEnum(); + registerFlag(); registerEnum(); registerEnum(); registerEnum(); diff --git a/libnymea/jsonrpc/jsonhandler.cpp b/libnymea/jsonrpc/jsonhandler.cpp index 8859350e..d513e2b1 100644 --- a/libnymea/jsonrpc/jsonhandler.cpp +++ b/libnymea/jsonrpc/jsonhandler.cpp @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2021, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -506,6 +506,3 @@ QVariant JsonHandler::unpack(const QMetaObject &metaObject, const QVariant &valu return QVariant(); } - - - diff --git a/libnymea/jsonrpc/jsonhandler.h b/libnymea/jsonrpc/jsonhandler.h index 2111926f..e1258c44 100644 --- a/libnymea/jsonrpc/jsonhandler.h +++ b/libnymea/jsonrpc/jsonhandler.h @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2021, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -76,12 +76,16 @@ public: template static QString enumRef(); + template static QString flagRef(); template static QString objectRef(); static QString objectRef(const QString &objectName); template static QString enumValueName(T value); template static T enumNameToValue(const QString &name); + template static QStringList flagValueNames(T value); + template static T flagNamesToValue(const QStringList &names); + static BasicType variantTypeToBasicType(QVariant::Type variantType); static QVariant::Type basicTypeToVariantType(BasicType basicType); @@ -91,7 +95,7 @@ public: protected: template void registerEnum(); - template void registerEnum(); + template void registerFlag(); template void registerObject(); template void registerObject(); @@ -104,7 +108,6 @@ protected: // Deprecated QString based registerObject void registerObject(const QString &name, const QVariantMap &object); - void registerMethod(const QString &name, const QString &description, const QVariantMap ¶ms, const QVariantMap &returns, const QString &deprecationInfo = QString()); void registerNotification(const QString &name, const QString &description, const QVariantMap ¶ms, const QString &deprecationInfo = QString()); @@ -146,7 +149,7 @@ void JsonHandler::registerEnum() } template -void JsonHandler::registerEnum() +void JsonHandler::registerFlag() { registerEnum(); QMetaEnum metaEnum = QMetaEnum::fromType(); @@ -205,9 +208,18 @@ template QString JsonHandler::enumRef() { QMetaEnum metaEnum = QMetaEnum::fromType(); + Q_ASSERT_X(!metaEnum.isFlag(), "JsonHandler", QString("The given type reference %1 is a flag. Please use flagRef() instead.").arg(metaEnum.name()).toUtf8()); return QString("$ref:%1").arg(metaEnum.name()); } +template +QString JsonHandler::flagRef() +{ + QMetaEnum metaFlag = QMetaEnum::fromType(); + Q_ASSERT_X(metaFlag.isFlag(), "JsonHandler", QString("The given type reference %1 is not a flag.").arg(metaFlag.name()).toUtf8()); + return QString("$ref:%1").arg(metaFlag.name()); +} + template QString JsonHandler::objectRef() { @@ -229,6 +241,34 @@ T JsonHandler::enumNameToValue(const QString &name) return static_cast(metaEnum.keyToValue(name.toUtf8())); } +template +QStringList JsonHandler::flagValueNames(T value) +{ + QMetaEnum metaFlag = QMetaEnum::fromType(); + Q_ASSERT_X(metaFlag.isFlag(), "JsonHandler", QString("The given template type %1 is not a flag.").arg(metaFlag.name()).toUtf8()); + QStringList names; + for (int i = 0; i < metaFlag.keyCount(); i++) { + if ((metaFlag.value(i) & value) > 0) { + names.append(metaFlag.key(i)); + } + } + return names; +} + +template +T JsonHandler::flagNamesToValue(const QStringList &names) +{ + QMetaEnum metaFlag = QMetaEnum::fromType(); + Q_ASSERT_X(metaFlag.isFlag(), "JsonHandler", QString("The given template type %1 is not a flag.").arg(metaFlag.name()).toUtf8()); + T flag; + foreach (const QString &name, names) { + bool keyOk; + flag |= metaFlag.keyToValue(name.toUtf8(), &keyOk); + Q_ASSERT_X(keyOk, "JsonHandler", QString("The given enum value for the flag %1 is not ok.").arg(metaFlag.name()).toUtf8()); + } + return flag; +} + template QVariant JsonHandler::pack(const T &value) const {