1 /* 2 * Copyright (c) 2011-2015, Intel Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation and/or 13 * other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors 16 * may be used to endorse or promote products derived from this software without 17 * specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 #pragma once 31 32 #include "Element.h" 33 #include "Results.h" 34 #include <set> 35 #include <string> 36 37 class CParameterBlackboard; 38 class CConfigurableElement; 39 class CSyncerSet; 40 class CConfigurableDomain; 41 class CSelectionCriteriaDefinition; 42 43 class CConfigurableDomains : public CElement 44 { 45 public: 46 // Configuration/Domains handling 47 /// Domains 48 bool createDomain(const std::string &strName, std::string &strError); 49 50 /* 51 * Adds a domain object to configurable domains. The ConfigurableDomains 52 * object takes ownership of the ConfigurableDomain object. 53 * 54 * @param[in] pDomain the domain object. 55 * @param[in] bOverwrite if false, will refuse to overwrite an existing 56 * domain, otherwise, an existing domain with the same name will first be 57 * removed. 58 * @param[in,out] strError error message 59 * 60 * @returns true if the domain was successfully added 61 */ 62 bool addDomain(CConfigurableDomain &domain, bool bOverwrite, std::string &strError); 63 64 /** 65 * Delete a domain by name 66 * 67 * @param[in] strName name of the domain to be deleted 68 * @param[in,out] strError error message 69 * 70 * @returns true of the domain was sucessfully deleted, false otherwise (i.e. 71 * the domain didn't exist). 72 */ 73 bool deleteDomain(const std::string &strName, std::string &strError); 74 void deleteAllDomains(); 75 bool renameDomain(const std::string &strName, const std::string &strNewName, 76 std::string &strError); 77 bool setSequenceAwareness(const std::string &strDomain, bool bSequenceAware, 78 std::string &strError); 79 bool getSequenceAwareness(const std::string &strDomain, bool &bSequenceAware, 80 std::string &strError) const; 81 bool listDomainElements(const std::string &strDomain, std::string &strResult) const; 82 83 /** Split a domain in two. 84 * Remove an element of a domain and create a new domain which owns the element. 85 * 86 * @param[in] domainName the domain name 87 * @param[in] element pointer to the element to remove 88 * @param[out] infos useful information we can provide to client 89 * @return true if succeed false otherwise 90 */ 91 bool split(const std::string &domainName, CConfigurableElement *element, core::Results &infos); 92 93 void listAssociatedElements(std::string &strResult) const; 94 void listConflictingElements(std::string &strResult) const; 95 void listDomains(std::string &strResult) const; 96 /// Configurations 97 bool listConfigurations(const std::string &strDomain, std::string &strResult) const; 98 bool createConfiguration(const std::string &strDomain, const std::string &strConfiguration, 99 const CParameterBlackboard *pMainBlackboard, std::string &strError); 100 bool deleteConfiguration(const std::string &strDomain, const std::string &strConfiguration, 101 std::string &strError); 102 bool renameConfiguration(const std::string &strDomain, const std::string &strConfigurationName, 103 const std::string &strNewConfigurationName, std::string &strError); 104 105 /** Restore a configuration 106 * 107 * @param[in] strDomain the domain name 108 * @param[in] strConfiguration the configuration name 109 * @param[in] pMainBlackboard the application main blackboard 110 * @param[in] bAutoSync boolean which indicates if auto sync mechanism is on 111 * @param[out] errors, errors encountered during restoration 112 * @return true if success false otherwise 113 */ 114 bool restoreConfiguration(const std::string &strDomain, const std::string &strConfiguration, 115 CParameterBlackboard *pMainBlackboard, bool bAutoSync, 116 core::Results &errors) const; 117 118 bool saveConfiguration(const std::string &strDomain, const std::string &strConfiguration, 119 const CParameterBlackboard *pMainBlackboard, std::string &strError); 120 bool setElementSequence(const std::string &strDomain, const std::string &strConfiguration, 121 const std::vector<std::string> &astrNewElementSequence, 122 std::string &strError); 123 bool getElementSequence(const std::string &strDomain, const std::string &strConfiguration, 124 std::string &strResult) const; 125 bool setApplicationRule(const std::string &strDomain, const std::string &strConfiguration, 126 const std::string &strApplicationRule, 127 const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition, 128 std::string &strError); 129 bool clearApplicationRule(const std::string &strDomain, const std::string &strConfiguration, 130 std::string &strError); 131 bool getApplicationRule(const std::string &strDomain, const std::string &strConfiguration, 132 std::string &strResult) const; 133 134 // Last applied configurations 135 void listLastAppliedConfigurations(std::string &strResult) const; 136 137 /** Associate a configurable element to a domain 138 * 139 * @param[in] domainName the domain name 140 * @param[in] element pointer to the element to add 141 * @param[in] mainBlackboard pointer to the application main blackboard 142 * @param[out] infos useful information we can provide to client 143 * @return true if succeed false otherwise 144 */ 145 bool addConfigurableElementToDomain(const std::string &domainName, 146 CConfigurableElement *element, 147 const CParameterBlackboard *mainBlackboard, 148 core::Results &infos); 149 150 bool removeConfigurableElementFromDomain(const std::string &strDomain, 151 CConfigurableElement *pConfigurableElement, 152 std::string &strError); 153 154 // Configuration Blackboard for element 155 CParameterBlackboard *findConfigurationBlackboard( 156 const std::string &strDomain, const std::string &strConfiguration, 157 const CConfigurableElement *pConfigurableElement, size_t &baseOffset, bool &bIsLastApplied, 158 std::string &strError) const; 159 160 const CConfigurableDomain *findConfigurableDomain(const std::string &strDomain, 161 std::string &strError) const; 162 163 // From IXmlSource 164 virtual void toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const; 165 166 // Ensure validity on whole domains from main blackboard 167 void validate(const CParameterBlackboard *pMainBlackboard); 168 169 /** Apply the configuration if required 170 * 171 * @param[in] pParameterBlackboard the blackboard to synchronize 172 * @param[in] syncerSet the set containing application syncers 173 * @param[in] bForce boolean used to force configuration application 174 * @param[out] infos useful information we can provide to client 175 */ 176 void apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet &syncerSet, bool bForce, 177 core::Results &infos) const; 178 179 // Class kind 180 virtual std::string getKind() const; 181 182 private: 183 /** Delete a domain 184 * 185 * @param(in] configurableDomain domain to be deleted 186 * @param[in,out] strError error message 187 * @returns true of the domain was sucessfully deleted, false otherwise (i.e. 188 * the domain didn't exist). 189 */ 190 void deleteDomain(CConfigurableDomain &configurableDomain); 191 // Returns true if children dynamic creation is to be dealt with 192 virtual bool childrenAreDynamic() const; 193 // Gather owned configurable elements owned by any domain 194 void gatherAllOwnedConfigurableElements( 195 std::set<const CConfigurableElement *> &configurableElementSet) const; 196 // Domain retrieval 197 CConfigurableDomain *findConfigurableDomain(const std::string &strDomain, 198 std::string &strError); 199 }; 200