summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIIncludes.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/GUIIncludes.h')
-rw-r--r--xbmc/guilib/GUIIncludes.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIIncludes.h b/xbmc/guilib/GUIIncludes.h
new file mode 100644
index 0000000..cc11aa3
--- /dev/null
+++ b/xbmc/guilib/GUIIncludes.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "interfaces/info/InfoBool.h"
+
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+// forward definitions
+class TiXmlElement;
+namespace INFO
+{
+ class CSkinVariableString;
+}
+
+class CGUIIncludes
+{
+public:
+ CGUIIncludes();
+ ~CGUIIncludes();
+
+ /*!
+ \brief Clear all include components (defaults, constants, variables, expressions and includes)
+ */
+ void Clear();
+
+ /*!
+ \brief Load all include components(defaults, constants, variables, expressions and includes)
+ from the main entrypoint \code{file}. Flattens nested expressions and expressions in variable
+ conditions after loading all other included files.
+
+ \param file the file to load
+ */
+ void Load(const std::string &file);
+
+ /*!
+ \brief Resolve all include components (defaults, constants, variables, expressions and includes)
+ for the given \code{node}. Place the conditions specified for <include> elements in \code{includeConditions}.
+
+ \param node the node from where we start to resolve the include components
+ \param includeConditions a map that holds the conditions for resolved includes
+ */
+ void Resolve(TiXmlElement *node, std::map<INFO::InfoPtr, bool>* includeConditions = NULL);
+
+ /*!
+ \brief Create a skin variable for the given \code{name} within the given \code{context}.
+
+ \param name the name of the skin variable
+ \param context the context where the variable is created in
+ \return skin variable
+ */
+ const INFO::CSkinVariableString* CreateSkinVariable(const std::string& name, int context);
+
+private:
+ enum ResolveParamsResult
+ {
+ NO_PARAMS_FOUND,
+ PARAMS_RESOLVED,
+ SINGLE_UNDEFINED_PARAM_RESOLVED
+ };
+
+ /*!
+ \brief Load all include components (defaults, constants, variables, expressions and includes)
+ from the given \code{file}.
+
+ \param file the file to load
+ \return true if the file was loaded otherwise false
+ */
+ bool Load_Internal(const std::string &file);
+
+ bool HasLoaded(const std::string &file) const;
+
+ void LoadDefaults(const TiXmlElement *node);
+ void LoadIncludes(const TiXmlElement *node);
+ void LoadVariables(const TiXmlElement *node);
+ void LoadConstants(const TiXmlElement *node);
+ void LoadExpressions(const TiXmlElement *node);
+
+ /*!
+ \brief Resolve all expressions containing other expressions to a single evaluatable expression.
+ */
+ void FlattenExpressions();
+
+ /*!
+ \brief Expand any expressions nested in this expression.
+
+ \param expression the expression to flatten
+ \param resolved list of already evaluated expression names, to avoid expanding circular references
+ */
+ void FlattenExpression(std::string &expression, const std::vector<std::string> &resolved);
+
+ /*!
+ \brief Resolve all variable conditions containing expressions to a single evaluatable condition.
+ */
+ void FlattenSkinVariableConditions();
+
+ void SetDefaults(TiXmlElement *node);
+ void ResolveIncludes(TiXmlElement *node, std::map<INFO::InfoPtr, bool>* xmlIncludeConditions = NULL);
+ void ResolveConstants(TiXmlElement *node);
+ void ResolveExpressions(TiXmlElement *node);
+
+ typedef std::map<std::string, std::string> Params;
+ static void InsertNested(TiXmlElement* controls, TiXmlElement* include, TiXmlElement* node);
+ static bool GetParameters(const TiXmlElement *include, const char *valueAttribute, Params& params);
+ static void ResolveParametersForNode(TiXmlElement *node, const Params& params);
+ static ResolveParamsResult ResolveParameters(const std::string& strInput, std::string& strOutput, const Params& params);
+
+ std::string ResolveConstant(const std::string &constant) const;
+ std::string ResolveExpressions(const std::string &expression) const;
+
+ std::vector<std::string> m_files;
+ std::map<std::string, std::pair<TiXmlElement, Params>> m_includes;
+ std::map<std::string, TiXmlElement> m_defaults;
+ std::map<std::string, TiXmlElement> m_skinvariables;
+ std::map<std::string, std::string> m_constants;
+ std::map<std::string, std::string> m_expressions;
+
+ std::set<std::string> m_constantAttributes;
+ std::set<std::string> m_constantNodes;
+
+ std::set<std::string> m_expressionAttributes;
+ std::set<std::string> m_expressionNodes;
+};