xref: /aosp_15_r20/external/parameter-framework/upstream/parameter/ConfigurableDomain.cpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker  * Copyright (c) 2011-2015, Intel Corporation
3*c33452fbSAndroid Build Coastguard Worker  * All rights reserved.
4*c33452fbSAndroid Build Coastguard Worker  *
5*c33452fbSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without modification,
6*c33452fbSAndroid Build Coastguard Worker  * are permitted provided that the following conditions are met:
7*c33452fbSAndroid Build Coastguard Worker  *
8*c33452fbSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
9*c33452fbSAndroid Build Coastguard Worker  * list of conditions and the following disclaimer.
10*c33452fbSAndroid Build Coastguard Worker  *
11*c33452fbSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c33452fbSAndroid Build Coastguard Worker  * this list of conditions and the following disclaimer in the documentation and/or
13*c33452fbSAndroid Build Coastguard Worker  * other materials provided with the distribution.
14*c33452fbSAndroid Build Coastguard Worker  *
15*c33452fbSAndroid Build Coastguard Worker  * 3. Neither the name of the copyright holder nor the names of its contributors
16*c33452fbSAndroid Build Coastguard Worker  * may be used to endorse or promote products derived from this software without
17*c33452fbSAndroid Build Coastguard Worker  * specific prior written permission.
18*c33452fbSAndroid Build Coastguard Worker  *
19*c33452fbSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*c33452fbSAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*c33452fbSAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*c33452fbSAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23*c33452fbSAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*c33452fbSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*c33452fbSAndroid Build Coastguard Worker  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*c33452fbSAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*c33452fbSAndroid Build Coastguard Worker  */
30*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableDomain.h"
31*c33452fbSAndroid Build Coastguard Worker #include "DomainConfiguration.h"
32*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableElement.h"
33*c33452fbSAndroid Build Coastguard Worker #include "ConfigurationAccessContext.h"
34*c33452fbSAndroid Build Coastguard Worker #include "XmlDomainSerializingContext.h"
35*c33452fbSAndroid Build Coastguard Worker #include "XmlDomainImportContext.h"
36*c33452fbSAndroid Build Coastguard Worker #include "XmlDomainExportContext.h"
37*c33452fbSAndroid Build Coastguard Worker #include "Utility.h"
38*c33452fbSAndroid Build Coastguard Worker #include "AlwaysAssert.hpp"
39*c33452fbSAndroid Build Coastguard Worker #include <cassert>
40*c33452fbSAndroid Build Coastguard Worker 
41*c33452fbSAndroid Build Coastguard Worker #define base CElement
42*c33452fbSAndroid Build Coastguard Worker 
43*c33452fbSAndroid Build Coastguard Worker using std::string;
44*c33452fbSAndroid Build Coastguard Worker 
CConfigurableDomain(const string & strName)45*c33452fbSAndroid Build Coastguard Worker CConfigurableDomain::CConfigurableDomain(const string &strName) : base(strName)
46*c33452fbSAndroid Build Coastguard Worker {
47*c33452fbSAndroid Build Coastguard Worker }
48*c33452fbSAndroid Build Coastguard Worker 
~CConfigurableDomain()49*c33452fbSAndroid Build Coastguard Worker CConfigurableDomain::~CConfigurableDomain()
50*c33452fbSAndroid Build Coastguard Worker {
51*c33452fbSAndroid Build Coastguard Worker     // Remove all configurable elements
52*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
53*c33452fbSAndroid Build Coastguard Worker 
54*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
55*c33452fbSAndroid Build Coastguard Worker 
56*c33452fbSAndroid Build Coastguard Worker         CConfigurableElement *pConfigurableElement = *it;
57*c33452fbSAndroid Build Coastguard Worker 
58*c33452fbSAndroid Build Coastguard Worker         // Remove from configurable element
59*c33452fbSAndroid Build Coastguard Worker         pConfigurableElement->removeAttachedConfigurableDomain(this);
60*c33452fbSAndroid Build Coastguard Worker     }
61*c33452fbSAndroid Build Coastguard Worker 
62*c33452fbSAndroid Build Coastguard Worker     // Remove all associated syncer sets
63*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementToSyncerSetMapIterator mapIt;
64*c33452fbSAndroid Build Coastguard Worker 
65*c33452fbSAndroid Build Coastguard Worker     for (mapIt = _configurableElementToSyncerSetMap.begin();
66*c33452fbSAndroid Build Coastguard Worker          mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) {
67*c33452fbSAndroid Build Coastguard Worker 
68*c33452fbSAndroid Build Coastguard Worker         delete mapIt->second;
69*c33452fbSAndroid Build Coastguard Worker     }
70*c33452fbSAndroid Build Coastguard Worker }
71*c33452fbSAndroid Build Coastguard Worker 
getKind() const72*c33452fbSAndroid Build Coastguard Worker string CConfigurableDomain::getKind() const
73*c33452fbSAndroid Build Coastguard Worker {
74*c33452fbSAndroid Build Coastguard Worker     return "ConfigurableDomain";
75*c33452fbSAndroid Build Coastguard Worker }
76*c33452fbSAndroid Build Coastguard Worker 
childrenAreDynamic() const77*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::childrenAreDynamic() const
78*c33452fbSAndroid Build Coastguard Worker {
79*c33452fbSAndroid Build Coastguard Worker     return true;
80*c33452fbSAndroid Build Coastguard Worker }
81*c33452fbSAndroid Build Coastguard Worker 
82*c33452fbSAndroid Build Coastguard Worker // Content dumping
logValue(utility::ErrorContext &) const83*c33452fbSAndroid Build Coastguard Worker string CConfigurableDomain::logValue(utility::ErrorContext & /*ctx*/) const
84*c33452fbSAndroid Build Coastguard Worker {
85*c33452fbSAndroid Build Coastguard Worker     return string("{") +
86*c33452fbSAndroid Build Coastguard Worker 
87*c33452fbSAndroid Build Coastguard Worker            "Sequence aware: " + (_bSequenceAware ? "yes" : "no") +
88*c33452fbSAndroid Build Coastguard Worker 
89*c33452fbSAndroid Build Coastguard Worker            ", Last applied configuration: " +
90*c33452fbSAndroid Build Coastguard Worker            (_pLastAppliedConfiguration ? _pLastAppliedConfiguration->getName() : "<none>") +
91*c33452fbSAndroid Build Coastguard Worker 
92*c33452fbSAndroid Build Coastguard Worker            "}";
93*c33452fbSAndroid Build Coastguard Worker }
94*c33452fbSAndroid Build Coastguard Worker 
95*c33452fbSAndroid Build Coastguard Worker // Sequence awareness
setSequenceAwareness(bool bSequenceAware)96*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::setSequenceAwareness(bool bSequenceAware)
97*c33452fbSAndroid Build Coastguard Worker {
98*c33452fbSAndroid Build Coastguard Worker     if (_bSequenceAware != bSequenceAware) {
99*c33452fbSAndroid Build Coastguard Worker 
100*c33452fbSAndroid Build Coastguard Worker         _bSequenceAware = bSequenceAware;
101*c33452fbSAndroid Build Coastguard Worker     }
102*c33452fbSAndroid Build Coastguard Worker }
103*c33452fbSAndroid Build Coastguard Worker 
getSequenceAwareness() const104*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::getSequenceAwareness() const
105*c33452fbSAndroid Build Coastguard Worker {
106*c33452fbSAndroid Build Coastguard Worker     return _bSequenceAware;
107*c33452fbSAndroid Build Coastguard Worker }
108*c33452fbSAndroid Build Coastguard Worker 
109*c33452fbSAndroid Build Coastguard Worker // From IXmlSource
toXml(CXmlElement & xmlElement,CXmlSerializingContext & serializingContext) const110*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::toXml(CXmlElement &xmlElement,
111*c33452fbSAndroid Build Coastguard Worker                                 CXmlSerializingContext &serializingContext) const
112*c33452fbSAndroid Build Coastguard Worker {
113*c33452fbSAndroid Build Coastguard Worker     base::toXml(xmlElement, serializingContext);
114*c33452fbSAndroid Build Coastguard Worker 
115*c33452fbSAndroid Build Coastguard Worker     // Sequence awareness
116*c33452fbSAndroid Build Coastguard Worker     xmlElement.setAttribute("SequenceAware", _bSequenceAware);
117*c33452fbSAndroid Build Coastguard Worker }
118*c33452fbSAndroid Build Coastguard Worker 
childrenToXml(CXmlElement & xmlElement,CXmlSerializingContext & serializingContext) const119*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::childrenToXml(CXmlElement &xmlElement,
120*c33452fbSAndroid Build Coastguard Worker                                         CXmlSerializingContext &serializingContext) const
121*c33452fbSAndroid Build Coastguard Worker {
122*c33452fbSAndroid Build Coastguard Worker     // Configurations
123*c33452fbSAndroid Build Coastguard Worker     composeDomainConfigurations(xmlElement, serializingContext);
124*c33452fbSAndroid Build Coastguard Worker 
125*c33452fbSAndroid Build Coastguard Worker     // Configurable Elements
126*c33452fbSAndroid Build Coastguard Worker     composeConfigurableElements(xmlElement);
127*c33452fbSAndroid Build Coastguard Worker 
128*c33452fbSAndroid Build Coastguard Worker     // Settings
129*c33452fbSAndroid Build Coastguard Worker     composeSettings(xmlElement, static_cast<CXmlDomainExportContext &>(serializingContext));
130*c33452fbSAndroid Build Coastguard Worker }
131*c33452fbSAndroid Build Coastguard Worker 
132*c33452fbSAndroid Build Coastguard Worker // XML composing
composeDomainConfigurations(CXmlElement & xmlElement,CXmlSerializingContext & serializingContext) const133*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::composeDomainConfigurations(
134*c33452fbSAndroid Build Coastguard Worker     CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const
135*c33452fbSAndroid Build Coastguard Worker {
136*c33452fbSAndroid Build Coastguard Worker     // Create Configurations element
137*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlConfigurationsElement;
138*c33452fbSAndroid Build Coastguard Worker 
139*c33452fbSAndroid Build Coastguard Worker     xmlElement.createChild(xmlConfigurationsElement, "Configurations");
140*c33452fbSAndroid Build Coastguard Worker 
141*c33452fbSAndroid Build Coastguard Worker     // Delegate to base
142*c33452fbSAndroid Build Coastguard Worker     base::childrenToXml(xmlConfigurationsElement, serializingContext);
143*c33452fbSAndroid Build Coastguard Worker }
144*c33452fbSAndroid Build Coastguard Worker 
composeConfigurableElements(CXmlElement & xmlElement) const145*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::composeConfigurableElements(CXmlElement &xmlElement) const
146*c33452fbSAndroid Build Coastguard Worker {
147*c33452fbSAndroid Build Coastguard Worker     // Create ConfigurableElements element
148*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlConfigurableElementsElement;
149*c33452fbSAndroid Build Coastguard Worker 
150*c33452fbSAndroid Build Coastguard Worker     xmlElement.createChild(xmlConfigurableElementsElement, "ConfigurableElements");
151*c33452fbSAndroid Build Coastguard Worker 
152*c33452fbSAndroid Build Coastguard Worker     // Serialize out all configurable elements settings
153*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
154*c33452fbSAndroid Build Coastguard Worker 
155*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
156*c33452fbSAndroid Build Coastguard Worker 
157*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
158*c33452fbSAndroid Build Coastguard Worker 
159*c33452fbSAndroid Build Coastguard Worker         // Create corresponding XML child element
160*c33452fbSAndroid Build Coastguard Worker         CXmlElement xmlChildConfigurableElement;
161*c33452fbSAndroid Build Coastguard Worker 
162*c33452fbSAndroid Build Coastguard Worker         xmlConfigurableElementsElement.createChild(xmlChildConfigurableElement,
163*c33452fbSAndroid Build Coastguard Worker                                                    "ConfigurableElement");
164*c33452fbSAndroid Build Coastguard Worker 
165*c33452fbSAndroid Build Coastguard Worker         // Set Path attribute
166*c33452fbSAndroid Build Coastguard Worker         xmlChildConfigurableElement.setAttribute("Path", pConfigurableElement->getPath());
167*c33452fbSAndroid Build Coastguard Worker     }
168*c33452fbSAndroid Build Coastguard Worker }
169*c33452fbSAndroid Build Coastguard Worker 
composeSettings(CXmlElement & xmlElement,CXmlDomainExportContext & context) const170*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::composeSettings(CXmlElement &xmlElement,
171*c33452fbSAndroid Build Coastguard Worker                                           CXmlDomainExportContext &context) const
172*c33452fbSAndroid Build Coastguard Worker {
173*c33452fbSAndroid Build Coastguard Worker     if (!context.withSettings()) {
174*c33452fbSAndroid Build Coastguard Worker 
175*c33452fbSAndroid Build Coastguard Worker         return;
176*c33452fbSAndroid Build Coastguard Worker     }
177*c33452fbSAndroid Build Coastguard Worker 
178*c33452fbSAndroid Build Coastguard Worker     // Create Settings element
179*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlSettingsElement;
180*c33452fbSAndroid Build Coastguard Worker 
181*c33452fbSAndroid Build Coastguard Worker     xmlElement.createChild(xmlSettingsElement, "Settings");
182*c33452fbSAndroid Build Coastguard Worker 
183*c33452fbSAndroid Build Coastguard Worker     // Serialize out all configurations settings
184*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
185*c33452fbSAndroid Build Coastguard Worker     size_t uiChildConfiguration;
186*c33452fbSAndroid Build Coastguard Worker 
187*c33452fbSAndroid Build Coastguard Worker     for (uiChildConfiguration = 0; uiChildConfiguration < uiNbConfigurations;
188*c33452fbSAndroid Build Coastguard Worker          uiChildConfiguration++) {
189*c33452fbSAndroid Build Coastguard Worker 
190*c33452fbSAndroid Build Coastguard Worker         const CDomainConfiguration *pDomainConfiguration =
191*c33452fbSAndroid Build Coastguard Worker             static_cast<const CDomainConfiguration *>(getChild(uiChildConfiguration));
192*c33452fbSAndroid Build Coastguard Worker 
193*c33452fbSAndroid Build Coastguard Worker         // Create child xml element for that configuration
194*c33452fbSAndroid Build Coastguard Worker         CXmlElement xmlConfigurationSettingsElement;
195*c33452fbSAndroid Build Coastguard Worker 
196*c33452fbSAndroid Build Coastguard Worker         xmlSettingsElement.createChild(xmlConfigurationSettingsElement,
197*c33452fbSAndroid Build Coastguard Worker                                        pDomainConfiguration->getXmlElementName());
198*c33452fbSAndroid Build Coastguard Worker 
199*c33452fbSAndroid Build Coastguard Worker         // Set its name attribute
200*c33452fbSAndroid Build Coastguard Worker         xmlConfigurationSettingsElement.setNameAttribute(pDomainConfiguration->getName());
201*c33452fbSAndroid Build Coastguard Worker 
202*c33452fbSAndroid Build Coastguard Worker         // Serialize out configuration settings
203*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->composeSettings(xmlConfigurationSettingsElement, context);
204*c33452fbSAndroid Build Coastguard Worker     }
205*c33452fbSAndroid Build Coastguard Worker }
206*c33452fbSAndroid Build Coastguard Worker 
207*c33452fbSAndroid Build Coastguard Worker // From IXmlSink
fromXml(const CXmlElement & xmlElement,CXmlSerializingContext & serializingContext)208*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::fromXml(const CXmlElement &xmlElement,
209*c33452fbSAndroid Build Coastguard Worker                                   CXmlSerializingContext &serializingContext)
210*c33452fbSAndroid Build Coastguard Worker {
211*c33452fbSAndroid Build Coastguard Worker     // Context
212*c33452fbSAndroid Build Coastguard Worker     CXmlDomainImportContext &xmlDomainImportContext =
213*c33452fbSAndroid Build Coastguard Worker         static_cast<CXmlDomainImportContext &>(serializingContext);
214*c33452fbSAndroid Build Coastguard Worker 
215*c33452fbSAndroid Build Coastguard Worker     // Sequence awareness (optional)
216*c33452fbSAndroid Build Coastguard Worker     xmlElement.getAttribute("SequenceAware", _bSequenceAware);
217*c33452fbSAndroid Build Coastguard Worker 
218*c33452fbSAndroid Build Coastguard Worker     std::string name;
219*c33452fbSAndroid Build Coastguard Worker     xmlElement.getAttribute("Name", name);
220*c33452fbSAndroid Build Coastguard Worker     setName(name);
221*c33452fbSAndroid Build Coastguard Worker 
222*c33452fbSAndroid Build Coastguard Worker     // Local parsing. Do not dig
223*c33452fbSAndroid Build Coastguard Worker     if (!parseDomainConfigurations(xmlElement, xmlDomainImportContext) ||
224*c33452fbSAndroid Build Coastguard Worker         !parseConfigurableElements(xmlElement, xmlDomainImportContext) ||
225*c33452fbSAndroid Build Coastguard Worker         !parseSettings(xmlElement, xmlDomainImportContext)) {
226*c33452fbSAndroid Build Coastguard Worker 
227*c33452fbSAndroid Build Coastguard Worker         return false;
228*c33452fbSAndroid Build Coastguard Worker     }
229*c33452fbSAndroid Build Coastguard Worker 
230*c33452fbSAndroid Build Coastguard Worker     // All provided configurations are parsed
231*c33452fbSAndroid Build Coastguard Worker     // Attempt validation on areas of non provided configurations for all configurable elements if
232*c33452fbSAndroid Build Coastguard Worker     // required
233*c33452fbSAndroid Build Coastguard Worker     if (xmlDomainImportContext.autoValidationRequired()) {
234*c33452fbSAndroid Build Coastguard Worker 
235*c33452fbSAndroid Build Coastguard Worker         autoValidateAll();
236*c33452fbSAndroid Build Coastguard Worker     }
237*c33452fbSAndroid Build Coastguard Worker 
238*c33452fbSAndroid Build Coastguard Worker     return true;
239*c33452fbSAndroid Build Coastguard Worker }
240*c33452fbSAndroid Build Coastguard Worker 
241*c33452fbSAndroid Build Coastguard Worker // XML parsing
parseDomainConfigurations(const CXmlElement & xmlElement,CXmlDomainImportContext & serializingContext)242*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::parseDomainConfigurations(const CXmlElement &xmlElement,
243*c33452fbSAndroid Build Coastguard Worker                                                     CXmlDomainImportContext &serializingContext)
244*c33452fbSAndroid Build Coastguard Worker {
245*c33452fbSAndroid Build Coastguard Worker     // We're supposedly clean
246*c33452fbSAndroid Build Coastguard Worker     assert(_configurableElementList.empty());
247*c33452fbSAndroid Build Coastguard Worker 
248*c33452fbSAndroid Build Coastguard Worker     // Get Configurations element
249*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlConfigurationsElement;
250*c33452fbSAndroid Build Coastguard Worker 
251*c33452fbSAndroid Build Coastguard Worker     xmlElement.getChildElement("Configurations", xmlConfigurationsElement);
252*c33452fbSAndroid Build Coastguard Worker 
253*c33452fbSAndroid Build Coastguard Worker     // Parse it and create domain configuration objects
254*c33452fbSAndroid Build Coastguard Worker     return base::fromXml(xmlConfigurationsElement, serializingContext);
255*c33452fbSAndroid Build Coastguard Worker }
256*c33452fbSAndroid Build Coastguard Worker 
257*c33452fbSAndroid Build Coastguard Worker // Parse configurable elements
parseConfigurableElements(const CXmlElement & xmlElement,CXmlDomainImportContext & serializingContext)258*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::parseConfigurableElements(const CXmlElement &xmlElement,
259*c33452fbSAndroid Build Coastguard Worker                                                     CXmlDomainImportContext &serializingContext)
260*c33452fbSAndroid Build Coastguard Worker {
261*c33452fbSAndroid Build Coastguard Worker     CSystemClass &systemClass = serializingContext.getSystemClass();
262*c33452fbSAndroid Build Coastguard Worker 
263*c33452fbSAndroid Build Coastguard Worker     // Get ConfigurableElements element
264*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlConfigurableElementsElement;
265*c33452fbSAndroid Build Coastguard Worker     xmlElement.getChildElement("ConfigurableElements", xmlConfigurableElementsElement);
266*c33452fbSAndroid Build Coastguard Worker 
267*c33452fbSAndroid Build Coastguard Worker     // Parse it and associate found configurable elements to it
268*c33452fbSAndroid Build Coastguard Worker     CXmlElement::CChildIterator it(xmlConfigurableElementsElement);
269*c33452fbSAndroid Build Coastguard Worker 
270*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlConfigurableElementElement;
271*c33452fbSAndroid Build Coastguard Worker 
272*c33452fbSAndroid Build Coastguard Worker     while (it.next(xmlConfigurableElementElement)) {
273*c33452fbSAndroid Build Coastguard Worker 
274*c33452fbSAndroid Build Coastguard Worker         // Locate configurable element
275*c33452fbSAndroid Build Coastguard Worker         string strConfigurableElementPath;
276*c33452fbSAndroid Build Coastguard Worker         xmlConfigurableElementElement.getAttribute("Path", strConfigurableElementPath);
277*c33452fbSAndroid Build Coastguard Worker 
278*c33452fbSAndroid Build Coastguard Worker         CPathNavigator pathNavigator(strConfigurableElementPath);
279*c33452fbSAndroid Build Coastguard Worker         string strError;
280*c33452fbSAndroid Build Coastguard Worker 
281*c33452fbSAndroid Build Coastguard Worker         // Is there an element and does it match system class name?
282*c33452fbSAndroid Build Coastguard Worker         if (!pathNavigator.navigateThrough(systemClass.getName(), strError)) {
283*c33452fbSAndroid Build Coastguard Worker 
284*c33452fbSAndroid Build Coastguard Worker             serializingContext.setError(
285*c33452fbSAndroid Build Coastguard Worker                 "Could not find configurable element of path " + strConfigurableElementPath +
286*c33452fbSAndroid Build Coastguard Worker                 " from ConfigurableDomain description " + getName() + " (" + strError + ")");
287*c33452fbSAndroid Build Coastguard Worker 
288*c33452fbSAndroid Build Coastguard Worker             return false;
289*c33452fbSAndroid Build Coastguard Worker         }
290*c33452fbSAndroid Build Coastguard Worker         // Browse system class for configurable element
291*c33452fbSAndroid Build Coastguard Worker         CConfigurableElement *pConfigurableElement =
292*c33452fbSAndroid Build Coastguard Worker             static_cast<CConfigurableElement *>(systemClass.findDescendant(pathNavigator));
293*c33452fbSAndroid Build Coastguard Worker 
294*c33452fbSAndroid Build Coastguard Worker         if (!pConfigurableElement) {
295*c33452fbSAndroid Build Coastguard Worker 
296*c33452fbSAndroid Build Coastguard Worker             serializingContext.setError("Could not find configurable element of path " +
297*c33452fbSAndroid Build Coastguard Worker                                         strConfigurableElementPath +
298*c33452fbSAndroid Build Coastguard Worker                                         " from ConfigurableDomain description " + getName());
299*c33452fbSAndroid Build Coastguard Worker 
300*c33452fbSAndroid Build Coastguard Worker             return false;
301*c33452fbSAndroid Build Coastguard Worker         }
302*c33452fbSAndroid Build Coastguard Worker         // Add found element to domain
303*c33452fbSAndroid Build Coastguard Worker         core::Results infos;
304*c33452fbSAndroid Build Coastguard Worker         if (!addConfigurableElement(pConfigurableElement, nullptr, infos)) {
305*c33452fbSAndroid Build Coastguard Worker 
306*c33452fbSAndroid Build Coastguard Worker             strError = utility::asString(infos);
307*c33452fbSAndroid Build Coastguard Worker             serializingContext.setError(strError);
308*c33452fbSAndroid Build Coastguard Worker 
309*c33452fbSAndroid Build Coastguard Worker             return false;
310*c33452fbSAndroid Build Coastguard Worker         }
311*c33452fbSAndroid Build Coastguard Worker     }
312*c33452fbSAndroid Build Coastguard Worker 
313*c33452fbSAndroid Build Coastguard Worker     return true;
314*c33452fbSAndroid Build Coastguard Worker }
315*c33452fbSAndroid Build Coastguard Worker 
316*c33452fbSAndroid Build Coastguard Worker // Parse settings
parseSettings(const CXmlElement & xmlElement,CXmlDomainImportContext & serializingContext)317*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::parseSettings(const CXmlElement &xmlElement,
318*c33452fbSAndroid Build Coastguard Worker                                         CXmlDomainImportContext &serializingContext)
319*c33452fbSAndroid Build Coastguard Worker {
320*c33452fbSAndroid Build Coastguard Worker     // Check we actually need to parse configuration settings
321*c33452fbSAndroid Build Coastguard Worker     if (!serializingContext.withSettings()) {
322*c33452fbSAndroid Build Coastguard Worker 
323*c33452fbSAndroid Build Coastguard Worker         // No parsing required
324*c33452fbSAndroid Build Coastguard Worker         return true;
325*c33452fbSAndroid Build Coastguard Worker     }
326*c33452fbSAndroid Build Coastguard Worker 
327*c33452fbSAndroid Build Coastguard Worker     // Get Settings element
328*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlSettingsElement;
329*c33452fbSAndroid Build Coastguard Worker     if (!xmlElement.getChildElement("Settings", xmlSettingsElement)) {
330*c33452fbSAndroid Build Coastguard Worker 
331*c33452fbSAndroid Build Coastguard Worker         // No settings, bail out successfully
332*c33452fbSAndroid Build Coastguard Worker         return true;
333*c33452fbSAndroid Build Coastguard Worker     }
334*c33452fbSAndroid Build Coastguard Worker 
335*c33452fbSAndroid Build Coastguard Worker     // Parse configuration settings
336*c33452fbSAndroid Build Coastguard Worker     CXmlElement::CChildIterator it(xmlSettingsElement);
337*c33452fbSAndroid Build Coastguard Worker 
338*c33452fbSAndroid Build Coastguard Worker     CXmlElement xmlConfigurationSettingsElement;
339*c33452fbSAndroid Build Coastguard Worker 
340*c33452fbSAndroid Build Coastguard Worker     while (it.next(xmlConfigurationSettingsElement)) {
341*c33452fbSAndroid Build Coastguard Worker         // Get domain configuration
342*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration = static_cast<CDomainConfiguration *>(
343*c33452fbSAndroid Build Coastguard Worker             findChild(xmlConfigurationSettingsElement.getNameAttribute()));
344*c33452fbSAndroid Build Coastguard Worker 
345*c33452fbSAndroid Build Coastguard Worker         if (!pDomainConfiguration) {
346*c33452fbSAndroid Build Coastguard Worker 
347*c33452fbSAndroid Build Coastguard Worker             serializingContext.setError("Could not find domain configuration referred to by"
348*c33452fbSAndroid Build Coastguard Worker                                         " configurable domain \"" +
349*c33452fbSAndroid Build Coastguard Worker                                         getName() + "\".");
350*c33452fbSAndroid Build Coastguard Worker 
351*c33452fbSAndroid Build Coastguard Worker             return false;
352*c33452fbSAndroid Build Coastguard Worker         }
353*c33452fbSAndroid Build Coastguard Worker         // Have domain configuration parse settings for all configurable elements
354*c33452fbSAndroid Build Coastguard Worker         if (!pDomainConfiguration->parseSettings(xmlConfigurationSettingsElement,
355*c33452fbSAndroid Build Coastguard Worker                                                  serializingContext)) {
356*c33452fbSAndroid Build Coastguard Worker 
357*c33452fbSAndroid Build Coastguard Worker             return false;
358*c33452fbSAndroid Build Coastguard Worker         }
359*c33452fbSAndroid Build Coastguard Worker     }
360*c33452fbSAndroid Build Coastguard Worker 
361*c33452fbSAndroid Build Coastguard Worker     return true;
362*c33452fbSAndroid Build Coastguard Worker }
363*c33452fbSAndroid Build Coastguard Worker // Configurable elements association
addConfigurableElement(CConfigurableElement * pConfigurableElement,const CParameterBlackboard * pMainBlackboard,core::Results & infos)364*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::addConfigurableElement(CConfigurableElement *pConfigurableElement,
365*c33452fbSAndroid Build Coastguard Worker                                                  const CParameterBlackboard *pMainBlackboard,
366*c33452fbSAndroid Build Coastguard Worker                                                  core::Results &infos)
367*c33452fbSAndroid Build Coastguard Worker {
368*c33452fbSAndroid Build Coastguard Worker     // Already associated?
369*c33452fbSAndroid Build Coastguard Worker     if (containsConfigurableElement(pConfigurableElement)) {
370*c33452fbSAndroid Build Coastguard Worker 
371*c33452fbSAndroid Build Coastguard Worker         infos.push_back("Configurable element " + pConfigurableElement->getPath() +
372*c33452fbSAndroid Build Coastguard Worker                         " already associated to configuration domain " + getName());
373*c33452fbSAndroid Build Coastguard Worker 
374*c33452fbSAndroid Build Coastguard Worker         return false;
375*c33452fbSAndroid Build Coastguard Worker     }
376*c33452fbSAndroid Build Coastguard Worker 
377*c33452fbSAndroid Build Coastguard Worker     // Already owned?
378*c33452fbSAndroid Build Coastguard Worker     if (pConfigurableElement->belongsTo(this)) {
379*c33452fbSAndroid Build Coastguard Worker 
380*c33452fbSAndroid Build Coastguard Worker         infos.push_back("Configurable element " + pConfigurableElement->getPath() +
381*c33452fbSAndroid Build Coastguard Worker                         " already owned by configuration domain " + getName());
382*c33452fbSAndroid Build Coastguard Worker 
383*c33452fbSAndroid Build Coastguard Worker         return false;
384*c33452fbSAndroid Build Coastguard Worker     }
385*c33452fbSAndroid Build Coastguard Worker 
386*c33452fbSAndroid Build Coastguard Worker     // Do add
387*c33452fbSAndroid Build Coastguard Worker     doAddConfigurableElement(pConfigurableElement, infos, pMainBlackboard);
388*c33452fbSAndroid Build Coastguard Worker 
389*c33452fbSAndroid Build Coastguard Worker     return true;
390*c33452fbSAndroid Build Coastguard Worker }
391*c33452fbSAndroid Build Coastguard Worker 
removeConfigurableElement(CConfigurableElement * pConfigurableElement,string & strError)392*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::removeConfigurableElement(CConfigurableElement *pConfigurableElement,
393*c33452fbSAndroid Build Coastguard Worker                                                     string &strError)
394*c33452fbSAndroid Build Coastguard Worker {
395*c33452fbSAndroid Build Coastguard Worker     // Not associated?
396*c33452fbSAndroid Build Coastguard Worker     if (!containsConfigurableElement(pConfigurableElement)) {
397*c33452fbSAndroid Build Coastguard Worker 
398*c33452fbSAndroid Build Coastguard Worker         strError = "Configurable element " + pConfigurableElement->getPath() +
399*c33452fbSAndroid Build Coastguard Worker                    " not associated to configuration domain " + getName();
400*c33452fbSAndroid Build Coastguard Worker 
401*c33452fbSAndroid Build Coastguard Worker         return false;
402*c33452fbSAndroid Build Coastguard Worker     }
403*c33452fbSAndroid Build Coastguard Worker 
404*c33452fbSAndroid Build Coastguard Worker     // Do remove
405*c33452fbSAndroid Build Coastguard Worker     doRemoveConfigurableElement(pConfigurableElement, true);
406*c33452fbSAndroid Build Coastguard Worker 
407*c33452fbSAndroid Build Coastguard Worker     return true;
408*c33452fbSAndroid Build Coastguard Worker }
409*c33452fbSAndroid Build Coastguard Worker 
410*c33452fbSAndroid Build Coastguard Worker /**
411*c33452fbSAndroid Build Coastguard Worker * Blackboard Configuration and Base Offset retrieval.
412*c33452fbSAndroid Build Coastguard Worker *
413*c33452fbSAndroid Build Coastguard Worker * This method fetches the Blackboard associated to the ConfigurableElement
414*c33452fbSAndroid Build Coastguard Worker * given in parameter, for a specific Configuration. The ConfigurableElement
415*c33452fbSAndroid Build Coastguard Worker * must belong to the Domain. If a Blackboard is found, the base offset of
416*c33452fbSAndroid Build Coastguard Worker * the ConfigurableElement is returned as well. This base offset corresponds to
417*c33452fbSAndroid Build Coastguard Worker * the offset of the ancestor of the ConfigurableElement associated to the Configuration.
418*c33452fbSAndroid Build Coastguard Worker *
419*c33452fbSAndroid Build Coastguard Worker * @param[in] strConfiguration                           Name of the Configuration.
420*c33452fbSAndroid Build Coastguard Worker * @param[in] pCandidateDescendantConfigurableElement    Pointer to a CConfigurableElement that
421*c33452fbSAndroid Build Coastguard Worker *                                                       belongs to the Domain.
422*c33452fbSAndroid Build Coastguard Worker * @param[out] baseOffset                              The base offset of the CConfigurableElement.
423*c33452fbSAndroid Build Coastguard Worker * @param[out] bIsLastApplied                            Boolean indicating that the Configuration is
424*c33452fbSAndroid Build Coastguard Worker *                                                       the last one applied of the Domain.
425*c33452fbSAndroid Build Coastguard Worker * @param[out] strError                                  Error message
426*c33452fbSAndroid Build Coastguard Worker *
427*c33452fbSAndroid Build Coastguard Worker * return Pointer to the Blackboard of the Configuration.
428*c33452fbSAndroid Build Coastguard Worker */
findConfigurationBlackboard(const string & strConfiguration,const CConfigurableElement * pCandidateDescendantConfigurableElement,size_t & baseOffset,bool & bIsLastApplied,string & strError) const429*c33452fbSAndroid Build Coastguard Worker CParameterBlackboard *CConfigurableDomain::findConfigurationBlackboard(
430*c33452fbSAndroid Build Coastguard Worker     const string &strConfiguration,
431*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pCandidateDescendantConfigurableElement, size_t &baseOffset,
432*c33452fbSAndroid Build Coastguard Worker     bool &bIsLastApplied, string &strError) const
433*c33452fbSAndroid Build Coastguard Worker {
434*c33452fbSAndroid Build Coastguard Worker     // Find Configuration
435*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pDomainConfiguration =
436*c33452fbSAndroid Build Coastguard Worker         static_cast<const CDomainConfiguration *>(findChild(strConfiguration));
437*c33452fbSAndroid Build Coastguard Worker 
438*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
439*c33452fbSAndroid Build Coastguard Worker 
440*c33452fbSAndroid Build Coastguard Worker         strError = "Domain configuration " + strConfiguration + " not found";
441*c33452fbSAndroid Build Coastguard Worker 
442*c33452fbSAndroid Build Coastguard Worker         return nullptr;
443*c33452fbSAndroid Build Coastguard Worker     }
444*c33452fbSAndroid Build Coastguard Worker 
445*c33452fbSAndroid Build Coastguard Worker     // Parse all configurable elements
446*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
447*c33452fbSAndroid Build Coastguard Worker 
448*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
449*c33452fbSAndroid Build Coastguard Worker 
450*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pAssociatedConfigurableElement = *it;
451*c33452fbSAndroid Build Coastguard Worker 
452*c33452fbSAndroid Build Coastguard Worker         // Check if the the associated element is the configurable element or one of its ancestors
453*c33452fbSAndroid Build Coastguard Worker         if ((pCandidateDescendantConfigurableElement == pAssociatedConfigurableElement) ||
454*c33452fbSAndroid Build Coastguard Worker             (pCandidateDescendantConfigurableElement->isDescendantOf(
455*c33452fbSAndroid Build Coastguard Worker                 pAssociatedConfigurableElement))) {
456*c33452fbSAndroid Build Coastguard Worker 
457*c33452fbSAndroid Build Coastguard Worker             baseOffset = pAssociatedConfigurableElement->getOffset();
458*c33452fbSAndroid Build Coastguard Worker             bIsLastApplied = (pDomainConfiguration == _pLastAppliedConfiguration);
459*c33452fbSAndroid Build Coastguard Worker 
460*c33452fbSAndroid Build Coastguard Worker             return pDomainConfiguration->getBlackboard(pAssociatedConfigurableElement);
461*c33452fbSAndroid Build Coastguard Worker         }
462*c33452fbSAndroid Build Coastguard Worker     }
463*c33452fbSAndroid Build Coastguard Worker 
464*c33452fbSAndroid Build Coastguard Worker     strError = "Element not associated to the Domain";
465*c33452fbSAndroid Build Coastguard Worker 
466*c33452fbSAndroid Build Coastguard Worker     return nullptr;
467*c33452fbSAndroid Build Coastguard Worker }
468*c33452fbSAndroid Build Coastguard Worker 
469*c33452fbSAndroid Build Coastguard Worker // Domain splitting
split(CConfigurableElement * pConfigurableElement,core::Results & infos)470*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::split(CConfigurableElement *pConfigurableElement, core::Results &infos)
471*c33452fbSAndroid Build Coastguard Worker {
472*c33452fbSAndroid Build Coastguard Worker     // Not associated?
473*c33452fbSAndroid Build Coastguard Worker     if (!containsConfigurableElement(pConfigurableElement)) {
474*c33452fbSAndroid Build Coastguard Worker 
475*c33452fbSAndroid Build Coastguard Worker         std::string strError = "Configurable element " + pConfigurableElement->getPath() +
476*c33452fbSAndroid Build Coastguard Worker                                " not associated to configuration domain " + getName();
477*c33452fbSAndroid Build Coastguard Worker         infos.push_back(strError);
478*c33452fbSAndroid Build Coastguard Worker 
479*c33452fbSAndroid Build Coastguard Worker         return false;
480*c33452fbSAndroid Build Coastguard Worker     }
481*c33452fbSAndroid Build Coastguard Worker 
482*c33452fbSAndroid Build Coastguard Worker     // Create sub domain areas for all configurable element's children
483*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurableElementChildren = pConfigurableElement->getNbChildren();
484*c33452fbSAndroid Build Coastguard Worker 
485*c33452fbSAndroid Build Coastguard Worker     if (!uiNbConfigurableElementChildren) {
486*c33452fbSAndroid Build Coastguard Worker 
487*c33452fbSAndroid Build Coastguard Worker         std::string strError = "Configurable element " + pConfigurableElement->getPath() +
488*c33452fbSAndroid Build Coastguard Worker                                " has no children to split configurable domain to";
489*c33452fbSAndroid Build Coastguard Worker         infos.push_back(strError);
490*c33452fbSAndroid Build Coastguard Worker 
491*c33452fbSAndroid Build Coastguard Worker         return false;
492*c33452fbSAndroid Build Coastguard Worker     }
493*c33452fbSAndroid Build Coastguard Worker 
494*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
495*c33452fbSAndroid Build Coastguard Worker 
496*c33452fbSAndroid Build Coastguard Worker         CConfigurableElement *pChildConfigurableElement =
497*c33452fbSAndroid Build Coastguard Worker             static_cast<CConfigurableElement *>(pConfigurableElement->getChild(uiChild));
498*c33452fbSAndroid Build Coastguard Worker 
499*c33452fbSAndroid Build Coastguard Worker         doAddConfigurableElement(pChildConfigurableElement, infos);
500*c33452fbSAndroid Build Coastguard Worker     }
501*c33452fbSAndroid Build Coastguard Worker 
502*c33452fbSAndroid Build Coastguard Worker     // Delegate to configurations
503*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
504*c33452fbSAndroid Build Coastguard Worker 
505*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
506*c33452fbSAndroid Build Coastguard Worker 
507*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
508*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
509*c33452fbSAndroid Build Coastguard Worker 
510*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->split(pConfigurableElement);
511*c33452fbSAndroid Build Coastguard Worker     }
512*c33452fbSAndroid Build Coastguard Worker 
513*c33452fbSAndroid Build Coastguard Worker     // Remove given configurable element from this domain
514*c33452fbSAndroid Build Coastguard Worker     // Note: we shouldn't need to recompute the sync set in that case, as the splitted element
515*c33452fbSAndroid Build Coastguard Worker     // should include the syncers of its children elements
516*c33452fbSAndroid Build Coastguard Worker     doRemoveConfigurableElement(pConfigurableElement, false);
517*c33452fbSAndroid Build Coastguard Worker 
518*c33452fbSAndroid Build Coastguard Worker     return true;
519*c33452fbSAndroid Build Coastguard Worker }
520*c33452fbSAndroid Build Coastguard Worker 
521*c33452fbSAndroid Build Coastguard Worker // Check if there is a pending configuration for this domain: i.e. an applicable configuration
522*c33452fbSAndroid Build Coastguard Worker // different from the last applied configuration
getPendingConfiguration() const523*c33452fbSAndroid Build Coastguard Worker const CDomainConfiguration *CConfigurableDomain::getPendingConfiguration() const
524*c33452fbSAndroid Build Coastguard Worker {
525*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pApplicableDomainConfiguration =
526*c33452fbSAndroid Build Coastguard Worker         findApplicableDomainConfiguration();
527*c33452fbSAndroid Build Coastguard Worker 
528*c33452fbSAndroid Build Coastguard Worker     if (pApplicableDomainConfiguration) {
529*c33452fbSAndroid Build Coastguard Worker 
530*c33452fbSAndroid Build Coastguard Worker         // Check not the last one before applying
531*c33452fbSAndroid Build Coastguard Worker         if (!_pLastAppliedConfiguration ||
532*c33452fbSAndroid Build Coastguard Worker             (_pLastAppliedConfiguration != pApplicableDomainConfiguration)) {
533*c33452fbSAndroid Build Coastguard Worker 
534*c33452fbSAndroid Build Coastguard Worker             return pApplicableDomainConfiguration;
535*c33452fbSAndroid Build Coastguard Worker         }
536*c33452fbSAndroid Build Coastguard Worker     }
537*c33452fbSAndroid Build Coastguard Worker 
538*c33452fbSAndroid Build Coastguard Worker     return nullptr;
539*c33452fbSAndroid Build Coastguard Worker }
540*c33452fbSAndroid Build Coastguard Worker 
541*c33452fbSAndroid Build Coastguard Worker // Configuration application if required
apply(CParameterBlackboard * pParameterBlackboard,CSyncerSet * pSyncerSet,bool bForce,std::string & strInfo) const542*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet *pSyncerSet,
543*c33452fbSAndroid Build Coastguard Worker                                 bool bForce, std::string &strInfo) const
544*c33452fbSAndroid Build Coastguard Worker {
545*c33452fbSAndroid Build Coastguard Worker     // Apply configuration only if the blackboard will
546*c33452fbSAndroid Build Coastguard Worker     // be synchronized either now or by syncerSet.
547*c33452fbSAndroid Build Coastguard Worker     if (!pSyncerSet ^ _bSequenceAware) {
548*c33452fbSAndroid Build Coastguard Worker         // The configuration can not be syncronised
549*c33452fbSAndroid Build Coastguard Worker         return;
550*c33452fbSAndroid Build Coastguard Worker     }
551*c33452fbSAndroid Build Coastguard Worker 
552*c33452fbSAndroid Build Coastguard Worker     if (bForce) {
553*c33452fbSAndroid Build Coastguard Worker         // Force a configuration restore by forgetting about last applied configuration
554*c33452fbSAndroid Build Coastguard Worker         _pLastAppliedConfiguration = nullptr;
555*c33452fbSAndroid Build Coastguard Worker     }
556*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pApplicableDomainConfiguration =
557*c33452fbSAndroid Build Coastguard Worker         findApplicableDomainConfiguration();
558*c33452fbSAndroid Build Coastguard Worker 
559*c33452fbSAndroid Build Coastguard Worker     if (pApplicableDomainConfiguration) {
560*c33452fbSAndroid Build Coastguard Worker 
561*c33452fbSAndroid Build Coastguard Worker         // Check not the last one before applying
562*c33452fbSAndroid Build Coastguard Worker         if (!_pLastAppliedConfiguration ||
563*c33452fbSAndroid Build Coastguard Worker             _pLastAppliedConfiguration != pApplicableDomainConfiguration) {
564*c33452fbSAndroid Build Coastguard Worker 
565*c33452fbSAndroid Build Coastguard Worker             strInfo = "Applying configuration '" + pApplicableDomainConfiguration->getName() +
566*c33452fbSAndroid Build Coastguard Worker                       "' from domain '" + getName() + "'";
567*c33452fbSAndroid Build Coastguard Worker 
568*c33452fbSAndroid Build Coastguard Worker             // Check if we need to synchronize during restore
569*c33452fbSAndroid Build Coastguard Worker             bool bSync = !pSyncerSet && _bSequenceAware;
570*c33452fbSAndroid Build Coastguard Worker 
571*c33452fbSAndroid Build Coastguard Worker             // Do the restore
572*c33452fbSAndroid Build Coastguard Worker             pApplicableDomainConfiguration->restore(pParameterBlackboard, bSync, nullptr);
573*c33452fbSAndroid Build Coastguard Worker 
574*c33452fbSAndroid Build Coastguard Worker             // Record last applied configuration
575*c33452fbSAndroid Build Coastguard Worker             _pLastAppliedConfiguration = pApplicableDomainConfiguration;
576*c33452fbSAndroid Build Coastguard Worker 
577*c33452fbSAndroid Build Coastguard Worker             // Check we need to provide syncer set to caller
578*c33452fbSAndroid Build Coastguard Worker             if (pSyncerSet && !_bSequenceAware) {
579*c33452fbSAndroid Build Coastguard Worker 
580*c33452fbSAndroid Build Coastguard Worker                 // Since we applied changes, add our own sync set to the given one
581*c33452fbSAndroid Build Coastguard Worker                 *pSyncerSet += _syncerSet;
582*c33452fbSAndroid Build Coastguard Worker             }
583*c33452fbSAndroid Build Coastguard Worker         }
584*c33452fbSAndroid Build Coastguard Worker     }
585*c33452fbSAndroid Build Coastguard Worker }
586*c33452fbSAndroid Build Coastguard Worker 
587*c33452fbSAndroid Build Coastguard Worker // Return applicable configuration validity for given configurable element
isApplicableConfigurationValid(const CConfigurableElement * pConfigurableElement) const588*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::isApplicableConfigurationValid(
589*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pConfigurableElement) const
590*c33452fbSAndroid Build Coastguard Worker {
591*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pApplicableDomainConfiguration =
592*c33452fbSAndroid Build Coastguard Worker         findApplicableDomainConfiguration();
593*c33452fbSAndroid Build Coastguard Worker 
594*c33452fbSAndroid Build Coastguard Worker     return pApplicableDomainConfiguration &&
595*c33452fbSAndroid Build Coastguard Worker            pApplicableDomainConfiguration->isValid(pConfigurableElement);
596*c33452fbSAndroid Build Coastguard Worker }
597*c33452fbSAndroid Build Coastguard Worker 
598*c33452fbSAndroid Build Coastguard Worker // In case configurable element was removed
computeSyncSet()599*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::computeSyncSet()
600*c33452fbSAndroid Build Coastguard Worker {
601*c33452fbSAndroid Build Coastguard Worker     // Clean sync set first
602*c33452fbSAndroid Build Coastguard Worker     _syncerSet.clear();
603*c33452fbSAndroid Build Coastguard Worker 
604*c33452fbSAndroid Build Coastguard Worker     // Add syncer sets for all associated configurable elements
605*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementToSyncerSetMapIterator mapIt;
606*c33452fbSAndroid Build Coastguard Worker 
607*c33452fbSAndroid Build Coastguard Worker     for (mapIt = _configurableElementToSyncerSetMap.begin();
608*c33452fbSAndroid Build Coastguard Worker          mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) {
609*c33452fbSAndroid Build Coastguard Worker 
610*c33452fbSAndroid Build Coastguard Worker         const CSyncerSet *pSyncerSet = mapIt->second;
611*c33452fbSAndroid Build Coastguard Worker 
612*c33452fbSAndroid Build Coastguard Worker         _syncerSet += *pSyncerSet;
613*c33452fbSAndroid Build Coastguard Worker     }
614*c33452fbSAndroid Build Coastguard Worker }
615*c33452fbSAndroid Build Coastguard Worker 
616*c33452fbSAndroid Build Coastguard Worker // Configuration Management
createConfiguration(const string & strName,const CParameterBlackboard * pMainBlackboard,string & strError)617*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::createConfiguration(const string &strName,
618*c33452fbSAndroid Build Coastguard Worker                                               const CParameterBlackboard *pMainBlackboard,
619*c33452fbSAndroid Build Coastguard Worker                                               string &strError)
620*c33452fbSAndroid Build Coastguard Worker {
621*c33452fbSAndroid Build Coastguard Worker     // Already exists?
622*c33452fbSAndroid Build Coastguard Worker     if (findChild(strName)) {
623*c33452fbSAndroid Build Coastguard Worker 
624*c33452fbSAndroid Build Coastguard Worker         strError = "Already existing configuration";
625*c33452fbSAndroid Build Coastguard Worker 
626*c33452fbSAndroid Build Coastguard Worker         return false;
627*c33452fbSAndroid Build Coastguard Worker     }
628*c33452fbSAndroid Build Coastguard Worker 
629*c33452fbSAndroid Build Coastguard Worker     // Creation
630*c33452fbSAndroid Build Coastguard Worker     auto pDomainConfiguration = new CDomainConfiguration(strName);
631*c33452fbSAndroid Build Coastguard Worker 
632*c33452fbSAndroid Build Coastguard Worker     // Configurable elements association
633*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
634*c33452fbSAndroid Build Coastguard Worker 
635*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
636*c33452fbSAndroid Build Coastguard Worker 
637*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
638*c33452fbSAndroid Build Coastguard Worker         ;
639*c33452fbSAndroid Build Coastguard Worker 
640*c33452fbSAndroid Build Coastguard Worker         // Retrieve associated syncer set
641*c33452fbSAndroid Build Coastguard Worker         CSyncerSet *pSyncerSet = getSyncerSet(pConfigurableElement);
642*c33452fbSAndroid Build Coastguard Worker 
643*c33452fbSAndroid Build Coastguard Worker         // Associate to configuration
644*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet);
645*c33452fbSAndroid Build Coastguard Worker     }
646*c33452fbSAndroid Build Coastguard Worker 
647*c33452fbSAndroid Build Coastguard Worker     // Hierarchy
648*c33452fbSAndroid Build Coastguard Worker     addChild(pDomainConfiguration);
649*c33452fbSAndroid Build Coastguard Worker 
650*c33452fbSAndroid Build Coastguard Worker     // Ensure validity of fresh new domain configuration
651*c33452fbSAndroid Build Coastguard Worker     // Attempt auto validation, so that the user gets his/her own settings by defaults
652*c33452fbSAndroid Build Coastguard Worker     if (!autoValidateConfiguration(pDomainConfiguration)) {
653*c33452fbSAndroid Build Coastguard Worker 
654*c33452fbSAndroid Build Coastguard Worker         // No valid configuration found to copy in from, validate againt main blackboard (will
655*c33452fbSAndroid Build Coastguard Worker         // concerned remaining invalid parts)
656*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->validate(pMainBlackboard);
657*c33452fbSAndroid Build Coastguard Worker     }
658*c33452fbSAndroid Build Coastguard Worker 
659*c33452fbSAndroid Build Coastguard Worker     return true;
660*c33452fbSAndroid Build Coastguard Worker }
661*c33452fbSAndroid Build Coastguard Worker 
deleteConfiguration(const string & strName,string & strError)662*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::deleteConfiguration(const string &strName, string &strError)
663*c33452fbSAndroid Build Coastguard Worker {
664*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration = findConfiguration(strName, strError);
665*c33452fbSAndroid Build Coastguard Worker 
666*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
667*c33452fbSAndroid Build Coastguard Worker 
668*c33452fbSAndroid Build Coastguard Worker         return false;
669*c33452fbSAndroid Build Coastguard Worker     }
670*c33452fbSAndroid Build Coastguard Worker 
671*c33452fbSAndroid Build Coastguard Worker     // Was the last applied?
672*c33452fbSAndroid Build Coastguard Worker     if (pDomainConfiguration == _pLastAppliedConfiguration) {
673*c33452fbSAndroid Build Coastguard Worker 
674*c33452fbSAndroid Build Coastguard Worker         // Forget about it
675*c33452fbSAndroid Build Coastguard Worker         _pLastAppliedConfiguration = nullptr;
676*c33452fbSAndroid Build Coastguard Worker     }
677*c33452fbSAndroid Build Coastguard Worker 
678*c33452fbSAndroid Build Coastguard Worker     // Hierarchy
679*c33452fbSAndroid Build Coastguard Worker     removeChild(pDomainConfiguration);
680*c33452fbSAndroid Build Coastguard Worker 
681*c33452fbSAndroid Build Coastguard Worker     // Destroy
682*c33452fbSAndroid Build Coastguard Worker     delete pDomainConfiguration;
683*c33452fbSAndroid Build Coastguard Worker 
684*c33452fbSAndroid Build Coastguard Worker     return true;
685*c33452fbSAndroid Build Coastguard Worker }
686*c33452fbSAndroid Build Coastguard Worker 
listAssociatedToElements(string & strResult) const687*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::listAssociatedToElements(string &strResult) const
688*c33452fbSAndroid Build Coastguard Worker {
689*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
690*c33452fbSAndroid Build Coastguard Worker 
691*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable elements
692*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
693*c33452fbSAndroid Build Coastguard Worker 
694*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
695*c33452fbSAndroid Build Coastguard Worker 
696*c33452fbSAndroid Build Coastguard Worker         strResult += pConfigurableElement->getPath() + "\n";
697*c33452fbSAndroid Build Coastguard Worker     }
698*c33452fbSAndroid Build Coastguard Worker }
699*c33452fbSAndroid Build Coastguard Worker 
renameConfiguration(const string & strName,const string & strNewName,string & strError)700*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::renameConfiguration(const string &strName, const string &strNewName,
701*c33452fbSAndroid Build Coastguard Worker                                               string &strError)
702*c33452fbSAndroid Build Coastguard Worker {
703*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration = findConfiguration(strName, strError);
704*c33452fbSAndroid Build Coastguard Worker 
705*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
706*c33452fbSAndroid Build Coastguard Worker 
707*c33452fbSAndroid Build Coastguard Worker         return false;
708*c33452fbSAndroid Build Coastguard Worker     }
709*c33452fbSAndroid Build Coastguard Worker 
710*c33452fbSAndroid Build Coastguard Worker     // Rename
711*c33452fbSAndroid Build Coastguard Worker     return pDomainConfiguration->rename(strNewName, strError);
712*c33452fbSAndroid Build Coastguard Worker }
713*c33452fbSAndroid Build Coastguard Worker 
restoreConfiguration(const string & configurationName,CParameterBlackboard * mainBlackboard,bool autoSync,core::Results & errors) const714*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::restoreConfiguration(const string &configurationName,
715*c33452fbSAndroid Build Coastguard Worker                                                CParameterBlackboard *mainBlackboard, bool autoSync,
716*c33452fbSAndroid Build Coastguard Worker                                                core::Results &errors) const
717*c33452fbSAndroid Build Coastguard Worker {
718*c33452fbSAndroid Build Coastguard Worker     string error;
719*c33452fbSAndroid Build Coastguard Worker 
720*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *configuration = findConfiguration(configurationName, error);
721*c33452fbSAndroid Build Coastguard Worker 
722*c33452fbSAndroid Build Coastguard Worker     if (configuration == nullptr) {
723*c33452fbSAndroid Build Coastguard Worker 
724*c33452fbSAndroid Build Coastguard Worker         errors.push_back(error);
725*c33452fbSAndroid Build Coastguard Worker         return false;
726*c33452fbSAndroid Build Coastguard Worker     }
727*c33452fbSAndroid Build Coastguard Worker 
728*c33452fbSAndroid Build Coastguard Worker     // Delegate
729*c33452fbSAndroid Build Coastguard Worker     bool bSuccess = configuration->restore(mainBlackboard, autoSync && _bSequenceAware, &errors);
730*c33452fbSAndroid Build Coastguard Worker 
731*c33452fbSAndroid Build Coastguard Worker     // Record last applied configuration
732*c33452fbSAndroid Build Coastguard Worker     _pLastAppliedConfiguration = configuration;
733*c33452fbSAndroid Build Coastguard Worker 
734*c33452fbSAndroid Build Coastguard Worker     // Synchronize
735*c33452fbSAndroid Build Coastguard Worker     if (autoSync && !_bSequenceAware) {
736*c33452fbSAndroid Build Coastguard Worker 
737*c33452fbSAndroid Build Coastguard Worker         bSuccess &= _syncerSet.sync(*mainBlackboard, false, &errors);
738*c33452fbSAndroid Build Coastguard Worker     }
739*c33452fbSAndroid Build Coastguard Worker     return bSuccess;
740*c33452fbSAndroid Build Coastguard Worker }
741*c33452fbSAndroid Build Coastguard Worker 
saveConfiguration(const string & strName,const CParameterBlackboard * pMainBlackboard,string & strError)742*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::saveConfiguration(const string &strName,
743*c33452fbSAndroid Build Coastguard Worker                                             const CParameterBlackboard *pMainBlackboard,
744*c33452fbSAndroid Build Coastguard Worker                                             string &strError)
745*c33452fbSAndroid Build Coastguard Worker {
746*c33452fbSAndroid Build Coastguard Worker     // Find Domain configuration
747*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration = findConfiguration(strName, strError);
748*c33452fbSAndroid Build Coastguard Worker 
749*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
750*c33452fbSAndroid Build Coastguard Worker 
751*c33452fbSAndroid Build Coastguard Worker         return false;
752*c33452fbSAndroid Build Coastguard Worker     }
753*c33452fbSAndroid Build Coastguard Worker 
754*c33452fbSAndroid Build Coastguard Worker     // Delegate
755*c33452fbSAndroid Build Coastguard Worker     pDomainConfiguration->save(pMainBlackboard);
756*c33452fbSAndroid Build Coastguard Worker 
757*c33452fbSAndroid Build Coastguard Worker     return true;
758*c33452fbSAndroid Build Coastguard Worker }
759*c33452fbSAndroid Build Coastguard Worker 
setElementSequence(const string & strConfiguration,const std::vector<string> & astrNewElementSequence,string & strError)760*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::setElementSequence(const string &strConfiguration,
761*c33452fbSAndroid Build Coastguard Worker                                              const std::vector<string> &astrNewElementSequence,
762*c33452fbSAndroid Build Coastguard Worker                                              string &strError)
763*c33452fbSAndroid Build Coastguard Worker {
764*c33452fbSAndroid Build Coastguard Worker     // Find Domain configuration
765*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration = findConfiguration(strConfiguration, strError);
766*c33452fbSAndroid Build Coastguard Worker 
767*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
768*c33452fbSAndroid Build Coastguard Worker 
769*c33452fbSAndroid Build Coastguard Worker         return false;
770*c33452fbSAndroid Build Coastguard Worker     }
771*c33452fbSAndroid Build Coastguard Worker 
772*c33452fbSAndroid Build Coastguard Worker     // Delegate to configuration
773*c33452fbSAndroid Build Coastguard Worker     return pDomainConfiguration->setElementSequence(astrNewElementSequence, strError);
774*c33452fbSAndroid Build Coastguard Worker }
775*c33452fbSAndroid Build Coastguard Worker 
getElementSequence(const string & strConfiguration,string & strResult) const776*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::getElementSequence(const string &strConfiguration,
777*c33452fbSAndroid Build Coastguard Worker                                              string &strResult) const
778*c33452fbSAndroid Build Coastguard Worker {
779*c33452fbSAndroid Build Coastguard Worker     // Find Domain configuration
780*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pDomainConfiguration =
781*c33452fbSAndroid Build Coastguard Worker         findConfiguration(strConfiguration, strResult);
782*c33452fbSAndroid Build Coastguard Worker 
783*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
784*c33452fbSAndroid Build Coastguard Worker 
785*c33452fbSAndroid Build Coastguard Worker         return false;
786*c33452fbSAndroid Build Coastguard Worker     }
787*c33452fbSAndroid Build Coastguard Worker 
788*c33452fbSAndroid Build Coastguard Worker     // Delegate to configuration
789*c33452fbSAndroid Build Coastguard Worker     pDomainConfiguration->getElementSequence(strResult);
790*c33452fbSAndroid Build Coastguard Worker 
791*c33452fbSAndroid Build Coastguard Worker     return true;
792*c33452fbSAndroid Build Coastguard Worker }
793*c33452fbSAndroid Build Coastguard Worker 
setApplicationRule(const string & strConfiguration,const string & strApplicationRule,const CSelectionCriteriaDefinition * pSelectionCriteriaDefinition,string & strError)794*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::setApplicationRule(
795*c33452fbSAndroid Build Coastguard Worker     const string &strConfiguration, const string &strApplicationRule,
796*c33452fbSAndroid Build Coastguard Worker     const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition, string &strError)
797*c33452fbSAndroid Build Coastguard Worker {
798*c33452fbSAndroid Build Coastguard Worker     // Find Domain configuration
799*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration = findConfiguration(strConfiguration, strError);
800*c33452fbSAndroid Build Coastguard Worker 
801*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
802*c33452fbSAndroid Build Coastguard Worker 
803*c33452fbSAndroid Build Coastguard Worker         return false;
804*c33452fbSAndroid Build Coastguard Worker     }
805*c33452fbSAndroid Build Coastguard Worker 
806*c33452fbSAndroid Build Coastguard Worker     // Delegate to configuration
807*c33452fbSAndroid Build Coastguard Worker     return pDomainConfiguration->setApplicationRule(strApplicationRule,
808*c33452fbSAndroid Build Coastguard Worker                                                     pSelectionCriteriaDefinition, strError);
809*c33452fbSAndroid Build Coastguard Worker }
810*c33452fbSAndroid Build Coastguard Worker 
clearApplicationRule(const string & strConfiguration,string & strError)811*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::clearApplicationRule(const string &strConfiguration, string &strError)
812*c33452fbSAndroid Build Coastguard Worker {
813*c33452fbSAndroid Build Coastguard Worker     // Find Domain configuration
814*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration = findConfiguration(strConfiguration, strError);
815*c33452fbSAndroid Build Coastguard Worker 
816*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
817*c33452fbSAndroid Build Coastguard Worker 
818*c33452fbSAndroid Build Coastguard Worker         return false;
819*c33452fbSAndroid Build Coastguard Worker     }
820*c33452fbSAndroid Build Coastguard Worker 
821*c33452fbSAndroid Build Coastguard Worker     // Delegate to configuration
822*c33452fbSAndroid Build Coastguard Worker     pDomainConfiguration->clearApplicationRule();
823*c33452fbSAndroid Build Coastguard Worker 
824*c33452fbSAndroid Build Coastguard Worker     return true;
825*c33452fbSAndroid Build Coastguard Worker }
826*c33452fbSAndroid Build Coastguard Worker 
getApplicationRule(const string & strConfiguration,string & strResult) const827*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::getApplicationRule(const string &strConfiguration,
828*c33452fbSAndroid Build Coastguard Worker                                              string &strResult) const
829*c33452fbSAndroid Build Coastguard Worker {
830*c33452fbSAndroid Build Coastguard Worker     // Find Domain configuration
831*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pDomainConfiguration =
832*c33452fbSAndroid Build Coastguard Worker         findConfiguration(strConfiguration, strResult);
833*c33452fbSAndroid Build Coastguard Worker 
834*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
835*c33452fbSAndroid Build Coastguard Worker 
836*c33452fbSAndroid Build Coastguard Worker         return false;
837*c33452fbSAndroid Build Coastguard Worker     }
838*c33452fbSAndroid Build Coastguard Worker 
839*c33452fbSAndroid Build Coastguard Worker     // Delegate to configuration
840*c33452fbSAndroid Build Coastguard Worker     strResult = pDomainConfiguration->getApplicationRule();
841*c33452fbSAndroid Build Coastguard Worker 
842*c33452fbSAndroid Build Coastguard Worker     return true;
843*c33452fbSAndroid Build Coastguard Worker }
844*c33452fbSAndroid Build Coastguard Worker 
845*c33452fbSAndroid Build Coastguard Worker // Last applied configuration
getLastAppliedConfigurationName() const846*c33452fbSAndroid Build Coastguard Worker string CConfigurableDomain::getLastAppliedConfigurationName() const
847*c33452fbSAndroid Build Coastguard Worker {
848*c33452fbSAndroid Build Coastguard Worker     if (_pLastAppliedConfiguration) {
849*c33452fbSAndroid Build Coastguard Worker 
850*c33452fbSAndroid Build Coastguard Worker         return _pLastAppliedConfiguration->getName();
851*c33452fbSAndroid Build Coastguard Worker     }
852*c33452fbSAndroid Build Coastguard Worker     return "<none>";
853*c33452fbSAndroid Build Coastguard Worker }
854*c33452fbSAndroid Build Coastguard Worker 
855*c33452fbSAndroid Build Coastguard Worker // Pending configuration
getPendingConfigurationName() const856*c33452fbSAndroid Build Coastguard Worker string CConfigurableDomain::getPendingConfigurationName() const
857*c33452fbSAndroid Build Coastguard Worker {
858*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pApplicableDomainConfiguration =
859*c33452fbSAndroid Build Coastguard Worker         findApplicableDomainConfiguration();
860*c33452fbSAndroid Build Coastguard Worker 
861*c33452fbSAndroid Build Coastguard Worker     if (!pApplicableDomainConfiguration) {
862*c33452fbSAndroid Build Coastguard Worker 
863*c33452fbSAndroid Build Coastguard Worker         // No configuration is pending
864*c33452fbSAndroid Build Coastguard Worker         return "<none>";
865*c33452fbSAndroid Build Coastguard Worker     }
866*c33452fbSAndroid Build Coastguard Worker 
867*c33452fbSAndroid Build Coastguard Worker     // Check it will be applied
868*c33452fbSAndroid Build Coastguard Worker     if (pApplicableDomainConfiguration != _pLastAppliedConfiguration) {
869*c33452fbSAndroid Build Coastguard Worker 
870*c33452fbSAndroid Build Coastguard Worker         // Found config will get applied
871*c33452fbSAndroid Build Coastguard Worker         return pApplicableDomainConfiguration->getName();
872*c33452fbSAndroid Build Coastguard Worker     } else {
873*c33452fbSAndroid Build Coastguard Worker 
874*c33452fbSAndroid Build Coastguard Worker         // Same configuration as current
875*c33452fbSAndroid Build Coastguard Worker         return "";
876*c33452fbSAndroid Build Coastguard Worker     }
877*c33452fbSAndroid Build Coastguard Worker }
878*c33452fbSAndroid Build Coastguard Worker 
879*c33452fbSAndroid Build Coastguard Worker // Ensure validity on whole domain from main blackboard
validate(const CParameterBlackboard * pMainBlackboard)880*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::validate(const CParameterBlackboard *pMainBlackboard)
881*c33452fbSAndroid Build Coastguard Worker {
882*c33452fbSAndroid Build Coastguard Worker 
883*c33452fbSAndroid Build Coastguard Worker     // Propagate
884*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
885*c33452fbSAndroid Build Coastguard Worker 
886*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
887*c33452fbSAndroid Build Coastguard Worker 
888*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
889*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
890*c33452fbSAndroid Build Coastguard Worker 
891*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->validate(pMainBlackboard);
892*c33452fbSAndroid Build Coastguard Worker     }
893*c33452fbSAndroid Build Coastguard Worker }
894*c33452fbSAndroid Build Coastguard Worker 
895*c33452fbSAndroid Build Coastguard Worker // Ensure validity on areas related to configurable element
validateAreas(const CConfigurableElement * pConfigurableElement,const CParameterBlackboard * pMainBlackboard)896*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::validateAreas(const CConfigurableElement *pConfigurableElement,
897*c33452fbSAndroid Build Coastguard Worker                                         const CParameterBlackboard *pMainBlackboard)
898*c33452fbSAndroid Build Coastguard Worker {
899*c33452fbSAndroid Build Coastguard Worker     // Propagate
900*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
901*c33452fbSAndroid Build Coastguard Worker 
902*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
903*c33452fbSAndroid Build Coastguard Worker 
904*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
905*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
906*c33452fbSAndroid Build Coastguard Worker 
907*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->validate(pConfigurableElement, pMainBlackboard);
908*c33452fbSAndroid Build Coastguard Worker     }
909*c33452fbSAndroid Build Coastguard Worker }
910*c33452fbSAndroid Build Coastguard Worker 
911*c33452fbSAndroid Build Coastguard Worker // Attempt validation for all configurable element's areas, relying on already existing valid
912*c33452fbSAndroid Build Coastguard Worker // configuration inside domain
autoValidateAll()913*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::autoValidateAll()
914*c33452fbSAndroid Build Coastguard Worker {
915*c33452fbSAndroid Build Coastguard Worker     // Validate
916*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
917*c33452fbSAndroid Build Coastguard Worker 
918*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable elements for configuration validation
919*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
920*c33452fbSAndroid Build Coastguard Worker 
921*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
922*c33452fbSAndroid Build Coastguard Worker 
923*c33452fbSAndroid Build Coastguard Worker         // Auto validate element
924*c33452fbSAndroid Build Coastguard Worker         autoValidateAreas(pConfigurableElement);
925*c33452fbSAndroid Build Coastguard Worker     }
926*c33452fbSAndroid Build Coastguard Worker }
927*c33452fbSAndroid Build Coastguard Worker 
928*c33452fbSAndroid Build Coastguard Worker // Attempt validation for configurable element's areas, relying on already existing valid
929*c33452fbSAndroid Build Coastguard Worker // configuration inside domain
autoValidateAreas(const CConfigurableElement * pConfigurableElement)930*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::autoValidateAreas(const CConfigurableElement *pConfigurableElement)
931*c33452fbSAndroid Build Coastguard Worker {
932*c33452fbSAndroid Build Coastguard Worker     // Find first valid configuration for given configurable element
933*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pValidDomainConfiguration =
934*c33452fbSAndroid Build Coastguard Worker         findValidDomainConfiguration(pConfigurableElement);
935*c33452fbSAndroid Build Coastguard Worker 
936*c33452fbSAndroid Build Coastguard Worker     // No valid configuration found, give up
937*c33452fbSAndroid Build Coastguard Worker     if (!pValidDomainConfiguration) {
938*c33452fbSAndroid Build Coastguard Worker 
939*c33452fbSAndroid Build Coastguard Worker         return;
940*c33452fbSAndroid Build Coastguard Worker     }
941*c33452fbSAndroid Build Coastguard Worker 
942*c33452fbSAndroid Build Coastguard Worker     // Validate all other configurations against found one, if any
943*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
944*c33452fbSAndroid Build Coastguard Worker 
945*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
946*c33452fbSAndroid Build Coastguard Worker 
947*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
948*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
949*c33452fbSAndroid Build Coastguard Worker 
950*c33452fbSAndroid Build Coastguard Worker         if (pDomainConfiguration != pValidDomainConfiguration &&
951*c33452fbSAndroid Build Coastguard Worker             !pDomainConfiguration->isValid(pConfigurableElement)) {
952*c33452fbSAndroid Build Coastguard Worker             // Validate
953*c33452fbSAndroid Build Coastguard Worker             pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement);
954*c33452fbSAndroid Build Coastguard Worker         }
955*c33452fbSAndroid Build Coastguard Worker     }
956*c33452fbSAndroid Build Coastguard Worker }
957*c33452fbSAndroid Build Coastguard Worker 
958*c33452fbSAndroid Build Coastguard Worker // Attempt configuration validation for all configurable elements' areas, relying on already
959*c33452fbSAndroid Build Coastguard Worker // existing valid configuration inside domain
autoValidateConfiguration(CDomainConfiguration * pDomainConfiguration)960*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration *pDomainConfiguration)
961*c33452fbSAndroid Build Coastguard Worker {
962*c33452fbSAndroid Build Coastguard Worker     // Find another configuration than this one, that ought to be valid!
963*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
964*c33452fbSAndroid Build Coastguard Worker 
965*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
966*c33452fbSAndroid Build Coastguard Worker 
967*c33452fbSAndroid Build Coastguard Worker         const CDomainConfiguration *pPotententialValidDomainConfiguration =
968*c33452fbSAndroid Build Coastguard Worker             static_cast<const CDomainConfiguration *>(getChild(uiChild));
969*c33452fbSAndroid Build Coastguard Worker 
970*c33452fbSAndroid Build Coastguard Worker         if (pPotententialValidDomainConfiguration != pDomainConfiguration) {
971*c33452fbSAndroid Build Coastguard Worker 
972*c33452fbSAndroid Build Coastguard Worker             // Validate against it
973*c33452fbSAndroid Build Coastguard Worker             pDomainConfiguration->validateAgainst(pPotententialValidDomainConfiguration);
974*c33452fbSAndroid Build Coastguard Worker 
975*c33452fbSAndroid Build Coastguard Worker             return true;
976*c33452fbSAndroid Build Coastguard Worker         }
977*c33452fbSAndroid Build Coastguard Worker     }
978*c33452fbSAndroid Build Coastguard Worker     return false;
979*c33452fbSAndroid Build Coastguard Worker }
980*c33452fbSAndroid Build Coastguard Worker 
981*c33452fbSAndroid Build Coastguard Worker // Search for a valid configuration for given configurable element
findValidDomainConfiguration(const CConfigurableElement * pConfigurableElement) const982*c33452fbSAndroid Build Coastguard Worker const CDomainConfiguration *CConfigurableDomain::findValidDomainConfiguration(
983*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pConfigurableElement) const
984*c33452fbSAndroid Build Coastguard Worker {
985*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
986*c33452fbSAndroid Build Coastguard Worker 
987*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
988*c33452fbSAndroid Build Coastguard Worker 
989*c33452fbSAndroid Build Coastguard Worker         const CDomainConfiguration *pDomainConfiguration =
990*c33452fbSAndroid Build Coastguard Worker             static_cast<const CDomainConfiguration *>(getChild(uiChild));
991*c33452fbSAndroid Build Coastguard Worker 
992*c33452fbSAndroid Build Coastguard Worker         if (pDomainConfiguration->isValid(pConfigurableElement)) {
993*c33452fbSAndroid Build Coastguard Worker 
994*c33452fbSAndroid Build Coastguard Worker             return pDomainConfiguration;
995*c33452fbSAndroid Build Coastguard Worker         }
996*c33452fbSAndroid Build Coastguard Worker     }
997*c33452fbSAndroid Build Coastguard Worker     return nullptr;
998*c33452fbSAndroid Build Coastguard Worker }
999*c33452fbSAndroid Build Coastguard Worker 
1000*c33452fbSAndroid Build Coastguard Worker // Search for an applicable configuration
findApplicableDomainConfiguration() const1001*c33452fbSAndroid Build Coastguard Worker const CDomainConfiguration *CConfigurableDomain::findApplicableDomainConfiguration() const
1002*c33452fbSAndroid Build Coastguard Worker {
1003*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
1004*c33452fbSAndroid Build Coastguard Worker 
1005*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
1006*c33452fbSAndroid Build Coastguard Worker 
1007*c33452fbSAndroid Build Coastguard Worker         const CDomainConfiguration *pDomainConfiguration =
1008*c33452fbSAndroid Build Coastguard Worker             static_cast<const CDomainConfiguration *>(getChild(uiChild));
1009*c33452fbSAndroid Build Coastguard Worker 
1010*c33452fbSAndroid Build Coastguard Worker         if (pDomainConfiguration->isApplicable()) {
1011*c33452fbSAndroid Build Coastguard Worker 
1012*c33452fbSAndroid Build Coastguard Worker             return pDomainConfiguration;
1013*c33452fbSAndroid Build Coastguard Worker         }
1014*c33452fbSAndroid Build Coastguard Worker     }
1015*c33452fbSAndroid Build Coastguard Worker     return nullptr;
1016*c33452fbSAndroid Build Coastguard Worker }
1017*c33452fbSAndroid Build Coastguard Worker 
1018*c33452fbSAndroid Build Coastguard Worker // Gather set of configurable elements
gatherConfigurableElements(std::set<const CConfigurableElement * > & configurableElementSet) const1019*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::gatherConfigurableElements(
1020*c33452fbSAndroid Build Coastguard Worker     std::set<const CConfigurableElement *> &configurableElementSet) const
1021*c33452fbSAndroid Build Coastguard Worker {
1022*c33452fbSAndroid Build Coastguard Worker     // Insert all configurable elements
1023*c33452fbSAndroid Build Coastguard Worker     configurableElementSet.insert(_configurableElementList.begin(), _configurableElementList.end());
1024*c33452fbSAndroid Build Coastguard Worker }
1025*c33452fbSAndroid Build Coastguard Worker 
1026*c33452fbSAndroid Build Coastguard Worker // Check configurable element already attached
containsConfigurableElement(const CConfigurableElement * pConfigurableCandidateElement) const1027*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomain::containsConfigurableElement(
1028*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pConfigurableCandidateElement) const
1029*c33452fbSAndroid Build Coastguard Worker {
1030*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
1031*c33452fbSAndroid Build Coastguard Worker 
1032*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable elements for comparison
1033*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
1034*c33452fbSAndroid Build Coastguard Worker 
1035*c33452fbSAndroid Build Coastguard Worker         if (pConfigurableCandidateElement == *it) {
1036*c33452fbSAndroid Build Coastguard Worker 
1037*c33452fbSAndroid Build Coastguard Worker             return true;
1038*c33452fbSAndroid Build Coastguard Worker         }
1039*c33452fbSAndroid Build Coastguard Worker     }
1040*c33452fbSAndroid Build Coastguard Worker     return false;
1041*c33452fbSAndroid Build Coastguard Worker }
1042*c33452fbSAndroid Build Coastguard Worker 
1043*c33452fbSAndroid Build Coastguard Worker // Merge any descended configurable element to this one with this one
mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement * newElement,core::Results & infos)1044*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::mergeAlreadyAssociatedDescendantConfigurableElements(
1045*c33452fbSAndroid Build Coastguard Worker     CConfigurableElement *newElement, core::Results &infos)
1046*c33452fbSAndroid Build Coastguard Worker {
1047*c33452fbSAndroid Build Coastguard Worker     std::list<CConfigurableElement *> mergedConfigurableElementList;
1048*c33452fbSAndroid Build Coastguard Worker 
1049*c33452fbSAndroid Build Coastguard Worker     ConfigurableElementListIterator it;
1050*c33452fbSAndroid Build Coastguard Worker 
1051*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable elements (new one not yet in the list!)
1052*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
1053*c33452fbSAndroid Build Coastguard Worker 
1054*c33452fbSAndroid Build Coastguard Worker         CConfigurableElement *pConfigurablePotentialDescendantElement = *it;
1055*c33452fbSAndroid Build Coastguard Worker 
1056*c33452fbSAndroid Build Coastguard Worker         if (pConfigurablePotentialDescendantElement->isDescendantOf(newElement)) {
1057*c33452fbSAndroid Build Coastguard Worker 
1058*c33452fbSAndroid Build Coastguard Worker             infos.push_back("In domain '" + getName() +
1059*c33452fbSAndroid Build Coastguard Worker                             "', merging descendant configurable element's configurations '" +
1060*c33452fbSAndroid Build Coastguard Worker                             pConfigurablePotentialDescendantElement->getName() +
1061*c33452fbSAndroid Build Coastguard Worker                             "' into its ascendant '" + newElement->getName() + "' ones");
1062*c33452fbSAndroid Build Coastguard Worker 
1063*c33452fbSAndroid Build Coastguard Worker             // Merge configuration data
1064*c33452fbSAndroid Build Coastguard Worker             mergeConfigurations(newElement, pConfigurablePotentialDescendantElement);
1065*c33452fbSAndroid Build Coastguard Worker 
1066*c33452fbSAndroid Build Coastguard Worker             // Keep track for removal
1067*c33452fbSAndroid Build Coastguard Worker             mergedConfigurableElementList.push_back(pConfigurablePotentialDescendantElement);
1068*c33452fbSAndroid Build Coastguard Worker         }
1069*c33452fbSAndroid Build Coastguard Worker     }
1070*c33452fbSAndroid Build Coastguard Worker 
1071*c33452fbSAndroid Build Coastguard Worker     // Remove all merged elements (new one not yet in the list!)
1072*c33452fbSAndroid Build Coastguard Worker     for (it = mergedConfigurableElementList.begin(); it != mergedConfigurableElementList.end();
1073*c33452fbSAndroid Build Coastguard Worker          ++it) {
1074*c33452fbSAndroid Build Coastguard Worker 
1075*c33452fbSAndroid Build Coastguard Worker         CConfigurableElement *pMergedConfigurableElement = *it;
1076*c33452fbSAndroid Build Coastguard Worker 
1077*c33452fbSAndroid Build Coastguard Worker         // Remove merged from configurable element from internal tracking list
1078*c33452fbSAndroid Build Coastguard Worker         // Note: we shouldn't need to recompute the sync set in that case, as the merged to element
1079*c33452fbSAndroid Build Coastguard Worker         // should include the syncers of merged from elements
1080*c33452fbSAndroid Build Coastguard Worker         doRemoveConfigurableElement(pMergedConfigurableElement, false);
1081*c33452fbSAndroid Build Coastguard Worker     }
1082*c33452fbSAndroid Build Coastguard Worker }
1083*c33452fbSAndroid Build Coastguard Worker 
mergeConfigurations(CConfigurableElement * pToConfigurableElement,CConfigurableElement * pFromConfigurableElement)1084*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::mergeConfigurations(CConfigurableElement *pToConfigurableElement,
1085*c33452fbSAndroid Build Coastguard Worker                                               CConfigurableElement *pFromConfigurableElement)
1086*c33452fbSAndroid Build Coastguard Worker {
1087*c33452fbSAndroid Build Coastguard Worker     // Propagate to domain configurations
1088*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
1089*c33452fbSAndroid Build Coastguard Worker 
1090*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
1091*c33452fbSAndroid Build Coastguard Worker 
1092*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
1093*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
1094*c33452fbSAndroid Build Coastguard Worker 
1095*c33452fbSAndroid Build Coastguard Worker         // Do the merge.
1096*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->merge(pToConfigurableElement, pFromConfigurableElement);
1097*c33452fbSAndroid Build Coastguard Worker     }
1098*c33452fbSAndroid Build Coastguard Worker }
1099*c33452fbSAndroid Build Coastguard Worker 
1100*c33452fbSAndroid Build Coastguard Worker // Configurable elements association
doAddConfigurableElement(CConfigurableElement * pConfigurableElement,core::Results & infos,const CParameterBlackboard * pMainBlackboard)1101*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::doAddConfigurableElement(CConfigurableElement *pConfigurableElement,
1102*c33452fbSAndroid Build Coastguard Worker                                                    core::Results &infos,
1103*c33452fbSAndroid Build Coastguard Worker                                                    const CParameterBlackboard *pMainBlackboard)
1104*c33452fbSAndroid Build Coastguard Worker {
1105*c33452fbSAndroid Build Coastguard Worker     // Inform configurable element
1106*c33452fbSAndroid Build Coastguard Worker     pConfigurableElement->addAttachedConfigurableDomain(this);
1107*c33452fbSAndroid Build Coastguard Worker 
1108*c33452fbSAndroid Build Coastguard Worker     // Create associated syncer set
1109*c33452fbSAndroid Build Coastguard Worker     auto pSyncerSet = new CSyncerSet;
1110*c33452fbSAndroid Build Coastguard Worker 
1111*c33452fbSAndroid Build Coastguard Worker     // Add to sync set the configurable element one
1112*c33452fbSAndroid Build Coastguard Worker     pConfigurableElement->fillSyncerSet(*pSyncerSet);
1113*c33452fbSAndroid Build Coastguard Worker 
1114*c33452fbSAndroid Build Coastguard Worker     // Store it
1115*c33452fbSAndroid Build Coastguard Worker     _configurableElementToSyncerSetMap[pConfigurableElement] = pSyncerSet;
1116*c33452fbSAndroid Build Coastguard Worker 
1117*c33452fbSAndroid Build Coastguard Worker     // Add it to global one
1118*c33452fbSAndroid Build Coastguard Worker     _syncerSet += *pSyncerSet;
1119*c33452fbSAndroid Build Coastguard Worker 
1120*c33452fbSAndroid Build Coastguard Worker     // Inform configurations
1121*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
1122*c33452fbSAndroid Build Coastguard Worker 
1123*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
1124*c33452fbSAndroid Build Coastguard Worker 
1125*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
1126*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
1127*c33452fbSAndroid Build Coastguard Worker 
1128*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet);
1129*c33452fbSAndroid Build Coastguard Worker     }
1130*c33452fbSAndroid Build Coastguard Worker 
1131*c33452fbSAndroid Build Coastguard Worker     // Ensure area validity for that configurable element (if main blackboard provided)
1132*c33452fbSAndroid Build Coastguard Worker     if (pMainBlackboard) {
1133*c33452fbSAndroid Build Coastguard Worker 
1134*c33452fbSAndroid Build Coastguard Worker         infos.push_back("Validating domain '" + getName() +
1135*c33452fbSAndroid Build Coastguard Worker                         "' against main blackboard for configurable element '" +
1136*c33452fbSAndroid Build Coastguard Worker                         pConfigurableElement->getPath() + "'");
1137*c33452fbSAndroid Build Coastguard Worker         // Need to validate against main blackboard
1138*c33452fbSAndroid Build Coastguard Worker         validateAreas(pConfigurableElement, pMainBlackboard);
1139*c33452fbSAndroid Build Coastguard Worker     }
1140*c33452fbSAndroid Build Coastguard Worker 
1141*c33452fbSAndroid Build Coastguard Worker     // Already associated descendend configurable elements need a merge of their configuration data
1142*c33452fbSAndroid Build Coastguard Worker     mergeAlreadyAssociatedDescendantConfigurableElements(pConfigurableElement, infos);
1143*c33452fbSAndroid Build Coastguard Worker 
1144*c33452fbSAndroid Build Coastguard Worker     // Add to list
1145*c33452fbSAndroid Build Coastguard Worker     _configurableElementList.push_back(pConfigurableElement);
1146*c33452fbSAndroid Build Coastguard Worker }
1147*c33452fbSAndroid Build Coastguard Worker 
doRemoveConfigurableElement(CConfigurableElement * pConfigurableElement,bool bRecomputeSyncSet)1148*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomain::doRemoveConfigurableElement(CConfigurableElement *pConfigurableElement,
1149*c33452fbSAndroid Build Coastguard Worker                                                       bool bRecomputeSyncSet)
1150*c33452fbSAndroid Build Coastguard Worker {
1151*c33452fbSAndroid Build Coastguard Worker     // Remove from list
1152*c33452fbSAndroid Build Coastguard Worker     _configurableElementList.remove(pConfigurableElement);
1153*c33452fbSAndroid Build Coastguard Worker 
1154*c33452fbSAndroid Build Coastguard Worker     // Remove associated syncer set
1155*c33452fbSAndroid Build Coastguard Worker     CSyncerSet *pSyncerSet = getSyncerSet(pConfigurableElement);
1156*c33452fbSAndroid Build Coastguard Worker 
1157*c33452fbSAndroid Build Coastguard Worker     _configurableElementToSyncerSetMap.erase(pConfigurableElement);
1158*c33452fbSAndroid Build Coastguard Worker 
1159*c33452fbSAndroid Build Coastguard Worker     delete pSyncerSet;
1160*c33452fbSAndroid Build Coastguard Worker 
1161*c33452fbSAndroid Build Coastguard Worker     // Inform configurable element
1162*c33452fbSAndroid Build Coastguard Worker     pConfigurableElement->removeAttachedConfigurableDomain(this);
1163*c33452fbSAndroid Build Coastguard Worker 
1164*c33452fbSAndroid Build Coastguard Worker     // Inform configurations
1165*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurations = getNbChildren();
1166*c33452fbSAndroid Build Coastguard Worker 
1167*c33452fbSAndroid Build Coastguard Worker     for (size_t uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
1168*c33452fbSAndroid Build Coastguard Worker 
1169*c33452fbSAndroid Build Coastguard Worker         CDomainConfiguration *pDomainConfiguration =
1170*c33452fbSAndroid Build Coastguard Worker             static_cast<CDomainConfiguration *>(getChild(uiChild));
1171*c33452fbSAndroid Build Coastguard Worker 
1172*c33452fbSAndroid Build Coastguard Worker         pDomainConfiguration->removeConfigurableElement(pConfigurableElement);
1173*c33452fbSAndroid Build Coastguard Worker     }
1174*c33452fbSAndroid Build Coastguard Worker     // Recompute our sync set if needed
1175*c33452fbSAndroid Build Coastguard Worker     if (bRecomputeSyncSet) {
1176*c33452fbSAndroid Build Coastguard Worker 
1177*c33452fbSAndroid Build Coastguard Worker         computeSyncSet();
1178*c33452fbSAndroid Build Coastguard Worker     }
1179*c33452fbSAndroid Build Coastguard Worker }
1180*c33452fbSAndroid Build Coastguard Worker 
1181*c33452fbSAndroid Build Coastguard Worker // Syncer set retrieval from configurable element
getSyncerSet(const CConfigurableElement * pConfigurableElement) const1182*c33452fbSAndroid Build Coastguard Worker CSyncerSet *CConfigurableDomain::getSyncerSet(
1183*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pConfigurableElement) const
1184*c33452fbSAndroid Build Coastguard Worker {
1185*c33452fbSAndroid Build Coastguard Worker     auto mapIt = _configurableElementToSyncerSetMap.find(pConfigurableElement);
1186*c33452fbSAndroid Build Coastguard Worker 
1187*c33452fbSAndroid Build Coastguard Worker     ALWAYS_ASSERT(mapIt != _configurableElementToSyncerSetMap.end(),
1188*c33452fbSAndroid Build Coastguard Worker                   "Could not find syncer set for " << getName() << " configurable domain");
1189*c33452fbSAndroid Build Coastguard Worker 
1190*c33452fbSAndroid Build Coastguard Worker     return mapIt->second;
1191*c33452fbSAndroid Build Coastguard Worker }
1192*c33452fbSAndroid Build Coastguard Worker 
1193*c33452fbSAndroid Build Coastguard Worker // Configuration retrieval
findConfiguration(const string & strConfiguration,string & strError)1194*c33452fbSAndroid Build Coastguard Worker CDomainConfiguration *CConfigurableDomain::findConfiguration(const string &strConfiguration,
1195*c33452fbSAndroid Build Coastguard Worker                                                              string &strError)
1196*c33452fbSAndroid Build Coastguard Worker {
1197*c33452fbSAndroid Build Coastguard Worker     CDomainConfiguration *pDomainConfiguration =
1198*c33452fbSAndroid Build Coastguard Worker         static_cast<CDomainConfiguration *>(findChild(strConfiguration));
1199*c33452fbSAndroid Build Coastguard Worker 
1200*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
1201*c33452fbSAndroid Build Coastguard Worker 
1202*c33452fbSAndroid Build Coastguard Worker         strError = "Domain configuration " + strConfiguration + " not found";
1203*c33452fbSAndroid Build Coastguard Worker 
1204*c33452fbSAndroid Build Coastguard Worker         return nullptr;
1205*c33452fbSAndroid Build Coastguard Worker     }
1206*c33452fbSAndroid Build Coastguard Worker     return pDomainConfiguration;
1207*c33452fbSAndroid Build Coastguard Worker }
1208*c33452fbSAndroid Build Coastguard Worker 
findConfiguration(const string & strConfiguration,string & strError) const1209*c33452fbSAndroid Build Coastguard Worker const CDomainConfiguration *CConfigurableDomain::findConfiguration(const string &strConfiguration,
1210*c33452fbSAndroid Build Coastguard Worker                                                                    string &strError) const
1211*c33452fbSAndroid Build Coastguard Worker {
1212*c33452fbSAndroid Build Coastguard Worker     const CDomainConfiguration *pDomainConfiguration =
1213*c33452fbSAndroid Build Coastguard Worker         static_cast<const CDomainConfiguration *>(findChild(strConfiguration));
1214*c33452fbSAndroid Build Coastguard Worker 
1215*c33452fbSAndroid Build Coastguard Worker     if (!pDomainConfiguration) {
1216*c33452fbSAndroid Build Coastguard Worker 
1217*c33452fbSAndroid Build Coastguard Worker         strError = "Domain configuration " + strConfiguration + " not found";
1218*c33452fbSAndroid Build Coastguard Worker 
1219*c33452fbSAndroid Build Coastguard Worker         return nullptr;
1220*c33452fbSAndroid Build Coastguard Worker     }
1221*c33452fbSAndroid Build Coastguard Worker     return pDomainConfiguration;
1222*c33452fbSAndroid Build Coastguard Worker }
1223