ConfigurableDomain.cpp revision b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7
1e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard/* 2b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Copyright (c) 2011-2014, Intel Corporation 3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved. 4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification, 6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met: 7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this 9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer. 10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice, 12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or 13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution. 14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors 16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without 17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission. 18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */ 3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableDomain.h" 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "DomainConfiguration.h" 3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableElement.h" 3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurationAccessContext.h" 3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlDomainSerializingContext.h" 3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <assert.h> 3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#define base CBinarySerializableElement 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3963499d4763e42d76bfd39b79871f611381d2d164Patrick BenavoliCConfigurableDomain::CConfigurableDomain(const string& strName) : base(strName), _bSequenceAware(false), _pLastAppliedConfiguration(NULL) 4068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4368a912857707864bbaaff9808717813105072a6ePatrick BenavoliCConfigurableDomain::~CConfigurableDomain() 4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove all configurable elements 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pConfigurableElement = *it; 5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove from configurable element 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->removeAttachedConfigurableDomain(this); 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 5563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 5663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove all associated syncer sets 5763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt; 5863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 5963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli for (mapIt = _configurableElementToSyncerSetMap.begin(); mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) { 6063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 6163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli delete mapIt->second; 6263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6568a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getKind() const 6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "ConfigurableDomain"; 6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::childrenAreDynamic() const 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Content dumping 760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolivoid CConfigurableDomain::logValue(string& strValue, CErrorContext& errorContext) const 770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli (void)errorContext; 790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue = "{"; 810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Sequence awareness 830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += "Sequence aware: "; 840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += _bSequenceAware ? "yes" : "no"; 850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Last applied configuration 870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += ", Last applied configuration: "; 880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += _pLastAppliedConfiguration ? _pLastAppliedConfiguration->getName() : "<none>"; 890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += "}"; 910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 9363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Sequence awareness 9463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::setSequenceAwareness(bool bSequenceAware) 9563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 9663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (_bSequenceAware != bSequenceAware) { 9763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 98ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Making domain \"%s\" sequence %s", getName().c_str(), bSequenceAware ? "aware" : "unaware"); 9963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _bSequenceAware = bSequenceAware; 10163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 10263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 10363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::getSequenceAwareness() const 10563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 10663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return _bSequenceAware; 10763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 10863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSource 11068a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const 11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 11263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Sequence awareness 11363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlElement.setAttributeBoolean("SequenceAware", _bSequenceAware); 11463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurations 11668a912857707864bbaaff9808717813105072a6ePatrick Benavoli composeDomainConfigurations(xmlElement, serializingContext); 11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurable Elements 11963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli composeConfigurableElements(xmlElement); 12063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 12163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Settings 12263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli composeSettings(xmlElement, serializingContext); 12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML composing 12668a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::composeDomainConfigurations(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const 12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create Configurations element 12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationsElement; 13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.createChild(xmlConfigurationsElement, "Configurations"); 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate to base 13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli base::toXml(xmlConfigurationsElement, serializingContext); 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::composeConfigurableElements(CXmlElement& xmlElement) const 13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create ConfigurableElements element 14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementsElement; 14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.createChild(xmlConfigurableElementsElement, "ConfigurableElements"); 14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Serialize out all configurable elements settings 14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CConfigurableElement* pConfigurableElement = *it; 15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create corresponding XML child element 15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlChildConfigurableElement; 15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlConfigurableElementsElement.createChild(xmlChildConfigurableElement, "ConfigurableElement"); 15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set Path attribute 15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlChildConfigurableElement.setAttributeString("Path", pConfigurableElement->getPath()); 15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::composeSettings(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const 16268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 16363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Context 16463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli const CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<const CXmlDomainSerializingContext&>(serializingContext); 16563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 16663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlDomainSerializingContext.withSettings()) { 16763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 16863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return; 16963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 17063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Create Settings element 17263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlSettingsElement; 17363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlElement.createChild(xmlSettingsElement, "Settings"); 17563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Serialize out all configurations settings 17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 17868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChildConfiguration; 17968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChildConfiguration = 0; uiChildConfiguration < uiNbConfigurations; uiChildConfiguration++) { 18168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 18268a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChildConfiguration)); 18368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 18468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create child xml element for that configuration 18568a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationSettingsElement; 18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 18763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlSettingsElement.createChild(xmlConfigurationSettingsElement, pDomainConfiguration->getKind()); 18868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 18968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set its name attribute 19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlConfigurationSettingsElement.setNameAttribute(pDomainConfiguration->getName()); 19168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Serialize out configuration settings 19363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->composeSettings(xmlConfigurationSettingsElement, serializingContext); 19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 19568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 19668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSink 19868a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 19968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 20063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Context 20163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext); 20263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 20363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Sequence awareness (optional) 20463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _bSequenceAware = xmlElement.hasAttribute("SequenceAware") && xmlElement.getAttributeBoolean("SequenceAware"); 20563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 20668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Local parsing. Do not dig 20763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!parseDomainConfigurations(xmlElement, serializingContext) || !parseConfigurableElements(xmlElement, serializingContext) || !parseSettings(xmlElement, serializingContext)) { 20863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 20963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 21063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 21163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // All provided configurations are parsed 21363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Attempt validation on areas of non provided configurations for all configurable elements if required 21463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (xmlDomainSerializingContext.autoValidationRequired()) { 21563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli autoValidateAll(); 21763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 21863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 22068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 22168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 22268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML parsing 22368a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::parseDomainConfigurations(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 22468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 22568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // We're supposedly clean 22668a912857707864bbaaff9808717813105072a6ePatrick Benavoli assert(_configurableElementList.empty()); 22768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 22868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get Configurations element 22968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationsElement; 23068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 23168a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.getChildElement("Configurations", xmlConfigurationsElement); 23268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 23368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parse it and create domain configuration objects 23468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return base::fromXml(xmlConfigurationsElement, serializingContext); 23568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 23668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 23768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Parse configurable elements 23868a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::parseConfigurableElements(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 23968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 24068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get System Class Element 24168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* pRootElement = getRoot(); 24268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* pSystemClassElement = pRootElement->findChildOfKind("SystemClass"); 24468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24568a912857707864bbaaff9808717813105072a6ePatrick Benavoli assert(pSystemClassElement); 24668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get ConfigurableElements element 24868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementsElement; 24968a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.getChildElement("ConfigurableElements", xmlConfigurableElementsElement); 25068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parse it and associate found configurable elements to it 25268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement::CChildIterator it(xmlConfigurableElementsElement); 25368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementElement; 25568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25668a912857707864bbaaff9808717813105072a6ePatrick Benavoli while (it.next(xmlConfigurableElementElement)) { 25768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Locate configurable element 25968a912857707864bbaaff9808717813105072a6ePatrick Benavoli string strConfigurableElementPath = xmlConfigurableElementElement.getAttributeString("Path"); 26068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CPathNavigator pathNavigator(strConfigurableElementPath); 262065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli string strError; 26368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Is there an element and does it match system class name? 265065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli if (!pathNavigator.navigateThrough(pSystemClassElement->getName(), strError)) { 26668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 267065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName() + " (" + strError + ")"); 26868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 27068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 27168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse system class for configurable element 27268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pSystemClassElement->findDescendant(pathNavigator)); 27368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27468a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pConfigurableElement) { 27568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27668a912857707864bbaaff9808717813105072a6ePatrick Benavoli serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName()); 27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 27968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 28068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Add found element to domain 28168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!addConfigurableElement(pConfigurableElement, NULL, strError)) { 28268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28368a912857707864bbaaff9808717813105072a6ePatrick Benavoli serializingContext.setError(strError); 28468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 28668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 28768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 28868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 29068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 29168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 29263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Parse settings 29363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::parseSettings(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 29468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 29568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Context 29668a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext); 29768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 29863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Check we actually need to parse configuration settings 29963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlDomainSerializingContext.withSettings()) { 30068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // No parsing required 30263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 30363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 30468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Get Settings element 30663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlSettingsElement; 30763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlElement.getChildElement("Settings", xmlSettingsElement)) { 30868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // No settings, bail out successfully 31063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 31168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 31268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 31363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Parse configuration settings 31463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement::CChildIterator it(xmlSettingsElement); 31568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 31663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlConfigurationSettingsElement; 3176ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 31863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli while (it.next(xmlConfigurationSettingsElement)) { 31963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Get domain configuration 32063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(xmlConfigurationSettingsElement.getNameAttribute())); 3216ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 32263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 3236ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 32463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlDomainSerializingContext.setError("Could not find domain configuration referred to by configurable domain " + getName()); 3256ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 3266ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return false; 3276ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 32863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Have domain configuration parse settings for all configurable elements 32963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration->parseSettings(xmlConfigurationSettingsElement, xmlDomainSerializingContext)) { 3306ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 3316ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return false; 3326ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 3336ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 3346ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 33568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 33668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 33768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association 33868a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::addConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError) 33968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 34068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already associated? 34168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (containsConfigurableElement(pConfigurableElement)) { 34268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 34368a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " already associated to configuration domain " + getName(); 34468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 34568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 34668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 34768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 34868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already owned? 34968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurableElement->belongsTo(this)) { 35068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35168a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " already owned by configuration domain " + getName(); 35268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 35468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 35568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do add 3579620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard doAddConfigurableElement(pConfigurableElement, pMainBlackboard); 35868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 36068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 36168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 36268a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::removeConfigurableElement(CConfigurableElement* pConfigurableElement, string& strError) 36368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 36468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Not associated? 36568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!containsConfigurableElement(pConfigurableElement)) { 36668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 36768a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName(); 36868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 36968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 37068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 371ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Removing configurable element \"%s\" from domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str()); 37268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do remove 37468a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pConfigurableElement, true); 37568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 37768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 37868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 379e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard/** 380e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* Blackboard Configuration and Base Offset retrieval. 381e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 382e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* This method fetches the Blackboard associated to the ConfigurableElement 383e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* given in parameter, for a specific Configuration. The ConfigurableElement 384e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* must belong to the Domain. If a Blackboard is found, the base offset of 385e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the ConfigurableElement is returned as well. This base offset corresponds to 386e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the offset of the ancestor of the ConfigurableElement associated to the Configuration. 387e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 388e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[in] strConfiguration Name of the Configuration. 389e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[in] pCandidateDescendantConfigurableElement Pointer to a CConfigurableElement that 390e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* belongs to the Domain. 391e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] uiBaseOffset The base offset of the CConfigurableElement. 392e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] bIsLastApplied Boolean indicating that the Configuration is 393e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the last one applied of the Domain. 394e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] strError Error message 395e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 396e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* return Pointer to the Blackboard of the Configuration. 397e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard*/ 398e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric BoisnardCParameterBlackboard* CConfigurableDomain::findConfigurationBlackboard(const string& strConfiguration, 399e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard const CConfigurableElement* pCandidateDescendantConfigurableElement, 400e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard uint32_t& uiBaseOffset, 401e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard bool& bIsLastApplied, 402e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard string& strError) const 403e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard{ 404e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Find Configuration 405e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(findChild(strConfiguration)); 406e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 407e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard if (!pDomainConfiguration) { 408e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 409e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard strError = "Domain configuration " + strConfiguration + " not found"; 410e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 411e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return NULL; 412e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 413e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 414e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Parse all configurable elements 415e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard ConfigurableElementListIterator it; 416e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 417e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 418e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 419e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard const CConfigurableElement* pAssociatedConfigurableElement = *it; 420e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 421e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Check if the the associated element is the configurable element or one of its ancestors 422e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard if ((pCandidateDescendantConfigurableElement == pAssociatedConfigurableElement) || 423e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard (pCandidateDescendantConfigurableElement->isDescendantOf(pAssociatedConfigurableElement))) { 424e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 425e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard uiBaseOffset = pAssociatedConfigurableElement->getOffset(); 426e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard bIsLastApplied = (pDomainConfiguration == _pLastAppliedConfiguration); 427e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 428e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return pDomainConfiguration->getBlackboard(pAssociatedConfigurableElement); 429e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 430e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 431e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 432e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard strError = "Element not associated to the Domain"; 433e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 434e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return NULL; 435e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard} 436e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 43768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Domain splitting 43868a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::split(CConfigurableElement* pConfigurableElement, string& strError) 43968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 44068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Not associated? 44168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!containsConfigurableElement(pConfigurableElement)) { 44268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 44368a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName(); 44468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 44568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 44668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 447ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Splitting configurable element \"%s\" domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str()); 44868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 44968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create sub domain areas for all configurable element's children 45068a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurableElementChildren = pConfigurableElement->getNbChildren(); 45168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!uiNbConfigurableElementChildren) { 45368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45468a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " has no children to split configurable domain to"; 45568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 45768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 45868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45968a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 46068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46168a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) { 46268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pChildConfigurableElement = static_cast<CConfigurableElement*>(pConfigurableElement->getChild(uiChild)); 46468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46568a912857707864bbaaff9808717813105072a6ePatrick Benavoli doAddConfigurableElement(pChildConfigurableElement); 46668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 46768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate to configurations 46968a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 47068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47168a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 47268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 47468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->split(pConfigurableElement); 47668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 47768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove given configurable element from this domain 47968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Note: we shouldn't need to recompute the sync set in that case, as the splitted element should include the syncers of its children elements 48068a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pConfigurableElement, false); 48168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 48268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 48368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 48468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4858b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Check if there is a pending configuration for this domain: i.e. an applicable configuration different from the last applied configuration 4868b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardconst CDomainConfiguration* CConfigurableDomain::getPendingConfiguration() const 4878b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{ 4888b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration(); 4898b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 4908b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (pApplicableDomainConfiguration) { 4918b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 4928b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard // Check not the last one before applying 4938b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (!_pLastAppliedConfiguration || (_pLastAppliedConfiguration != pApplicableDomainConfiguration)) { 4948b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 4958b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return pApplicableDomainConfiguration; 4968b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 4978b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 4988b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 4998b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return NULL; 5008b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard} 5018b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 50268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration application if required 503f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulinvoid CConfigurableDomain::apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet* pSyncerSet, bool bForce) const 50468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 505f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Apply configuration only if the blackboard will 506f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // be synchronized either now or by syncerSet. 507f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin if(!pSyncerSet ^ _bSequenceAware) { 508f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // The configuration can not be syncronised 509f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin return; 510f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin } 511f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin 51268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (bForce) { 51368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Force a configuration restore by forgetting about last applied configuration 51468a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = NULL; 51568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 51668a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration(); 51768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 51868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pApplicableDomainConfiguration) { 51968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 52068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Check not the last one before applying 52168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!_pLastAppliedConfiguration || _pLastAppliedConfiguration != pApplicableDomainConfiguration) { 52268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 523f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin log_info("Applying configuration \"%s\" from domain \"%s\"", 524f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin pApplicableDomainConfiguration->getName().c_str(), 525f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin getName().c_str()); 526f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin 527f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Check if we need to synchronize during restore 528f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin bool bSync = !pSyncerSet && _bSequenceAware; 52968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 53068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do the restore 531f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin pApplicableDomainConfiguration->restore(pParameterBlackboard, bSync, NULL); 53268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 53368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Record last applied configuration 53468a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = pApplicableDomainConfiguration; 53568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 536f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Check we need to provide syncer set to caller 537f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin if (pSyncerSet && !_bSequenceAware) { 53863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 53963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Since we applied changes, add our own sync set to the given one 540f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin *pSyncerSet += _syncerSet; 54163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 54268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 54368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 54468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 54568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 54668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Return applicable configuration validity for given configurable element 54768a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::isApplicableConfigurationValid(const CConfigurableElement* pConfigurableElement) const 54868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 54968a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration(); 55068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 55168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pApplicableDomainConfiguration && pApplicableDomainConfiguration->isValid(pConfigurableElement); 55268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 55368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 55468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// In case configurable element was removed 55568a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::computeSyncSet() 55668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 55768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Clean sync set first 55863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet.clear(); 55968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add syncer sets for all associated configurable elements 56163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt; 56268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli for (mapIt = _configurableElementToSyncerSetMap.begin(); mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) { 56468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli const CSyncerSet* pSyncerSet = mapIt->second; 56668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet += *pSyncerSet; 56868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 56968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 57068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration Management 57268a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::createConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError) 57368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 57468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already exists? 57568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (findChild(strName)) { 57668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57768a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Already existing configuration"; 57868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 58068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 581ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Creating domain configuration \"%s\" into domain \"%s\"", strName.c_str(), getName().c_str()); 58268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 58368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Creation 58468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = new CDomainConfiguration(strName); 58568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 58668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurable elements association 58768a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 58868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 58968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 59068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli const CConfigurableElement* pConfigurableElement = *it;; 59263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 59363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Retrieve associated syncer set 59463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CSyncerSet* pSyncerSet = getSyncerSet(pConfigurableElement); 59563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 59663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Associate to configuration 59763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet); 59868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 59968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 60068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 60168a912857707864bbaaff9808717813105072a6ePatrick Benavoli addChild(pDomainConfiguration); 60268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 60368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Ensure validity of fresh new domain configuration 60468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Attempt auto validation, so that the user gets his/her own settings by defaults 60568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!autoValidateConfiguration(pDomainConfiguration)) { 60668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 60768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // No valid configuration found to copy in from, validate againt main blackboard (will concerned remaining invalid parts) 60868a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pMainBlackboard); 60968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 61068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 61268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 61368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61468a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::deleteConfiguration(const string& strName, string& strError) 61568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 61768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 61968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 62168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 62268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 623ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Deleting configuration \"%s\" from domain \"%s\"", strName.c_str(), getName().c_str()); 62468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Was the last applied? 62668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration == _pLastAppliedConfiguration) { 62768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Forget about it 62968a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = NULL; 63068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 63168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 63368a912857707864bbaaff9808717813105072a6ePatrick Benavoli removeChild(pDomainConfiguration); 63468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Destroy 63668a912857707864bbaaff9808717813105072a6ePatrick Benavoli delete pDomainConfiguration; 63768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 63968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 64068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64168a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::listAssociatedToElements(string& strResult) const 64268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 64368a912857707864bbaaff9808717813105072a6ePatrick Benavoli strResult = "\n"; 64468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64568a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 64668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements 64868a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 64968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65068a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CConfigurableElement* pConfigurableElement = *it; 65168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65268a912857707864bbaaff9808717813105072a6ePatrick Benavoli strResult += pConfigurableElement->getPath() + "\n"; 65368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 65468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 65568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::renameConfiguration(const string& strName, const string& strNewName, string& strError) 65768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 65968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 66168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 66368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 664ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Renaming domain \"%s\"'s configuration \"%s\" to \"%s\"", getName().c_str(), strName.c_str(), strNewName.c_str()); 66568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Rename 66768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration->rename(strNewName, strError); 66868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 66968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 670ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocardbool CConfigurableDomain::restoreConfiguration(const string& strName, CParameterBlackboard* pMainBlackboard, bool bAutoSync, list<string>& lstrError) const 67168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 672ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard string strError; 673ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard 6740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 67568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 67668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 67768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 678ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard lstrError.push_back(strError); 67968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 68068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 681ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Restoring domain \"%s\"'s configuration \"%s\" to parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str()); 68268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 68368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate 684ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard bool bSuccess = pDomainConfiguration->restore(pMainBlackboard, bAutoSync && _bSequenceAware, &lstrError); 68568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 68668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Record last applied configuration 68768a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = pDomainConfiguration; 68868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 68968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Synchronize 690ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard if (bAutoSync && !_bSequenceAware) { 691ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard 692ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard bSuccess &= _syncerSet.sync(*pMainBlackboard, false, &lstrError); 693ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard } 694ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard return bSuccess; 69568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 69668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 69768a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::saveConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError) 69868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 69968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find Domain configuration 7000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 70168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 70268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 70368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 70468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 70568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 706ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Saving domain \"%s\"'s configuration \"%s\" from parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str()); 70768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 70868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate 70968a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->save(pMainBlackboard); 71068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 71168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 71268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 71368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::setElementSequence(const string& strConfiguration, const vector<string>& astrNewElementSequence, string& strError) 71563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 71663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Find Domain configuration 7170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError); 71863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 71963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 72063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 72163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 72263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 72363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 72463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Delegate to configuration 72563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return pDomainConfiguration->setElementSequence(astrNewElementSequence, strError); 72663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 72763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 7280bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::getElementSequence(const string& strConfiguration, string& strResult) const 72963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 73063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Find Domain configuration 7310bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strResult); 73263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 73363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 73463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 73563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 73663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 73763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 73863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Delegate to configuration 73963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->getElementSequence(strResult); 74063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 74163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 74263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 74363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 7440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::setApplicationRule(const string& strConfiguration, const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError) 7450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7460bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError); 7480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 7500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 7520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 7530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 7550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration->setApplicationRule(strApplicationRule, pSelectionCriteriaDefinition, strError); 7560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 7570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::clearApplicationRule(const string& strConfiguration, string& strError) 7590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError); 7620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 7640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 7660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 7670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 7690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pDomainConfiguration->clearApplicationRule(); 7700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 7720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 7730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::getApplicationRule(const string& strConfiguration, string& strResult) const 7750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strResult); 7780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 7800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 7820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 7830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 7850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pDomainConfiguration->getApplicationRule(strResult); 7860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 7880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 7890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 79068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Last applied configuration 79168a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getLastAppliedConfigurationName() const 79268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 79368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (_pLastAppliedConfiguration) { 79468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 79568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return _pLastAppliedConfiguration->getName(); 79668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 79768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "<none>"; 79868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 79968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8008b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Pending configuration 8018b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardstring CConfigurableDomain::getPendingConfigurationName() const 8028b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{ 8038b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard const CDomainConfiguration* pPendingConfiguration = getPendingConfiguration(); 8048b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 8058b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (pPendingConfiguration) { 8068b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 8078b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return pPendingConfiguration->getName(); 8088b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 8098b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return "<none>"; 8108b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard} 8118b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 81268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on whole domain from main blackboard 81368a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::validate(const CParameterBlackboard* pMainBlackboard) 81468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 81568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 81668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate 81768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 81868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 81968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 82068a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 82168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 82268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 82368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 82468a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pMainBlackboard); 82568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 82668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 82768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 82868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on areas related to configurable element 82968a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::validateAreas(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard) 83068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 831ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Validating domain \"" + getName() + "\" against main blackboard for configurable element \"" + pConfigurableElement->getPath() + "\""); 83268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 83368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate 83468a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 83568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 83668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 83768a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 83868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 83968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 84068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 84168a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pConfigurableElement, pMainBlackboard); 84268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 84368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 84468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 84568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt validation for all configurable element's areas, relying on already existing valid configuration inside domain 84668a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAll() 84768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 84868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate 84968a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 85068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 85168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements for configuration validation 85268a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 85368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 85468a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CConfigurableElement* pConfigurableElement = *it; 85568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 85668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Auto validate element 85768a912857707864bbaaff9808717813105072a6ePatrick Benavoli autoValidateAreas(pConfigurableElement); 85868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 85968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 86068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 86168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt validation for configurable element's areas, relying on already existing valid configuration inside domain 86268a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAreas(const CConfigurableElement* pConfigurableElement) 86368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 86468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find first valid configuration for given configurable element 86568a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pValidDomainConfiguration = findValidDomainConfiguration(pConfigurableElement); 86668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 86768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // No valid configuration found, give up 86868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pValidDomainConfiguration) { 86968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 87068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return; 87168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 87268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 87368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate all other configurations against found one, if any 87468a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 87568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 87668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 87768a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 87868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 87968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 88068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration != pValidDomainConfiguration && !pDomainConfiguration->isValid(pConfigurableElement)) { 88268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate 88368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement); 88468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 88568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 88668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 88768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt configuration validation for all configurable elements' areas, relying on already existing valid configuration inside domain 88968a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration) 89068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 89168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find another configuration than this one, that ought to be valid! 89268a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 89368a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 89468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 89568a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 89668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 89768a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pPotententialValidDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild)); 89868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 89968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pPotententialValidDomainConfiguration != pDomainConfiguration) { 90068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate against it 90268a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validateAgainst(pPotententialValidDomainConfiguration); 90368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 90568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 90668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 90768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 90868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 90968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 91068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for a valid configuration for given configurable element 91168a912857707864bbaaff9808717813105072a6ePatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findValidDomainConfiguration(const CConfigurableElement* pConfigurableElement) const 91268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 91368a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 91468a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 91568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 91668a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 91768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 91868a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild)); 91968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration->isValid(pConfigurableElement)) { 92168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration; 92368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 92468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 92568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return NULL; 92668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 92768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for an applicable configuration 92968a912857707864bbaaff9808717813105072a6ePatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findApplicableDomainConfiguration() const 93068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 93168a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 93268a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 93368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93468a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 93568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93668a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild)); 93768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration->isApplicable()) { 93968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration; 94168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 94268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 94368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return NULL; 94468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 94568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Gather set of configurable elements 94768a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::gatherConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const 94868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 94968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Insert all configurable elements 95068a912857707864bbaaff9808717813105072a6ePatrick Benavoli configurableElementSet.insert(_configurableElementList.begin(), _configurableElementList.end()); 95168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 95268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 95368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Check configurable element already attached 95468a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::containsConfigurableElement(const CConfigurableElement* pConfigurableCandidateElement) const 95568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 95668a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 95768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 95868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements for comparison 95968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 96068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 96168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurableCandidateElement == *it) { 96268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 96368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 96468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 96568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 96668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 96768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 96868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 96968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Merge any descended configurable element to this one with this one 97068a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement* pNewConfigurableElement) 97168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 97268a912857707864bbaaff9808717813105072a6ePatrick Benavoli list<CConfigurableElement*> mergedConfigurableElementList; 97368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97468a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 97568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements (new one not yet in the list!) 97768a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 97868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pConfigurablePotentialDescendantElement = *it; 98068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurablePotentialDescendantElement->isDescendantOf(pNewConfigurableElement)) { 98268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 983ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("In domain \"%s\", merging descendant configurable element's configurations \"%s\" into its ascendant \"%s\" ones", getName().c_str(), pConfigurablePotentialDescendantElement->getName().c_str(), pNewConfigurableElement->getName().c_str()); 98468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Merge configuration data 98668a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergeConfigurations(pNewConfigurableElement, pConfigurablePotentialDescendantElement); 98768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Keep track for removal 98968a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergedConfigurableElementList.push_back(pConfigurablePotentialDescendantElement); 99068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 99168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 99268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove all merged elements (new one not yet in the list!) 99468a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = mergedConfigurableElementList.begin(); it != mergedConfigurableElementList.end(); ++it) { 99568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99668a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pMergedConfigurableElement = *it; 99768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove merged from configurable element from internal tracking list 99968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Note: we shouldn't need to recompute the sync set in that case, as the merged to element should include the syncers of merged from elements 100068a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pMergedConfigurableElement, false); 100168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 100268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 100368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 100468a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::mergeConfigurations(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement) 100568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 100668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate to domain configurations 100768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 100868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 100968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101068a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 101168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 101368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do the merge. 101568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->merge(pToConfigurableElement, pFromConfigurableElement); 101668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 101768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 101868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association 10209620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnardvoid CConfigurableDomain::doAddConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard *pMainBlackboard) 102168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 102268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurable element 102368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->addAttachedConfigurableDomain(this); 102468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 102563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Create associated syncer set 102663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CSyncerSet* pSyncerSet = new CSyncerSet; 102763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 102863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add to sync set the configurable element one 102963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pConfigurableElement->fillSyncerSet(*pSyncerSet); 103063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 103163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Store it 103263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _configurableElementToSyncerSetMap[pConfigurableElement] = pSyncerSet; 103363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 103463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add it to global one 103563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet += *pSyncerSet; 103663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 103768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurations 103868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 103968a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 104068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 104168a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 104268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 104368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 104468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 104563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet); 104668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 104768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10489620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Ensure area validity for that configurable element (if main blackboard provided) 10499620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard if (pMainBlackboard) { 10509620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 10519620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Need to validate against main blackboard 10529620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard validateAreas(pConfigurableElement, pMainBlackboard); 10539620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard } 10549620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 10559620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Already associated descendend configurable elements need a merge of their configuration data 105668a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergeAlreadyAssociatedDescendantConfigurableElements(pConfigurableElement); 105768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 105868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Add to list 105968a912857707864bbaaff9808717813105072a6ePatrick Benavoli _configurableElementList.push_back(pConfigurableElement); 106068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 106168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 106268a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::doRemoveConfigurableElement(CConfigurableElement* pConfigurableElement, bool bRecomputeSyncSet) 106368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 106468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove from list 106568a912857707864bbaaff9808717813105072a6ePatrick Benavoli _configurableElementList.remove(pConfigurableElement); 106668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 106763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove associated syncer set 106863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CSyncerSet* pSyncerSet = getSyncerSet(pConfigurableElement); 106963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 107063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _configurableElementToSyncerSetMap.erase(pConfigurableElement); 107163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 107263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli delete pSyncerSet; 107363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 107468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurable element 107568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->removeAttachedConfigurableDomain(this); 107668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 107768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurations 107868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 107968a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 108068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 108168a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 108268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 108368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 108468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 108568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->removeConfigurableElement(pConfigurableElement); 108668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 108768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Recompute our sync set if needed 108868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (bRecomputeSyncSet) { 108968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 109068a912857707864bbaaff9808717813105072a6ePatrick Benavoli computeSyncSet(); 109168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 109268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 109363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 109463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Syncer set retrieval from configurable element 109563499d4763e42d76bfd39b79871f611381d2d164Patrick BenavoliCSyncerSet* CConfigurableDomain::getSyncerSet(const CConfigurableElement* pConfigurableElement) const 109663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 109763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt = _configurableElementToSyncerSetMap.find(pConfigurableElement); 109863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 109963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli assert(mapIt != _configurableElementToSyncerSetMap.end()); 110063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 110163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return mapIt->second; 110263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 11030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Configuration retrieval 11050bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCDomainConfiguration* CConfigurableDomain::findConfiguration(const string& strConfiguration, string& strError) 11060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 11070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(strConfiguration)); 11080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 11100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Domain configuration " + strConfiguration + " not found"; 11120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return NULL; 11140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 11150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration; 11160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 11170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findConfiguration(const string& strConfiguration, string& strError) const 11190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 11200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(findChild(strConfiguration)); 11210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 11230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Domain configuration " + strConfiguration + " not found"; 11250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return NULL; 11270bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 11280bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration; 11290bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 1130