Add flag handling methods for the JSON RPC handler.

pull/481/head
Simon Stürz 2021-11-05 18:49:20 +01:00
parent 249393241c
commit 1fc896def2
4 changed files with 47 additions and 10 deletions

View File

@ -58,7 +58,7 @@ DeviceHandler::DeviceHandler(QObject *parent) :
registerEnum<Device::DeviceSetupStatus>(); registerEnum<Device::DeviceSetupStatus>();
registerEnum<Thing::ThingSetupStatus>(); registerEnum<Thing::ThingSetupStatus>();
registerEnum<DeviceClass::SetupMethod>(); registerEnum<DeviceClass::SetupMethod>();
registerEnum<DeviceClass::CreateMethod, DeviceClass::CreateMethods>(); registerFlag<DeviceClass::CreateMethod, DeviceClass::CreateMethods>();
registerEnum<Types::Unit>(); registerEnum<Types::Unit>();
registerEnum<Types::InputType>(); registerEnum<Types::InputType>();
registerEnum<Types::IOType>(); registerEnum<Types::IOType>();

View File

@ -57,7 +57,7 @@ IntegrationsHandler::IntegrationsHandler(ThingManager *thingManager, QObject *pa
registerEnum<Thing::ThingError>(); registerEnum<Thing::ThingError>();
registerEnum<Thing::ThingSetupStatus>(); registerEnum<Thing::ThingSetupStatus>();
registerEnum<ThingClass::SetupMethod>(); registerEnum<ThingClass::SetupMethod>();
registerEnum<ThingClass::CreateMethod, ThingClass::CreateMethods>(); registerFlag<ThingClass::CreateMethod, ThingClass::CreateMethods>();
registerEnum<Types::Unit>(); registerEnum<Types::Unit>();
registerEnum<Types::InputType>(); registerEnum<Types::InputType>();
registerEnum<Types::IOType>(); registerEnum<Types::IOType>();

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2020, nymea GmbH * Copyright 2013 - 2021, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -506,6 +506,3 @@ QVariant JsonHandler::unpack(const QMetaObject &metaObject, const QVariant &valu
return QVariant(); return QVariant();
} }

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2020, nymea GmbH * Copyright 2013 - 2021, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -76,12 +76,16 @@ public:
template<typename T> static QString enumRef(); template<typename T> static QString enumRef();
template<typename T> static QString flagRef();
template<typename T> static QString objectRef(); template<typename T> static QString objectRef();
static QString objectRef(const QString &objectName); static QString objectRef(const QString &objectName);
template<typename T> static QString enumValueName(T value); template<typename T> static QString enumValueName(T value);
template<typename T> static T enumNameToValue(const QString &name); template<typename T> static T enumNameToValue(const QString &name);
template<typename T> static QStringList flagValueNames(T value);
template<typename T> static T flagNamesToValue(const QStringList &names);
static BasicType variantTypeToBasicType(QVariant::Type variantType); static BasicType variantTypeToBasicType(QVariant::Type variantType);
static QVariant::Type basicTypeToVariantType(BasicType basicType); static QVariant::Type basicTypeToVariantType(BasicType basicType);
@ -91,7 +95,7 @@ public:
protected: protected:
template <typename Enum> void registerEnum(); template <typename Enum> void registerEnum();
template <typename Enum, typename Flags> void registerEnum(); template <typename Enum, typename Flags> void registerFlag();
template <typename ObjectType> void registerObject(); template <typename ObjectType> void registerObject();
template <typename ObjectType, typename ListType> void registerObject(); template <typename ObjectType, typename ListType> void registerObject();
@ -104,7 +108,6 @@ protected:
// Deprecated QString based registerObject // Deprecated QString based registerObject
void registerObject(const QString &name, const QVariantMap &object); void registerObject(const QString &name, const QVariantMap &object);
void registerMethod(const QString &name, const QString &description, const QVariantMap &params, const QVariantMap &returns, const QString &deprecationInfo = QString()); void registerMethod(const QString &name, const QString &description, const QVariantMap &params, const QVariantMap &returns, const QString &deprecationInfo = QString());
void registerNotification(const QString &name, const QString &description, const QVariantMap &params, const QString &deprecationInfo = QString()); void registerNotification(const QString &name, const QString &description, const QVariantMap &params, const QString &deprecationInfo = QString());
@ -146,7 +149,7 @@ void JsonHandler::registerEnum()
} }
template<typename Enum, typename Flags> template<typename Enum, typename Flags>
void JsonHandler::registerEnum() void JsonHandler::registerFlag()
{ {
registerEnum<Enum>(); registerEnum<Enum>();
QMetaEnum metaEnum = QMetaEnum::fromType<Enum>(); QMetaEnum metaEnum = QMetaEnum::fromType<Enum>();
@ -205,9 +208,18 @@ template<typename T>
QString JsonHandler::enumRef() QString JsonHandler::enumRef()
{ {
QMetaEnum metaEnum = QMetaEnum::fromType<T>(); QMetaEnum metaEnum = QMetaEnum::fromType<T>();
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()); return QString("$ref:%1").arg(metaEnum.name());
} }
template<typename T>
QString JsonHandler::flagRef()
{
QMetaEnum metaFlag = QMetaEnum::fromType<T>();
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<typename T> template<typename T>
QString JsonHandler::objectRef() QString JsonHandler::objectRef()
{ {
@ -229,6 +241,34 @@ T JsonHandler::enumNameToValue(const QString &name)
return static_cast<T>(metaEnum.keyToValue(name.toUtf8())); return static_cast<T>(metaEnum.keyToValue(name.toUtf8()));
} }
template<typename T>
QStringList JsonHandler::flagValueNames(T value)
{
QMetaEnum metaFlag = QMetaEnum::fromType<T>();
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<typename T>
T JsonHandler::flagNamesToValue(const QStringList &names)
{
QMetaEnum metaFlag = QMetaEnum::fromType<T>();
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<typename T> template<typename T>
QVariant JsonHandler::pack(const T &value) const QVariant JsonHandler::pack(const T &value) const
{ {