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