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 */
30ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard#include <cassert>
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableDomains.h"
3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableDomain.h"
3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableElement.h"
3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
359368eea42a1afb01dd44110582f997115b50e742François Gaffie#define base CElement
3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
37d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string;
38d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve
3968a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomains::getKind() const
4068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return "ConfigurableDomains";
4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4468a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomains::childrenAreDynamic() const
4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on whole domains from main blackboard
509368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::validate(const CParameterBlackboard *pMainBlackboard)
5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate to domains
53911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t uiNbConfigurableDomains = getNbChildren();
5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
559368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
579368eea42a1afb01dd44110582f997115b50e742François Gaffie        CConfigurableDomain *pChildConfigurableDomain =
589368eea42a1afb01dd44110582f997115b50e742François Gaffie            static_cast<CConfigurableDomain *>(getChild(child));
5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pChildConfigurableDomain->validate(pMainBlackboard);
6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration application if required
659368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet &syncerSet,
669368eea42a1afb01dd44110582f997115b50e742François Gaffie                                 bool bForce, core::Results &infos) const
6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
68f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    /// Delegate to domains
6963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
70f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    // Start with domains that can be synchronized all at once (with passed syncer set)
71911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t uiNbConfigurableDomains = getNbChildren();
7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
739368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
759368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableDomain *pChildConfigurableDomain =
769368eea42a1afb01dd44110582f997115b50e742François Gaffie            static_cast<const CConfigurableDomain *>(getChild(child));
7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
789368eea42a1afb01dd44110582f997115b50e742François Gaffie        std::string info;
79f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin        // Apply and collect syncers when relevant
809368eea42a1afb01dd44110582f997115b50e742François Gaffie        pChildConfigurableDomain->apply(pParameterBlackboard, &syncerSet, bForce, info);
819368eea42a1afb01dd44110582f997115b50e742François Gaffie
829368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (!info.empty()) {
839368eea42a1afb01dd44110582f997115b50e742François Gaffie            infos.push_back(info);
849368eea42a1afb01dd44110582f997115b50e742François Gaffie        }
8568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
86f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    // Synchronize those collected syncers
87ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    syncerSet.sync(*pParameterBlackboard, false, NULL);
8863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
89f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    // Then deal with domains that need to synchronize along apply
909368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
9163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
929368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableDomain *pChildConfigurableDomain =
939368eea42a1afb01dd44110582f997115b50e742François Gaffie            static_cast<const CConfigurableDomain *>(getChild(child));
9463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
959368eea42a1afb01dd44110582f997115b50e742François Gaffie        std::string info;
96f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin        // Apply and synchronize when relevant
979368eea42a1afb01dd44110582f997115b50e742François Gaffie        pChildConfigurableDomain->apply(pParameterBlackboard, NULL, bForce, info);
989368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (!info.empty()) {
999368eea42a1afb01dd44110582f997115b50e742François Gaffie            infos.push_back(info);
1009368eea42a1afb01dd44110582f997115b50e742François Gaffie        }
10163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
10268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
10368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSource
1059368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::toXml(CXmlElement &xmlElement,
1069368eea42a1afb01dd44110582f997115b50e742François Gaffie                                 CXmlSerializingContext &serializingContext) const
10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Set attribute
1099368eea42a1afb01dd44110582f997115b50e742François Gaffie    xmlElement.setAttribute("SystemClassName", getName());
11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1118cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner    base::childrenToXml(xmlElement, serializingContext);
11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration/Domains handling
11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli/// Domains
1169368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::createDomain(const string &strName, string &strError)
11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Already exists?
11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (findChild(strName)) {
12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Already existing configurable domain";
12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Creation/Hierarchy
12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    addChild(new CConfigurableDomain(strName));
12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1329368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::addDomain(CConfigurableDomain &domain, bool bOverwrite, string &strError)
13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
134fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    string strErrorDrop;
13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
136fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    string strDomainName(domain.getName());
1379368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pExistingDomain = findConfigurableDomain(strDomainName, strErrorDrop);
13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
139fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    if (pExistingDomain) {
140fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner        if (!bOverwrite) {
141fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner            strError = "Can't add domain \"" + strDomainName +
1429368eea42a1afb01dd44110582f997115b50e742François Gaffie                       "\" because it already exists and overwrite was not requested.";
143fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner            return false;
144fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner        }
14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
146fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner        deleteDomain(*pExistingDomain);
147fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    }
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
149fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    addChild(&domain);
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1549368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::deleteDomain(CConfigurableDomain &configurableDomain)
155fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner{
156fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    removeChild(&configurableDomain);
157fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner
158fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    delete &configurableDomain;
159fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner}
160fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner
1619368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::deleteDomain(const string &strName, string &strError)
162fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner{
1639368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strName, strError);
164fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner
165fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    if (pConfigurableDomain) {
166fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner        deleteDomain(*pConfigurableDomain);
167fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner        return true;
168fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    }
169fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner
170fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner    return false;
171fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner}
172fd21197b84f46ba53ace3a1b9d0c05596815dd51David Wagner
173170f0a44b8309a954cd4802e85ac3dd6944a35faKevin Rocardvoid CConfigurableDomains::deleteAllDomains()
174170f0a44b8309a954cd4802e85ac3dd6944a35faKevin Rocard{
1759368eea42a1afb01dd44110582f997115b50e742François Gaffie    // remove Children
176170f0a44b8309a954cd4802e85ac3dd6944a35faKevin Rocard    clean();
177170f0a44b8309a954cd4802e85ac3dd6944a35faKevin Rocard}
178170f0a44b8309a954cd4802e85ac3dd6944a35faKevin Rocard
1799368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::renameDomain(const string &strName, const string &strNewName,
1809368eea42a1afb01dd44110582f997115b50e742François Gaffie                                        string &strError)
18168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
1829368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strName, strError);
18368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
18568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
18768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
18868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Rename
19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pConfigurableDomain->rename(strNewName, strError);
19168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
19268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1939368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::setSequenceAwareness(const string &strDomain, bool bSequenceAware,
1949368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                string &strError)
19563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
1969368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
19763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
19863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!pConfigurableDomain) {
19963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
20063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
20163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
20263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
20363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    pConfigurableDomain->setSequenceAwareness(bSequenceAware);
20463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
20563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return true;
20663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
20763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
2089368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::getSequenceAwareness(const string &strDomain, bool &bSequenceAware,
2099368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                string &strError) const
21063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
2119368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
21263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
21363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!pConfigurableDomain) {
21463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
21563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
21663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
21763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
21863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    bSequenceAware = pConfigurableDomain->getSequenceAwareness();
21963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
22063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return true;
22163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
22263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
22368a912857707864bbaaff9808717813105072a6ePatrick Benavoli/// Configurations
2249368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::listConfigurations(const string &strDomain, string &strResult) const
22568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
2269368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
22768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
22968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
23068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
23168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
23268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // delegate
23368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pConfigurableDomain->listChildren(strResult);
23468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
23568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
23668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
23768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2389368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::createConfiguration(const string &strDomain,
2399368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               const string &strConfiguration,
2409368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               const CParameterBlackboard *pMainBlackboard,
2419368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               string &strError)
24268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
24368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
2449368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
24568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
24768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
24968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
25068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
25168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pConfigurableDomain->createConfiguration(strConfiguration, pMainBlackboard, strError);
25268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
25368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2549368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::deleteConfiguration(const string &strDomain,
2559368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               const string &strConfiguration, string &strError)
25668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
25768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
2589368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
25968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
26168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
26368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
26468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
26568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pConfigurableDomain->deleteConfiguration(strConfiguration, strError);
26668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
26768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2689368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::renameConfiguration(const string &strDomain,
2699368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               const string &strConfigurationName,
2709368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               const string &strNewConfigurationName,
2719368eea42a1afb01dd44110582f997115b50e742François Gaffie                                               string &strError)
27268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
27368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
2749368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
27568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
27968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
28068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
2819368eea42a1afb01dd44110582f997115b50e742François Gaffie    return pConfigurableDomain->renameConfiguration(strConfigurationName, strNewConfigurationName,
2829368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                    strError);
28368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
28468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2859368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::listDomainElements(const string &strDomain, string &strResult) const
28668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
28768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
2889368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
28968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
29068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
29168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
29268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
29368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
29468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
29568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pConfigurableDomain->listAssociatedToElements(strResult);
29668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
29768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
29868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
29968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3009368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::split(const string &domainName, CConfigurableElement *element,
3019368eea42a1afb01dd44110582f997115b50e742François Gaffie                                 core::Results &infos)
30268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
30368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
3049368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::string error;
3059368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
30668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3079368eea42a1afb01dd44110582f997115b50e742François Gaffie    if (domain == NULL) {
30868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3099368eea42a1afb01dd44110582f997115b50e742François Gaffie        infos.push_back(error);
31068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
31168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
31268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
3139368eea42a1afb01dd44110582f997115b50e742François Gaffie    domain->split(element, infos);
31468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
31568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
31668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
31768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3189368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::listAssociatedElements(string &strResult) const
31968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
3209368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::set<const CConfigurableElement *> configurableElementSet;
32168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
32268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get all owned configurable elements
32368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    gatherAllOwnedConfigurableElements(configurableElementSet);
32468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
32568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Fill result
3269368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::set<const CConfigurableElement *>::const_iterator it;
32768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
32868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
32968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3309368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableElement *pConfigurableElement = *it;
33168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
33268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        string strAssociatedDomainList;
33368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
33468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pConfigurableElement->listAssociatedDomains(strAssociatedDomainList, false);
33568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
33668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strResult += pConfigurableElement->getPath() + " [" + strAssociatedDomainList + "]\n";
33768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
33868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
33968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3409368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::listConflictingElements(string &strResult) const
34168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
3429368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::set<const CConfigurableElement *> configurableElementSet;
34368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
34468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get all owned configurable elements
34568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    gatherAllOwnedConfigurableElements(configurableElementSet);
34668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
34768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Fill result
3489368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::set<const CConfigurableElement *>::const_iterator it;
34968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
35168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3529368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableElement *pConfigurableElement = *it;
35368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pConfigurableElement->getBelongingDomainCount() > 1) {
35568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35668a912857707864bbaaff9808717813105072a6ePatrick Benavoli            string strBelongingDomainList;
35768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35868a912857707864bbaaff9808717813105072a6ePatrick Benavoli            pConfigurableElement->listBelongingDomains(strBelongingDomainList, false);
35968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3609368eea42a1afb01dd44110582f997115b50e742François Gaffie            strResult += pConfigurableElement->getPath() + " contained in multiple domains: " +
3619368eea42a1afb01dd44110582f997115b50e742François Gaffie                         strBelongingDomainList + "\n";
36268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
36368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
36468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
36568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3669368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::listDomains(string &strResult) const
36763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
36863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // List domains
369911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t uiNbConfigurableDomains = getNbChildren();
37063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
3719368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
37263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
3739368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableDomain *pChildConfigurableDomain =
3749368eea42a1afb01dd44110582f997115b50e742François Gaffie            static_cast<const CConfigurableDomain *>(getChild(child));
37563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
37663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Name
37763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        strResult += pChildConfigurableDomain->getName();
37863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
37963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Sequence awareness
38063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        if (pChildConfigurableDomain->getSequenceAwareness()) {
38163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
3829bed7cea60c371df60ab53c2e7ade186f04266f3Patrick Benavoli            strResult += " [sequence aware]";
38363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        }
3849bed7cea60c371df60ab53c2e7ade186f04266f3Patrick Benavoli        strResult += "\n";
38563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
38663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
38763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
38868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Gather configurable elements owned by any domain
3899368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::gatherAllOwnedConfigurableElements(
3909368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::set<const CConfigurableElement *> &configurableElementSet) const
39168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
39268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate to domains
393911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t uiNbConfigurableDomains = getNbChildren();
39468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3959368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
39668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3979368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableDomain *pChildConfigurableDomain =
3989368eea42a1afb01dd44110582f997115b50e742François Gaffie            static_cast<const CConfigurableDomain *>(getChild(child));
39968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pChildConfigurableDomain->gatherConfigurableElements(configurableElementSet);
40168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
40268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
40368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Config restore
4059368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::restoreConfiguration(const string &domainName,
4069368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                const string &configurationName,
4079368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                CParameterBlackboard *mainBlackboard, bool autoSync,
4089368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                core::Results &errors) const
40968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4109368eea42a1afb01dd44110582f997115b50e742François Gaffie    string error;
41168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
4129368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
41368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4149368eea42a1afb01dd44110582f997115b50e742François Gaffie    if (domain == NULL) {
41568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4169368eea42a1afb01dd44110582f997115b50e742François Gaffie        errors.push_back(error);
41768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
41868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
41968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
4209368eea42a1afb01dd44110582f997115b50e742François Gaffie    return domain->restoreConfiguration(configurationName, mainBlackboard, autoSync, errors);
42168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
42268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
42368a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Config save
4249368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::saveConfiguration(const string &strDomain,
4259368eea42a1afb01dd44110582f997115b50e742François Gaffie                                             const string &strConfiguration,
4269368eea42a1afb01dd44110582f997115b50e742François Gaffie                                             const CParameterBlackboard *pMainBlackboard,
4279368eea42a1afb01dd44110582f997115b50e742François Gaffie                                             string &strError)
42868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
42968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
4309368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
43168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
43268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
43368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
43468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
43568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
43668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
43768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pConfigurableDomain->saveConfiguration(strConfiguration, pMainBlackboard, strError);
43868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
43968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4409368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::setElementSequence(const string &strDomain,
4419368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              const string &strConfiguration,
4429368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              const std::vector<string> &astrNewElementSequence,
4439368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              string &strError)
44463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
44563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Find domain
4469368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
44763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
44863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!pConfigurableDomain) {
44963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
45063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
45163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
45263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
45363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Delegate to domain
4549368eea42a1afb01dd44110582f997115b50e742François Gaffie    return pConfigurableDomain->setElementSequence(strConfiguration, astrNewElementSequence,
4559368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                   strError);
45663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
45763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
4589368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::getElementSequence(const string &strDomain,
4599368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              const string &strConfiguration,
4609368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              string &strResult) const
46163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
46263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Find domain
4639368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
46463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
46563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!pConfigurableDomain) {
46663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
46763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
46863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
46963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Delegate to domain
47063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return pConfigurableDomain->getElementSequence(strConfiguration, strResult);
47163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
47263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
4739368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::setApplicationRule(
4749368eea42a1afb01dd44110582f997115b50e742François Gaffie    const string &strDomain, const string &strConfiguration, const string &strApplicationRule,
4759368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition, string &strError)
4760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
4779368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
4780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pConfigurableDomain) {
4800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return false;
4820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
4830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Delegate to domain
4859368eea42a1afb01dd44110582f997115b50e742François Gaffie    return pConfigurableDomain->setApplicationRule(strConfiguration, strApplicationRule,
4869368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                   pSelectionCriteriaDefinition, strError);
4870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
4880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4899368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::clearApplicationRule(const string &strDomain,
4909368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                const string &strConfiguration, string &strError)
4910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
4929368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
4930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pConfigurableDomain) {
4950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return false;
4970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
4980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
4990bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Delegate to domain
5000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return pConfigurableDomain->clearApplicationRule(strConfiguration, strError);
5010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
5020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
5039368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::getApplicationRule(const string &strDomain,
5049368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              const string &strConfiguration,
5059368eea42a1afb01dd44110582f997115b50e742François Gaffie                                              string &strResult) const
5060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
5079368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
5080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
5090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pConfigurableDomain) {
5100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
5110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return false;
5120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
5130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
5140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Delegate to domain
5150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return pConfigurableDomain->getApplicationRule(strConfiguration, strResult);
5160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
5170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
51868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Last applied configurations
5199368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CConfigurableDomains::listLastAppliedConfigurations(string &strResult) const
52068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
52168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Browse domains
522911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli    size_t uiNbConfigurableDomains = getNbChildren();
52368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5249368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
52568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5269368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableDomain *pChildConfigurableDomain =
5279368eea42a1afb01dd44110582f997115b50e742François Gaffie            static_cast<const CConfigurableDomain *>(getChild(child));
52868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5299368eea42a1afb01dd44110582f997115b50e742François Gaffie        strResult += pChildConfigurableDomain->getName() + ": " +
5309368eea42a1afb01dd44110582f997115b50e742François Gaffie                     pChildConfigurableDomain->getLastAppliedConfigurationName() + " [" +
5319368eea42a1afb01dd44110582f997115b50e742François Gaffie                     pChildConfigurableDomain->getPendingConfigurationName() + "]\n";
53268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
53368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
53468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
53568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable element - domain association
5369368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::addConfigurableElementToDomain(
5379368eea42a1afb01dd44110582f997115b50e742François Gaffie    const string &domainName, CConfigurableElement *element,
5389368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CParameterBlackboard *mainBlackboard, core::Results &infos)
53968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
54068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
5419368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::string error;
5429368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
54368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5449368eea42a1afb01dd44110582f997115b50e742François Gaffie    if (domain == NULL) {
54568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5469368eea42a1afb01dd44110582f997115b50e742François Gaffie        infos.push_back(error);
54768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
54868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
54968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
5509368eea42a1afb01dd44110582f997115b50e742François Gaffie    return domain->addConfigurableElement(element, mainBlackboard, infos);
55168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
55268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5539368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CConfigurableDomains::removeConfigurableElementFromDomain(
5549368eea42a1afb01dd44110582f997115b50e742François Gaffie    const string &strDomain, CConfigurableElement *pConfigurableElement, string &strError)
55568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
55668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find domain
5579368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
55868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
55968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pConfigurableDomain) {
56068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
56168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
56268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
56368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
56468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pConfigurableDomain->removeConfigurableElement(pConfigurableElement, strError);
56568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
56668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5679368eea42a1afb01dd44110582f997115b50e742François GaffieCParameterBlackboard *CConfigurableDomains::findConfigurationBlackboard(
5689368eea42a1afb01dd44110582f997115b50e742François Gaffie    const string &strDomain, const string &strConfiguration,
5699368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableElement *pConfigurableElement, size_t &baseOffset, bool &bIsLastApplied,
5709368eea42a1afb01dd44110582f997115b50e742François Gaffie    string &strError) const
571e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard{
572e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    // Find domain
5739368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
574e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
575e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    if (!pConfigurableDomain) {
576e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
577e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard        return NULL;
578e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    }
579e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
580e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    // Check that element belongs to the domain
581e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    if (!pConfigurableElement->belongsTo(pConfigurableDomain)) {
582e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
5839368eea42a1afb01dd44110582f997115b50e742François Gaffie        strError = "Element \"" + pConfigurableElement->getPath() +
5849368eea42a1afb01dd44110582f997115b50e742François Gaffie                   "\" does not belong to domain \"" + strDomain + "\"";
585e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
586e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard        return NULL;
587e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    }
588e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
589e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    // Find Configuration Blackboard and Base Offset
5909368eea42a1afb01dd44110582f997115b50e742François Gaffie    return pConfigurableDomain->findConfigurationBlackboard(strConfiguration, pConfigurableElement,
5919368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                            baseOffset, bIsLastApplied, strError);
59268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
5940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Domain retrieval
5959368eea42a1afb01dd44110582f997115b50e742François GaffieCConfigurableDomain *CConfigurableDomains::findConfigurableDomain(const string &strDomain,
5969368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                                  string &strError)
5970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
59812de2f264c693736a0157847578f6231309cf395David Wagner    // Call the const equivalent
5999368eea42a1afb01dd44110582f997115b50e742François Gaffie    return const_cast<CConfigurableDomain *>(
6009368eea42a1afb01dd44110582f997115b50e742François Gaffie        static_cast<const CConfigurableDomains *>(this)->findConfigurableDomain(strDomain,
6019368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                                                strError));
6020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
6030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6049368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CConfigurableDomain *CConfigurableDomains::findConfigurableDomain(const string &strDomain,
6059368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                                        string &strError) const
6060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
6070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Find domain
6089368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CConfigurableDomain *pConfigurableDomain =
6099368eea42a1afb01dd44110582f997115b50e742François Gaffie        static_cast<const CConfigurableDomain *>(findChild(strDomain));
6100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pConfigurableDomain) {
6120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        strError = "Configurable domain " + strDomain + " not found";
6140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return NULL;
6160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
6170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return pConfigurableDomain;
6190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
620