ConfigurableDomain.cpp revision 8cb5d8815da673747b729d5e0a05a5cdc11a9081
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 39d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string; 40d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve 4163499d4763e42d76bfd39b79871f611381d2d164Patrick BenavoliCConfigurableDomain::CConfigurableDomain(const string& strName) : base(strName), _bSequenceAware(false), _pLastAppliedConfiguration(NULL) 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4568a912857707864bbaaff9808717813105072a6ePatrick BenavoliCConfigurableDomain::~CConfigurableDomain() 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove all configurable elements 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pConfigurableElement = *it; 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove from configurable element 5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->removeAttachedConfigurableDomain(this); 5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 5763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 5863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove all associated syncer sets 5963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt; 6063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 6163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli for (mapIt = _configurableElementToSyncerSetMap.begin(); mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) { 6263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 6363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli delete mapIt->second; 6463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6768a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getKind() const 6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "ConfigurableDomain"; 7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7268a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::childrenAreDynamic() const 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Content dumping 780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolivoid CConfigurableDomain::logValue(string& strValue, CErrorContext& errorContext) const 790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli (void)errorContext; 810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue = "{"; 830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Sequence awareness 850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += "Sequence aware: "; 860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += _bSequenceAware ? "yes" : "no"; 870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Last applied configuration 890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += ", Last applied configuration: "; 900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += _pLastAppliedConfiguration ? _pLastAppliedConfiguration->getName() : "<none>"; 910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strValue += "}"; 930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 9563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Sequence awareness 9663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::setSequenceAwareness(bool bSequenceAware) 9763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 9863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (_bSequenceAware != bSequenceAware) { 9963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 100ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Making domain \"%s\" sequence %s", getName().c_str(), bSequenceAware ? "aware" : "unaware"); 10163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _bSequenceAware = bSequenceAware; 10363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 10463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 10563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::getSequenceAwareness() const 10763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 10863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return _bSequenceAware; 10963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 11063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSource 11268a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const 11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1148cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner base::toXml(xmlElement, serializingContext); 1158cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner 11663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Sequence awareness 11763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlElement.setAttributeBoolean("SequenceAware", _bSequenceAware); 1188cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner} 11963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 1208cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagnervoid CConfigurableDomain::childrenToXml(CXmlElement& xmlElement, 1218cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner CXmlSerializingContext& serializingContext) const 1228cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner{ 12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurations 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli composeDomainConfigurations(xmlElement, serializingContext); 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurable Elements 12763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli composeConfigurableElements(xmlElement); 12863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 12963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Settings 13063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli composeSettings(xmlElement, serializingContext); 13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML composing 13468a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::composeDomainConfigurations(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create Configurations element 13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationsElement; 13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.createChild(xmlConfigurationsElement, "Configurations"); 14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate to base 1428cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner base::childrenToXml(xmlConfigurationsElement, serializingContext); 14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::composeConfigurableElements(CXmlElement& xmlElement) const 14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create ConfigurableElements element 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementsElement; 14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.createChild(xmlConfigurableElementsElement, "ConfigurableElements"); 15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Serialize out all configurable elements settings 15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CConfigurableElement* pConfigurableElement = *it; 15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create corresponding XML child element 16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlChildConfigurableElement; 16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16268a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlConfigurableElementsElement.createChild(xmlChildConfigurableElement, "ConfigurableElement"); 16368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set Path attribute 16568a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlChildConfigurableElement.setAttributeString("Path", pConfigurableElement->getPath()); 16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 16768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 16868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::composeSettings(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const 17068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 17163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Context 17263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli const CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<const CXmlDomainSerializingContext&>(serializingContext); 17363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlDomainSerializingContext.withSettings()) { 17563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return; 17763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 17863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Create Settings element 18063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlSettingsElement; 18163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 18263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlElement.createChild(xmlSettingsElement, "Settings"); 18363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 18463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Serialize out all configurations settings 18568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChildConfiguration; 18768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 18868a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChildConfiguration = 0; uiChildConfiguration < uiNbConfigurations; uiChildConfiguration++) { 18968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChildConfiguration)); 19168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create child xml element for that configuration 19368a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationSettingsElement; 19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlSettingsElement.createChild(xmlConfigurationSettingsElement, pDomainConfiguration->getKind()); 19668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set its name attribute 19868a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlConfigurationSettingsElement.setNameAttribute(pDomainConfiguration->getName()); 19968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 20063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Serialize out configuration settings 20163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->composeSettings(xmlConfigurationSettingsElement, serializingContext); 20268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 20368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 20468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 20568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSink 20668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 20768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 20863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Context 20963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext); 21063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Sequence awareness (optional) 21263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _bSequenceAware = xmlElement.hasAttribute("SequenceAware") && xmlElement.getAttributeBoolean("SequenceAware"); 21363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Local parsing. Do not dig 21563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!parseDomainConfigurations(xmlElement, serializingContext) || !parseConfigurableElements(xmlElement, serializingContext) || !parseSettings(xmlElement, serializingContext)) { 21663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 21863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 21963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 22063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // All provided configurations are parsed 22163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Attempt validation on areas of non provided configurations for all configurable elements if required 22263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (xmlDomainSerializingContext.autoValidationRequired()) { 22363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 22463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli autoValidateAll(); 22563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 22663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 22763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 22868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 22968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 23068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML parsing 23168a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::parseDomainConfigurations(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 23268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 23368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // We're supposedly clean 23468a912857707864bbaaff9808717813105072a6ePatrick Benavoli assert(_configurableElementList.empty()); 23568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 23668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get Configurations element 23768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationsElement; 23868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 23968a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.getChildElement("Configurations", xmlConfigurationsElement); 24068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parse it and create domain configuration objects 24268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return base::fromXml(xmlConfigurationsElement, serializingContext); 24368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 24468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Parse configurable elements 24668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::parseConfigurableElements(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 24768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 24868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get System Class Element 24968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* pRootElement = getRoot(); 25068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CElement* pSystemClassElement = pRootElement->findChildOfKind("SystemClass"); 25268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25368a912857707864bbaaff9808717813105072a6ePatrick Benavoli assert(pSystemClassElement); 25468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get ConfigurableElements element 25668a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementsElement; 25768a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.getChildElement("ConfigurableElements", xmlConfigurableElementsElement); 25868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parse it and associate found configurable elements to it 26068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement::CChildIterator it(xmlConfigurableElementsElement); 26168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementElement; 26368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26468a912857707864bbaaff9808717813105072a6ePatrick Benavoli while (it.next(xmlConfigurableElementElement)) { 26568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Locate configurable element 26768a912857707864bbaaff9808717813105072a6ePatrick Benavoli string strConfigurableElementPath = xmlConfigurableElementElement.getAttributeString("Path"); 26868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CPathNavigator pathNavigator(strConfigurableElementPath); 270065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli string strError; 27168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Is there an element and does it match system class name? 273065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli if (!pathNavigator.navigateThrough(pSystemClassElement->getName(), strError)) { 27468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 275065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName() + " (" + strError + ")"); 27668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 27868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 27968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse system class for configurable element 28068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pSystemClassElement->findDescendant(pathNavigator)); 28168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pConfigurableElement) { 28368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28468a912857707864bbaaff9808717813105072a6ePatrick Benavoli serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName()); 28568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 28768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 28868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Add found element to domain 28968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!addConfigurableElement(pConfigurableElement, NULL, strError)) { 29068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 29168a912857707864bbaaff9808717813105072a6ePatrick Benavoli serializingContext.setError(strError); 29268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 29368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 29468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 29568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 29668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 29768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 29868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 29968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Parse settings 30163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::parseSettings(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) 30268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 30368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Context 30468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext); 30568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Check we actually need to parse configuration settings 30763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlDomainSerializingContext.withSettings()) { 30868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // No parsing required 31063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 31163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 31268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 31363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Get Settings element 31463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlSettingsElement; 31563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlElement.getChildElement("Settings", xmlSettingsElement)) { 31668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 31763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // No settings, bail out successfully 31863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 31968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 32068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 32163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Parse configuration settings 32263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement::CChildIterator it(xmlSettingsElement); 32368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 32463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlConfigurationSettingsElement; 3256ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 32663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli while (it.next(xmlConfigurationSettingsElement)) { 32763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Get domain configuration 32863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(xmlConfigurationSettingsElement.getNameAttribute())); 3296ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 33063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 3316ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 33263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlDomainSerializingContext.setError("Could not find domain configuration referred to by configurable domain " + getName()); 3336ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 3346ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return false; 3356ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 33663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Have domain configuration parse settings for all configurable elements 33763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration->parseSettings(xmlConfigurationSettingsElement, xmlDomainSerializingContext)) { 3386ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 3396ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return false; 3406ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 3416ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 3426ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 34368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 34468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 34568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association 34668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::addConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError) 34768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 34868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already associated? 34968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (containsConfigurableElement(pConfigurableElement)) { 35068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35168a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " already associated to configuration domain " + getName(); 35268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 35468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 35568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already owned? 35768a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurableElement->belongsTo(this)) { 35868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 35968a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " already owned by configuration domain " + getName(); 36068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 36168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 36268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 36368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 36468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do add 3659620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard doAddConfigurableElement(pConfigurableElement, pMainBlackboard); 36668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 36768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 36868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 36968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::removeConfigurableElement(CConfigurableElement* pConfigurableElement, string& strError) 37168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 37268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Not associated? 37368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!containsConfigurableElement(pConfigurableElement)) { 37468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37568a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName(); 37668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 37868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 379ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Removing configurable element \"%s\" from domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str()); 38068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 38168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do remove 38268a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pConfigurableElement, true); 38368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 38468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 38568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 38668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 387e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard/** 388e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* Blackboard Configuration and Base Offset retrieval. 389e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 390e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* This method fetches the Blackboard associated to the ConfigurableElement 391e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* given in parameter, for a specific Configuration. The ConfigurableElement 392e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* must belong to the Domain. If a Blackboard is found, the base offset of 393e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the ConfigurableElement is returned as well. This base offset corresponds to 394e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the offset of the ancestor of the ConfigurableElement associated to the Configuration. 395e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 396e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[in] strConfiguration Name of the Configuration. 397e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[in] pCandidateDescendantConfigurableElement Pointer to a CConfigurableElement that 398e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* belongs to the Domain. 399e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] uiBaseOffset The base offset of the CConfigurableElement. 400e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] bIsLastApplied Boolean indicating that the Configuration is 401e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the last one applied of the Domain. 402e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] strError Error message 403e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 404e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* return Pointer to the Blackboard of the Configuration. 405e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard*/ 406e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric BoisnardCParameterBlackboard* CConfigurableDomain::findConfigurationBlackboard(const string& strConfiguration, 407e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard const CConfigurableElement* pCandidateDescendantConfigurableElement, 408e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard uint32_t& uiBaseOffset, 409e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard bool& bIsLastApplied, 410e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard string& strError) const 411e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard{ 412e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Find Configuration 413e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(findChild(strConfiguration)); 414e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 415e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard if (!pDomainConfiguration) { 416e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 417e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard strError = "Domain configuration " + strConfiguration + " not found"; 418e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 419e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return NULL; 420e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 421e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 422e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Parse all configurable elements 423e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard ConfigurableElementListIterator it; 424e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 425e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 426e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 427e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard const CConfigurableElement* pAssociatedConfigurableElement = *it; 428e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 429e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Check if the the associated element is the configurable element or one of its ancestors 430e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard if ((pCandidateDescendantConfigurableElement == pAssociatedConfigurableElement) || 431e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard (pCandidateDescendantConfigurableElement->isDescendantOf(pAssociatedConfigurableElement))) { 432e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 433e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard uiBaseOffset = pAssociatedConfigurableElement->getOffset(); 434e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard bIsLastApplied = (pDomainConfiguration == _pLastAppliedConfiguration); 435e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 436e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return pDomainConfiguration->getBlackboard(pAssociatedConfigurableElement); 437e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 438e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 439e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 440e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard strError = "Element not associated to the Domain"; 441e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 442e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return NULL; 443e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard} 444e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 44568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Domain splitting 44668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::split(CConfigurableElement* pConfigurableElement, string& strError) 44768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 44868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Not associated? 44968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!containsConfigurableElement(pConfigurableElement)) { 45068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45168a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName(); 45268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 45468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 455ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Splitting configurable element \"%s\" domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str()); 45668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 45768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create sub domain areas for all configurable element's children 45868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurableElementChildren = pConfigurableElement->getNbChildren(); 45968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!uiNbConfigurableElementChildren) { 46168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46268a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Configurable element " + pConfigurableElement->getPath() + " has no children to split configurable domain to"; 46368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 46568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 46668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 46868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 46968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) { 47068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pChildConfigurableElement = static_cast<CConfigurableElement*>(pConfigurableElement->getChild(uiChild)); 47268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47368a912857707864bbaaff9808717813105072a6ePatrick Benavoli doAddConfigurableElement(pChildConfigurableElement); 47468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 47568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate to configurations 47768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 47868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 48068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 48168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 48268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 48368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->split(pConfigurableElement); 48468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 48568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 48668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove given configurable element from this domain 48768a912857707864bbaaff9808717813105072a6ePatrick 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 48868a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pConfigurableElement, false); 48968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 49068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 49168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 49268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4938b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Check if there is a pending configuration for this domain: i.e. an applicable configuration different from the last applied configuration 4948b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardconst CDomainConfiguration* CConfigurableDomain::getPendingConfiguration() const 4958b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{ 4968b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration(); 4978b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 4988b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (pApplicableDomainConfiguration) { 4998b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5008b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard // Check not the last one before applying 5018b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (!_pLastAppliedConfiguration || (_pLastAppliedConfiguration != pApplicableDomainConfiguration)) { 5028b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5038b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return pApplicableDomainConfiguration; 5048b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 5058b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 5068b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5078b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return NULL; 5088b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard} 5098b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 51068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration application if required 511f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulinvoid CConfigurableDomain::apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet* pSyncerSet, bool bForce) const 51268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 513f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Apply configuration only if the blackboard will 514f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // be synchronized either now or by syncerSet. 515f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin if(!pSyncerSet ^ _bSequenceAware) { 516f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // The configuration can not be syncronised 517f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin return; 518f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin } 519f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin 52068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (bForce) { 52168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Force a configuration restore by forgetting about last applied configuration 52268a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = NULL; 52368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 52468a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration(); 52568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 52668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pApplicableDomainConfiguration) { 52768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 52868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Check not the last one before applying 52968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!_pLastAppliedConfiguration || _pLastAppliedConfiguration != pApplicableDomainConfiguration) { 53068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 531f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin log_info("Applying configuration \"%s\" from domain \"%s\"", 532f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin pApplicableDomainConfiguration->getName().c_str(), 533f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin getName().c_str()); 534f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin 535f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Check if we need to synchronize during restore 536f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin bool bSync = !pSyncerSet && _bSequenceAware; 53768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 53868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do the restore 539f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin pApplicableDomainConfiguration->restore(pParameterBlackboard, bSync, NULL); 54068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 54168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Record last applied configuration 54268a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = pApplicableDomainConfiguration; 54368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 544f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Check we need to provide syncer set to caller 545f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin if (pSyncerSet && !_bSequenceAware) { 54663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 54763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Since we applied changes, add our own sync set to the given one 548f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin *pSyncerSet += _syncerSet; 54963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 55068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 55168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 55268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 55368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 55468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Return applicable configuration validity for given configurable element 55568a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::isApplicableConfigurationValid(const CConfigurableElement* pConfigurableElement) const 55668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 55768a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration(); 55868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 55968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pApplicableDomainConfiguration && pApplicableDomainConfiguration->isValid(pConfigurableElement); 56068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 56168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// In case configurable element was removed 56368a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::computeSyncSet() 56468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 56568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Clean sync set first 56663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet.clear(); 56768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add syncer sets for all associated configurable elements 56963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt; 57068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli for (mapIt = _configurableElementToSyncerSetMap.begin(); mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) { 57268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli const CSyncerSet* pSyncerSet = mapIt->second; 57468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet += *pSyncerSet; 57668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 57768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 57868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration Management 58068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::createConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError) 58168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 58268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already exists? 58368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (findChild(strName)) { 58468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 58568a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Already existing configuration"; 58668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 58768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 58868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 589ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Creating domain configuration \"%s\" into domain \"%s\"", strName.c_str(), getName().c_str()); 59068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Creation 59268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = new CDomainConfiguration(strName); 59368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurable elements association 59568a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 59668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59768a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 59868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli const CConfigurableElement* pConfigurableElement = *it;; 60063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 60163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Retrieve associated syncer set 60263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CSyncerSet* pSyncerSet = getSyncerSet(pConfigurableElement); 60363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 60463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Associate to configuration 60563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet); 60668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 60768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 60868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 60968a912857707864bbaaff9808717813105072a6ePatrick Benavoli addChild(pDomainConfiguration); 61068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Ensure validity of fresh new domain configuration 61268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Attempt auto validation, so that the user gets his/her own settings by defaults 61368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!autoValidateConfiguration(pDomainConfiguration)) { 61468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // No valid configuration found to copy in from, validate againt main blackboard (will concerned remaining invalid parts) 61668a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pMainBlackboard); 61768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 61868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 62068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 62168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62268a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::deleteConfiguration(const string& strName, string& strError) 62368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 62568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 62768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 62968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 63068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 631ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Deleting configuration \"%s\" from domain \"%s\"", strName.c_str(), getName().c_str()); 63268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Was the last applied? 63468a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration == _pLastAppliedConfiguration) { 63568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Forget about it 63768a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = NULL; 63868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 63968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 64168a912857707864bbaaff9808717813105072a6ePatrick Benavoli removeChild(pDomainConfiguration); 64268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Destroy 64468a912857707864bbaaff9808717813105072a6ePatrick Benavoli delete pDomainConfiguration; 64568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 64768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 64868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64968a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::listAssociatedToElements(string& strResult) const 65068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 65168a912857707864bbaaff9808717813105072a6ePatrick Benavoli strResult = "\n"; 65268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65368a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 65468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements 65668a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 65768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65868a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CConfigurableElement* pConfigurableElement = *it; 65968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66068a912857707864bbaaff9808717813105072a6ePatrick Benavoli strResult += pConfigurableElement->getPath() + "\n"; 66168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 66268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 66368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66468a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::renameConfiguration(const string& strName, const string& strNewName, string& strError) 66568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 66768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 66968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 67068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 67168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 672ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Renaming domain \"%s\"'s configuration \"%s\" to \"%s\"", getName().c_str(), strName.c_str(), strNewName.c_str()); 67368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 67468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Rename 67568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration->rename(strNewName, strError); 67668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 67768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 678d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalvebool CConfigurableDomain::restoreConfiguration(const string& strName, CParameterBlackboard* pMainBlackboard, bool bAutoSync, std::list<string>& lstrError) const 67968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 680ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard string strError; 681ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard 6820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 68368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 68468a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 68568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 686ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard lstrError.push_back(strError); 68768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 68868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 689ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Restoring domain \"%s\"'s configuration \"%s\" to parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str()); 69068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 69168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate 692ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard bool bSuccess = pDomainConfiguration->restore(pMainBlackboard, bAutoSync && _bSequenceAware, &lstrError); 69368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 69468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Record last applied configuration 69568a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = pDomainConfiguration; 69668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 69768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Synchronize 698ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard if (bAutoSync && !_bSequenceAware) { 699ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard 700ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard bSuccess &= _syncerSet.sync(*pMainBlackboard, false, &lstrError); 701ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard } 702ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard return bSuccess; 70368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 70468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 70568a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::saveConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError) 70668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 70768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find Domain configuration 7080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError); 70968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 71068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 71168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 71268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 71368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 714ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Saving domain \"%s\"'s configuration \"%s\" from parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str()); 71568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 71668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate 71768a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->save(pMainBlackboard); 71868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 71968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 72068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 72168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 722d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalvebool CConfigurableDomain::setElementSequence(const string& strConfiguration, const std::vector<string>& astrNewElementSequence, string& strError) 72363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 72463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Find Domain configuration 7250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError); 72663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 72763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 72863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 72963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 73063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 73163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 73263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Delegate to configuration 73363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return pDomainConfiguration->setElementSequence(astrNewElementSequence, strError); 73463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 73563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 7360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::getElementSequence(const string& strConfiguration, string& strResult) const 73763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 73863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Find Domain configuration 7390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strResult); 74063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 74163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 74263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 74363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 74463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 74563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 74663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Delegate to configuration 74763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->getElementSequence(strResult); 74863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 74963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 75063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 75163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 7520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::setApplicationRule(const string& strConfiguration, const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError) 7530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError); 7560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 7580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 7600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 7610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 7630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration->setApplicationRule(strApplicationRule, pSelectionCriteriaDefinition, strError); 7640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 7650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::clearApplicationRule(const string& strConfiguration, string& strError) 7670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError); 7700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 7720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 7740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 7750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 7770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pDomainConfiguration->clearApplicationRule(); 7780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 7800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 7810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::getApplicationRule(const string& strConfiguration, string& strResult) const 7830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strResult); 7860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 7880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 7900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 7910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 7930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pDomainConfiguration->getApplicationRule(strResult); 7940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 7950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 7960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 7970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 79868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Last applied configuration 79968a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getLastAppliedConfigurationName() const 80068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 80168a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (_pLastAppliedConfiguration) { 80268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 80368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return _pLastAppliedConfiguration->getName(); 80468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 80568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "<none>"; 80668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 80768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8088b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Pending configuration 8098b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardstring CConfigurableDomain::getPendingConfigurationName() const 8108b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{ 8118b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard const CDomainConfiguration* pPendingConfiguration = getPendingConfiguration(); 8128b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 8138b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (pPendingConfiguration) { 8148b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 8158b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return pPendingConfiguration->getName(); 8168b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 8178b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return "<none>"; 8188b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard} 8198b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 82068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on whole domain from main blackboard 82168a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::validate(const CParameterBlackboard* pMainBlackboard) 82268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 82368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 82468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate 82568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 82668a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 82768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 82868a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 82968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 83068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 83168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 83268a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pMainBlackboard); 83368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 83468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 83568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 83668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on areas related to configurable element 83768a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::validateAreas(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard) 83868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 839ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard log_info("Validating domain \"" + getName() + "\" against main blackboard for configurable element \"" + pConfigurableElement->getPath() + "\""); 84068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 84168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate 84268a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 84368a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 84468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 84568a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 84668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 84768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 84868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 84968a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pConfigurableElement, pMainBlackboard); 85068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 85168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 85268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 85368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt validation for all configurable element's areas, relying on already existing valid configuration inside domain 85468a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAll() 85568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 85668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate 85768a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 85868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 85968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements for configuration validation 86068a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 86168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 86268a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CConfigurableElement* pConfigurableElement = *it; 86368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 86468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Auto validate element 86568a912857707864bbaaff9808717813105072a6ePatrick Benavoli autoValidateAreas(pConfigurableElement); 86668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 86768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 86868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 86968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt validation for configurable element's areas, relying on already existing valid configuration inside domain 87068a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAreas(const CConfigurableElement* pConfigurableElement) 87168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 87268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find first valid configuration for given configurable element 87368a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pValidDomainConfiguration = findValidDomainConfiguration(pConfigurableElement); 87468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 87568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // No valid configuration found, give up 87668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pValidDomainConfiguration) { 87768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 87868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return; 87968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 88068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate all other configurations against found one, if any 88268a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 88368a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 88468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88568a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 88668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 88868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration != pValidDomainConfiguration && !pDomainConfiguration->isValid(pConfigurableElement)) { 89068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate 89168a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement); 89268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 89368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 89468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 89568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 89668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt configuration validation for all configurable elements' areas, relying on already existing valid configuration inside domain 89768a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration) 89868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 89968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find another configuration than this one, that ought to be valid! 90068a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 90168a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 90268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90368a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 90468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90568a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pPotententialValidDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild)); 90668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90768a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pPotententialValidDomainConfiguration != pDomainConfiguration) { 90868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate against it 91068a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validateAgainst(pPotententialValidDomainConfiguration); 91168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 91268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 91368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 91468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 91568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 91668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 91768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 91868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for a valid configuration for given configurable element 91968a912857707864bbaaff9808717813105072a6ePatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findValidDomainConfiguration(const CConfigurableElement* pConfigurableElement) const 92068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 92168a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 92268a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 92368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92468a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 92568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92668a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild)); 92768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration->isValid(pConfigurableElement)) { 92968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration; 93168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 93268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 93368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return NULL; 93468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 93568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for an applicable configuration 93768a912857707864bbaaff9808717813105072a6ePatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findApplicableDomainConfiguration() const 93868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 93968a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 94068a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 94168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94268a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 94368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94468a912857707864bbaaff9808717813105072a6ePatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild)); 94568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration->isApplicable()) { 94768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration; 94968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 95068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 95168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return NULL; 95268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 95368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 95468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Gather set of configurable elements 955d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalvevoid CConfigurableDomain::gatherConfigurableElements(std::set<const CConfigurableElement*>& configurableElementSet) const 95668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 95768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Insert all configurable elements 95868a912857707864bbaaff9808717813105072a6ePatrick Benavoli configurableElementSet.insert(_configurableElementList.begin(), _configurableElementList.end()); 95968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 96068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 96168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Check configurable element already attached 96268a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::containsConfigurableElement(const CConfigurableElement* pConfigurableCandidateElement) const 96368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 96468a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 96568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 96668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements for comparison 96768a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 96868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 96968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurableCandidateElement == *it) { 97068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 97268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 97368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 97468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 97568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 97668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Merge any descended configurable element to this one with this one 97868a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement* pNewConfigurableElement) 97968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 980d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve std::list<CConfigurableElement*> mergedConfigurableElementList; 98168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98268a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 98368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements (new one not yet in the list!) 98568a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 98668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98768a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pConfigurablePotentialDescendantElement = *it; 98868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurablePotentialDescendantElement->isDescendantOf(pNewConfigurableElement)) { 99068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 991ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin 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()); 99268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Merge configuration data 99468a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergeConfigurations(pNewConfigurableElement, pConfigurablePotentialDescendantElement); 99568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Keep track for removal 99768a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergedConfigurableElementList.push_back(pConfigurablePotentialDescendantElement); 99868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 99968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 100068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 100168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove all merged elements (new one not yet in the list!) 100268a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = mergedConfigurableElementList.begin(); it != mergedConfigurableElementList.end(); ++it) { 100368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 100468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CConfigurableElement* pMergedConfigurableElement = *it; 100568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 100668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove merged from configurable element from internal tracking list 100768a912857707864bbaaff9808717813105072a6ePatrick 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 100868a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pMergedConfigurableElement, false); 100968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 101068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 101168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101268a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::mergeConfigurations(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement) 101368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 101468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate to domain configurations 101568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 101668a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 101768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101868a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 101968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 102068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 102168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 102268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do the merge. 102368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->merge(pToConfigurableElement, pFromConfigurableElement); 102468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 102568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 102668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 102768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association 10289620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnardvoid CConfigurableDomain::doAddConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard *pMainBlackboard) 102968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 103068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurable element 103168a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->addAttachedConfigurableDomain(this); 103268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 103363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Create associated syncer set 103463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CSyncerSet* pSyncerSet = new CSyncerSet; 103563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 103663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add to sync set the configurable element one 103763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pConfigurableElement->fillSyncerSet(*pSyncerSet); 103863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 103963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Store it 104063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _configurableElementToSyncerSetMap[pConfigurableElement] = pSyncerSet; 104163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 104263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add it to global one 104363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet += *pSyncerSet; 104463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 104568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurations 104668a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 104768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 104868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 104968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 105068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 105168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 105268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 105363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet); 105468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 105568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10569620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Ensure area validity for that configurable element (if main blackboard provided) 10579620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard if (pMainBlackboard) { 10589620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 10599620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Need to validate against main blackboard 10609620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard validateAreas(pConfigurableElement, pMainBlackboard); 10619620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard } 10629620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 10639620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Already associated descendend configurable elements need a merge of their configuration data 106468a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergeAlreadyAssociatedDescendantConfigurableElements(pConfigurableElement); 106568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 106668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Add to list 106768a912857707864bbaaff9808717813105072a6ePatrick Benavoli _configurableElementList.push_back(pConfigurableElement); 106868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 106968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 107068a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::doRemoveConfigurableElement(CConfigurableElement* pConfigurableElement, bool bRecomputeSyncSet) 107168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 107268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove from list 107368a912857707864bbaaff9808717813105072a6ePatrick Benavoli _configurableElementList.remove(pConfigurableElement); 107468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 107563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove associated syncer set 107663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CSyncerSet* pSyncerSet = getSyncerSet(pConfigurableElement); 107763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 107863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _configurableElementToSyncerSetMap.erase(pConfigurableElement); 107963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 108063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli delete pSyncerSet; 108163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 108268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurable element 108368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->removeAttachedConfigurableDomain(this); 108468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 108568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurations 108668a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiNbConfigurations = getNbChildren(); 108768a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiChild; 108868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 108968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 109068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 109168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild)); 109268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 109368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->removeConfigurableElement(pConfigurableElement); 109468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 109568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Recompute our sync set if needed 109668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (bRecomputeSyncSet) { 109768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 109868a912857707864bbaaff9808717813105072a6ePatrick Benavoli computeSyncSet(); 109968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 110068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 110163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 110263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Syncer set retrieval from configurable element 110363499d4763e42d76bfd39b79871f611381d2d164Patrick BenavoliCSyncerSet* CConfigurableDomain::getSyncerSet(const CConfigurableElement* pConfigurableElement) const 110463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 110563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt = _configurableElementToSyncerSetMap.find(pConfigurableElement); 110663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 110763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli assert(mapIt != _configurableElementToSyncerSetMap.end()); 110863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 110963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return mapIt->second; 111063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 11110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Configuration retrieval 11130bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCDomainConfiguration* CConfigurableDomain::findConfiguration(const string& strConfiguration, string& strError) 11140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 11150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(strConfiguration)); 11160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 11180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Domain configuration " + strConfiguration + " not found"; 11200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return NULL; 11220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 11230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration; 11240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 11250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findConfiguration(const string& strConfiguration, string& strError) const 11270bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 11280bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(findChild(strConfiguration)); 11290bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11300bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 11310bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11320bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Domain configuration " + strConfiguration + " not found"; 11330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return NULL; 11350bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 11360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration; 11370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 1138