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