2 * Copyright (C) 2012-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "BooleanLogic.h"
11 #include "utils/StringUtils.h"
12 #include "utils/XBMCTinyXML.h"
13 #include "utils/log.h"
15 bool CBooleanLogicValue::Deserialize(const TiXmlNode
*node
)
20 const TiXmlElement
*elem
= node
->ToElement();
24 if (node
->FirstChild() != NULL
&& node
->FirstChild()->Type() == TiXmlNode::TINYXML_TEXT
)
25 m_value
= node
->FirstChild()->ValueStr();
28 const char *strNegated
= elem
->Attribute("negated");
29 if (strNegated
!= NULL
)
31 if (StringUtils::EqualsNoCase(strNegated
, "true"))
33 else if (!StringUtils::EqualsNoCase(strNegated
, "false"))
35 CLog::Log(LOGDEBUG
, "CBooleanLogicValue: invalid negated value \"{}\"", strNegated
);
43 bool CBooleanLogicOperation::Deserialize(const TiXmlNode
*node
)
48 // check if this is a simple operation with a single value directly expressed
50 if (node
->FirstChild() == NULL
|| node
->FirstChild()->Type() == TiXmlNode::TINYXML_TEXT
)
52 CBooleanLogicValuePtr value
= CBooleanLogicValuePtr(newValue());
53 if (value
== NULL
|| !value
->Deserialize(node
))
55 CLog::Log(LOGDEBUG
, "CBooleanLogicOperation: failed to deserialize implicit boolean value definition");
59 m_values
.push_back(value
);
63 const TiXmlNode
*operationNode
= node
->FirstChild();
64 while (operationNode
!= NULL
)
66 std::string tag
= operationNode
->ValueStr();
67 if (StringUtils::EqualsNoCase(tag
, "and") || StringUtils::EqualsNoCase(tag
, "or"))
69 CBooleanLogicOperationPtr operation
= CBooleanLogicOperationPtr(newOperation());
70 if (operation
== NULL
)
73 operation
->SetOperation(StringUtils::EqualsNoCase(tag
, "and") ? BooleanLogicOperationAnd
: BooleanLogicOperationOr
);
74 if (!operation
->Deserialize(operationNode
))
76 CLog::Log(LOGDEBUG
, "CBooleanLogicOperation: failed to deserialize <{}> definition", tag
);
80 m_operations
.push_back(operation
);
84 CBooleanLogicValuePtr value
= CBooleanLogicValuePtr(newValue());
88 if (StringUtils::EqualsNoCase(tag
, value
->GetTag()))
90 if (!value
->Deserialize(operationNode
))
92 CLog::Log(LOGDEBUG
, "CBooleanLogicOperation: failed to deserialize <{}> definition", tag
);
96 m_values
.push_back(value
);
98 else if (operationNode
->Type() == TiXmlNode::TINYXML_ELEMENT
)
99 CLog::Log(LOGDEBUG
, "CBooleanLogicOperation: unknown <{}> definition encountered", tag
);
102 operationNode
= operationNode
->NextSibling();
108 bool CBooleanLogic::Deserialize(const TiXmlNode
*node
)
113 if (m_operation
== NULL
)
115 m_operation
= CBooleanLogicOperationPtr(new CBooleanLogicOperation());
117 if (m_operation
== NULL
)
121 return m_operation
->Deserialize(node
);