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