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