aboutsummaryrefslogtreecommitdiffstats
path: root/parameter/DomainConfiguration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parameter/DomainConfiguration.cpp')
-rw-r--r--parameter/DomainConfiguration.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/parameter/DomainConfiguration.cpp b/parameter/DomainConfiguration.cpp
new file mode 100644
index 0000000..4ab5f1d
--- /dev/null
+++ b/parameter/DomainConfiguration.cpp
@@ -0,0 +1,285 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "DomainConfiguration.h"
+#include "AreaConfiguration.h"
+#include "ConfigurableElement.h"
+#include "CompoundRule.h"
+#include <assert.h>
+
+#define base CBinarySerializableElement
+
+CDomainConfiguration::CDomainConfiguration(const string& strName) : base(strName)
+{
+}
+
+CDomainConfiguration::~CDomainConfiguration()
+{
+ AreaConfigurationListIterator it;
+
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ delete *it;
+ }
+}
+
+// Class kind
+string CDomainConfiguration::getKind() const
+{
+ return "Configuration";
+}
+
+// Child dynamic creation
+bool CDomainConfiguration::childrenAreDynamic() const
+{
+ return true;
+}
+
+// XML configuration settings parsing
+bool CDomainConfiguration::serializeXmlSettings(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurationSettingsElement, CConfigurationAccessContext& configurationAccessContext)
+{
+ // Find related AreaConfiguration
+ CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement);
+
+ assert(pAreaConfiguration);
+
+ // Delegate to corresponding area configuration
+ return pAreaConfiguration->serializeXmlSettings(xmlConfigurationSettingsElement, configurationAccessContext);
+}
+
+// Configurable Elements association
+void CDomainConfiguration::addConfigurableElement(const CConfigurableElement* pConfigurableElement)
+{
+ _areaConfigurationList.push_back(new CAreaConfiguration(pConfigurableElement));
+}
+
+void CDomainConfiguration::removeConfigurableElement(const CConfigurableElement* pConfigurableElement)
+{
+ CAreaConfiguration* pAreaConfigurationToRemove = getAreaConfiguration(pConfigurableElement);
+
+ _areaConfigurationList.remove(pAreaConfigurationToRemove);
+
+ delete pAreaConfigurationToRemove;
+}
+
+// Save data from current
+void CDomainConfiguration::save(const CParameterBlackboard* pMainBlackboard)
+{
+ AreaConfigurationListIterator it;
+
+ // Just propagate to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->save(pMainBlackboard);
+ }
+}
+
+// Apply data to current
+void CDomainConfiguration::restore(CParameterBlackboard* pMainBlackboard) const
+{
+ AreaConfigurationListIterator it;
+
+ // Just propagate to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ const CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->restore(pMainBlackboard);
+ }
+}
+
+// Ensure validity for configurable element area configuration
+void CDomainConfiguration::validate(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard)
+{
+ CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
+
+ // Delegate
+ pAreaConfigurationToValidate->validate(pMainBlackboard);
+}
+
+// Ensure validity of all area configurations
+void CDomainConfiguration::validate(const CParameterBlackboard* pMainBlackboard)
+{
+ AreaConfigurationListIterator it;
+
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->validate(pMainBlackboard);
+ }
+}
+
+// Return configuration validity for given configurable element
+bool CDomainConfiguration::isValid(const CConfigurableElement* pConfigurableElement) const
+{
+ // Get child configurable elemnt's area configuration
+ CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement);
+
+ assert(pAreaConfiguration);
+
+ return pAreaConfiguration->isValid();
+}
+
+// Ensure validity of configurable element's area configuration by copying in from a valid one
+void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration, const CConfigurableElement* pConfigurableElement)
+{
+ // Retrieve related area configurations
+ CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
+ const CAreaConfiguration* pAreaConfigurationToValidateAgainst = pValidDomainConfiguration->getAreaConfiguration(pConfigurableElement);
+
+ // Delegate to area
+ pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
+}
+
+// Ensure validity of all configurable element's area configuration by copying in from a valid ones
+void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration)
+{
+ // Copy in configuration data from against domain
+ AreaConfigurationListIterator it, itAgainst;
+
+ for (it = _areaConfigurationList.begin(), itAgainst = pValidDomainConfiguration->_areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it, ++itAgainst) {
+
+ CAreaConfiguration* pAreaConfigurationToValidate = *it;
+ const CAreaConfiguration* pAreaConfigurationToValidateAgainst = *itAgainst;
+
+ // Delegate to area
+ pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
+ }
+}
+
+// Dynamic data application
+bool CDomainConfiguration::isApplicable() const
+{
+ const CCompoundRule* pRule = getRule();
+
+ return pRule && pRule->matches();
+}
+
+// Merge existing configurations to given configurable element ones
+void CDomainConfiguration::merge(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement)
+{
+ // Retrieve related area configurations
+ CAreaConfiguration* pAreaConfigurationToMergeTo = getAreaConfiguration(pToConfigurableElement);
+ const CAreaConfiguration* pAreaConfigurationToMergeFrom = getAreaConfiguration(pFromConfigurableElement);
+
+ // Do the merge
+ pAreaConfigurationToMergeTo->copyFromInner(pAreaConfigurationToMergeFrom);
+}
+
+// Domain splitting
+void CDomainConfiguration::split(CConfigurableElement* pFromConfigurableElement)
+{
+ // Retrieve related area configuration
+ const CAreaConfiguration* pAreaConfigurationToSplitFrom = getAreaConfiguration(pFromConfigurableElement);
+
+ // Go through children areas to copy configuration data to them
+ uint32_t uiNbConfigurableElementChildren = pFromConfigurableElement->getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
+
+ CConfigurableElement* pToChildConfigurableElement = static_cast<CConfigurableElement*>(pFromConfigurableElement->getChild(uiChild));
+
+ // Get child configurable elemnt's area configuration
+ CAreaConfiguration* pChildAreaConfiguration = getAreaConfiguration(pToChildConfigurableElement);
+
+ // Do the copy
+ pAreaConfigurationToSplitFrom->copyToInner(pChildAreaConfiguration);
+ }
+}
+
+// AreaConfiguration retrieval from configurable element
+CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(const CConfigurableElement* pConfigurableElement) const
+{
+ AreaConfigurationListIterator it;
+
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) {
+
+ return pAreaConfiguration;
+ }
+ }
+ // Not found?
+ assert(0);
+
+ return NULL;
+}
+
+// Presence of application condition
+bool CDomainConfiguration::hasRule() const
+{
+ return !!getRule();
+}
+
+// Rule
+const CCompoundRule* CDomainConfiguration::getRule() const
+{
+ if (getNbChildren()) {
+ // Rule created
+ return static_cast<const CCompoundRule*>(getChild(ECompoundRule));
+ }
+ return NULL;
+}
+
+// Serialization
+void CDomainConfiguration::binarySerialize(CBinaryStream& binaryStream)
+{
+ AreaConfigurationListIterator it;
+
+ // Just propagate to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->serialize(binaryStream);
+ }
+}
+
+// Data size
+uint32_t CDomainConfiguration::getDataSize() const
+{
+ uint32_t uiDataSize = 0;
+ AreaConfigurationListIterator it;
+
+ // Just propagate request to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ const CAreaConfiguration* pAreaConfiguration = *it;
+
+ uiDataSize += pAreaConfiguration->getSize();
+ }
+ return uiDataSize;
+}