introduce StateDescriptor and StateEvaluator for use with Rules
This commit is contained in:
parent
21738b3907
commit
08223606ee
6
debian/changelog
vendored
6
debian/changelog
vendored
@ -1,3 +1,9 @@
|
|||||||
|
guh (0.1.7) utopic; urgency=medium
|
||||||
|
|
||||||
|
* implement StateEvaluators
|
||||||
|
|
||||||
|
-- Michael Zanetti <micha@noneyet> Sun, 08 Jun 2014 23:27:31 +0200
|
||||||
|
|
||||||
guh (0.1.6) utopic; urgency=medium
|
guh (0.1.6) utopic; urgency=medium
|
||||||
|
|
||||||
* state changes auto generate events now
|
* state changes auto generate events now
|
||||||
|
|||||||
@ -26,6 +26,7 @@ SOURCES += plugin/device.cpp \
|
|||||||
types/paramtype.cpp \
|
types/paramtype.cpp \
|
||||||
types/param.cpp \
|
types/param.cpp \
|
||||||
types/paramdescriptor.cpp \
|
types/paramdescriptor.cpp \
|
||||||
|
types/statedescriptor.cpp
|
||||||
|
|
||||||
HEADERS += plugin/device.h \
|
HEADERS += plugin/device.h \
|
||||||
plugin/deviceclass.h \
|
plugin/deviceclass.h \
|
||||||
@ -45,5 +46,6 @@ HEADERS += plugin/device.h \
|
|||||||
types/typeutils.h \
|
types/typeutils.h \
|
||||||
types/paramtype.h \
|
types/paramtype.h \
|
||||||
types/param.h \
|
types/param.h \
|
||||||
types/paramdescriptor.h
|
types/paramdescriptor.h \
|
||||||
|
types/statedescriptor.h
|
||||||
|
|
||||||
|
|||||||
@ -146,7 +146,6 @@ bool Device::hasState(const StateTypeId &stateTypeId) const
|
|||||||
/*! For convenience, this finds the \l{State} matching the given \a stateTypeId and returns the current valie in this Device. */
|
/*! For convenience, this finds the \l{State} matching the given \a stateTypeId and returns the current valie in this Device. */
|
||||||
QVariant Device::stateValue(const StateTypeId &stateTypeId) const
|
QVariant Device::stateValue(const StateTypeId &stateTypeId) const
|
||||||
{
|
{
|
||||||
qDebug() << "device has states:" << m_states.count();
|
|
||||||
foreach (const State &state, m_states) {
|
foreach (const State &state, m_states) {
|
||||||
qDebug() << "checking" << stateTypeId << state.stateTypeId();
|
qDebug() << "checking" << stateTypeId << state.stateTypeId();
|
||||||
if (state.stateTypeId() == stateTypeId) {
|
if (state.stateTypeId() == stateTypeId) {
|
||||||
@ -171,6 +170,16 @@ void Device::setStateValue(const StateTypeId &stateTypeId, const QVariant &value
|
|||||||
qWarning() << "failed setting state for" << m_name;
|
qWarning() << "failed setting state for" << m_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
State Device::state(const StateTypeId &stateTypeId) const
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_states.count(); ++i) {
|
||||||
|
if (m_states.at(i).stateTypeId() == stateTypeId) {
|
||||||
|
return m_states.at(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return State(StateTypeId(), DeviceId());
|
||||||
|
}
|
||||||
|
|
||||||
bool Device::setupComplete() const
|
bool Device::setupComplete() const
|
||||||
{
|
{
|
||||||
return m_setupComplete;
|
return m_setupComplete;
|
||||||
|
|||||||
@ -45,18 +45,20 @@ public:
|
|||||||
void setName(const QString &name);
|
void setName(const QString &name);
|
||||||
|
|
||||||
QList<Param> params() const;
|
QList<Param> params() const;
|
||||||
|
bool hasParam(const QString ¶mName) const;
|
||||||
void setParams(const QList<Param> ¶ms);
|
void setParams(const QList<Param> ¶ms);
|
||||||
|
|
||||||
QVariant paramValue(const QString ¶mName) const;
|
QVariant paramValue(const QString ¶mName) const;
|
||||||
|
|
||||||
QList<State> states() const;
|
QList<State> states() const;
|
||||||
bool hasParam(const QString ¶mName) const;
|
bool hasState(const StateTypeId &stateTypeId) const;
|
||||||
void setStates(const QList<State> &states);
|
void setStates(const QList<State> &states);
|
||||||
|
|
||||||
bool hasState(const StateTypeId &stateTypeId) const;
|
|
||||||
QVariant stateValue(const StateTypeId &stateTypeId) const;
|
QVariant stateValue(const StateTypeId &stateTypeId) const;
|
||||||
void setStateValue(const StateTypeId &stateTypeId, const QVariant &value);
|
void setStateValue(const StateTypeId &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
|
State state(const StateTypeId &stateTypeId) const;
|
||||||
|
|
||||||
bool setupComplete() const;
|
bool setupComplete() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|||||||
@ -32,13 +32,19 @@
|
|||||||
|
|
||||||
/*! Constructs an EventDescriptor describing an Event.
|
/*! Constructs an EventDescriptor describing an Event.
|
||||||
*/
|
*/
|
||||||
EventDescriptor::EventDescriptor(const EventTypeId &eventTypeId, const DeviceId &deviceId, const QList<ParamDescriptor> ¶mDescriptors):
|
EventDescriptor::EventDescriptor(const EventDescriptorId &id, const EventTypeId &eventTypeId, const DeviceId &deviceId, const QList<ParamDescriptor> ¶mDescriptors):
|
||||||
|
m_id(id),
|
||||||
m_eventTypeId(eventTypeId),
|
m_eventTypeId(eventTypeId),
|
||||||
m_deviceId(deviceId),
|
m_deviceId(deviceId),
|
||||||
m_paramDescriptors(paramDescriptors)
|
m_paramDescriptors(paramDescriptors)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventDescriptorId EventDescriptor::id() const
|
||||||
|
{
|
||||||
|
return m_id;
|
||||||
|
}
|
||||||
|
|
||||||
/*! Returns the id of the \l{EventType} which describes this Event.*/
|
/*! Returns the id of the \l{EventType} which describes this Event.*/
|
||||||
EventTypeId EventDescriptor::eventTypeId() const
|
EventTypeId EventDescriptor::eventTypeId() const
|
||||||
{
|
{
|
||||||
@ -98,33 +104,33 @@ bool EventDescriptor::operator ==(const Event &event) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach (const ParamDescriptor ¶mDescriptor, m_paramDescriptors) {
|
foreach (const ParamDescriptor ¶mDescriptor, m_paramDescriptors) {
|
||||||
switch (paramDescriptor.operand()) {
|
switch (paramDescriptor.operatorType()) {
|
||||||
case ParamDescriptor::OperandTypeEquals:
|
case ValueOperatorEquals:
|
||||||
if (event.param(paramDescriptor.name()).value() != paramDescriptor.value()) {
|
if (event.param(paramDescriptor.name()).value() != paramDescriptor.value()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ParamDescriptor::OperandTypeNotEquals:
|
case ValueOperatorNotEquals:
|
||||||
if (event.param(paramDescriptor.name()).value() == paramDescriptor.value()) {
|
if (event.param(paramDescriptor.name()).value() == paramDescriptor.value()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ParamDescriptor::OperandTypeGreater:
|
case ValueOperatorGreater:
|
||||||
if (event.param(paramDescriptor.name()).value() <= paramDescriptor.value()) {
|
if (event.param(paramDescriptor.name()).value() <= paramDescriptor.value()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ParamDescriptor::OperandTypeGreaterOrEqual:
|
case ValueOperatorGreaterOrEqual:
|
||||||
if (event.param(paramDescriptor.name()).value() < paramDescriptor.value()) {
|
if (event.param(paramDescriptor.name()).value() < paramDescriptor.value()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ParamDescriptor::OperandTypeLess:
|
case ValueOperatorLess:
|
||||||
if (event.param(paramDescriptor.name()).value() >= paramDescriptor.value()) {
|
if (event.param(paramDescriptor.name()).value() >= paramDescriptor.value()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ParamDescriptor::OperandTypeLessOrEqual:
|
case ValueOperatorLessOrEqual:
|
||||||
if (event.param(paramDescriptor.name()).value() < paramDescriptor.value()) {
|
if (event.param(paramDescriptor.name()).value() < paramDescriptor.value()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,9 @@
|
|||||||
class EventDescriptor
|
class EventDescriptor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EventDescriptor(const EventTypeId &eventTypeId, const DeviceId &deviceId, const QList<ParamDescriptor> ¶mDescriptors = QList<ParamDescriptor>());
|
EventDescriptor(const EventDescriptorId &id, const EventTypeId &eventTypeId, const DeviceId &deviceId, const QList<ParamDescriptor> ¶mDescriptors = QList<ParamDescriptor>());
|
||||||
|
|
||||||
|
EventDescriptorId id() const;
|
||||||
|
|
||||||
EventTypeId eventTypeId() const;
|
EventTypeId eventTypeId() const;
|
||||||
DeviceId deviceId() const;
|
DeviceId deviceId() const;
|
||||||
@ -44,6 +46,7 @@ public:
|
|||||||
bool operator ==(const Event &event) const;
|
bool operator ==(const Event &event) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
EventDescriptorId m_id;
|
||||||
EventTypeId m_eventTypeId;
|
EventTypeId m_eventTypeId;
|
||||||
DeviceId m_deviceId;
|
DeviceId m_deviceId;
|
||||||
QList<ParamDescriptor> m_paramDescriptors;
|
QList<ParamDescriptor> m_paramDescriptors;
|
||||||
|
|||||||
@ -20,17 +20,17 @@
|
|||||||
|
|
||||||
ParamDescriptor::ParamDescriptor(const QString &name, const QVariant &value):
|
ParamDescriptor::ParamDescriptor(const QString &name, const QVariant &value):
|
||||||
Param(name, value),
|
Param(name, value),
|
||||||
m_operand(OperandTypeEquals)
|
m_operatorType(ValueOperatorEquals)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ParamDescriptor::OperandType ParamDescriptor::operand() const
|
ValueOperator ParamDescriptor::operatorType() const
|
||||||
{
|
{
|
||||||
return m_operand;
|
return m_operatorType;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParamDescriptor::setOperand(ParamDescriptor::OperandType operand)
|
void ParamDescriptor::setOperatorType(ValueOperator operatorType)
|
||||||
{
|
{
|
||||||
m_operand = operand;
|
m_operatorType = operatorType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,25 +20,18 @@
|
|||||||
#define PARAMDESCRIPTOR_H
|
#define PARAMDESCRIPTOR_H
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
|
#include "typeutils.h"
|
||||||
|
|
||||||
class ParamDescriptor : public Param
|
class ParamDescriptor : public Param
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum OperandType {
|
|
||||||
OperandTypeEquals,
|
|
||||||
OperandTypeNotEquals,
|
|
||||||
OperandTypeLess,
|
|
||||||
OperandTypeGreater,
|
|
||||||
OperandTypeLessOrEqual,
|
|
||||||
OperandTypeGreaterOrEqual
|
|
||||||
};
|
|
||||||
ParamDescriptor(const QString &name, const QVariant &value = QVariant());
|
ParamDescriptor(const QString &name, const QVariant &value = QVariant());
|
||||||
|
|
||||||
OperandType operand() const;
|
ValueOperator operatorType() const;
|
||||||
void setOperand(OperandType operand);
|
void setOperatorType(ValueOperator operatorType);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OperandType m_operand;
|
ValueOperator m_operatorType;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PARAMDESCRIPTOR_H
|
#endif // PARAMDESCRIPTOR_H
|
||||||
|
|||||||
96
libguh/types/statedescriptor.cpp
Normal file
96
libguh/types/statedescriptor.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
* *
|
||||||
|
* This file is part of guh. *
|
||||||
|
* *
|
||||||
|
* Guh is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, version 2 of the License. *
|
||||||
|
* *
|
||||||
|
* Guh is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with guh. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
* *
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#include "statedescriptor.h"
|
||||||
|
|
||||||
|
StateDescriptor::StateDescriptor():
|
||||||
|
m_id(StateDescriptorId::createStateDescriptorId()),
|
||||||
|
m_operatorType(ValueOperatorEquals)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
StateDescriptor::StateDescriptor(const StateDescriptorId &id, const StateTypeId &stateTypeId, const DeviceId &deviceId, const QVariant &stateValue, ValueOperator operatorType):
|
||||||
|
m_id(id),
|
||||||
|
m_stateTypeId(stateTypeId),
|
||||||
|
m_deviceId(deviceId),
|
||||||
|
m_stateValue(stateValue),
|
||||||
|
m_operatorType(operatorType)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
StateDescriptorId StateDescriptor::id() const
|
||||||
|
{
|
||||||
|
return m_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
StateTypeId StateDescriptor::stateTypeId() const
|
||||||
|
{
|
||||||
|
return m_stateTypeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceId StateDescriptor::deviceId() const
|
||||||
|
{
|
||||||
|
return m_deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant StateDescriptor::stateValue() const
|
||||||
|
{
|
||||||
|
return m_stateValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueOperator StateDescriptor::operatorType() const
|
||||||
|
{
|
||||||
|
return m_operatorType;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StateDescriptor::operator ==(const StateDescriptor &other) const
|
||||||
|
{
|
||||||
|
return m_stateTypeId == other.stateTypeId() &&
|
||||||
|
m_deviceId == other.deviceId() &&
|
||||||
|
m_stateValue == other.stateValue() &&
|
||||||
|
m_operatorType == other.operatorType();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StateDescriptor::operator ==(const State &state) const
|
||||||
|
{
|
||||||
|
if ((m_stateTypeId != state.stateTypeId()) || (m_deviceId != state.deviceId())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
switch (m_operatorType) {
|
||||||
|
case ValueOperatorEquals:
|
||||||
|
return m_stateValue == state.value();
|
||||||
|
case ValueOperatorGreater:
|
||||||
|
return m_stateValue > state.value();
|
||||||
|
case ValueOperatorGreaterOrEqual:
|
||||||
|
return m_stateValue >= state.value();
|
||||||
|
case ValueOperatorLess:
|
||||||
|
return m_stateValue < state.value();
|
||||||
|
case ValueOperatorLessOrEqual:
|
||||||
|
return m_stateValue <= state.value();
|
||||||
|
case ValueOperatorNotEquals:
|
||||||
|
return m_stateValue != state.value();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StateDescriptor::operator !=(const State &state) const
|
||||||
|
{
|
||||||
|
return !(operator==(state));
|
||||||
|
}
|
||||||
58
libguh/types/statedescriptor.h
Normal file
58
libguh/types/statedescriptor.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
* *
|
||||||
|
* This file is part of guh. *
|
||||||
|
* *
|
||||||
|
* Guh is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, version 2 of the License. *
|
||||||
|
* *
|
||||||
|
* Guh is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with guh. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
* *
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#ifndef STATEDESCRIPTOR_H
|
||||||
|
#define STATEDESCRIPTOR_H
|
||||||
|
|
||||||
|
#include "typeutils.h"
|
||||||
|
#include "paramdescriptor.h"
|
||||||
|
#include "state.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QVariantList>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
class StateDescriptor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StateDescriptor();
|
||||||
|
StateDescriptor(const StateDescriptorId &id, const StateTypeId &stateTypeId, const DeviceId &deviceId, const QVariant &stateValue, ValueOperator operatorType = ValueOperatorEquals);
|
||||||
|
|
||||||
|
StateDescriptorId id() const;
|
||||||
|
|
||||||
|
StateTypeId stateTypeId() const;
|
||||||
|
DeviceId deviceId() const;
|
||||||
|
QVariant stateValue() const;
|
||||||
|
ValueOperator operatorType() const;
|
||||||
|
|
||||||
|
bool operator ==(const StateDescriptor &other) const;
|
||||||
|
|
||||||
|
bool operator ==(const State &state) const;
|
||||||
|
bool operator !=(const State &state) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
StateDescriptorId m_id;
|
||||||
|
StateTypeId m_stateTypeId;
|
||||||
|
DeviceId m_deviceId;
|
||||||
|
QVariant m_stateValue;
|
||||||
|
ValueOperator m_operatorType;
|
||||||
|
};
|
||||||
|
QDebug operator<<(QDebug dbg, const StateDescriptor &eventDescriptor);
|
||||||
|
QDebug operator<<(QDebug dbg, const QList<StateDescriptor> &eventDescriptors);
|
||||||
|
|
||||||
|
#endif // STATEDESCRIPTOR_H
|
||||||
@ -43,10 +43,28 @@ DECLARE_TYPE_ID(DeviceDescriptor)
|
|||||||
|
|
||||||
DECLARE_TYPE_ID(EventType)
|
DECLARE_TYPE_ID(EventType)
|
||||||
DECLARE_TYPE_ID(Event)
|
DECLARE_TYPE_ID(Event)
|
||||||
|
DECLARE_TYPE_ID(EventDescriptor)
|
||||||
DECLARE_TYPE_ID(StateType)
|
DECLARE_TYPE_ID(StateType)
|
||||||
DECLARE_TYPE_ID(State)
|
DECLARE_TYPE_ID(State)
|
||||||
|
DECLARE_TYPE_ID(StateDescriptor)
|
||||||
|
DECLARE_TYPE_ID(StateEvaluator)
|
||||||
DECLARE_TYPE_ID(ActionType)
|
DECLARE_TYPE_ID(ActionType)
|
||||||
DECLARE_TYPE_ID(Action)
|
DECLARE_TYPE_ID(Action)
|
||||||
DECLARE_TYPE_ID(Plugin)
|
DECLARE_TYPE_ID(Plugin)
|
||||||
|
DECLARE_TYPE_ID(Rule)
|
||||||
|
|
||||||
|
enum ValueOperator {
|
||||||
|
ValueOperatorEquals,
|
||||||
|
ValueOperatorNotEquals,
|
||||||
|
ValueOperatorLess,
|
||||||
|
ValueOperatorGreater,
|
||||||
|
ValueOperatorLessOrEqual,
|
||||||
|
ValueOperatorGreaterOrEqual
|
||||||
|
};
|
||||||
|
|
||||||
|
enum StateOperator {
|
||||||
|
StateOperatorAnd,
|
||||||
|
StateOperatorOr
|
||||||
|
};
|
||||||
|
|
||||||
#endif // TYPEUTILS_H
|
#endif // TYPEUTILS_H
|
||||||
|
|||||||
@ -28,16 +28,18 @@ bool JsonTypes::s_initialized = false;
|
|||||||
QString JsonTypes::s_lastError;
|
QString JsonTypes::s_lastError;
|
||||||
|
|
||||||
QVariantList JsonTypes::s_basicTypes;
|
QVariantList JsonTypes::s_basicTypes;
|
||||||
QVariantList JsonTypes::s_ruleTypes;
|
QVariantList JsonTypes::s_stateOperatorTypes;
|
||||||
|
QVariantList JsonTypes::s_valueOperatorTypes;
|
||||||
QVariantList JsonTypes::s_createMethodTypes;
|
QVariantList JsonTypes::s_createMethodTypes;
|
||||||
QVariantList JsonTypes::s_setupMethodTypes;
|
QVariantList JsonTypes::s_setupMethodTypes;
|
||||||
QVariantList JsonTypes::s_operandTypes;
|
|
||||||
|
|
||||||
QVariantMap JsonTypes::s_paramType;
|
QVariantMap JsonTypes::s_paramType;
|
||||||
QVariantMap JsonTypes::s_param;
|
QVariantMap JsonTypes::s_param;
|
||||||
QVariantMap JsonTypes::s_paramDescriptor;
|
QVariantMap JsonTypes::s_paramDescriptor;
|
||||||
QVariantMap JsonTypes::s_stateType;
|
QVariantMap JsonTypes::s_stateType;
|
||||||
QVariantMap JsonTypes::s_state;
|
QVariantMap JsonTypes::s_state;
|
||||||
|
QVariantMap JsonTypes::s_stateDescriptor;
|
||||||
|
QVariantMap JsonTypes::s_stateEvaluator;
|
||||||
QVariantMap JsonTypes::s_eventType;
|
QVariantMap JsonTypes::s_eventType;
|
||||||
QVariantMap JsonTypes::s_event;
|
QVariantMap JsonTypes::s_event;
|
||||||
QVariantMap JsonTypes::s_eventDescriptor;
|
QVariantMap JsonTypes::s_eventDescriptor;
|
||||||
@ -54,10 +56,10 @@ void JsonTypes::init()
|
|||||||
{
|
{
|
||||||
// BasicTypes
|
// BasicTypes
|
||||||
s_basicTypes << "uuid" << "string" << "integer" << "double" << "bool";
|
s_basicTypes << "uuid" << "string" << "integer" << "double" << "bool";
|
||||||
s_ruleTypes << "RuleTypeMatchAll" << "RuleTypeMatchAny";
|
s_stateOperatorTypes << "StateOperatorAnd" << "StateOperatorOr";
|
||||||
|
s_valueOperatorTypes << "OperatorTypeEquals" << "OperatorTypeNotEquals" << "OperatorTypeLess" << "OperatorTypeGreater" << "OperatorTypeLessThan" << "OperatorTypeGreaterThan";
|
||||||
s_createMethodTypes << "CreateMethodUser" << "CreateMethodAuto" << "CreateMethodDiscovery";
|
s_createMethodTypes << "CreateMethodUser" << "CreateMethodAuto" << "CreateMethodDiscovery";
|
||||||
s_setupMethodTypes << "SetupMethodJustAdd" << "SetupMethodDisplayPin" << "SetupMethodEnterPin" << "SetupMethodPushButton";
|
s_setupMethodTypes << "SetupMethodJustAdd" << "SetupMethodDisplayPin" << "SetupMethodEnterPin" << "SetupMethodPushButton";
|
||||||
s_operandTypes << "OperandTypeEquals" << "OperandTypeNotEquals" << "OperandTypeLess" << "OperandTypeGreater" << "OperandTypeLessThan" << "OperandTypeGreaterThan";
|
|
||||||
|
|
||||||
// ParamType
|
// ParamType
|
||||||
s_paramType.insert("name", "string");
|
s_paramType.insert("name", "string");
|
||||||
@ -73,7 +75,7 @@ void JsonTypes::init()
|
|||||||
// ParamDescriptor
|
// ParamDescriptor
|
||||||
s_paramDescriptor.insert("name", "string");
|
s_paramDescriptor.insert("name", "string");
|
||||||
s_paramDescriptor.insert("value", basicTypesRef());
|
s_paramDescriptor.insert("value", basicTypesRef());
|
||||||
s_paramDescriptor.insert("operand", operandTypesRef());
|
s_paramDescriptor.insert("operator", valueOperatorTypesRef());
|
||||||
|
|
||||||
// StateType
|
// StateType
|
||||||
s_stateType.insert("id", "uuid");
|
s_stateType.insert("id", "uuid");
|
||||||
@ -86,6 +88,19 @@ void JsonTypes::init()
|
|||||||
s_state.insert("deviceId", "uuid");
|
s_state.insert("deviceId", "uuid");
|
||||||
s_state.insert("value", "variant");
|
s_state.insert("value", "variant");
|
||||||
|
|
||||||
|
// StateDescriptor
|
||||||
|
s_stateDescriptor.insert("id", "uuid");
|
||||||
|
s_stateDescriptor.insert("stateTypeId", "uuid");
|
||||||
|
s_stateDescriptor.insert("deviceId", "uuid");
|
||||||
|
s_stateDescriptor.insert("value", "variant");
|
||||||
|
s_stateDescriptor.insert("operator", valueOperatorTypesRef());
|
||||||
|
|
||||||
|
// StateEvaluator
|
||||||
|
s_stateEvaluator.insert("id", "uuid");
|
||||||
|
s_stateEvaluator.insert("o:stateDescriptor", stateDescriptorRef());
|
||||||
|
s_stateEvaluator.insert("o:childEvaluators", QVariantList() << stateEvaluatorRef());
|
||||||
|
s_stateEvaluator.insert("o:operator", stateOperatorTypesRef());
|
||||||
|
|
||||||
// EventType
|
// EventType
|
||||||
s_eventType.insert("id", "uuid");
|
s_eventType.insert("id", "uuid");
|
||||||
s_eventType.insert("name", "string");
|
s_eventType.insert("name", "string");
|
||||||
@ -146,10 +161,9 @@ void JsonTypes::init()
|
|||||||
|
|
||||||
// Rule
|
// Rule
|
||||||
s_rule.insert("id", "uuid");
|
s_rule.insert("id", "uuid");
|
||||||
s_rule.insert("ruleType", ruleTypesRef());
|
|
||||||
s_rule.insert("eventDescriptors", QVariantList() << eventDescriptorRef());
|
s_rule.insert("eventDescriptors", QVariantList() << eventDescriptorRef());
|
||||||
s_rule.insert("actions", QVariantList() << actionRef());
|
s_rule.insert("actions", QVariantList() << actionRef());
|
||||||
s_rule.insert("states", QVariantList() << stateRef());
|
s_rule.insert("stateEvaluator", stateEvaluatorRef());
|
||||||
|
|
||||||
s_initialized = true;
|
s_initialized = true;
|
||||||
}
|
}
|
||||||
@ -166,8 +180,11 @@ QVariantMap JsonTypes::allTypes()
|
|||||||
allTypes.insert("ParamType", paramTypeDescription());
|
allTypes.insert("ParamType", paramTypeDescription());
|
||||||
allTypes.insert("CreateMethodType", createMethodTypes());
|
allTypes.insert("CreateMethodType", createMethodTypes());
|
||||||
allTypes.insert("SetupMethodType", setupMethodTypes());
|
allTypes.insert("SetupMethodType", setupMethodTypes());
|
||||||
allTypes.insert("OperandType", operandTypes());
|
allTypes.insert("ValueOperatorType", valueOperatorTypes());
|
||||||
|
allTypes.insert("StateOperatorType", stateOperatorTypes());
|
||||||
allTypes.insert("StateType", stateTypeDescription());
|
allTypes.insert("StateType", stateTypeDescription());
|
||||||
|
allTypes.insert("StateDescriptor", stateDescriptorDescription());
|
||||||
|
allTypes.insert("StateEvaluator", stateEvaluatorDescription());
|
||||||
allTypes.insert("Event", eventDescription());
|
allTypes.insert("Event", eventDescription());
|
||||||
allTypes.insert("EventType", eventTypeDescription());
|
allTypes.insert("EventType", eventTypeDescription());
|
||||||
allTypes.insert("EventDescriptor", eventDescriptorDescription());
|
allTypes.insert("EventDescriptor", eventDescriptorDescription());
|
||||||
@ -181,7 +198,6 @@ QVariantMap JsonTypes::allTypes()
|
|||||||
allTypes.insert("Device", deviceDescription());
|
allTypes.insert("Device", deviceDescription());
|
||||||
allTypes.insert("DeviceDescriptor", deviceDescriptorDescription());
|
allTypes.insert("DeviceDescriptor", deviceDescriptorDescription());
|
||||||
allTypes.insert("Action", actionDescription());
|
allTypes.insert("Action", actionDescription());
|
||||||
allTypes.insert("RuleType", ruleTypes());
|
|
||||||
allTypes.insert("Rule", ruleDescription());
|
allTypes.insert("Rule", ruleDescription());
|
||||||
return allTypes;
|
return allTypes;
|
||||||
}
|
}
|
||||||
@ -221,7 +237,7 @@ QVariantMap JsonTypes::packEventDescriptor(const EventDescriptor &eventDescripto
|
|||||||
foreach (const ParamDescriptor ¶mDescriptor, eventDescriptor.paramDescriptors()) {
|
foreach (const ParamDescriptor ¶mDescriptor, eventDescriptor.paramDescriptors()) {
|
||||||
params.append(packParamDescriptor(paramDescriptor));
|
params.append(packParamDescriptor(paramDescriptor));
|
||||||
}
|
}
|
||||||
variant.insert("params", params);
|
variant.insert("paramDescriptors", params);
|
||||||
return variant;
|
return variant;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,6 +277,31 @@ QVariantMap JsonTypes::packStateType(const StateType &stateType)
|
|||||||
return variantMap;
|
return variantMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVariantMap JsonTypes::packStateDescriptor(const StateDescriptor &stateDescriptor)
|
||||||
|
{
|
||||||
|
QVariantMap variantMap;
|
||||||
|
variantMap.insert("id", stateDescriptor.id().toString());
|
||||||
|
variantMap.insert("stateTypeId", stateDescriptor.stateTypeId().toString());
|
||||||
|
variantMap.insert("deviceId", stateDescriptor.deviceId().toString());
|
||||||
|
variantMap.insert("value", stateDescriptor.stateValue());
|
||||||
|
variantMap.insert("operator", valueOperatorTypes().at(stateDescriptor.operatorType()));
|
||||||
|
return variantMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap JsonTypes::packStateEvaluator(const StateEvaluator &stateEvaluator)
|
||||||
|
{
|
||||||
|
QVariantMap variantMap;
|
||||||
|
variantMap.insert("id", stateEvaluator.id());
|
||||||
|
variantMap.insert("stateDescriptor", packStateDescriptor(stateEvaluator.stateDescriptor()));
|
||||||
|
QVariantList childEvaluators;
|
||||||
|
foreach (const StateEvaluator &childEvaluator, stateEvaluator.childEvaluators()) {
|
||||||
|
childEvaluators.append(packStateEvaluator(childEvaluator));
|
||||||
|
}
|
||||||
|
variantMap.insert("childEvaluators", childEvaluators);
|
||||||
|
|
||||||
|
return variantMap;
|
||||||
|
}
|
||||||
|
|
||||||
QVariantMap JsonTypes::packParam(const Param ¶m)
|
QVariantMap JsonTypes::packParam(const Param ¶m)
|
||||||
{
|
{
|
||||||
QVariantMap variantMap;
|
QVariantMap variantMap;
|
||||||
@ -273,7 +314,7 @@ QVariantMap JsonTypes::packParamDescriptor(const ParamDescriptor ¶mDescripto
|
|||||||
QVariantMap variantMap;
|
QVariantMap variantMap;
|
||||||
variantMap.insert("name", paramDescriptor.name());
|
variantMap.insert("name", paramDescriptor.name());
|
||||||
variantMap.insert("value", paramDescriptor.value());
|
variantMap.insert("value", paramDescriptor.value());
|
||||||
variantMap.insert("operand", s_operandTypes.at(paramDescriptor.operand()));
|
variantMap.insert("operator", s_valueOperatorTypes.at(paramDescriptor.operatorType()));
|
||||||
return variantMap;
|
return variantMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,16 +421,12 @@ QVariantMap JsonTypes::packRule(const Rule &rule)
|
|||||||
}
|
}
|
||||||
ruleMap.insert("eventDescriptors", eventDescriptorList);
|
ruleMap.insert("eventDescriptors", eventDescriptorList);
|
||||||
|
|
||||||
ruleMap.insert("ruleType", s_ruleTypes.at(rule.ruleType()));
|
|
||||||
|
|
||||||
QVariantList actionList;
|
QVariantList actionList;
|
||||||
foreach (const Action &action, rule.actions()) {
|
foreach (const Action &action, rule.actions()) {
|
||||||
actionList.append(JsonTypes::packAction(action));
|
actionList.append(JsonTypes::packAction(action));
|
||||||
}
|
}
|
||||||
ruleMap.insert("actions", actionList);
|
ruleMap.insert("actions", actionList);
|
||||||
|
ruleMap.insert("stateEvaluator", JsonTypes::packStateEvaluator(rule.stateEvaluator()));
|
||||||
QVariantList states;
|
|
||||||
ruleMap.insert("states", states);
|
|
||||||
return ruleMap;
|
return ruleMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,19 +449,19 @@ QList<Param> JsonTypes::unpackParams(const QVariantList ¶mList)
|
|||||||
ParamDescriptor JsonTypes::unpackParamDescriptor(const QVariantMap ¶mMap)
|
ParamDescriptor JsonTypes::unpackParamDescriptor(const QVariantMap ¶mMap)
|
||||||
{
|
{
|
||||||
ParamDescriptor param(paramMap.value("name").toString(), paramMap.value("value"));
|
ParamDescriptor param(paramMap.value("name").toString(), paramMap.value("value"));
|
||||||
QString operandString = paramMap.value("operand").toString();
|
QString operatorString = paramMap.value("operator").toString();
|
||||||
if (operandString == "OperandTypeEquals") {
|
if (operatorString == "ValueOperatorEquals") {
|
||||||
param.setOperand(ParamDescriptor::OperandTypeEquals);
|
param.setOperatorType(ValueOperatorEquals);
|
||||||
} else if (operandString == "OperandTypeNotEquals") {
|
} else if (operatorString == "ValueOperatorNotEquals") {
|
||||||
param.setOperand(ParamDescriptor::OperandTypeNotEquals);
|
param.setOperatorType(ValueOperatorNotEquals);
|
||||||
} else if (operandString == "OperandTypeLess") {
|
} else if (operatorString == "ValueOperatorLess") {
|
||||||
param.setOperand(ParamDescriptor::OperandTypeLess);
|
param.setOperatorType(ValueOperatorLess);
|
||||||
} else if (operandString == "OperandTypeGreater") {
|
} else if (operatorString == "ValueOperatorGreater") {
|
||||||
param.setOperand(ParamDescriptor::OperandTypeGreater);
|
param.setOperatorType(ValueOperatorGreater);
|
||||||
} else if (operandString == "OperandTypeLessOrEqual") {
|
} else if (operatorString == "ValueOperatorLessOrEqual") {
|
||||||
param.setOperand(ParamDescriptor::OperandTypeLessOrEqual);
|
param.setOperatorType(ValueOperatorLessOrEqual);
|
||||||
} else if (operandString == "OperandTypeGreaterOrEqual") {
|
} else if (operatorString == "ValueOperatorGreaterOrEqual") {
|
||||||
param.setOperand(ParamDescriptor::OperandTypeGreaterOrEqual);
|
param.setOperatorType(ValueOperatorGreaterOrEqual);
|
||||||
}
|
}
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
@ -589,6 +626,18 @@ QPair<bool, QString> JsonTypes::validateVariant(const QVariant &templateVariant,
|
|||||||
qDebug() << "state type not matching";
|
qDebug() << "state type not matching";
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
} else if (refName == stateEvaluatorRef()) {
|
||||||
|
QPair<bool, QString> result = validateMap(stateEvaluatorDescription(), variant.toMap());
|
||||||
|
if (!result.first) {
|
||||||
|
qDebug() << "stateEvaluator type not matching";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else if (refName == stateDescriptorRef()) {
|
||||||
|
QPair<bool, QString> result = validateMap(stateDescriptorDescription(), variant.toMap());
|
||||||
|
if (!result.first) {
|
||||||
|
qDebug() << "stateDescriptor type not matching";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
} else if (refName == pluginRef()) {
|
} else if (refName == pluginRef()) {
|
||||||
QPair<bool, QString> result = validateMap(pluginDescription(), variant.toMap());
|
QPair<bool, QString> result = validateMap(pluginDescription(), variant.toMap());
|
||||||
if (!result.first) {
|
if (!result.first) {
|
||||||
@ -601,16 +650,22 @@ QPair<bool, QString> JsonTypes::validateVariant(const QVariant &templateVariant,
|
|||||||
qDebug() << "rule type not matching";
|
qDebug() << "rule type not matching";
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
} else if (refName == eventDescriptorRef()) {
|
||||||
|
QPair<bool, QString> result = validateMap(eventDescriptorDescription(), variant.toMap());
|
||||||
|
if (!result.first) {
|
||||||
|
qDebug() << "evendescriptor not matching";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
} else if (refName == basicTypesRef()) {
|
} else if (refName == basicTypesRef()) {
|
||||||
QPair<bool, QString> result = validateBasicType(variant);
|
QPair<bool, QString> result = validateBasicType(variant);
|
||||||
if (!result.first) {
|
if (!result.first) {
|
||||||
qDebug() << "value not allowed in" << basicTypesRef();
|
qDebug() << "value not allowed in" << basicTypesRef();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} else if (refName == ruleTypesRef()) {
|
} else if (refName == stateOperatorTypesRef()) {
|
||||||
QPair<bool, QString> result = validateRuleType(variant);
|
QPair<bool, QString> result = validateStateOperatorType(variant);
|
||||||
if (!result.first) {
|
if (!result.first) {
|
||||||
qDebug() << "value not allowed in" << ruleTypesRef();
|
qDebug() << "value not allowed in" << stateOperatorTypesRef();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} else if (refName == createMethodTypesRef()) {
|
} else if (refName == createMethodTypesRef()) {
|
||||||
@ -625,10 +680,10 @@ QPair<bool, QString> JsonTypes::validateVariant(const QVariant &templateVariant,
|
|||||||
qDebug() << "value not allowed in" << createMethodTypesRef();
|
qDebug() << "value not allowed in" << createMethodTypesRef();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} else if (refName == operandTypesRef()) {
|
} else if (refName == valueOperatorTypesRef()) {
|
||||||
QPair<bool, QString> result = validateOperandType(variant);
|
QPair<bool, QString> result = validateValueOperatorType(variant);
|
||||||
if (!result.first) {
|
if (!result.first) {
|
||||||
qDebug() << QString("value %1 not allowed in %2").arg(variant.toString()).arg(operandTypesRef());
|
qDebug() << QString("value %1 not allowed in %2").arg(variant.toString()).arg(valueOperatorTypesRef());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -685,9 +740,9 @@ QPair<bool, QString> JsonTypes::validateBasicType(const QVariant &variant)
|
|||||||
return report(false, QString("Error validating basic type %1.").arg(variant.toString()));
|
return report(false, QString("Error validating basic type %1.").arg(variant.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
QPair<bool, QString> JsonTypes::validateRuleType(const QVariant &variant)
|
QPair<bool, QString> JsonTypes::validateStateOperatorType(const QVariant &variant)
|
||||||
{
|
{
|
||||||
return report(s_ruleTypes.contains(variant.toString()), QString("Unknown rules type %1").arg(variant.toString()));
|
return report(s_stateOperatorTypes.contains(variant.toString()), QString("Unknown state operator %1").arg(variant.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
QPair<bool, QString> JsonTypes::validateCreateMethodType(const QVariant &variant)
|
QPair<bool, QString> JsonTypes::validateCreateMethodType(const QVariant &variant)
|
||||||
@ -700,7 +755,7 @@ QPair<bool, QString> JsonTypes::validateSetupMethodType(const QVariant &variant)
|
|||||||
return report(s_setupMethodTypes.contains(variant.toString()), QString("Unknwon setupMethod type %1").arg(variant.toString()));
|
return report(s_setupMethodTypes.contains(variant.toString()), QString("Unknwon setupMethod type %1").arg(variant.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
QPair<bool, QString> JsonTypes::validateOperandType(const QVariant &variant)
|
QPair<bool, QString> JsonTypes::validateValueOperatorType(const QVariant &variant)
|
||||||
{
|
{
|
||||||
return report(s_operandTypes.contains(variant.toString()), QString("Unknown operand type %1").arg(variant.toString()));
|
return report(s_valueOperatorTypes.contains(variant.toString()), QString("Unknown value operator type %1").arg(variant.toString()));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,15 +65,17 @@ public:
|
|||||||
static QVariantMap allTypes();
|
static QVariantMap allTypes();
|
||||||
|
|
||||||
DECLARE_TYPE(basicTypes, "BasicType")
|
DECLARE_TYPE(basicTypes, "BasicType")
|
||||||
DECLARE_TYPE(ruleTypes, "RuleType")
|
DECLARE_TYPE(stateOperatorTypes, "StateOperatorType")
|
||||||
|
DECLARE_TYPE(valueOperatorTypes, "ValueOperatorType")
|
||||||
DECLARE_TYPE(createMethodTypes, "CreateMethodType")
|
DECLARE_TYPE(createMethodTypes, "CreateMethodType")
|
||||||
DECLARE_TYPE(setupMethodTypes, "SetupMethodType")
|
DECLARE_TYPE(setupMethodTypes, "SetupMethodType")
|
||||||
DECLARE_TYPE(operandTypes, "OperandType")
|
|
||||||
DECLARE_OBJECT(paramType, "ParamType")
|
DECLARE_OBJECT(paramType, "ParamType")
|
||||||
DECLARE_OBJECT(param, "Param")
|
DECLARE_OBJECT(param, "Param")
|
||||||
DECLARE_OBJECT(paramDescriptor, "ParamDescriptor")
|
DECLARE_OBJECT(paramDescriptor, "ParamDescriptor")
|
||||||
DECLARE_OBJECT(stateType, "StateType")
|
DECLARE_OBJECT(stateType, "StateType")
|
||||||
|
DECLARE_OBJECT(stateDescriptor, "StateDescriptor")
|
||||||
DECLARE_OBJECT(state, "State")
|
DECLARE_OBJECT(state, "State")
|
||||||
|
DECLARE_OBJECT(stateEvaluator, "StateEvaluator")
|
||||||
DECLARE_OBJECT(eventType, "EventType")
|
DECLARE_OBJECT(eventType, "EventType")
|
||||||
DECLARE_OBJECT(event, "Event")
|
DECLARE_OBJECT(event, "Event")
|
||||||
DECLARE_OBJECT(eventDescriptor, "EventDescriptor")
|
DECLARE_OBJECT(eventDescriptor, "EventDescriptor")
|
||||||
@ -92,6 +94,8 @@ public:
|
|||||||
static QVariantMap packActionType(const ActionType &actionType);
|
static QVariantMap packActionType(const ActionType &actionType);
|
||||||
static QVariantMap packAction(const Action &action);
|
static QVariantMap packAction(const Action &action);
|
||||||
static QVariantMap packStateType(const StateType &stateType);
|
static QVariantMap packStateType(const StateType &stateType);
|
||||||
|
static QVariantMap packStateDescriptor(const StateDescriptor &stateDescriptor);
|
||||||
|
static QVariantMap packStateEvaluator(const StateEvaluator &stateEvaluator);
|
||||||
static QVariantMap packParam(const Param ¶m);
|
static QVariantMap packParam(const Param ¶m);
|
||||||
static QVariantMap packParamType(const ParamType ¶mType);
|
static QVariantMap packParamType(const ParamType ¶mType);
|
||||||
static QVariantMap packParamDescriptor(const ParamDescriptor ¶mDescriptor);
|
static QVariantMap packParamDescriptor(const ParamDescriptor ¶mDescriptor);
|
||||||
@ -112,10 +116,10 @@ public:
|
|||||||
static QPair<bool, QString> validateList(const QVariantList &templateList, const QVariantList &list);
|
static QPair<bool, QString> validateList(const QVariantList &templateList, const QVariantList &list);
|
||||||
static QPair<bool, QString> validateVariant(const QVariant &templateVariant, const QVariant &variant);
|
static QPair<bool, QString> validateVariant(const QVariant &templateVariant, const QVariant &variant);
|
||||||
static QPair<bool, QString> validateBasicType(const QVariant &variant);
|
static QPair<bool, QString> validateBasicType(const QVariant &variant);
|
||||||
static QPair<bool, QString> validateRuleType(const QVariant &variant);
|
static QPair<bool, QString> validateStateOperatorType(const QVariant &variant);
|
||||||
static QPair<bool, QString> validateCreateMethodType(const QVariant &variant);
|
static QPair<bool, QString> validateCreateMethodType(const QVariant &variant);
|
||||||
static QPair<bool, QString> validateSetupMethodType(const QVariant &variant);
|
static QPair<bool, QString> validateSetupMethodType(const QVariant &variant);
|
||||||
static QPair<bool, QString> validateOperandType(const QVariant &variant);
|
static QPair<bool, QString> validateValueOperatorType(const QVariant &variant);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool s_initialized;
|
static bool s_initialized;
|
||||||
|
|||||||
@ -46,12 +46,15 @@ RulesHandler::RulesHandler(QObject *parent) :
|
|||||||
setParams("AddRule", params);
|
setParams("AddRule", params);
|
||||||
returns.insert("success", "bool");
|
returns.insert("success", "bool");
|
||||||
returns.insert("errorMessage", "string");
|
returns.insert("errorMessage", "string");
|
||||||
|
returns.insert("o:ruleId", "uuid");
|
||||||
setReturns("AddRule", returns);
|
setReturns("AddRule", returns);
|
||||||
|
|
||||||
params.clear(); returns.clear();
|
params.clear(); returns.clear();
|
||||||
setDescription("RemoveRule", "Remove a rule");
|
setDescription("RemoveRule", "Remove a rule");
|
||||||
params.insert("ruleId", "uuid");
|
params.insert("ruleId", "uuid");
|
||||||
setParams("RemoveRule", params);
|
setParams("RemoveRule", params);
|
||||||
|
returns.insert("success", "bool");
|
||||||
|
returns.insert("errorMessage", "string");
|
||||||
setReturns("RemoveRule", returns);
|
setReturns("RemoveRule", returns);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +69,6 @@ JsonReply* RulesHandler::GetRules(const QVariantMap ¶ms)
|
|||||||
|
|
||||||
QVariantList rulesList;
|
QVariantList rulesList;
|
||||||
foreach (const Rule &rule, GuhCore::instance()->ruleEngine()->rules()) {
|
foreach (const Rule &rule, GuhCore::instance()->ruleEngine()->rules()) {
|
||||||
qDebug() << "got rule" << rule.id();
|
|
||||||
QVariantMap ruleMap = JsonTypes::packRule(rule);
|
QVariantMap ruleMap = JsonTypes::packRule(rule);
|
||||||
rulesList.append(ruleMap);
|
rulesList.append(ruleMap);
|
||||||
}
|
}
|
||||||
@ -78,16 +80,15 @@ JsonReply* RulesHandler::GetRules(const QVariantMap ¶ms)
|
|||||||
|
|
||||||
JsonReply* RulesHandler::AddRule(const QVariantMap ¶ms)
|
JsonReply* RulesHandler::AddRule(const QVariantMap ¶ms)
|
||||||
{
|
{
|
||||||
QVariantMap eventMap = params.value("event").toMap();
|
QVariantMap eventMap = params.value("eventDescriptor").toMap();
|
||||||
|
|
||||||
EventTypeId eventTypeId(eventMap.value("eventTypeId").toString());
|
EventTypeId eventTypeId(eventMap.value("eventTypeId").toString());
|
||||||
DeviceId eventDeviceId(eventMap.value("deviceId").toString());
|
DeviceId eventDeviceId(eventMap.value("deviceId").toString());
|
||||||
QList<ParamDescriptor> eventParams = JsonTypes::unpackParamDescriptors(eventMap.value("paramDescriptors").toList());
|
QList<ParamDescriptor> eventParams = JsonTypes::unpackParamDescriptors(eventMap.value("paramDescriptors").toList());
|
||||||
EventDescriptor eventDescriptor(eventTypeId, eventDeviceId, eventParams);
|
EventDescriptor eventDescriptor(EventDescriptorId::createEventDescriptorId(), eventTypeId, eventDeviceId, eventParams);
|
||||||
|
|
||||||
QList<Action> actions;
|
QList<Action> actions;
|
||||||
QVariantList actionList = params.value("actions").toList();
|
QVariantList actionList = params.value("actions").toList();
|
||||||
qDebug() << "got action list" << actionList.count();
|
|
||||||
foreach (const QVariant &actionVariant, actionList) {
|
foreach (const QVariant &actionVariant, actionList) {
|
||||||
QVariantMap actionMap = actionVariant.toMap();
|
QVariantMap actionMap = actionVariant.toMap();
|
||||||
Action action(ActionTypeId(actionMap.value("actionTypeId").toString()), DeviceId(actionMap.value("deviceId").toString()));
|
Action action(ActionTypeId(actionMap.value("actionTypeId").toString()), DeviceId(actionMap.value("deviceId").toString()));
|
||||||
@ -102,10 +103,12 @@ JsonReply* RulesHandler::AddRule(const QVariantMap ¶ms)
|
|||||||
return createReply(returns);
|
return createReply(returns);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(GuhCore::instance()->ruleEngine()->addRule(eventDescriptor, actions)) {
|
RuleId newRuleId = RuleId::createRuleId();
|
||||||
|
switch(GuhCore::instance()->ruleEngine()->addRule(newRuleId, eventDescriptor, actions)) {
|
||||||
case RuleEngine::RuleErrorNoError:
|
case RuleEngine::RuleErrorNoError:
|
||||||
returns.insert("success", true);
|
returns.insert("success", true);
|
||||||
returns.insert("errorMessage", "");
|
returns.insert("errorMessage", "");
|
||||||
|
returns.insert("ruleId", newRuleId.toString());
|
||||||
break;
|
break;
|
||||||
case RuleEngine::RuleErrorDeviceNotFound:
|
case RuleEngine::RuleErrorDeviceNotFound:
|
||||||
returns.insert("success", false);
|
returns.insert("success", false);
|
||||||
@ -125,10 +128,11 @@ JsonReply* RulesHandler::AddRule(const QVariantMap ¶ms)
|
|||||||
JsonReply* RulesHandler::RemoveRule(const QVariantMap ¶ms)
|
JsonReply* RulesHandler::RemoveRule(const QVariantMap ¶ms)
|
||||||
{
|
{
|
||||||
QVariantMap returns;
|
QVariantMap returns;
|
||||||
QUuid ruleId = params.value("ruleId").toUuid();
|
RuleId ruleId(params.value("ruleId").toString());
|
||||||
switch (GuhCore::instance()->ruleEngine()->removeRule(ruleId)) {
|
switch (GuhCore::instance()->ruleEngine()->removeRule(ruleId)) {
|
||||||
case RuleEngine::RuleErrorNoError:
|
case RuleEngine::RuleErrorNoError:
|
||||||
returns.insert("success", true);
|
returns.insert("success", true);
|
||||||
|
returns.insert("errorMessage", "");
|
||||||
break;
|
break;
|
||||||
case RuleEngine::RuleErrorRuleNotFound:
|
case RuleEngine::RuleErrorRuleNotFound:
|
||||||
returns.insert("success", false);
|
returns.insert("success", false);
|
||||||
|
|||||||
@ -48,19 +48,23 @@
|
|||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
/*! Constructs a Rule with the given \a id, \a eventDescriptor, \a states and \a actions. The ruleType will default to
|
/*! Constructs an empty, invalid rule. */
|
||||||
\l{Rule::RuleTypeAll}.*/
|
Rule::Rule()
|
||||||
Rule::Rule(const QUuid &id, const EventDescriptor &eventDescriptor, const QList<State> &states, const QList<Action> &actions):
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Constructs a Rule with the given \a id, \a eventDescriptor, \a states and \a actions.*/
|
||||||
|
Rule::Rule(const RuleId &id, const QList<EventDescriptor> &eventDescriptorList, const StateEvaluator &stateEvaluator, const QList<Action> &actions):
|
||||||
m_id(id),
|
m_id(id),
|
||||||
m_eventDescriptors(QList<EventDescriptor>() << eventDescriptor),
|
m_eventDescriptors(eventDescriptorList),
|
||||||
m_states(states),
|
m_stateEvaluator(stateEvaluator),
|
||||||
m_actions(actions),
|
m_actions(actions)
|
||||||
m_ruleType(RuleTypeAll)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Returns the id or the Rule. */
|
/*! Returns the id or the Rule. */
|
||||||
QUuid Rule::id() const
|
RuleId Rule::id() const
|
||||||
{
|
{
|
||||||
return m_id;
|
return m_id;
|
||||||
}
|
}
|
||||||
@ -71,10 +75,10 @@ QList<EventDescriptor> Rule::eventDescriptors() const
|
|||||||
return m_eventDescriptors;
|
return m_eventDescriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Returns the \l{State}{States} that need to be matching in order for this to Rule apply. */
|
/*! Returns the \l{StateEvaluator} that needs to evaluate successfully in order for this to Rule apply. */
|
||||||
QList<State> Rule::states() const
|
StateEvaluator Rule::stateEvaluator() const
|
||||||
{
|
{
|
||||||
return m_states;
|
return m_stateEvaluator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Returns the \l{Action}{Actions} to be executed when this Rule is matched and states match. */
|
/*! Returns the \l{Action}{Actions} to be executed when this Rule is matched and states match. */
|
||||||
@ -82,15 +86,3 @@ QList<Action> Rule::actions() const
|
|||||||
{
|
{
|
||||||
return m_actions;
|
return m_actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Returns the type of the rule. This defines how states are compared. The default is \l{Rule::RuleTypeAll}.*/
|
|
||||||
Rule::RuleType Rule::ruleType() const
|
|
||||||
{
|
|
||||||
return m_ruleType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Set the type of the rule to \a ruleType. This defines how states are compared. The default is \l{Rule::RuleTypeAll}.*/
|
|
||||||
void Rule::setRuleType(Rule::RuleType ruleType)
|
|
||||||
{
|
|
||||||
m_ruleType = ruleType;
|
|
||||||
}
|
|
||||||
|
|||||||
@ -29,28 +29,19 @@
|
|||||||
class Rule
|
class Rule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum RuleType {
|
Rule();
|
||||||
RuleTypeAll,
|
Rule(const RuleId &id, const QList<EventDescriptor> &eventDescriptorList, const StateEvaluator &stateEvaluator, const QList<Action> &actions);
|
||||||
RuleTypeAny
|
|
||||||
};
|
|
||||||
|
|
||||||
Rule(const QUuid &id, const EventDescriptor &eventDescriptor, const QList<State> &states, const QList<Action> &actions);
|
RuleId id() const;
|
||||||
|
|
||||||
QUuid id() const;
|
|
||||||
QList<EventDescriptor> eventDescriptors() const;
|
QList<EventDescriptor> eventDescriptors() const;
|
||||||
QList<State> states() const;
|
StateEvaluator stateEvaluator() const;
|
||||||
QList<Action> actions() const;
|
QList<Action> actions() const;
|
||||||
|
|
||||||
RuleType ruleType() const;
|
|
||||||
void setRuleType(RuleType ruleType);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QUuid m_id;
|
RuleId m_id;
|
||||||
QList<EventDescriptor> m_eventDescriptors;
|
QList<EventDescriptor> m_eventDescriptors;
|
||||||
QList<State> m_states;
|
StateEvaluator m_stateEvaluator;
|
||||||
StateEvaluator stateEvaluator;
|
|
||||||
QList<Action> m_actions;
|
QList<Action> m_actions;
|
||||||
RuleType m_ruleType;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RULE_H
|
#endif // RULE_H
|
||||||
|
|||||||
@ -79,32 +79,36 @@ RuleEngine::RuleEngine(QObject *parent) :
|
|||||||
|
|
||||||
settings.beginGroup(idString);
|
settings.beginGroup(idString);
|
||||||
|
|
||||||
settings.beginGroup("event");
|
QList<EventDescriptor> eventDescriptorList;
|
||||||
EventTypeId eventTypeId(settings.value("eventTypeId").toString());
|
settings.beginGroup("events");
|
||||||
DeviceId deviceId(settings.value("deviceId").toString());
|
|
||||||
QList<ParamDescriptor> params;
|
foreach (QString eventGroupName, settings.childGroups()) {
|
||||||
foreach (QString groupName, settings.childGroups()) {
|
if (eventGroupName.startsWith("EventDescriptor-")) {
|
||||||
if (groupName.startsWith("ParamDescriptor-")) {
|
settings.beginGroup(eventGroupName);
|
||||||
settings.beginGroup(groupName);
|
EventDescriptorId eventDescriptorId(eventGroupName.remove(QRegExp("^EventDescriptor-")));
|
||||||
ParamDescriptor paramDescriptor(groupName.remove(QRegExp("^ParamDescriptor-")), settings.value("value"));
|
EventTypeId eventTypeId(settings.value("eventTypeId").toString());
|
||||||
paramDescriptor.setOperand((ParamDescriptor::OperandType)settings.value("operand").toInt());
|
DeviceId deviceId(settings.value("deviceId").toString());
|
||||||
params.append(paramDescriptor);
|
|
||||||
|
QList<ParamDescriptor> params;
|
||||||
|
foreach (QString groupName, settings.childGroups()) {
|
||||||
|
if (groupName.startsWith("ParamDescriptor-")) {
|
||||||
|
settings.beginGroup(groupName);
|
||||||
|
ParamDescriptor paramDescriptor(groupName.remove(QRegExp("^ParamDescriptor-")), settings.value("value"));
|
||||||
|
paramDescriptor.setOperatorType((ValueOperator)settings.value("operator").toInt());
|
||||||
|
params.append(paramDescriptor);
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EventDescriptor eventDescriptor(eventDescriptorId, eventTypeId, deviceId, params);
|
||||||
|
eventDescriptorList.append(eventDescriptor);
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EventDescriptor eventDescriptor(eventTypeId, deviceId, params);
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup("states");
|
StateEvaluator stateEvaluator = StateEvaluator::loadFromSettings(settings, "stateEvaluator");
|
||||||
QList<State> states;
|
|
||||||
foreach (const QString &stateTypeIdString, settings.childGroups()) {
|
|
||||||
settings.beginGroup(stateTypeIdString);
|
|
||||||
State state(StateTypeId(stateTypeIdString), DeviceId(settings.value("deviceId").toString()));
|
|
||||||
state.setValue(settings.value("value"));
|
|
||||||
settings.endGroup();
|
|
||||||
states.append(state);
|
|
||||||
}
|
|
||||||
settings.endGroup();
|
|
||||||
|
|
||||||
settings.beginGroup("actions");
|
settings.beginGroup("actions");
|
||||||
QList<Action> actions;
|
QList<Action> actions;
|
||||||
@ -129,8 +133,8 @@ RuleEngine::RuleEngine(QObject *parent) :
|
|||||||
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
Rule rule = Rule(QUuid(idString), eventDescriptor, states, actions);
|
// Rule rule = Rule(RuleId(idString), eventDescriptorList, states, actions);
|
||||||
m_rules.append(rule);
|
// m_rules.append(rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -146,23 +150,8 @@ QList<Action> RuleEngine::evaluateEvent(const Event &event)
|
|||||||
for (int i = 0; i < m_rules.count(); ++i) {
|
for (int i = 0; i < m_rules.count(); ++i) {
|
||||||
qDebug() << "evaluating rule" << i << m_rules.at(i).eventDescriptors();
|
qDebug() << "evaluating rule" << i << m_rules.at(i).eventDescriptors();
|
||||||
if (containsEvent(m_rules.at(i), event)) {
|
if (containsEvent(m_rules.at(i), event)) {
|
||||||
bool statesMatching = true;
|
if (m_rules.at(i).stateEvaluator().evaluate()) {
|
||||||
qDebug() << "checking states:" << m_rules.at(i).states();
|
qDebug() << "states matching!";
|
||||||
foreach (const State &state, m_rules.at(i).states()) {
|
|
||||||
Device *device = GuhCore::instance()->deviceManager()->findConfiguredDevice(state.deviceId());
|
|
||||||
if (!device) {
|
|
||||||
qWarning() << "Device referenced in rule cannot be found";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (state.value() != device->stateValue(state.stateTypeId())) {
|
|
||||||
qDebug() << "State value not matching:" << state.value() << device->stateValue(state.stateTypeId());
|
|
||||||
statesMatching = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qDebug() << "states matching" << statesMatching;
|
|
||||||
if (statesMatching) {
|
|
||||||
actions.append(m_rules.at(i).actions());
|
actions.append(m_rules.at(i).actions());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -173,60 +162,86 @@ QList<Action> RuleEngine::evaluateEvent(const Event &event)
|
|||||||
|
|
||||||
/*! Add a new \l{Rule} with the given \a event and \a actions to the engine.
|
/*! Add a new \l{Rule} with the given \a event and \a actions to the engine.
|
||||||
For convenience, this creates a Rule without any \l{State} comparison. */
|
For convenience, this creates a Rule without any \l{State} comparison. */
|
||||||
RuleEngine::RuleError RuleEngine::addRule(const EventDescriptor &eventDescriptor, const QList<Action> &actions)
|
RuleEngine::RuleError RuleEngine::addRule(const RuleId &ruleId, const EventDescriptor &eventDescriptor, const QList<Action> &actions)
|
||||||
{
|
{
|
||||||
return addRule(eventDescriptor, QList<State>(), actions);
|
QList<EventDescriptor> eventDescriptorList;
|
||||||
|
eventDescriptorList.append(eventDescriptor);
|
||||||
|
return addRule(ruleId, eventDescriptorList, StateEvaluator(StateEvaluatorId::createStateEvaluatorId()), actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Add a new \l{Rule} with the given \a event, \a states and \a actions to the engine. */
|
/*! Add a new \l{Rule} with the given \a event, \a states and \a actions to the engine. */
|
||||||
RuleEngine::RuleError RuleEngine::addRule(const EventDescriptor &eventDescriptor, const QList<State> &states, const QList<Action> &actions)
|
RuleEngine::RuleError RuleEngine::addRule(const RuleId &ruleId, const QList<EventDescriptor> &eventDescriptorList, const StateEvaluator &stateEvaluator, const QList<Action> &actions)
|
||||||
{
|
{
|
||||||
Device *device = GuhCore::instance()->deviceManager()->findConfiguredDevice(eventDescriptor.deviceId());
|
if (ruleId.isNull()) {
|
||||||
if (!device) {
|
return RuleErrorInvalidRuleId;
|
||||||
qWarning() << "Cannot create rule. No configured device for eventTypeId" << eventDescriptor.eventTypeId();
|
|
||||||
return RuleErrorDeviceNotFound;
|
|
||||||
}
|
}
|
||||||
DeviceClass deviceClass = GuhCore::instance()->deviceManager()->findDeviceClass(device->deviceClassId());
|
if (!findRule(ruleId).id().isNull()) {
|
||||||
qDebug() << "found deviceClass" << deviceClass.name();
|
qWarning() << "Already have a rule with this id!";
|
||||||
|
return RuleErrorInvalidRuleId;
|
||||||
|
}
|
||||||
|
foreach (const EventDescriptor &eventDescriptor, eventDescriptorList) {
|
||||||
|
Device *device = GuhCore::instance()->deviceManager()->findConfiguredDevice(eventDescriptor.deviceId());
|
||||||
|
if (!device) {
|
||||||
|
qWarning() << "Cannot create rule. No configured device for eventTypeId" << eventDescriptor.eventTypeId();
|
||||||
|
return RuleErrorDeviceNotFound;
|
||||||
|
}
|
||||||
|
DeviceClass deviceClass = GuhCore::instance()->deviceManager()->findDeviceClass(device->deviceClassId());
|
||||||
|
|
||||||
bool eventTypeFound = false;
|
bool eventTypeFound = false;
|
||||||
foreach (const EventType &eventType, deviceClass.eventTypes()) {
|
foreach (const EventType &eventType, deviceClass.eventTypes()) {
|
||||||
if (eventType.id() == eventDescriptor.eventTypeId()) {
|
if (eventType.id() == eventDescriptor.eventTypeId()) {
|
||||||
eventTypeFound = true;
|
eventTypeFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!eventTypeFound) {
|
||||||
|
qWarning() << "Cannot create rule. Device " + device->name() + " has no event type:" << eventDescriptor.eventTypeId();
|
||||||
|
return RuleErrorEventTypeNotFound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!eventTypeFound) {
|
|
||||||
qWarning() << "Cannot create rule. Device " + device->name() + " has no event type:" << eventDescriptor.eventTypeId();
|
foreach (const Action &action, actions) {
|
||||||
return RuleErrorEventTypeNotFound;
|
Device *device = GuhCore::instance()->deviceManager()->findConfiguredDevice(action.deviceId());
|
||||||
|
if (!device) {
|
||||||
|
qWarning() << "Cannot create rule. No configured device for actionTypeId" << action.actionTypeId();
|
||||||
|
return RuleErrorDeviceNotFound;
|
||||||
|
}
|
||||||
|
DeviceClass deviceClass = GuhCore::instance()->deviceManager()->findDeviceClass(device->deviceClassId());
|
||||||
|
|
||||||
|
bool actionTypeFound = false;
|
||||||
|
foreach (const ActionType &actionType, deviceClass.actionTypes()) {
|
||||||
|
if (actionType.id() == action.actionTypeId()) {
|
||||||
|
actionTypeFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!actionTypeFound) {
|
||||||
|
qWarning() << "Cannot create rule. Device " + device->name() + " has no action type:" << action.actionTypeId();
|
||||||
|
return RuleErrorActionTypeNotFound;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rule rule = Rule(QUuid::createUuid(), eventDescriptor, states, actions);
|
Rule rule = Rule(ruleId, eventDescriptorList, stateEvaluator, actions);
|
||||||
m_rules.append(rule);
|
m_rules.append(rule);
|
||||||
emit ruleAdded(rule.id());
|
emit ruleAdded(rule.id());
|
||||||
|
|
||||||
QSettings settings(m_settingsFile);
|
QSettings settings(m_settingsFile);
|
||||||
settings.beginGroup(rule.id().toString());
|
settings.beginGroup(rule.id().toString());
|
||||||
settings.beginGroup("event");
|
settings.beginGroup("events");
|
||||||
settings.setValue("eventTypeId", eventDescriptor.eventTypeId());
|
foreach (const EventDescriptor &eventDescriptor, eventDescriptorList) {
|
||||||
settings.setValue("deviceId", eventDescriptor.deviceId());
|
settings.beginGroup("EventDescriptor-" + eventDescriptor.id().toString());
|
||||||
foreach (const ParamDescriptor ¶mDescriptor, eventDescriptor.paramDescriptors()) {
|
settings.setValue("deviceId", eventDescriptor.deviceId().toString());
|
||||||
settings.beginGroup("ParamDescriptor-" + paramDescriptor.name());
|
settings.setValue("eventTypeId", eventDescriptor.eventTypeId());
|
||||||
settings.setValue("value", paramDescriptor.value());
|
|
||||||
settings.setValue("operand", paramDescriptor.operand());
|
foreach (const ParamDescriptor ¶mDescriptor, eventDescriptor.paramDescriptors()) {
|
||||||
|
settings.beginGroup("ParamDescriptor-" + paramDescriptor.name());
|
||||||
|
settings.setValue("value", paramDescriptor.value());
|
||||||
|
settings.setValue("operator", paramDescriptor.operatorType());
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup("states");
|
stateEvaluator.dumpToSettings(settings, "stateEvaluator");
|
||||||
foreach (const State &state, states) {
|
|
||||||
settings.beginGroup(state.stateTypeId().toString());
|
|
||||||
settings.setValue("deviceId", state.deviceId());
|
|
||||||
settings.setValue("value", state.value());
|
|
||||||
settings.endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.endGroup();
|
|
||||||
|
|
||||||
settings.beginGroup("actions");
|
settings.beginGroup("actions");
|
||||||
foreach (const Action &action, rule.actions()) {
|
foreach (const Action &action, rule.actions()) {
|
||||||
@ -256,7 +271,7 @@ QList<Rule> RuleEngine::rules() const
|
|||||||
/*! Removes the \l{Rule} with the given \a ruleId from the Engine.
|
/*! Removes the \l{Rule} with the given \a ruleId from the Engine.
|
||||||
Returns \l{RuleEngine::RuleError} which describes whether the operation
|
Returns \l{RuleEngine::RuleError} which describes whether the operation
|
||||||
was successful or not. */
|
was successful or not. */
|
||||||
RuleEngine::RuleError RuleEngine::removeRule(const QUuid &ruleId)
|
RuleEngine::RuleError RuleEngine::removeRule(const RuleId &ruleId)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_rules.count(); ++i) {
|
for (int i = 0; i < m_rules.count(); ++i) {
|
||||||
Rule rule = m_rules.at(i);
|
Rule rule = m_rules.at(i);
|
||||||
@ -276,6 +291,16 @@ RuleEngine::RuleError RuleEngine::removeRule(const QUuid &ruleId)
|
|||||||
return RuleErrorRuleNotFound;
|
return RuleErrorRuleNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rule RuleEngine::findRule(const RuleId &ruleId)
|
||||||
|
{
|
||||||
|
foreach (const Rule &rule, m_rules) {
|
||||||
|
if (rule.id() == ruleId) {
|
||||||
|
return rule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Rule();
|
||||||
|
}
|
||||||
|
|
||||||
bool RuleEngine::containsEvent(const Rule &rule, const Event &event)
|
bool RuleEngine::containsEvent(const Rule &rule, const Event &event)
|
||||||
{
|
{
|
||||||
foreach (const EventDescriptor &eventDescriptor, rule.eventDescriptors()) {
|
foreach (const EventDescriptor &eventDescriptor, rule.eventDescriptors()) {
|
||||||
|
|||||||
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "rule.h"
|
#include "rule.h"
|
||||||
#include "types/event.h"
|
#include "types/event.h"
|
||||||
|
#include "stateevaluator.h"
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
@ -32,24 +33,28 @@ class RuleEngine : public QObject
|
|||||||
public:
|
public:
|
||||||
enum RuleError {
|
enum RuleError {
|
||||||
RuleErrorNoError,
|
RuleErrorNoError,
|
||||||
|
RuleErrorInvalidRuleId,
|
||||||
RuleErrorRuleNotFound,
|
RuleErrorRuleNotFound,
|
||||||
RuleErrorDeviceNotFound,
|
RuleErrorDeviceNotFound,
|
||||||
RuleErrorEventTypeNotFound
|
RuleErrorEventTypeNotFound,
|
||||||
|
RuleErrorActionTypeNotFound
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit RuleEngine(QObject *parent = 0);
|
explicit RuleEngine(QObject *parent = 0);
|
||||||
|
|
||||||
QList<Action> evaluateEvent(const Event &event);
|
QList<Action> evaluateEvent(const Event &event);
|
||||||
|
|
||||||
RuleError addRule(const EventDescriptor &eventDescriptor, const QList<Action> &actions);
|
RuleError addRule(const RuleId &ruleId, const EventDescriptor &eventDescriptor, const QList<Action> &actions);
|
||||||
RuleError addRule(const EventDescriptor &eventDescriptor, const QList<State> &states, const QList<Action> &actions);
|
RuleError addRule(const RuleId &ruleId, const QList<EventDescriptor> &eventDescriptorList, const StateEvaluator &stateEvaluator, const QList<Action> &actions);
|
||||||
QList<Rule> rules() const;
|
QList<Rule> rules() const;
|
||||||
|
|
||||||
RuleError removeRule(const QUuid &ruleId);
|
RuleError removeRule(const RuleId &ruleId);
|
||||||
|
|
||||||
|
Rule findRule(const RuleId &ruleId);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void ruleAdded(const QUuid &ruleId);
|
void ruleAdded(const RuleId &ruleId);
|
||||||
void ruleRemoved(const QUuid &ruleId);
|
void ruleRemoved(const RuleId &ruleId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool containsEvent(const Rule &rule, const Event &event);
|
bool containsEvent(const Rule &rule, const Event &event);
|
||||||
|
|||||||
@ -17,9 +17,141 @@
|
|||||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
#include "stateevaluator.h"
|
#include "stateevaluator.h"
|
||||||
|
#include "guhcore.h"
|
||||||
|
#include "devicemanager.h"
|
||||||
|
|
||||||
StateEvaluator::StateEvaluator()
|
StateEvaluator::StateEvaluator()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
StateEvaluator::StateEvaluator(const StateEvaluatorId &id, const StateDescriptor &statedescriptor):
|
||||||
|
m_id(id),
|
||||||
|
m_stateDescriptor(statedescriptor)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
StateEvaluator::StateEvaluator(const StateEvaluatorId &id, QList<StateEvaluator> childEvaluators, StateOperator stateOperator):
|
||||||
|
m_id(id),
|
||||||
|
m_childEvaluators(childEvaluators),
|
||||||
|
m_operatorType(stateOperator),
|
||||||
|
m_stateDescriptor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
StateEvaluatorId StateEvaluator::id() const
|
||||||
|
{
|
||||||
|
return m_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
StateDescriptor StateEvaluator::stateDescriptor() const
|
||||||
|
{
|
||||||
|
return m_stateDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<StateEvaluator> StateEvaluator::childEvaluators() const
|
||||||
|
{
|
||||||
|
return m_childEvaluators;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateEvaluator::setChildEvaluators(const QList<StateEvaluator> &stateEvaluators)
|
||||||
|
{
|
||||||
|
m_childEvaluators = stateEvaluators;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateEvaluator::appendEvaluator(const StateEvaluator &stateEvaluator)
|
||||||
|
{
|
||||||
|
m_childEvaluators.append(stateEvaluator);
|
||||||
|
}
|
||||||
|
|
||||||
|
StateOperator StateEvaluator::operatorType() const
|
||||||
|
{
|
||||||
|
return m_operatorType;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateEvaluator::setOperatorType(StateOperator operatorType)
|
||||||
|
{
|
||||||
|
m_operatorType = operatorType;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StateEvaluator::evaluate() const
|
||||||
|
{
|
||||||
|
if (!m_stateDescriptor.stateTypeId().isNull() && !m_stateDescriptor.deviceId().isNull()) {
|
||||||
|
Device *device = GuhCore::instance()->deviceManager()->findConfiguredDevice(m_stateDescriptor.deviceId());
|
||||||
|
if (!device) {
|
||||||
|
qWarning() << "Device not existing!";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (device->hasState(m_stateDescriptor.stateTypeId())) {
|
||||||
|
qWarning() << "Device found, but it does not appear to have such a state!";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_stateDescriptor != device->state(m_stateDescriptor.stateTypeId())) {
|
||||||
|
// state not matching
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (const StateEvaluator &stateEvaluator, m_childEvaluators) {
|
||||||
|
if (!stateEvaluator.evaluate()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateEvaluator::dumpToSettings(QSettings &settings, const QString &groupName) const
|
||||||
|
{
|
||||||
|
settings.beginGroup(groupName);
|
||||||
|
|
||||||
|
settings.setValue("id", m_id.toString());
|
||||||
|
settings.beginGroup("stateDescriptor");
|
||||||
|
settings.setValue("stateDescriptorId", m_stateDescriptor.id().toString());
|
||||||
|
settings.setValue("stateTypeId", m_stateDescriptor.stateTypeId().toString());
|
||||||
|
settings.setValue("deviceId", m_stateDescriptor.deviceId().toString());
|
||||||
|
settings.setValue("value", m_stateDescriptor.stateValue());
|
||||||
|
settings.setValue("operator", m_stateDescriptor.operatorType());
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
settings.setValue("operator", m_operatorType);
|
||||||
|
|
||||||
|
settings.beginGroup("childEvaluators");
|
||||||
|
foreach (const StateEvaluator &evaluator, m_childEvaluators) {
|
||||||
|
evaluator.dumpToSettings(settings, "stateEvaluator-" + evaluator.id().toString());
|
||||||
|
}
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
StateEvaluator StateEvaluator::loadFromSettings(QSettings &settings, const QString &groupName)
|
||||||
|
{
|
||||||
|
settings.beginGroup(groupName);
|
||||||
|
StateEvaluatorId id(settings.value("id").toString());
|
||||||
|
|
||||||
|
settings.beginGroup("stateDescriptor");
|
||||||
|
StateDescriptorId stateDescriptorId(settings.value("stateDescriptorId").toString());
|
||||||
|
StateTypeId stateTypeId(settings.value("stateTypeId").toString());
|
||||||
|
DeviceId deviceId(settings.value("deviceId").toString());
|
||||||
|
QVariant stateValue = settings.value("value");
|
||||||
|
ValueOperator valueOperator = (ValueOperator)settings.value("operator").toInt();
|
||||||
|
StateDescriptor stateDescriptor(stateDescriptorId, stateTypeId, deviceId, stateValue, valueOperator);
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
StateEvaluator ret(id, stateDescriptor);
|
||||||
|
|
||||||
|
ret.setOperatorType((StateOperator)settings.value("operator").toInt());
|
||||||
|
|
||||||
|
settings.beginGroup("childEvaluators");
|
||||||
|
foreach (const QString &evaluatorGroup, settings.childGroups()) {
|
||||||
|
settings.beginGroup(evaluatorGroup);
|
||||||
|
ret.appendEvaluator(StateEvaluator::loadFromSettings(settings, evaluatorGroup));
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -20,31 +20,44 @@
|
|||||||
#define STATEEVALUATOR_H
|
#define STATEEVALUATOR_H
|
||||||
|
|
||||||
#include "types/state.h"
|
#include "types/state.h"
|
||||||
|
#include "types/statedescriptor.h"
|
||||||
|
|
||||||
//class EvaluatorEntry
|
#include <QSettings>
|
||||||
//{
|
|
||||||
//public:
|
|
||||||
// EvaluatorEntry();
|
|
||||||
|
|
||||||
// QUuid stateTypeId;
|
|
||||||
// QUuid deviceId;
|
|
||||||
//// Rule::Operator operation;
|
|
||||||
// QVariant value;
|
|
||||||
//};
|
|
||||||
|
|
||||||
//class EvaluatorChain
|
|
||||||
//{
|
|
||||||
|
|
||||||
//};
|
|
||||||
|
|
||||||
class StateEvaluator
|
class StateEvaluator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum OperatorType {
|
||||||
|
OperatorTypeAnd,
|
||||||
|
OperatorTypeOr
|
||||||
|
};
|
||||||
|
|
||||||
StateEvaluator();
|
StateEvaluator();
|
||||||
|
StateEvaluator(const StateEvaluatorId &id, const StateDescriptor &statedescriptor);
|
||||||
|
StateEvaluator(const StateEvaluatorId &id, QList<StateEvaluator> childEvaluators = QList<StateEvaluator>(), StateOperator stateOperator = StateOperatorAnd);
|
||||||
|
|
||||||
|
StateEvaluatorId id() const;
|
||||||
|
|
||||||
|
StateDescriptor stateDescriptor() const;
|
||||||
|
|
||||||
|
QList<StateEvaluator> childEvaluators() const;
|
||||||
|
void setChildEvaluators(const QList<StateEvaluator> &childEvaluators);
|
||||||
|
void appendEvaluator(const StateEvaluator &stateEvaluator);
|
||||||
|
|
||||||
|
StateOperator operatorType() const;
|
||||||
|
void setOperatorType(StateOperator operatorType);
|
||||||
|
|
||||||
|
bool evaluate() const;
|
||||||
|
|
||||||
|
void dumpToSettings(QSettings &settings, const QString &groupName) const;
|
||||||
|
static StateEvaluator loadFromSettings(QSettings &settings, const QString &groupPrefix);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// EvaluatorEntry m_entry;
|
StateEvaluatorId m_id;
|
||||||
|
StateDescriptor m_stateDescriptor;
|
||||||
|
|
||||||
|
QList<StateEvaluator> m_childEvaluators;
|
||||||
|
StateOperator m_operatorType;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
0.1.6
|
0.1.7
|
||||||
{
|
{
|
||||||
"methods": {
|
"methods": {
|
||||||
"Actions.ExecuteAction": {
|
"Actions.ExecuteAction": {
|
||||||
@ -223,6 +223,7 @@
|
|||||||
},
|
},
|
||||||
"returns": {
|
"returns": {
|
||||||
"errorMessage": "string",
|
"errorMessage": "string",
|
||||||
|
"o:ruleId": "uuid",
|
||||||
"success": "bool"
|
"success": "bool"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -242,6 +243,8 @@
|
|||||||
"ruleId": "uuid"
|
"ruleId": "uuid"
|
||||||
},
|
},
|
||||||
"returns": {
|
"returns": {
|
||||||
|
"errorMessage": "string",
|
||||||
|
"success": "bool"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -345,21 +348,13 @@
|
|||||||
"$ref:ParamType"
|
"$ref:ParamType"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"OperandType": [
|
|
||||||
"OperandTypeEquals",
|
|
||||||
"OperandTypeNotEquals",
|
|
||||||
"OperandTypeLess",
|
|
||||||
"OperandTypeGreater",
|
|
||||||
"OperandTypeLessThan",
|
|
||||||
"OperandTypeGreaterThan"
|
|
||||||
],
|
|
||||||
"Param": {
|
"Param": {
|
||||||
"name": "string",
|
"name": "string",
|
||||||
"value": "$ref:BasicType"
|
"value": "$ref:BasicType"
|
||||||
},
|
},
|
||||||
"ParamDescriptor": {
|
"ParamDescriptor": {
|
||||||
"name": "string",
|
"name": "string",
|
||||||
"operand": "$ref:OperandType",
|
"operator": "$ref:ValueOperatorType",
|
||||||
"value": "$ref:BasicType"
|
"value": "$ref:BasicType"
|
||||||
},
|
},
|
||||||
"ParamType": {
|
"ParamType": {
|
||||||
@ -384,15 +379,8 @@
|
|||||||
"$ref:EventDescriptor"
|
"$ref:EventDescriptor"
|
||||||
],
|
],
|
||||||
"id": "uuid",
|
"id": "uuid",
|
||||||
"ruleType": "$ref:RuleType",
|
"stateEvaluator": "$ref:StateEvaluator"
|
||||||
"states": [
|
|
||||||
"$ref:State"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"RuleType": [
|
|
||||||
"RuleTypeMatchAll",
|
|
||||||
"RuleTypeMatchAny"
|
|
||||||
],
|
|
||||||
"SetupMethodType": [
|
"SetupMethodType": [
|
||||||
"SetupMethodJustAdd",
|
"SetupMethodJustAdd",
|
||||||
"SetupMethodDisplayPin",
|
"SetupMethodDisplayPin",
|
||||||
@ -404,12 +392,39 @@
|
|||||||
"stateTypeId": "uuid",
|
"stateTypeId": "uuid",
|
||||||
"value": "variant"
|
"value": "variant"
|
||||||
},
|
},
|
||||||
|
"StateDescriptor": {
|
||||||
|
"deviceId": "uuid",
|
||||||
|
"id": "uuid",
|
||||||
|
"operator": "$ref:ValueOperatorType",
|
||||||
|
"stateTypeId": "uuid",
|
||||||
|
"value": "variant"
|
||||||
|
},
|
||||||
|
"StateEvaluator": {
|
||||||
|
"id": "uuid",
|
||||||
|
"o:childEvaluators": [
|
||||||
|
"$ref:StateEvaluator"
|
||||||
|
],
|
||||||
|
"o:operator": "$ref:StateOperatorType",
|
||||||
|
"o:stateDescriptor": "$ref:StateDescriptor"
|
||||||
|
},
|
||||||
|
"StateOperatorType": [
|
||||||
|
"StateOperatorAnd",
|
||||||
|
"StateOperatorOr"
|
||||||
|
],
|
||||||
"StateType": {
|
"StateType": {
|
||||||
"defaultValue": "variant",
|
"defaultValue": "variant",
|
||||||
"id": "uuid",
|
"id": "uuid",
|
||||||
"name": "string",
|
"name": "string",
|
||||||
"type": "$ref:BasicType"
|
"type": "$ref:BasicType"
|
||||||
},
|
},
|
||||||
|
"ValueOperatorType": [
|
||||||
|
"OperatorTypeEquals",
|
||||||
|
"OperatorTypeNotEquals",
|
||||||
|
"OperatorTypeLess",
|
||||||
|
"OperatorTypeGreater",
|
||||||
|
"OperatorTypeLessThan",
|
||||||
|
"OperatorTypeGreaterThan"
|
||||||
|
],
|
||||||
"Vendor": {
|
"Vendor": {
|
||||||
"id": "uuid",
|
"id": "uuid",
|
||||||
"name": "string"
|
"name": "string"
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
TEMPLATE=subdirs
|
TEMPLATE=subdirs
|
||||||
SUBDIRS=versioning devices jsonrpc events states actions
|
SUBDIRS=versioning devices jsonrpc events states actions rules
|
||||||
|
|||||||
@ -47,8 +47,6 @@ private slots:
|
|||||||
|
|
||||||
void stateChangeEmitsNotifications();
|
void stateChangeEmitsNotifications();
|
||||||
|
|
||||||
void getRules();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QStringList extractRefs(const QVariant &variant);
|
QStringList extractRefs(const QVariant &variant);
|
||||||
|
|
||||||
@ -252,12 +250,6 @@ void TestJSONRPC::stateChangeEmitsNotifications()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestJSONRPC::getRules()
|
|
||||||
{
|
|
||||||
QVariant response = injectAndWait("Rules.GetRules", QVariantMap());
|
|
||||||
qDebug() << "got rules response" << response;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "testjsonrpc.moc"
|
#include "testjsonrpc.moc"
|
||||||
|
|
||||||
QTEST_MAIN(TestJSONRPC)
|
QTEST_MAIN(TestJSONRPC)
|
||||||
|
|||||||
5
tests/auto/rules/rules.pro
Normal file
5
tests/auto/rules/rules.pro
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
include(../../../guh.pri)
|
||||||
|
include(../autotests.pri)
|
||||||
|
|
||||||
|
TARGET = rules
|
||||||
|
SOURCES += testrules.cpp
|
||||||
151
tests/auto/rules/testrules.cpp
Normal file
151
tests/auto/rules/testrules.cpp
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* This file is part of guh. *
|
||||||
|
* *
|
||||||
|
* Guh is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, version 2 of the License. *
|
||||||
|
* *
|
||||||
|
* Guh is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with guh. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "guhtestbase.h"
|
||||||
|
#include "guhcore.h"
|
||||||
|
#include "devicemanager.h"
|
||||||
|
#include "mocktcpserver.h"
|
||||||
|
|
||||||
|
#include <QtTest/QtTest>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QTcpSocket>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
|
||||||
|
class TestRules: public GuhTestBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void addRules_data();
|
||||||
|
void addRules();
|
||||||
|
void getStateValue_data();
|
||||||
|
void getStateValue();
|
||||||
|
};
|
||||||
|
|
||||||
|
void TestRules::addRules_data()
|
||||||
|
{
|
||||||
|
QVariantMap validAction;
|
||||||
|
validAction.insert("actionTypeId", mockActionIdNoParams);
|
||||||
|
validAction.insert("deviceId", m_mockDeviceId);
|
||||||
|
validAction.insert("params", QVariantList());
|
||||||
|
|
||||||
|
QVariantMap invalidAction;
|
||||||
|
invalidAction.insert("actionTypeId", ActionTypeId());
|
||||||
|
invalidAction.insert("deviceId", m_mockDeviceId);
|
||||||
|
invalidAction.insert("params", QVariantList());
|
||||||
|
|
||||||
|
QVariantMap validEventDescriptor;
|
||||||
|
validEventDescriptor.insert("eventTypeId", mockEvent1Id);
|
||||||
|
validEventDescriptor.insert("deviceId", m_mockDeviceId);
|
||||||
|
validEventDescriptor.insert("paramDescriptors", QVariantList());
|
||||||
|
|
||||||
|
QVariantMap invalidEventDescriptor;
|
||||||
|
invalidEventDescriptor.insert("eventTypeId", mockEvent1Id);
|
||||||
|
invalidEventDescriptor.insert("deviceId", DeviceId());
|
||||||
|
invalidEventDescriptor.insert("paramDescriptors", QVariantList());
|
||||||
|
|
||||||
|
QTest::addColumn<QVariantMap>("action1");
|
||||||
|
QTest::addColumn<QVariantMap>("eventDescriptor1");
|
||||||
|
QTest::addColumn<bool>("success");
|
||||||
|
|
||||||
|
QTest::newRow("valid rule") << validAction << validEventDescriptor << true;
|
||||||
|
QTest::newRow("invalid action") << invalidAction << validEventDescriptor << false;
|
||||||
|
QTest::newRow("invalid event descriptor") << validAction << invalidEventDescriptor << false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestRules::addRules()
|
||||||
|
{
|
||||||
|
QFETCH(QVariantMap, action1);
|
||||||
|
QFETCH(QVariantMap, eventDescriptor1);
|
||||||
|
QFETCH(bool, success);
|
||||||
|
|
||||||
|
QVariantMap params;
|
||||||
|
QVariantList actions;
|
||||||
|
actions.append(action1);
|
||||||
|
params.insert("actions", actions);
|
||||||
|
params.insert("eventDescriptor", eventDescriptor1);
|
||||||
|
QVariant response = injectAndWait("Rules.AddRule", params);
|
||||||
|
|
||||||
|
RuleId newRuleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString());
|
||||||
|
verifySuccess(response, success);
|
||||||
|
|
||||||
|
response = injectAndWait("Rules.GetRules");
|
||||||
|
QVariantList rules = response.toMap().value("params").toMap().value("rules").toList();
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
QVERIFY2(rules.count() == 0, "There should be no rules.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVERIFY2(rules.count() == 1, "There should be exactly one rule");
|
||||||
|
QCOMPARE(RuleId(rules.first().toMap().value("id").toString()), newRuleId);
|
||||||
|
|
||||||
|
QVariantList eventDescriptors = rules.first().toMap().value("eventDescriptors").toList();
|
||||||
|
QVERIFY2(eventDescriptors.count() == 1, "There shoud be exactly one eventDescriptor");
|
||||||
|
QVERIFY2(eventDescriptors.first().toMap() == eventDescriptor1, "Event descriptor doesn't match");
|
||||||
|
|
||||||
|
QVariantList replyActions = rules.first().toMap().value("actions").toList();
|
||||||
|
QVERIFY2(actions == replyActions, "Actions don't match");
|
||||||
|
|
||||||
|
|
||||||
|
params.clear();
|
||||||
|
params.insert("ruleId", newRuleId);
|
||||||
|
response = injectAndWait("Rules.RemoveRule", params);
|
||||||
|
verifySuccess(response, true);
|
||||||
|
|
||||||
|
response = injectAndWait("Rules.GetRules");
|
||||||
|
rules = response.toMap().value("params").toMap().value("rules").toList();
|
||||||
|
QVERIFY2(rules.count() == 0, "There should be no rules.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestRules::getStateValue_data()
|
||||||
|
{
|
||||||
|
QList<Device*> devices = GuhCore::instance()->deviceManager()->findConfiguredDevices(mockDeviceClassId);
|
||||||
|
QVERIFY2(devices.count() > 0, "There needs to be at least one configured Mock Device for this test");
|
||||||
|
Device *device = devices.first();
|
||||||
|
|
||||||
|
QTest::addColumn<DeviceId>("deviceId");
|
||||||
|
QTest::addColumn<StateTypeId>("stateTypeId");
|
||||||
|
QTest::addColumn<bool>("success");
|
||||||
|
|
||||||
|
QTest::newRow("existing state") << device->id() << mockIntStateId << true;
|
||||||
|
QTest::newRow("invalid device") << DeviceId::createDeviceId() << mockIntStateId << false;
|
||||||
|
QTest::newRow("invalid statetype") << device->id() << StateTypeId::createStateTypeId() << false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestRules::getStateValue()
|
||||||
|
{
|
||||||
|
QFETCH(DeviceId, deviceId);
|
||||||
|
QFETCH(StateTypeId, stateTypeId);
|
||||||
|
QFETCH(bool, success);
|
||||||
|
|
||||||
|
QVariantMap params;
|
||||||
|
params.insert("deviceId", deviceId.toString());
|
||||||
|
params.insert("stateTypeId", stateTypeId.toString());
|
||||||
|
|
||||||
|
QVariant response = injectAndWait("Devices.GetStateValue", params);
|
||||||
|
|
||||||
|
verifySuccess(response, success);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "testrules.moc"
|
||||||
|
QTEST_MAIN(TestRules)
|
||||||
Reference in New Issue
Block a user