ConfigurableDomain.h revision e42dacdeaf82d63000be61c6f1583a2ab08e0a98
1e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard/*
268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * INTEL CONFIDENTIAL
368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Copyright © 2011 Intel
468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Corporation All Rights Reserved.
568a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * The source code contained or described herein and all documents related to
768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * the source code ("Material") are owned by Intel Corporation or its suppliers
868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * or licensors. Title to the Material remains with Intel Corporation or its
968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * suppliers and licensors. The Material contains trade secrets and proprietary
1068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * and confidential information of Intel or its suppliers and licensors. The
1168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Material is protected by worldwide copyright and trade secret laws and
1268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * treaty provisions. No part of the Material may be used, copied, reproduced,
1368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * modified, published, uploaded, posted, transmitted, distributed, or
1468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * disclosed in any way without Intel’s prior express written permission.
1568a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
1668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * No license under any patent, copyright, trade secret or other intellectual
1768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * property right is granted to or conferred upon you by disclosure or delivery
1868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * of the Materials, either expressly, by implication, inducement, estoppel or
1968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * otherwise. Any license under such intellectual property rights must be
2068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * express and approved by Intel in writing.
2168a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
2268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * CREATED: 2011-06-01
2368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * UPDATED: 2011-07-27
2468a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
2568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#pragma once
2668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BinarySerializableElement.h"
2868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "SyncerSet.h"
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <list>
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <set>
3163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli#include <map>
3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3368a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CConfigurableElement;
3468a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CDomainConfiguration;
3568a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CParameterBlackboard;
360bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliclass CSelectionCriteriaDefinition;
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3868a912857707864bbaaff9808717813105072a6ePatrick Benavoliclass CConfigurableDomain : public CBinarySerializableElement
3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    typedef list<CConfigurableElement*>::const_iterator ConfigurableElementListIterator;
4163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    typedef map<const CConfigurableElement*, CSyncerSet*>::const_iterator ConfigurableElementToSyncerSetMapIterator;
4268a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic:
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CConfigurableDomain(const string& strName);
4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual ~CConfigurableDomain();
4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Sequence awareness
4763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    void setSequenceAwareness(bool bSequenceAware);
4863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    bool getSequenceAwareness() const;
4963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configuration Management
5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool createConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError);
5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool deleteConfiguration(const string& strName, string& strError);
5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool renameConfiguration(const string& strName, const string& strNewName, string& strError);
54ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    bool restoreConfiguration(const string& strName, CParameterBlackboard* pMainBlackboard, bool bAutoSync, list<string>& strError) const;
5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool saveConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError);
560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    bool setElementSequence(const string& strConfiguration, const vector<string>& astrNewElementSequence, string& strError);
570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    bool getElementSequence(const string& strConfiguration, string& strResult) const;
580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    bool setApplicationRule(const string& strConfiguration, const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError);
590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    bool clearApplicationRule(const string& strConfiguration, string& strError);
600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    bool getApplicationRule(const string& strConfiguration, string& strResult) const;
6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
628b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Last applied configuration name
6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    string getLastAppliedConfigurationName() const;
6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
658b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Pending configuration name
668b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    string getPendingConfigurationName() const;
678b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Associated Configurable elements
6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void gatherConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const;
7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void listAssociatedToElements(string& strResult) const;
7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurable elements association
7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool addConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError);
7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool removeConfigurableElement(CConfigurableElement* pConfigurableElement, string& strError);
7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
76e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    // Blackboard Configuration and Base Offset retrieval
77e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard    CParameterBlackboard* findConfigurationBlackboard(const string& strConfiguration,
78e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard                                                      const CConfigurableElement* pConfigurableElement,
79e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard                                                      uint32_t& uiBaseOffset,
80e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard                                                      bool& bIsLastApplied,
81e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard                                                      string& strError) const;
82e42dacdeaf82d63000be61c6f1583a2ab08e0a98Frédéric Boisnard
8368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Domain splitting
8468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool split(CConfigurableElement* pConfigurableElement, string& strError);
8568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Ensure validity on whole domain from main blackboard
8768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void validate(const CParameterBlackboard* pMainBlackboard);
8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
8968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configuration application if required
90f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    void apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet* pSyncerSet, bool bForced) const;
9168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Return applicable configuration validity for given configurable element
9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool isApplicableConfigurationValid(const CConfigurableElement* pConfigurableElement) const;
9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // From IXmlSink
9668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
9768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // From IXmlSource
9968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
10068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
10168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Class kind
10268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual string getKind() const;
1038b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
1040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliprotected:
1050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Content dumping
1060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    virtual void logValue(string& strValue, CErrorContext& errorContext) const;
1078b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
10868a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate:
1098b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Get pending configuration
1108b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    const CDomainConfiguration* getPendingConfiguration() const;
1118b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
1128b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    // Search for an applicable configuration
1138b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    const CDomainConfiguration* findApplicableDomainConfiguration() const;
1148b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Returns true if children dynamic creation is to be dealt with (here, will allow child deletion upon clean)
11668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    virtual bool childrenAreDynamic() const;
11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Ensure validity on areas related to configurable element
11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void validateAreas(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard);
12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Attempt validation for all configurable element's areas, relying on already existing valid configuration inside domain
12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void autoValidateAll();
12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Attempt validation for one configurable element's areas, relying on already existing valid configuration inside domain
12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void autoValidateAreas(const CConfigurableElement* pConfigurableElement);
12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Attempt configuration validation for all configurable elements' areas, relying on already existing valid configuration inside domain
12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration);
12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Search for a valid configuration for given configurable element
13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    const CDomainConfiguration* findValidDomainConfiguration(const CConfigurableElement* pConfigurableElement) const;
13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // In case configurable element was removed
13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void computeSyncSet();
13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Check configurable element already attached
13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool containsConfigurableElement(const CConfigurableElement* pConfigurableCandidateElement) const;
13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Merge any descended configurable element to this one
14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement* pNewConfigurableElement);
14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void mergeConfigurations(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement);
14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurable elements association
1459620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    void doAddConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard = NULL);
14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void doRemoveConfigurableElement(CConfigurableElement* pConfigurableElement, bool bRecomputeSyncSet);
14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // XML parsing
14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool parseDomainConfigurations(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    bool parseConfigurableElements(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
15163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    bool parseSettings(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // XML composing
15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    void composeDomainConfigurations(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
15563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    void composeConfigurableElements(CXmlElement& xmlElement) const;
15663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    void composeSettings(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
15763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
15863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Syncer set retrieval from configurable element
15963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CSyncerSet* getSyncerSet(const CConfigurableElement* pConfigurableElement) const;
16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Configuration retrieval
1620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* findConfiguration(const string& strConfiguration, string& strError);
1630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    const CDomainConfiguration* findConfiguration(const string& strConfiguration, string& strError) const;
1640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
16568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurable elements
16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    list<CConfigurableElement*> _configurableElementList;
16768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Associated syncer sets
16963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    map<const CConfigurableElement*, CSyncerSet*> _configurableElementToSyncerSetMap;
17063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
17163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Sequence awareness
17263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    bool _bSequenceAware;
17363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Syncer set used to ensure propoer synchronization of restored configurable elements
17568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CSyncerSet _syncerSet;
17668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Last applied configuration
17863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    mutable const CDomainConfiguration* _pLastAppliedConfiguration;
17968a912857707864bbaaff9808717813105072a6ePatrick Benavoli};
18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
181