1e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard/* 29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2011-2015, 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" 3529fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner#include "XmlDomainImportContext.h" 3629fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner#include "XmlDomainExportContext.h" 379368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "Utility.h" 389368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "AlwaysAssert.hpp" 399368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <cassert> 4068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 419368eea42a1afb01dd44110582f997115b50e742François Gaffie#define base CElement 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 43d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string; 44d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve 459368eea42a1afb01dd44110582f997115b50e742François GaffieCConfigurableDomain::CConfigurableDomain(const string &strName) : base(strName) 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4968a912857707864bbaaff9808717813105072a6ePatrick BenavoliCConfigurableDomain::~CConfigurableDomain() 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 5163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove all configurable elements 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 569368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *pConfigurableElement = *it; 5768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove from configurable element 5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->removeAttachedConfigurableDomain(this); 6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 6163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 6263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove all associated syncer sets 6363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt; 6463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 659368eea42a1afb01dd44110582f997115b50e742François Gaffie for (mapIt = _configurableElementToSyncerSetMap.begin(); 669368eea42a1afb01dd44110582f997115b50e742François Gaffie mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) { 6763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 6863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli delete mapIt->second; 6963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7268a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getKind() const 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "ConfigurableDomain"; 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7768a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::childrenAreDynamic() const 7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 8168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Content dumping 839368eea42a1afb01dd44110582f997115b50e742François Gaffiestring CConfigurableDomain::logValue(utility::ErrorContext & /*ctx*/) const 840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 859368eea42a1afb01dd44110582f997115b50e742François Gaffie return string("{") + 860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 879368eea42a1afb01dd44110582f997115b50e742François Gaffie "Sequence aware: " + (_bSequenceAware ? "yes" : "no") + 880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 899368eea42a1afb01dd44110582f997115b50e742François Gaffie ", Last applied configuration: " + 909368eea42a1afb01dd44110582f997115b50e742François Gaffie (_pLastAppliedConfiguration ? _pLastAppliedConfiguration->getName() : "<none>") + 910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 929368eea42a1afb01dd44110582f997115b50e742François Gaffie "}"; 930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 9563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Sequence awareness 9663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::setSequenceAwareness(bool bSequenceAware) 9763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 9863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (_bSequenceAware != bSequenceAware) { 9963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _bSequenceAware = bSequenceAware; 10163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 10263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 10363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::getSequenceAwareness() const 10563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 10663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return _bSequenceAware; 10763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 10863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSource 1109368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::toXml(CXmlElement &xmlElement, 1119368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlSerializingContext &serializingContext) const 11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1138cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner base::toXml(xmlElement, serializingContext); 1148cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner 11563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Sequence awareness 1169368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.setAttribute("SequenceAware", _bSequenceAware); 1178cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner} 11863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 1199368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::childrenToXml(CXmlElement &xmlElement, 1209368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlSerializingContext &serializingContext) const 1218cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner{ 12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurations 12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli composeDomainConfigurations(xmlElement, serializingContext); 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurable Elements 12663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli composeConfigurableElements(xmlElement); 12763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 12863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Settings 1299368eea42a1afb01dd44110582f997115b50e742François Gaffie composeSettings(xmlElement, static_cast<CXmlDomainExportContext &>(serializingContext)); 13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML composing 1339368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::composeDomainConfigurations( 1349368eea42a1afb01dd44110582f997115b50e742François Gaffie 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 1459368eea42a1afb01dd44110582f997115b50e742François Gaffievoid 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 1579368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement = *it; 15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create corresponding XML child element 16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlChildConfigurableElement; 16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1629368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlConfigurableElementsElement.createChild(xmlChildConfigurableElement, 1639368eea42a1afb01dd44110582f997115b50e742François Gaffie "ConfigurableElement"); 16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set Path attribute 1669368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlChildConfigurableElement.setAttribute("Path", pConfigurableElement->getPath()); 16768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 16868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 16968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1709368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::composeSettings(CXmlElement &xmlElement, 1719368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlDomainExportContext &context) const 17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1739368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!context.withSettings()) { 17463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return; 17663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 17763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 17863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Create Settings element 17963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlSettingsElement; 18063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 18163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli xmlElement.createChild(xmlSettingsElement, "Settings"); 18263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 18363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Serialize out all configurations settings 184911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 185911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiChildConfiguration; 18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1879368eea42a1afb01dd44110582f997115b50e742François Gaffie for (uiChildConfiguration = 0; uiChildConfiguration < uiNbConfigurations; 1889368eea42a1afb01dd44110582f997115b50e742François Gaffie uiChildConfiguration++) { 18968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1909368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 1919368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CDomainConfiguration *>(getChild(uiChildConfiguration)); 19268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create child xml element for that configuration 19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationSettingsElement; 19568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1969368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlSettingsElement.createChild(xmlConfigurationSettingsElement, 1979368eea42a1afb01dd44110582f997115b50e742François Gaffie pDomainConfiguration->getXmlElementName()); 19868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 19968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set its name attribute 20068a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlConfigurationSettingsElement.setNameAttribute(pDomainConfiguration->getName()); 20168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 20263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Serialize out configuration settings 2039368eea42a1afb01dd44110582f997115b50e742François Gaffie pDomainConfiguration->composeSettings(xmlConfigurationSettingsElement, context); 20468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 20568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 20668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 20768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSink 2089368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::fromXml(const CXmlElement &xmlElement, 2099368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlSerializingContext &serializingContext) 21068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 21163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Context 2129368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlDomainImportContext &xmlDomainImportContext = 2139368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CXmlDomainImportContext &>(serializingContext); 21463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 21563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Sequence awareness (optional) 2169368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.getAttribute("SequenceAware", _bSequenceAware); 21763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 2189368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string name; 2199368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.getAttribute("Name", name); 2209368eea42a1afb01dd44110582f997115b50e742François Gaffie setName(name); 221fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner 22268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Local parsing. Do not dig 22329fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner if (!parseDomainConfigurations(xmlElement, xmlDomainImportContext) || 22429fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner !parseConfigurableElements(xmlElement, xmlDomainImportContext) || 22529fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner !parseSettings(xmlElement, xmlDomainImportContext)) { 22663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 22763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 22863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 22963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 23063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // All provided configurations are parsed 2319368eea42a1afb01dd44110582f997115b50e742François Gaffie // Attempt validation on areas of non provided configurations for all configurable elements if 2329368eea42a1afb01dd44110582f997115b50e742François Gaffie // required 23329fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner if (xmlDomainImportContext.autoValidationRequired()) { 23463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 23563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli autoValidateAll(); 23663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 23763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 23863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 23968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 24068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML parsing 2429368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::parseDomainConfigurations(const CXmlElement &xmlElement, 2439368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlDomainImportContext &serializingContext) 24468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 24568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // We're supposedly clean 24668a912857707864bbaaff9808717813105072a6ePatrick Benavoli assert(_configurableElementList.empty()); 24768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 24868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get Configurations element 24968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurationsElement; 25068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25168a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.getChildElement("Configurations", xmlConfigurationsElement); 25268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parse it and create domain configuration objects 25468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return base::fromXml(xmlConfigurationsElement, serializingContext); 25568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 25668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 25768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Parse configurable elements 2589368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::parseConfigurableElements(const CXmlElement &xmlElement, 2599368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlDomainImportContext &serializingContext) 26068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 2619368eea42a1afb01dd44110582f997115b50e742François Gaffie CSystemClass &systemClass = serializingContext.getSystemClass(); 26268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get ConfigurableElements element 26468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementsElement; 26568a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlElement.getChildElement("ConfigurableElements", xmlConfigurableElementsElement); 26668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 26768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parse it and associate found configurable elements to it 26868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement::CChildIterator it(xmlConfigurableElementsElement); 26968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27068a912857707864bbaaff9808717813105072a6ePatrick Benavoli CXmlElement xmlConfigurableElementElement; 27168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27268a912857707864bbaaff9808717813105072a6ePatrick Benavoli while (it.next(xmlConfigurableElementElement)) { 27368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Locate configurable element 2759368eea42a1afb01dd44110582f997115b50e742François Gaffie string strConfigurableElementPath; 2769368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlConfigurableElementElement.getAttribute("Path", strConfigurableElementPath); 27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 27868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CPathNavigator pathNavigator(strConfigurableElementPath); 279065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli string strError; 28068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Is there an element and does it match system class name? 282d8a53107d5f965c8ca406ee95f5999efd6694730David Wagner if (!pathNavigator.navigateThrough(systemClass.getName(), strError)) { 28368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 2849368eea42a1afb01dd44110582f997115b50e742François Gaffie serializingContext.setError( 2859368eea42a1afb01dd44110582f997115b50e742François Gaffie "Could not find configurable element of path " + strConfigurableElementPath + 2869368eea42a1afb01dd44110582f997115b50e742François Gaffie " from ConfigurableDomain description " + getName() + " (" + strError + ")"); 28768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 28868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 28968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 29068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse system class for configurable element 2919368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *pConfigurableElement = 2929368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CConfigurableElement *>(systemClass.findDescendant(pathNavigator)); 29368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 29468a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pConfigurableElement) { 29568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 2969368eea42a1afb01dd44110582f997115b50e742François Gaffie serializingContext.setError("Could not find configurable element of path " + 2979368eea42a1afb01dd44110582f997115b50e742François Gaffie strConfigurableElementPath + 2989368eea42a1afb01dd44110582f997115b50e742François Gaffie " from ConfigurableDomain description " + getName()); 29968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 30168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 30268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Add found element to domain 3039368eea42a1afb01dd44110582f997115b50e742François Gaffie core::Results infos; 3049368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!addConfigurableElement(pConfigurableElement, NULL, infos)) { 30568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3069368eea42a1afb01dd44110582f997115b50e742François Gaffie strError = utility::asString(infos); 30768a912857707864bbaaff9808717813105072a6ePatrick Benavoli serializingContext.setError(strError); 30868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 30968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 31068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 31168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 31268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 31368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 31468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 31568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 31663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Parse settings 3179368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::parseSettings(const CXmlElement &xmlElement, 3189368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlDomainImportContext &serializingContext) 31968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 32063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Check we actually need to parse configuration settings 32129fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner if (!serializingContext.withSettings()) { 32268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 32363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // No parsing required 32463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 32563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 32668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 32763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Get Settings element 32863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlSettingsElement; 32963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!xmlElement.getChildElement("Settings", xmlSettingsElement)) { 33068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 33163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // No settings, bail out successfully 33263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 33368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 33468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 33563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Parse configuration settings 33663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement::CChildIterator it(xmlSettingsElement); 33768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 33863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli CXmlElement xmlConfigurationSettingsElement; 3396ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 34063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli while (it.next(xmlConfigurationSettingsElement)) { 34163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Get domain configuration 3429368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = static_cast<CDomainConfiguration *>( 3439368eea42a1afb01dd44110582f997115b50e742François Gaffie findChild(xmlConfigurationSettingsElement.getNameAttribute())); 3446ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 34563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 3466ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 34729fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner serializingContext.setError("Could not find domain configuration referred to by" 3489368eea42a1afb01dd44110582f997115b50e742François Gaffie " configurable domain \"" + 3499368eea42a1afb01dd44110582f997115b50e742François Gaffie getName() + "\"."); 3506ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 3516ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return false; 3526ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 35363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Have domain configuration parse settings for all configurable elements 35429fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner if (!pDomainConfiguration->parseSettings(xmlConfigurationSettingsElement, 35529fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner serializingContext)) { 3566ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 3576ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return false; 3586ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 3596ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli } 3606ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli 36168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 36268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 36368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association 3649368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::addConfigurableElement(CConfigurableElement *pConfigurableElement, 3659368eea42a1afb01dd44110582f997115b50e742François Gaffie const CParameterBlackboard *pMainBlackboard, 3669368eea42a1afb01dd44110582f997115b50e742François Gaffie core::Results &infos) 36768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 36868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already associated? 36968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (containsConfigurableElement(pConfigurableElement)) { 37068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3719368eea42a1afb01dd44110582f997115b50e742François Gaffie infos.push_back("Configurable element " + pConfigurableElement->getPath() + 3729368eea42a1afb01dd44110582f997115b50e742François Gaffie " already associated to configuration domain " + getName()); 37368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 37568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 37668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 37768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already owned? 37868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurableElement->belongsTo(this)) { 37968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3809368eea42a1afb01dd44110582f997115b50e742François Gaffie infos.push_back("Configurable element " + pConfigurableElement->getPath() + 3819368eea42a1afb01dd44110582f997115b50e742François Gaffie " already owned by configuration domain " + getName()); 38268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 38368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 38468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 38568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 38668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do add 3879368eea42a1afb01dd44110582f997115b50e742François Gaffie doAddConfigurableElement(pConfigurableElement, infos, pMainBlackboard); 38868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 38968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 39068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 39168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3929368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::removeConfigurableElement(CConfigurableElement *pConfigurableElement, 3939368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) 39468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 39568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Not associated? 39668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!containsConfigurableElement(pConfigurableElement)) { 39768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3989368eea42a1afb01dd44110582f997115b50e742François Gaffie strError = "Configurable element " + pConfigurableElement->getPath() + 3999368eea42a1afb01dd44110582f997115b50e742François Gaffie " not associated to configuration domain " + getName(); 40068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 40168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 40268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 40368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 40468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do remove 40568a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pConfigurableElement, true); 40668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 40768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 40868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 40968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 410e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard/** 411e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* Blackboard Configuration and Base Offset retrieval. 412e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 413e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* This method fetches the Blackboard associated to the ConfigurableElement 414e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* given in parameter, for a specific Configuration. The ConfigurableElement 415e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* must belong to the Domain. If a Blackboard is found, the base offset of 416e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the ConfigurableElement is returned as well. This base offset corresponds to 417e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the offset of the ancestor of the ConfigurableElement associated to the Configuration. 418e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 419e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[in] strConfiguration Name of the Configuration. 420e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[in] pCandidateDescendantConfigurableElement Pointer to a CConfigurableElement that 421e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* belongs to the Domain. 4229368eea42a1afb01dd44110582f997115b50e742François Gaffie* @param[out] baseOffset The base offset of the CConfigurableElement. 423e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] bIsLastApplied Boolean indicating that the Configuration is 424e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* the last one applied of the Domain. 425e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* @param[out] strError Error message 426e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* 427e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard* return Pointer to the Blackboard of the Configuration. 428e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard*/ 4299368eea42a1afb01dd44110582f997115b50e742François GaffieCParameterBlackboard *CConfigurableDomain::findConfigurationBlackboard( 4309368eea42a1afb01dd44110582f997115b50e742François Gaffie const string &strConfiguration, 4319368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pCandidateDescendantConfigurableElement, size_t &baseOffset, 4329368eea42a1afb01dd44110582f997115b50e742François Gaffie bool &bIsLastApplied, string &strError) const 433e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard{ 434e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Find Configuration 4359368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 4369368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CDomainConfiguration *>(findChild(strConfiguration)); 437e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 438e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard if (!pDomainConfiguration) { 439e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 440e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard strError = "Domain configuration " + strConfiguration + " not found"; 441e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 442e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return NULL; 443e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 444e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 445e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Parse all configurable elements 446e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard ConfigurableElementListIterator it; 447e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 448e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 449e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 4509368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pAssociatedConfigurableElement = *it; 451e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 452e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard // Check if the the associated element is the configurable element or one of its ancestors 453e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard if ((pCandidateDescendantConfigurableElement == pAssociatedConfigurableElement) || 4549368eea42a1afb01dd44110582f997115b50e742François Gaffie (pCandidateDescendantConfigurableElement->isDescendantOf( 4559368eea42a1afb01dd44110582f997115b50e742François Gaffie pAssociatedConfigurableElement))) { 456e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 4579368eea42a1afb01dd44110582f997115b50e742François Gaffie baseOffset = pAssociatedConfigurableElement->getOffset(); 458e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard bIsLastApplied = (pDomainConfiguration == _pLastAppliedConfiguration); 459e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 460e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return pDomainConfiguration->getBlackboard(pAssociatedConfigurableElement); 461e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 462e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard } 463e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 464e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard strError = "Element not associated to the Domain"; 465e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 466e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard return NULL; 467e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard} 468e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard 46968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Domain splitting 4709368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::split(CConfigurableElement *pConfigurableElement, core::Results &infos) 47168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 47268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Not associated? 47368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!containsConfigurableElement(pConfigurableElement)) { 47468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4759368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string strError = "Configurable element " + pConfigurableElement->getPath() + 4769368eea42a1afb01dd44110582f997115b50e742François Gaffie " not associated to configuration domain " + getName(); 4779368eea42a1afb01dd44110582f997115b50e742François Gaffie infos.push_back(strError); 47868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 47968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 48068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 48168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 48268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Create sub domain areas for all configurable element's children 483911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurableElementChildren = pConfigurableElement->getNbChildren(); 48468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 48568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!uiNbConfigurableElementChildren) { 48668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4879368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string strError = "Configurable element " + pConfigurableElement->getPath() + 4889368eea42a1afb01dd44110582f997115b50e742François Gaffie " has no children to split configurable domain to"; 4899368eea42a1afb01dd44110582f997115b50e742François Gaffie infos.push_back(strError); 49068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 49168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 49268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 49368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4949368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) { 49568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4969368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *pChildConfigurableElement = 4979368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CConfigurableElement *>(pConfigurableElement->getChild(uiChild)); 49868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4999368eea42a1afb01dd44110582f997115b50e742François Gaffie doAddConfigurableElement(pChildConfigurableElement, infos); 50068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 50168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 50268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate to configurations 503911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 50468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5059368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 50668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5079368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 5089368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 50968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 51068a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->split(pConfigurableElement); 51168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 51268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 51368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove given configurable element from this domain 5149368eea42a1afb01dd44110582f997115b50e742François Gaffie // Note: we shouldn't need to recompute the sync set in that case, as the splitted element 5159368eea42a1afb01dd44110582f997115b50e742François Gaffie // should include the syncers of its children elements 51668a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pConfigurableElement, false); 51768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 51868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 51968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 52068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5219368eea42a1afb01dd44110582f997115b50e742François Gaffie// Check if there is a pending configuration for this domain: i.e. an applicable configuration 5229368eea42a1afb01dd44110582f997115b50e742François Gaffie// different from the last applied configuration 5239368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CDomainConfiguration *CConfigurableDomain::getPendingConfiguration() const 5248b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{ 5259368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pApplicableDomainConfiguration = 5269368eea42a1afb01dd44110582f997115b50e742François Gaffie findApplicableDomainConfiguration(); 5278b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5288b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard if (pApplicableDomainConfiguration) { 5298b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5308b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard // Check not the last one before applying 5319368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!_pLastAppliedConfiguration || 5329368eea42a1afb01dd44110582f997115b50e742François Gaffie (_pLastAppliedConfiguration != pApplicableDomainConfiguration)) { 5338b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5348b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return pApplicableDomainConfiguration; 5358b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 5368b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 5378b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 5388b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard return NULL; 5398b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard} 5408b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 54168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration application if required 5429368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet *pSyncerSet, 5439368eea42a1afb01dd44110582f997115b50e742François Gaffie bool bForce, std::string &strInfo) const 54468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 545f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Apply configuration only if the blackboard will 546f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // be synchronized either now or by syncerSet. 5479368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!pSyncerSet ^ _bSequenceAware) { 548f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // The configuration can not be syncronised 549f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin return; 550f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin } 551f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin 55268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (bForce) { 55368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Force a configuration restore by forgetting about last applied configuration 55468a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = NULL; 55568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 5569368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pApplicableDomainConfiguration = 5579368eea42a1afb01dd44110582f997115b50e742François Gaffie findApplicableDomainConfiguration(); 55868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 55968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pApplicableDomainConfiguration) { 56068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 56168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Check not the last one before applying 5629368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!_pLastAppliedConfiguration || 5639368eea42a1afb01dd44110582f997115b50e742François Gaffie _pLastAppliedConfiguration != pApplicableDomainConfiguration) { 56468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5659368eea42a1afb01dd44110582f997115b50e742François Gaffie strInfo = "Applying configuration '" + pApplicableDomainConfiguration->getName() + 5669368eea42a1afb01dd44110582f997115b50e742François Gaffie "' from domain '" + getName() + "'"; 567f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin 568f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Check if we need to synchronize during restore 569f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin bool bSync = !pSyncerSet && _bSequenceAware; 57068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do the restore 572f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin pApplicableDomainConfiguration->restore(pParameterBlackboard, bSync, NULL); 57368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 57468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Record last applied configuration 57568a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = pApplicableDomainConfiguration; 57668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 577f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin // Check we need to provide syncer set to caller 578f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin if (pSyncerSet && !_bSequenceAware) { 57963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 58063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Since we applied changes, add our own sync set to the given one 581f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin *pSyncerSet += _syncerSet; 58263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 58368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 58468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 58568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 58668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 58768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Return applicable configuration validity for given configurable element 5889368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::isApplicableConfigurationValid( 5899368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement) const 59068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 5919368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pApplicableDomainConfiguration = 5929368eea42a1afb01dd44110582f997115b50e742François Gaffie findApplicableDomainConfiguration(); 59368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5949368eea42a1afb01dd44110582f997115b50e742François Gaffie return pApplicableDomainConfiguration && 5959368eea42a1afb01dd44110582f997115b50e742François Gaffie pApplicableDomainConfiguration->isValid(pConfigurableElement); 59668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 59768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// In case configurable element was removed 59968a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::computeSyncSet() 60068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 60168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Clean sync set first 60263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet.clear(); 60368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 60463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add syncer sets for all associated configurable elements 60563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli ConfigurableElementToSyncerSetMapIterator mapIt; 60668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6079368eea42a1afb01dd44110582f997115b50e742François Gaffie for (mapIt = _configurableElementToSyncerSetMap.begin(); 6089368eea42a1afb01dd44110582f997115b50e742François Gaffie mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) { 60968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6109368eea42a1afb01dd44110582f997115b50e742François Gaffie const CSyncerSet *pSyncerSet = mapIt->second; 61168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet += *pSyncerSet; 61368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 61468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 61568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 61668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration Management 6179368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::createConfiguration(const string &strName, 6189368eea42a1afb01dd44110582f997115b50e742François Gaffie const CParameterBlackboard *pMainBlackboard, 6199368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) 62068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 62168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Already exists? 62268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (findChild(strName)) { 62368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62468a912857707864bbaaff9808717813105072a6ePatrick Benavoli strError = "Already existing configuration"; 62568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 62768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 62868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 62968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Creation 6309368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = new CDomainConfiguration(strName); 63168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Configurable elements association 63368a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 63468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 63568a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 63668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6379368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement = *it; 6389368eea42a1afb01dd44110582f997115b50e742François Gaffie ; 63963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 64063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Retrieve associated syncer set 6419368eea42a1afb01dd44110582f997115b50e742François Gaffie CSyncerSet *pSyncerSet = getSyncerSet(pConfigurableElement); 64263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 64363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Associate to configuration 64463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet); 64568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 64668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 64768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 64868a912857707864bbaaff9808717813105072a6ePatrick Benavoli addChild(pDomainConfiguration); 64968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Ensure validity of fresh new domain configuration 65168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Attempt auto validation, so that the user gets his/her own settings by defaults 65268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!autoValidateConfiguration(pDomainConfiguration)) { 65368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6549368eea42a1afb01dd44110582f997115b50e742François Gaffie // No valid configuration found to copy in from, validate againt main blackboard (will 6559368eea42a1afb01dd44110582f997115b50e742François Gaffie // concerned remaining invalid parts) 65668a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pMainBlackboard); 65768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 65868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 65968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 66068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 66168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6629368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::deleteConfiguration(const string &strName, string &strError) 66368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6649368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = findConfiguration(strName, strError); 66568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 66768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 66868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 66968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 67068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 67168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Was the last applied? 67268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration == _pLastAppliedConfiguration) { 67368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 67468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Forget about it 67568a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pLastAppliedConfiguration = NULL; 67668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 67768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 67868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Hierarchy 67968a912857707864bbaaff9808717813105072a6ePatrick Benavoli removeChild(pDomainConfiguration); 68068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 68168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Destroy 68268a912857707864bbaaff9808717813105072a6ePatrick Benavoli delete pDomainConfiguration; 68368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 68468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 68568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 68668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6879368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::listAssociatedToElements(string &strResult) const 68868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 68968a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 69068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 69168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements 69268a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 69368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6949368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement = *it; 69568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 69668a912857707864bbaaff9808717813105072a6ePatrick Benavoli strResult += pConfigurableElement->getPath() + "\n"; 69768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 69868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 69968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7009368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::renameConfiguration(const string &strName, const string &strNewName, 7019368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) 70268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7039368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = findConfiguration(strName, strError); 70468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 70568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 70668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 70768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 70868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 70968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 71068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Rename 71168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration->rename(strNewName, strError); 71268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 71368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7149368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::restoreConfiguration(const string &configurationName, 7159368eea42a1afb01dd44110582f997115b50e742François Gaffie CParameterBlackboard *mainBlackboard, bool autoSync, 7169368eea42a1afb01dd44110582f997115b50e742François Gaffie core::Results &errors) const 71768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7189368eea42a1afb01dd44110582f997115b50e742François Gaffie string error; 719ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard 7209368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *configuration = findConfiguration(configurationName, error); 72168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7229368eea42a1afb01dd44110582f997115b50e742François Gaffie if (configuration == NULL) { 72368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7249368eea42a1afb01dd44110582f997115b50e742François Gaffie errors.push_back(error); 72568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 72668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 72768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 72868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate 7299368eea42a1afb01dd44110582f997115b50e742François Gaffie bool bSuccess = configuration->restore(mainBlackboard, autoSync && _bSequenceAware, &errors); 73068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 73168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Record last applied configuration 7329368eea42a1afb01dd44110582f997115b50e742François Gaffie _pLastAppliedConfiguration = configuration; 73368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 73468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Synchronize 7359368eea42a1afb01dd44110582f997115b50e742François Gaffie if (autoSync && !_bSequenceAware) { 736ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard 7379368eea42a1afb01dd44110582f997115b50e742François Gaffie bSuccess &= _syncerSet.sync(*mainBlackboard, false, &errors); 738ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard } 739ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard return bSuccess; 74068a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 74168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7429368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::saveConfiguration(const string &strName, 7439368eea42a1afb01dd44110582f997115b50e742François Gaffie const CParameterBlackboard *pMainBlackboard, 7449368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) 74568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 74668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find Domain configuration 7479368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = findConfiguration(strName, strError); 74868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 74968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pDomainConfiguration) { 75068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 75168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 75268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 75368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 75468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Delegate 75568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->save(pMainBlackboard); 75668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 75768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 75868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 75968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7609368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::setElementSequence(const string &strConfiguration, 7619368eea42a1afb01dd44110582f997115b50e742François Gaffie const std::vector<string> &astrNewElementSequence, 7629368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) 76363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 76463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Find Domain configuration 7659368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = findConfiguration(strConfiguration, strError); 76663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 76763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 76863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 76963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 77063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 77163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 77263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Delegate to configuration 77363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return pDomainConfiguration->setElementSequence(astrNewElementSequence, strError); 77463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 77563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 7769368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::getElementSequence(const string &strConfiguration, 7779368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strResult) const 77863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 77963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Find Domain configuration 7809368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 7819368eea42a1afb01dd44110582f997115b50e742François Gaffie findConfiguration(strConfiguration, strResult); 78263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 78363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli if (!pDomainConfiguration) { 78463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 78563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return false; 78663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli } 78763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 78863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Delegate to configuration 78963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->getElementSequence(strResult); 79063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 79163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return true; 79263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 79363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 7949368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::setApplicationRule( 7959368eea42a1afb01dd44110582f997115b50e742François Gaffie const string &strConfiguration, const string &strApplicationRule, 7969368eea42a1afb01dd44110582f997115b50e742François Gaffie const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition, string &strError) 7970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 7980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 7999368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = findConfiguration(strConfiguration, strError); 8000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 8020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 8040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 8050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 8079368eea42a1afb01dd44110582f997115b50e742François Gaffie return pDomainConfiguration->setApplicationRule(strApplicationRule, 8089368eea42a1afb01dd44110582f997115b50e742François Gaffie pSelectionCriteriaDefinition, strError); 8090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 8100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8119368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::clearApplicationRule(const string &strConfiguration, string &strError) 8120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 8130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 8149368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = findConfiguration(strConfiguration, strError); 8150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 8170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 8190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 8200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 8220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli pDomainConfiguration->clearApplicationRule(); 8230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 8250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 8260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8279368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::getApplicationRule(const string &strConfiguration, 8289368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strResult) const 8290bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 8300bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Find Domain configuration 8319368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 8329368eea42a1afb01dd44110582f997115b50e742François Gaffie findConfiguration(strConfiguration, strResult); 8330bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8340bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 8350bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return false; 8370bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 8380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8390bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli // Delegate to configuration 8409368eea42a1afb01dd44110582f997115b50e742François Gaffie strResult = pDomainConfiguration->getApplicationRule(); 8410bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 8420bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return true; 8430bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 8440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 84568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Last applied configuration 84668a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getLastAppliedConfigurationName() const 84768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 84868a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (_pLastAppliedConfiguration) { 84968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 85068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return _pLastAppliedConfiguration->getName(); 85168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 85268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return "<none>"; 85368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 85468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8558b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Pending configuration 8568b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardstring CConfigurableDomain::getPendingConfigurationName() const 8578b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{ 8589368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pApplicableDomainConfiguration = 8599368eea42a1afb01dd44110582f997115b50e742François Gaffie findApplicableDomainConfiguration(); 8608b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 8619368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!pApplicableDomainConfiguration) { 8628b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 8639368eea42a1afb01dd44110582f997115b50e742François Gaffie // No configuration is pending 8649368eea42a1afb01dd44110582f997115b50e742François Gaffie return "<none>"; 8659368eea42a1afb01dd44110582f997115b50e742François Gaffie } 8669368eea42a1afb01dd44110582f997115b50e742François Gaffie 8679368eea42a1afb01dd44110582f997115b50e742François Gaffie // Check it will be applied 8689368eea42a1afb01dd44110582f997115b50e742François Gaffie if (pApplicableDomainConfiguration != _pLastAppliedConfiguration) { 8699368eea42a1afb01dd44110582f997115b50e742François Gaffie 8709368eea42a1afb01dd44110582f997115b50e742François Gaffie // Found config will get applied 8719368eea42a1afb01dd44110582f997115b50e742François Gaffie return pApplicableDomainConfiguration->getName(); 8729368eea42a1afb01dd44110582f997115b50e742François Gaffie } else { 8739368eea42a1afb01dd44110582f997115b50e742François Gaffie 8749368eea42a1afb01dd44110582f997115b50e742François Gaffie // Same configuration as current 8759368eea42a1afb01dd44110582f997115b50e742François Gaffie return ""; 8768b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard } 8778b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard} 8788b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard 87968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on whole domain from main blackboard 8809368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::validate(const CParameterBlackboard *pMainBlackboard) 88168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 88268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 88368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate 884911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 88568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8869368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 88768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8889368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 8899368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 89068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 89168a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pMainBlackboard); 89268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 89368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 89468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 89568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on areas related to configurable element 8969368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::validateAreas(const CConfigurableElement *pConfigurableElement, 8979368eea42a1afb01dd44110582f997115b50e742François Gaffie const CParameterBlackboard *pMainBlackboard) 89868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 89968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate 900911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 90168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9029368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 90368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9049368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 9059368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 90668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 90768a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validate(pConfigurableElement, pMainBlackboard); 90868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 90968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 91068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9119368eea42a1afb01dd44110582f997115b50e742François Gaffie// Attempt validation for all configurable element's areas, relying on already existing valid 9129368eea42a1afb01dd44110582f997115b50e742François Gaffie// configuration inside domain 91368a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAll() 91468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 91568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate 91668a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 91768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 91868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements for configuration validation 91968a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 92068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9219368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement = *it; 92268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 92368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Auto validate element 92468a912857707864bbaaff9808717813105072a6ePatrick Benavoli autoValidateAreas(pConfigurableElement); 92568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 92668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 92768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9289368eea42a1afb01dd44110582f997115b50e742François Gaffie// Attempt validation for configurable element's areas, relying on already existing valid 9299368eea42a1afb01dd44110582f997115b50e742François Gaffie// configuration inside domain 9309368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::autoValidateAreas(const CConfigurableElement *pConfigurableElement) 93168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 93268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find first valid configuration for given configurable element 9339368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pValidDomainConfiguration = 9349368eea42a1afb01dd44110582f997115b50e742François Gaffie findValidDomainConfiguration(pConfigurableElement); 93568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // No valid configuration found, give up 93768a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!pValidDomainConfiguration) { 93868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 93968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return; 94068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 94168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 94268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate all other configurations against found one, if any 943911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 94468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9459368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 94668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9479368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 9489368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 94968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9509368eea42a1afb01dd44110582f997115b50e742François Gaffie if (pDomainConfiguration != pValidDomainConfiguration && 9519368eea42a1afb01dd44110582f997115b50e742François Gaffie !pDomainConfiguration->isValid(pConfigurableElement)) { 95268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate 95368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement); 95468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 95568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 95668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 95768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9589368eea42a1afb01dd44110582f997115b50e742François Gaffie// Attempt configuration validation for all configurable elements' areas, relying on already 9599368eea42a1afb01dd44110582f997115b50e742François Gaffie// existing valid configuration inside domain 9609368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration *pDomainConfiguration) 96168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 96268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Find another configuration than this one, that ought to be valid! 963911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 96468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9659368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 96668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9679368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pPotententialValidDomainConfiguration = 9689368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CDomainConfiguration *>(getChild(uiChild)); 96968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pPotententialValidDomainConfiguration != pDomainConfiguration) { 97168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Validate against it 97368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->validateAgainst(pPotententialValidDomainConfiguration); 97468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 97568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 97668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 97768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 97868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 97968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 98068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 98168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for a valid configuration for given configurable element 9829368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CDomainConfiguration *CConfigurableDomain::findValidDomainConfiguration( 9839368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement) const 98468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 985911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 98668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9879368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 98868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9899368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 9909368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CDomainConfiguration *>(getChild(uiChild)); 99168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration->isValid(pConfigurableElement)) { 99368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 99468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration; 99568a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 99668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 99768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return NULL; 99868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 99968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 100068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for an applicable configuration 10019368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CDomainConfiguration *CConfigurableDomain::findApplicableDomainConfiguration() const 100268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1003911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 100468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10059368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 100668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10079368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 10089368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CDomainConfiguration *>(getChild(uiChild)); 100968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pDomainConfiguration->isApplicable()) { 101168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pDomainConfiguration; 101368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 101468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 101568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return NULL; 101668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 101768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 101868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Gather set of configurable elements 10199368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::gatherConfigurableElements( 10209368eea42a1afb01dd44110582f997115b50e742François Gaffie std::set<const CConfigurableElement *> &configurableElementSet) const 102168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 102268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Insert all configurable elements 102368a912857707864bbaaff9808717813105072a6ePatrick Benavoli configurableElementSet.insert(_configurableElementList.begin(), _configurableElementList.end()); 102468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 102568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 102668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Check configurable element already attached 10279368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomain::containsConfigurableElement( 10289368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableCandidateElement) const 102968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 103068a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 103168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 103268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements for comparison 103368a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 103468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 103568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (pConfigurableCandidateElement == *it) { 103668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 103768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 103868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 103968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 104068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 104168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 104268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 104368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Merge any descended configurable element to this one with this one 10449368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::mergeAlreadyAssociatedDescendantConfigurableElements( 10459368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *newElement, core::Results &infos) 104668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 10479368eea42a1afb01dd44110582f997115b50e742François Gaffie std::list<CConfigurableElement *> mergedConfigurableElementList; 104868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 104968a912857707864bbaaff9808717813105072a6ePatrick Benavoli ConfigurableElementListIterator it; 105068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 105168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Browse all configurable elements (new one not yet in the list!) 105268a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) { 105368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10549368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *pConfigurablePotentialDescendantElement = *it; 105568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10569368eea42a1afb01dd44110582f997115b50e742François Gaffie if (pConfigurablePotentialDescendantElement->isDescendantOf(newElement)) { 105768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10589368eea42a1afb01dd44110582f997115b50e742François Gaffie infos.push_back("In domain '" + getName() + 10599368eea42a1afb01dd44110582f997115b50e742François Gaffie "', merging descendant configurable element's configurations '" + 10609368eea42a1afb01dd44110582f997115b50e742François Gaffie pConfigurablePotentialDescendantElement->getName() + 10619368eea42a1afb01dd44110582f997115b50e742François Gaffie "' into its ascendant '" + newElement->getName() + "' ones"); 106268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 106368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Merge configuration data 10649368eea42a1afb01dd44110582f997115b50e742François Gaffie mergeConfigurations(newElement, pConfigurablePotentialDescendantElement); 106568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 106668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Keep track for removal 106768a912857707864bbaaff9808717813105072a6ePatrick Benavoli mergedConfigurableElementList.push_back(pConfigurablePotentialDescendantElement); 106868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 106968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 107068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 107168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove all merged elements (new one not yet in the list!) 10729368eea42a1afb01dd44110582f997115b50e742François Gaffie for (it = mergedConfigurableElementList.begin(); it != mergedConfigurableElementList.end(); 10739368eea42a1afb01dd44110582f997115b50e742François Gaffie ++it) { 107468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10759368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *pMergedConfigurableElement = *it; 107668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 107768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove merged from configurable element from internal tracking list 10789368eea42a1afb01dd44110582f997115b50e742François Gaffie // Note: we shouldn't need to recompute the sync set in that case, as the merged to element 10799368eea42a1afb01dd44110582f997115b50e742François Gaffie // should include the syncers of merged from elements 108068a912857707864bbaaff9808717813105072a6ePatrick Benavoli doRemoveConfigurableElement(pMergedConfigurableElement, false); 108168a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 108268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 108368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10849368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::mergeConfigurations(CConfigurableElement *pToConfigurableElement, 10859368eea42a1afb01dd44110582f997115b50e742François Gaffie CConfigurableElement *pFromConfigurableElement) 108668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 108768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Propagate to domain configurations 1088911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 108968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10909368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 109168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10929368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 10939368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 109468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 109568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Do the merge. 109668a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->merge(pToConfigurableElement, pFromConfigurableElement); 109768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 109868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 109968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 110068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association 11019368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::doAddConfigurableElement(CConfigurableElement *pConfigurableElement, 11029368eea42a1afb01dd44110582f997115b50e742François Gaffie core::Results &infos, 11039368eea42a1afb01dd44110582f997115b50e742François Gaffie const CParameterBlackboard *pMainBlackboard) 110468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 110568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurable element 110668a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->addAttachedConfigurableDomain(this); 110768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 110863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Create associated syncer set 11099368eea42a1afb01dd44110582f997115b50e742François Gaffie CSyncerSet *pSyncerSet = new CSyncerSet; 111063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 111163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add to sync set the configurable element one 111263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pConfigurableElement->fillSyncerSet(*pSyncerSet); 111363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 111463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Store it 111563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _configurableElementToSyncerSetMap[pConfigurableElement] = pSyncerSet; 111663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 111763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Add it to global one 111863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _syncerSet += *pSyncerSet; 111963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 112068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurations 1121911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 112268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11239368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 112468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11259368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 11269368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 112768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 112863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet); 112968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 113068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11319620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Ensure area validity for that configurable element (if main blackboard provided) 11329620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard if (pMainBlackboard) { 11339620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 11349368eea42a1afb01dd44110582f997115b50e742François Gaffie infos.push_back("Validating domain '" + getName() + 11359368eea42a1afb01dd44110582f997115b50e742François Gaffie "' against main blackboard for configurable element '" + 11369368eea42a1afb01dd44110582f997115b50e742François Gaffie pConfigurableElement->getPath() + "'"); 11379620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Need to validate against main blackboard 11389620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard validateAreas(pConfigurableElement, pMainBlackboard); 11399620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard } 11409620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard 11419620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard // Already associated descendend configurable elements need a merge of their configuration data 11429368eea42a1afb01dd44110582f997115b50e742François Gaffie mergeAlreadyAssociatedDescendantConfigurableElements(pConfigurableElement, infos); 114368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 114468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Add to list 114568a912857707864bbaaff9808717813105072a6ePatrick Benavoli _configurableElementList.push_back(pConfigurableElement); 114668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 114768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11489368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomain::doRemoveConfigurableElement(CConfigurableElement *pConfigurableElement, 11499368eea42a1afb01dd44110582f997115b50e742François Gaffie bool bRecomputeSyncSet) 115068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 115168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Remove from list 115268a912857707864bbaaff9808717813105072a6ePatrick Benavoli _configurableElementList.remove(pConfigurableElement); 115368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 115463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli // Remove associated syncer set 11559368eea42a1afb01dd44110582f997115b50e742François Gaffie CSyncerSet *pSyncerSet = getSyncerSet(pConfigurableElement); 115663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 115763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli _configurableElementToSyncerSetMap.erase(pConfigurableElement); 115863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 115963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli delete pSyncerSet; 116063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 116168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurable element 116268a912857707864bbaaff9808717813105072a6ePatrick Benavoli pConfigurableElement->removeAttachedConfigurableDomain(this); 116368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 116468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Inform configurations 1165911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbConfigurations = getNbChildren(); 116668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11679368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) { 116868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11699368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 11709368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(getChild(uiChild)); 117168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 117268a912857707864bbaaff9808717813105072a6ePatrick Benavoli pDomainConfiguration->removeConfigurableElement(pConfigurableElement); 117368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 117468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Recompute our sync set if needed 117568a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (bRecomputeSyncSet) { 117668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 117768a912857707864bbaaff9808717813105072a6ePatrick Benavoli computeSyncSet(); 117868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 117968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 118063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 118163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Syncer set retrieval from configurable element 11829368eea42a1afb01dd44110582f997115b50e742François GaffieCSyncerSet *CConfigurableDomain::getSyncerSet( 11839368eea42a1afb01dd44110582f997115b50e742François Gaffie const CConfigurableElement *pConfigurableElement) const 118463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{ 11859368eea42a1afb01dd44110582f997115b50e742François Gaffie ConfigurableElementToSyncerSetMapIterator mapIt = 11869368eea42a1afb01dd44110582f997115b50e742François Gaffie _configurableElementToSyncerSetMap.find(pConfigurableElement); 118763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 11889368eea42a1afb01dd44110582f997115b50e742François Gaffie ALWAYS_ASSERT(mapIt != _configurableElementToSyncerSetMap.end(), 11899368eea42a1afb01dd44110582f997115b50e742François Gaffie "Could not find syncer set for " << getName() << " configurable domain"); 119063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli 119163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli return mapIt->second; 119263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli} 11930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 11940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Configuration retrieval 11959368eea42a1afb01dd44110582f997115b50e742François GaffieCDomainConfiguration *CConfigurableDomain::findConfiguration(const string &strConfiguration, 11969368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) 11970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 11989368eea42a1afb01dd44110582f997115b50e742François Gaffie CDomainConfiguration *pDomainConfiguration = 11999368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<CDomainConfiguration *>(findChild(strConfiguration)); 12000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 12020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Domain configuration " + strConfiguration + " not found"; 12040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return NULL; 12060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 12070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration; 12080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 12090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12109368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CDomainConfiguration *CConfigurableDomain::findConfiguration(const string &strConfiguration, 12119368eea42a1afb01dd44110582f997115b50e742François Gaffie string &strError) const 12120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{ 12139368eea42a1afb01dd44110582f997115b50e742François Gaffie const CDomainConfiguration *pDomainConfiguration = 12149368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CDomainConfiguration *>(findChild(strConfiguration)); 12150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli if (!pDomainConfiguration) { 12170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli strError = "Domain configuration " + strConfiguration + " not found"; 12190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli 12200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return NULL; 12210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli } 12220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli return pDomainConfiguration; 12230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli} 1224