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#pragma once
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3229fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner#include "XmlSerializingContext.h"
3329fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner#include "XmlDomainImportContext.h"
349368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "XmlDomainExportContext.h"
3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "SyncerSet.h"
369368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "Results.h"
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <list>
3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <set>
3963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli#include <map>
40d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve#include <string>
4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4268a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CConfigurableElement;
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CDomainConfiguration;
4468a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CParameterBlackboard;
450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliclass CSelectionCriteriaDefinition;
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
479368eea42a1afb01dd44110582f997115b50e742François Gaffieclass CConfigurableDomain : public CElement
4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
499368eea42a1afb01dd44110582f997115b50e742François Gaffie    typedef std::list<CConfigurableElement *>::const_iterator ConfigurableElementListIterator;
509368eea42a1afb01dd44110582f997115b50e742François Gaffie    typedef std::map<const CConfigurableElement *, CSyncerSet *>::const_iterator
519368eea42a1afb01dd44110582f997115b50e742François Gaffie        ConfigurableElementToSyncerSetMapIterator;
529368eea42a1afb01dd44110582f997115b50e742François Gaffie
5368a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic:
549368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain() = default;
559368eea42a1afb01dd44110582f997115b50e742François Gaffie    CConfigurableDomain(const std::string &strName);
5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual ~CConfigurableDomain();
5768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Sequence awareness
5963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    void setSequenceAwareness(bool bSequenceAware);
6063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    bool getSequenceAwareness() const;
6163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configuration Management
639368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool createConfiguration(const std::string &strName,
649368eea42a1afb01dd44110582f997115b50e742François Gaffie                             const CParameterBlackboard *pMainBlackboard, std::string &strError);
659368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool deleteConfiguration(const std::string &strName, std::string &strError);
669368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool renameConfiguration(const std::string &strName, const std::string &strNewName,
679368eea42a1afb01dd44110582f997115b50e742François Gaffie                             std::string &strError);
689368eea42a1afb01dd44110582f997115b50e742François Gaffie
699368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Restore a configuration
709368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
719368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] configurationName the configuration name
729368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] mainBlackboard the application main blackboard
739368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] autoSync boolean which indicates if auto sync mechanism is on
749368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[out] errors, errors encountered during restoration
759368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @return true if success false otherwise
769368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
779368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool restoreConfiguration(const std::string &configurationName,
789368eea42a1afb01dd44110582f997115b50e742François Gaffie                              CParameterBlackboard *mainBlackboard, bool autoSync,
799368eea42a1afb01dd44110582f997115b50e742François Gaffie                              core::Results &errors) const;
809368eea42a1afb01dd44110582f997115b50e742François Gaffie
819368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool saveConfiguration(const std::string &strName, const CParameterBlackboard *pMainBlackboard,
829368eea42a1afb01dd44110582f997115b50e742François Gaffie                           std::string &strError);
839368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool setElementSequence(const std::string &strConfiguration,
849368eea42a1afb01dd44110582f997115b50e742François Gaffie                            const std::vector<std::string> &astrNewElementSequence,
859368eea42a1afb01dd44110582f997115b50e742François Gaffie                            std::string &strError);
869368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool getElementSequence(const std::string &strConfiguration, std::string &strResult) const;
879368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool setApplicationRule(const std::string &strConfiguration,
889368eea42a1afb01dd44110582f997115b50e742François Gaffie                            const std::string &strApplicationRule,
899368eea42a1afb01dd44110582f997115b50e742François Gaffie                            const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition,
909368eea42a1afb01dd44110582f997115b50e742François Gaffie                            std::string &strError);
919368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool clearApplicationRule(const std::string &strConfiguration, std::string &strError);
929368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool getApplicationRule(const std::string &strConfiguration, std::string &strResult) const;
9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
948b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Last applied configuration name
95d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string getLastAppliedConfigurationName() const;
9668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
978b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Pending configuration name
98d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    std::string getPendingConfigurationName() const;
998b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
10068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Associated Configurable elements
1019368eea42a1afb01dd44110582f997115b50e742François Gaffie    void gatherConfigurableElements(
1029368eea42a1afb01dd44110582f997115b50e742François Gaffie        std::set<const CConfigurableElement *> &configurableElementSet) const;
1039368eea42a1afb01dd44110582f997115b50e742François Gaffie    void listAssociatedToElements(std::string &strResult) const;
1049368eea42a1afb01dd44110582f997115b50e742François Gaffie
1059368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Add a configurable element to the domain
1069368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
1079368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] pConfigurableElement pointer to the element to add
1089368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] pMainBlackboard pointer to the application main blackboard
1099368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[out] infos useful information we can provide to client
1109368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @return true if succeed false otherwise
1119368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1129368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool addConfigurableElement(CConfigurableElement *pConfigurableElement,
1139368eea42a1afb01dd44110582f997115b50e742François Gaffie                                const CParameterBlackboard *pMainBlackboard, core::Results &infos);
11468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1159368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool removeConfigurableElement(CConfigurableElement *pConfigurableElement,
1169368eea42a1afb01dd44110582f997115b50e742François Gaffie                                   std::string &strError);
11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
118e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    // Blackboard Configuration and Base Offset retrieval
1199368eea42a1afb01dd44110582f997115b50e742François Gaffie    CParameterBlackboard *findConfigurationBlackboard(
1209368eea42a1afb01dd44110582f997115b50e742François Gaffie        const std::string &strConfiguration, const CConfigurableElement *pConfigurableElement,
1219368eea42a1afb01dd44110582f997115b50e742François Gaffie        size_t &baseOffset, bool &bIsLastApplied, std::string &strError) const;
122e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
1239368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Split the domain in two.
1249368eea42a1afb01dd44110582f997115b50e742François Gaffie     * Remove an element of a domain and create a new domain which owns the element.
1259368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
1269368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] pConfigurableElement pointer to the element to remove
1279368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[out] infos useful information we can provide to client
1289368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @return true if succeed false otherwise
1299368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1309368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool split(CConfigurableElement *pConfigurableElement, core::Results &infos);
13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Ensure validity on whole domain from main blackboard
1339368eea42a1afb01dd44110582f997115b50e742François Gaffie    void validate(const CParameterBlackboard *pMainBlackboard);
13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1359368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Apply the configuration if required
1369368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
1379368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] pParameterBlackboard the blackboard to synchronize
1389368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] pSyncerSet pointer to the set containing application syncers
1399368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] bForced boolean used to force configuration application
1409368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[out] info string containing useful information we can provide to client
1419368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1429368eea42a1afb01dd44110582f997115b50e742François Gaffie    void apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet *pSyncerSet, bool bForced,
1439368eea42a1afb01dd44110582f997115b50e742François Gaffie               std::string &info) const;
14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Return applicable configuration validity for given configurable element
1469368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool isApplicableConfigurationValid(const CConfigurableElement *pConfigurableElement) const;
14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // From IXmlSink
1499368eea42a1afb01dd44110582f997115b50e742François Gaffie    virtual bool fromXml(const CXmlElement &xmlElement, CXmlSerializingContext &serializingContext);
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // From IXmlSource
1529368eea42a1afb01dd44110582f997115b50e742François Gaffie    virtual void toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const;
1539368eea42a1afb01dd44110582f997115b50e742François Gaffie    virtual void childrenToXml(CXmlElement &xmlElement,
1549368eea42a1afb01dd44110582f997115b50e742François Gaffie                               CXmlSerializingContext &serializingContext) const;
15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Class kind
157d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve    virtual std::string getKind() const;
1588b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
1590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliprotected:
1600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Content dumping
1619368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::string logValue(utility::ErrorContext &errorContext) const override;
1628b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
16368a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate:
1648b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Get pending configuration
1659368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CDomainConfiguration *getPendingConfiguration() const;
1668b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
1678b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Search for an applicable configuration
1689368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CDomainConfiguration *findApplicableDomainConfiguration() const;
1698b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
1709368eea42a1afb01dd44110582f997115b50e742François Gaffie    // Returns true if children dynamic creation is to be dealt with (here, will allow child
1719368eea42a1afb01dd44110582f997115b50e742François Gaffie    // deletion upon clean)
17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual bool childrenAreDynamic() const;
17368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Ensure validity on areas related to configurable element
1759368eea42a1afb01dd44110582f997115b50e742François Gaffie    void validateAreas(const CConfigurableElement *pConfigurableElement,
1769368eea42a1afb01dd44110582f997115b50e742François Gaffie                       const CParameterBlackboard *pMainBlackboard);
17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1789368eea42a1afb01dd44110582f997115b50e742François Gaffie    // Attempt validation for all configurable element's areas, relying on already existing valid
1799368eea42a1afb01dd44110582f997115b50e742François Gaffie    // configuration inside domain
18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void autoValidateAll();
18168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1829368eea42a1afb01dd44110582f997115b50e742François Gaffie    // Attempt validation for one configurable element's areas, relying on already existing valid
1839368eea42a1afb01dd44110582f997115b50e742François Gaffie    // configuration inside domain
1849368eea42a1afb01dd44110582f997115b50e742François Gaffie    void autoValidateAreas(const CConfigurableElement *pConfigurableElement);
18568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1869368eea42a1afb01dd44110582f997115b50e742François Gaffie    // Attempt configuration validation for all configurable elements' areas, relying on already
1879368eea42a1afb01dd44110582f997115b50e742François Gaffie    // existing valid configuration inside domain
1889368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool autoValidateConfiguration(CDomainConfiguration *pDomainConfiguration);
18968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Search for a valid configuration for given configurable element
1919368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CDomainConfiguration *findValidDomainConfiguration(
1929368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableElement *pConfigurableElement) const;
19368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // In case configurable element was removed
19568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void computeSyncSet();
19668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Check configurable element already attached
1989368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool containsConfigurableElement(
1999368eea42a1afb01dd44110582f997115b50e742François Gaffie        const CConfigurableElement *pConfigurableCandidateElement) const;
20068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2019368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Merge any descended configurable element to this one
2029368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
2039368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] newElement pointer to element which has potential descendants which can be merged
2049368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[out] infos useful information we can provide to client
2059368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
2069368eea42a1afb01dd44110582f997115b50e742François Gaffie    void mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement *newElement,
2079368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                              core::Results &infos);
20868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2099368eea42a1afb01dd44110582f997115b50e742François Gaffie    void mergeConfigurations(CConfigurableElement *pToConfigurableElement,
2109368eea42a1afb01dd44110582f997115b50e742François Gaffie                             CConfigurableElement *pFromConfigurableElement);
2119368eea42a1afb01dd44110582f997115b50e742François Gaffie
2129368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Actually realize the association between the domain and a configurable  element
2139368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
2149368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] pConfigurableElement pointer to the element to add
2159368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[out] infos useful information we can provide to client
2169368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @param[in] (optional) pMainBlackboard, pointer to the application main blackboard
2179368eea42a1afb01dd44110582f997115b50e742François Gaffie     *            Default value is NULL, when provided, blackboard area concerning the configurable
2189368eea42a1afb01dd44110582f997115b50e742François Gaffie     *            element are validated.
2199368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
2209368eea42a1afb01dd44110582f997115b50e742François Gaffie    void doAddConfigurableElement(CConfigurableElement *pConfigurableElement, core::Results &infos,
2219368eea42a1afb01dd44110582f997115b50e742François Gaffie                                  const CParameterBlackboard *pMainBlackboard = NULL);
2229368eea42a1afb01dd44110582f997115b50e742François Gaffie
2239368eea42a1afb01dd44110582f997115b50e742François Gaffie    void doRemoveConfigurableElement(CConfigurableElement *pConfigurableElement,
2249368eea42a1afb01dd44110582f997115b50e742François Gaffie                                     bool bRecomputeSyncSet);
22568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // XML parsing
22729fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner    /**
22829fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * Deserialize domain configurations from an Xml document and add them to
22929fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * the domain.
23029fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     *
23129fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @param[in] xmlElement the XML element to be parsed
23229fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @param[in] serializingContext context for the deserialization
23329fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     *
23429fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @return false if an error occurs, true otherwise.
23529fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     */
2369368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool parseDomainConfigurations(const CXmlElement &xmlElement,
2379368eea42a1afb01dd44110582f997115b50e742François Gaffie                                   CXmlDomainImportContext &serializingContext);
23829fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner    /**
23929fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * Deserialize domain elements from an Xml document and add them to
24029fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * the domain.
24129fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     *
24229fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @param[in] xmlElement the XML element to be parsed
24329fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @param[in] serializingContext context for the deserialization
24429fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     *
24529fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @return false if an error occurs, true otherwise.
24629fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     */
2479368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool parseConfigurableElements(const CXmlElement &xmlElement,
2489368eea42a1afb01dd44110582f997115b50e742François Gaffie                                   CXmlDomainImportContext &serializingContext);
24929fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner    /**
25029fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * Deserialize settings from an Xml document and add them to
25129fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * the domain.
25229fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     *
25329fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @param[in] xmlElement the XML element to be parsed
25429fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @param[in] xmlDomainImportContext context for the deserialization
25529fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     *
25629fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     * @return false if an error occurs, true otherwise.
25729fa61fc5bc02f72f99e66ad50e4de8cb6b8490bDavid Wagner     */
2589368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool parseSettings(const CXmlElement &xmlElement, CXmlDomainImportContext &serializingContext);
25968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // XML composing
2619368eea42a1afb01dd44110582f997115b50e742François Gaffie    void composeDomainConfigurations(CXmlElement &xmlElement,
2629368eea42a1afb01dd44110582f997115b50e742François Gaffie                                     CXmlSerializingContext &serializingContext) const;
2639368eea42a1afb01dd44110582f997115b50e742François Gaffie    void composeConfigurableElements(CXmlElement &xmlElement) const;
2649368eea42a1afb01dd44110582f997115b50e742François Gaffie    void composeSettings(CXmlElement &xmlElement, CXmlDomainExportContext &context) const;
26563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
26663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Syncer set retrieval from configurable element
2679368eea42a1afb01dd44110582f997115b50e742François Gaffie    CSyncerSet *getSyncerSet(const CConfigurableElement *pConfigurableElement) const;
26868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Configuration retrieval
2709368eea42a1afb01dd44110582f997115b50e742François Gaffie    CDomainConfiguration *findConfiguration(const std::string &strConfiguration,
2719368eea42a1afb01dd44110582f997115b50e742François Gaffie                                            std::string &strError);
2729368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CDomainConfiguration *findConfiguration(const std::string &strConfiguration,
2739368eea42a1afb01dd44110582f997115b50e742François Gaffie                                                  std::string &strError) const;
2740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
27568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurable elements
2769368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::list<CConfigurableElement *> _configurableElementList;
27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Associated syncer sets
2799368eea42a1afb01dd44110582f997115b50e742François Gaffie    std::map<const CConfigurableElement *, CSyncerSet *> _configurableElementToSyncerSetMap;
28063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
28163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Sequence awareness
2829368eea42a1afb01dd44110582f997115b50e742François Gaffie    bool _bSequenceAware{false};
28363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
28468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Syncer set used to ensure propoer synchronization of restored configurable elements
28568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CSyncerSet _syncerSet;
28668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
28768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Last applied configuration
2889368eea42a1afb01dd44110582f997115b50e742François Gaffie    mutable const CDomainConfiguration *_pLastAppliedConfiguration{nullptr};
28968a912857707864bbaaff9808717813105072a6ePatrick Benavoli};
290