xref: /aosp_15_r20/external/parameter-framework/upstream/parameter/ConfigurableElement.cpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker  * Copyright (c) 2011-2015, Intel Corporation
3*c33452fbSAndroid Build Coastguard Worker  * All rights reserved.
4*c33452fbSAndroid Build Coastguard Worker  *
5*c33452fbSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without modification,
6*c33452fbSAndroid Build Coastguard Worker  * are permitted provided that the following conditions are met:
7*c33452fbSAndroid Build Coastguard Worker  *
8*c33452fbSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
9*c33452fbSAndroid Build Coastguard Worker  * list of conditions and the following disclaimer.
10*c33452fbSAndroid Build Coastguard Worker  *
11*c33452fbSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c33452fbSAndroid Build Coastguard Worker  * this list of conditions and the following disclaimer in the documentation and/or
13*c33452fbSAndroid Build Coastguard Worker  * other materials provided with the distribution.
14*c33452fbSAndroid Build Coastguard Worker  *
15*c33452fbSAndroid Build Coastguard Worker  * 3. Neither the name of the copyright holder nor the names of its contributors
16*c33452fbSAndroid Build Coastguard Worker  * may be used to endorse or promote products derived from this software without
17*c33452fbSAndroid Build Coastguard Worker  * specific prior written permission.
18*c33452fbSAndroid Build Coastguard Worker  *
19*c33452fbSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*c33452fbSAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*c33452fbSAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*c33452fbSAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23*c33452fbSAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*c33452fbSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*c33452fbSAndroid Build Coastguard Worker  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*c33452fbSAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*c33452fbSAndroid Build Coastguard Worker  */
30*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableElement.h"
31*c33452fbSAndroid Build Coastguard Worker #include "MappingData.h"
32*c33452fbSAndroid Build Coastguard Worker #include "SyncerSet.h"
33*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableDomain.h"
34*c33452fbSAndroid Build Coastguard Worker #include "ConfigurationAccessContext.h"
35*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableElementAggregator.h"
36*c33452fbSAndroid Build Coastguard Worker #include "AreaConfiguration.h"
37*c33452fbSAndroid Build Coastguard Worker #include "Iterator.hpp"
38*c33452fbSAndroid Build Coastguard Worker #include "Utility.h"
39*c33452fbSAndroid Build Coastguard Worker #include "XmlParameterSerializingContext.h"
40*c33452fbSAndroid Build Coastguard Worker #include <assert.h>
41*c33452fbSAndroid Build Coastguard Worker 
42*c33452fbSAndroid Build Coastguard Worker #define base CElement
43*c33452fbSAndroid Build Coastguard Worker 
CConfigurableElement(const std::string & strName)44*c33452fbSAndroid Build Coastguard Worker CConfigurableElement::CConfigurableElement(const std::string &strName) : base(strName)
45*c33452fbSAndroid Build Coastguard Worker {
46*c33452fbSAndroid Build Coastguard Worker }
47*c33452fbSAndroid Build Coastguard Worker 
fromXml(const CXmlElement & xmlElement,CXmlSerializingContext & serializingContext)48*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::fromXml(const CXmlElement &xmlElement,
49*c33452fbSAndroid Build Coastguard Worker                                    CXmlSerializingContext &serializingContext)
50*c33452fbSAndroid Build Coastguard Worker {
51*c33452fbSAndroid Build Coastguard Worker     auto &context = static_cast<CXmlParameterSerializingContext &>(serializingContext);
52*c33452fbSAndroid Build Coastguard Worker     auto &accessContext = context.getAccessContext();
53*c33452fbSAndroid Build Coastguard Worker 
54*c33452fbSAndroid Build Coastguard Worker     if (accessContext.serializeSettings()) {
55*c33452fbSAndroid Build Coastguard Worker         // As serialization and deserialisation are handled through the *same* function
56*c33452fbSAndroid Build Coastguard Worker         // the (de)serialize object can not be const in `serializeXmlSettings` signature.
57*c33452fbSAndroid Build Coastguard Worker         // As a result a const_cast is unavoidable :(.
58*c33452fbSAndroid Build Coastguard Worker         // Fixme: split serializeXmlSettings in two functions (in and out) to avoid the `const_cast`
59*c33452fbSAndroid Build Coastguard Worker         return serializeXmlSettings(const_cast<CXmlElement &>(xmlElement),
60*c33452fbSAndroid Build Coastguard Worker                                     static_cast<CConfigurationAccessContext &>(accessContext));
61*c33452fbSAndroid Build Coastguard Worker     }
62*c33452fbSAndroid Build Coastguard Worker     return structureFromXml(xmlElement, serializingContext);
63*c33452fbSAndroid Build Coastguard Worker }
64*c33452fbSAndroid Build Coastguard Worker 
toXml(CXmlElement & xmlElement,CXmlSerializingContext & serializingContext) const65*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::toXml(CXmlElement &xmlElement,
66*c33452fbSAndroid Build Coastguard Worker                                  CXmlSerializingContext &serializingContext) const
67*c33452fbSAndroid Build Coastguard Worker {
68*c33452fbSAndroid Build Coastguard Worker     auto &context = static_cast<CXmlParameterSerializingContext &>(serializingContext);
69*c33452fbSAndroid Build Coastguard Worker     auto &accessContext = context.getAccessContext();
70*c33452fbSAndroid Build Coastguard Worker     if (accessContext.serializeSettings()) {
71*c33452fbSAndroid Build Coastguard Worker 
72*c33452fbSAndroid Build Coastguard Worker         serializeXmlSettings(xmlElement, static_cast<CConfigurationAccessContext &>(accessContext));
73*c33452fbSAndroid Build Coastguard Worker     } else {
74*c33452fbSAndroid Build Coastguard Worker 
75*c33452fbSAndroid Build Coastguard Worker         structureToXml(xmlElement, serializingContext);
76*c33452fbSAndroid Build Coastguard Worker     }
77*c33452fbSAndroid Build Coastguard Worker }
78*c33452fbSAndroid Build Coastguard Worker 
79*c33452fbSAndroid Build Coastguard Worker // XML configuration settings parsing
serializeXmlSettings(CXmlElement & xmlConfigurationSettingsElementContent,CConfigurationAccessContext & configurationAccessContext) const80*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::serializeXmlSettings(
81*c33452fbSAndroid Build Coastguard Worker     CXmlElement &xmlConfigurationSettingsElementContent,
82*c33452fbSAndroid Build Coastguard Worker     CConfigurationAccessContext &configurationAccessContext) const
83*c33452fbSAndroid Build Coastguard Worker {
84*c33452fbSAndroid Build Coastguard Worker     size_t uiNbChildren = getNbChildren();
85*c33452fbSAndroid Build Coastguard Worker 
86*c33452fbSAndroid Build Coastguard Worker     if (!configurationAccessContext.serializeOut()) {
87*c33452fbSAndroid Build Coastguard Worker         // Just do basic checks and propagate to children
88*c33452fbSAndroid Build Coastguard Worker         CXmlElement::CChildIterator it(xmlConfigurationSettingsElementContent);
89*c33452fbSAndroid Build Coastguard Worker 
90*c33452fbSAndroid Build Coastguard Worker         CXmlElement xmlChildConfigurableElementSettingsElement;
91*c33452fbSAndroid Build Coastguard Worker 
92*c33452fbSAndroid Build Coastguard Worker         // Propagate to children
93*c33452fbSAndroid Build Coastguard Worker         for (size_t index = 0; index < uiNbChildren; index++) {
94*c33452fbSAndroid Build Coastguard Worker 
95*c33452fbSAndroid Build Coastguard Worker             // Get child
96*c33452fbSAndroid Build Coastguard Worker             const CConfigurableElement *pChildConfigurableElement =
97*c33452fbSAndroid Build Coastguard Worker                 static_cast<const CConfigurableElement *>(getChild(index));
98*c33452fbSAndroid Build Coastguard Worker 
99*c33452fbSAndroid Build Coastguard Worker             if (!it.next(xmlChildConfigurableElementSettingsElement)) {
100*c33452fbSAndroid Build Coastguard Worker 
101*c33452fbSAndroid Build Coastguard Worker                 // Structure error
102*c33452fbSAndroid Build Coastguard Worker                 configurationAccessContext.setError(
103*c33452fbSAndroid Build Coastguard Worker                     "Configuration settings parsing: missing child node " +
104*c33452fbSAndroid Build Coastguard Worker                     pChildConfigurableElement->getXmlElementName() + " (name:" +
105*c33452fbSAndroid Build Coastguard Worker                     pChildConfigurableElement->getName() + ") in " + getName());
106*c33452fbSAndroid Build Coastguard Worker 
107*c33452fbSAndroid Build Coastguard Worker                 return false;
108*c33452fbSAndroid Build Coastguard Worker             }
109*c33452fbSAndroid Build Coastguard Worker 
110*c33452fbSAndroid Build Coastguard Worker             // Check element type matches in type
111*c33452fbSAndroid Build Coastguard Worker             if (xmlChildConfigurableElementSettingsElement.getType() !=
112*c33452fbSAndroid Build Coastguard Worker                 pChildConfigurableElement->getXmlElementName()) {
113*c33452fbSAndroid Build Coastguard Worker 
114*c33452fbSAndroid Build Coastguard Worker                 // "Component" tag has been renamed to "ParameterBlock", but retro-compatibility
115*c33452fbSAndroid Build Coastguard Worker                 // shall be ensured.
116*c33452fbSAndroid Build Coastguard Worker                 //
117*c33452fbSAndroid Build Coastguard Worker                 // So checking if this case occurs, i.e. element name is "ParameterBlock"
118*c33452fbSAndroid Build Coastguard Worker                 // but xml setting name is "Component".
119*c33452fbSAndroid Build Coastguard Worker                 bool compatibilityCase =
120*c33452fbSAndroid Build Coastguard Worker                     (pChildConfigurableElement->getXmlElementName() == "ParameterBlock") &&
121*c33452fbSAndroid Build Coastguard Worker                     (xmlChildConfigurableElementSettingsElement.getType() == "Component");
122*c33452fbSAndroid Build Coastguard Worker 
123*c33452fbSAndroid Build Coastguard Worker                 // Error if the compatibility case does not occur.
124*c33452fbSAndroid Build Coastguard Worker                 if (!compatibilityCase) {
125*c33452fbSAndroid Build Coastguard Worker 
126*c33452fbSAndroid Build Coastguard Worker                     // Type error
127*c33452fbSAndroid Build Coastguard Worker                     configurationAccessContext.setError(
128*c33452fbSAndroid Build Coastguard Worker                         "Configuration settings parsing: Settings "
129*c33452fbSAndroid Build Coastguard Worker                         "for configurable element " +
130*c33452fbSAndroid Build Coastguard Worker                         pChildConfigurableElement->getQualifiedPath() +
131*c33452fbSAndroid Build Coastguard Worker                         " does not match expected type: " +
132*c33452fbSAndroid Build Coastguard Worker                         xmlChildConfigurableElementSettingsElement.getType() + " instead of " +
133*c33452fbSAndroid Build Coastguard Worker                         pChildConfigurableElement->getKind());
134*c33452fbSAndroid Build Coastguard Worker                     return false;
135*c33452fbSAndroid Build Coastguard Worker                 }
136*c33452fbSAndroid Build Coastguard Worker             }
137*c33452fbSAndroid Build Coastguard Worker 
138*c33452fbSAndroid Build Coastguard Worker             // Check element type matches in name
139*c33452fbSAndroid Build Coastguard Worker             if (xmlChildConfigurableElementSettingsElement.getNameAttribute() !=
140*c33452fbSAndroid Build Coastguard Worker                 pChildConfigurableElement->getName()) {
141*c33452fbSAndroid Build Coastguard Worker 
142*c33452fbSAndroid Build Coastguard Worker                 // Name error
143*c33452fbSAndroid Build Coastguard Worker                 configurationAccessContext.setError(
144*c33452fbSAndroid Build Coastguard Worker                     "Configuration settings parsing: Under configurable element " +
145*c33452fbSAndroid Build Coastguard Worker                     getQualifiedPath() + ", expected element name " +
146*c33452fbSAndroid Build Coastguard Worker                     pChildConfigurableElement->getName() + " but found " +
147*c33452fbSAndroid Build Coastguard Worker                     xmlChildConfigurableElementSettingsElement.getNameAttribute() + " instead");
148*c33452fbSAndroid Build Coastguard Worker 
149*c33452fbSAndroid Build Coastguard Worker                 return false;
150*c33452fbSAndroid Build Coastguard Worker             }
151*c33452fbSAndroid Build Coastguard Worker 
152*c33452fbSAndroid Build Coastguard Worker             // Parse child configurable element's settings
153*c33452fbSAndroid Build Coastguard Worker             if (!pChildConfigurableElement->serializeXmlSettings(
154*c33452fbSAndroid Build Coastguard Worker                     xmlChildConfigurableElementSettingsElement, configurationAccessContext)) {
155*c33452fbSAndroid Build Coastguard Worker 
156*c33452fbSAndroid Build Coastguard Worker                 return false;
157*c33452fbSAndroid Build Coastguard Worker             }
158*c33452fbSAndroid Build Coastguard Worker         }
159*c33452fbSAndroid Build Coastguard Worker         // There should remain no configurable element to parse
160*c33452fbSAndroid Build Coastguard Worker         if (it.next(xmlChildConfigurableElementSettingsElement)) {
161*c33452fbSAndroid Build Coastguard Worker 
162*c33452fbSAndroid Build Coastguard Worker             // Structure error
163*c33452fbSAndroid Build Coastguard Worker             configurationAccessContext.setError(
164*c33452fbSAndroid Build Coastguard Worker                 "Configuration settings parsing: Unexpected xml element node " +
165*c33452fbSAndroid Build Coastguard Worker                 xmlChildConfigurableElementSettingsElement.getType() + " in " + getQualifiedPath());
166*c33452fbSAndroid Build Coastguard Worker 
167*c33452fbSAndroid Build Coastguard Worker             return false;
168*c33452fbSAndroid Build Coastguard Worker         }
169*c33452fbSAndroid Build Coastguard Worker     } else {
170*c33452fbSAndroid Build Coastguard Worker         // Handle element name attribute
171*c33452fbSAndroid Build Coastguard Worker         xmlConfigurationSettingsElementContent.setNameAttribute(getName());
172*c33452fbSAndroid Build Coastguard Worker 
173*c33452fbSAndroid Build Coastguard Worker         // Propagate to children
174*c33452fbSAndroid Build Coastguard Worker         for (size_t index = 0; index < uiNbChildren; index++) {
175*c33452fbSAndroid Build Coastguard Worker 
176*c33452fbSAndroid Build Coastguard Worker             const CConfigurableElement *pChildConfigurableElement =
177*c33452fbSAndroid Build Coastguard Worker                 static_cast<const CConfigurableElement *>(getChild(index));
178*c33452fbSAndroid Build Coastguard Worker 
179*c33452fbSAndroid Build Coastguard Worker             // Create corresponding child element
180*c33452fbSAndroid Build Coastguard Worker             CXmlElement xmlChildConfigurableElementSettingsElement;
181*c33452fbSAndroid Build Coastguard Worker 
182*c33452fbSAndroid Build Coastguard Worker             xmlConfigurationSettingsElementContent.createChild(
183*c33452fbSAndroid Build Coastguard Worker                 xmlChildConfigurableElementSettingsElement,
184*c33452fbSAndroid Build Coastguard Worker                 pChildConfigurableElement->getXmlElementName());
185*c33452fbSAndroid Build Coastguard Worker 
186*c33452fbSAndroid Build Coastguard Worker             // Propagate
187*c33452fbSAndroid Build Coastguard Worker             pChildConfigurableElement->serializeXmlSettings(
188*c33452fbSAndroid Build Coastguard Worker                 xmlChildConfigurableElementSettingsElement, configurationAccessContext);
189*c33452fbSAndroid Build Coastguard Worker         }
190*c33452fbSAndroid Build Coastguard Worker     }
191*c33452fbSAndroid Build Coastguard Worker     // Done
192*c33452fbSAndroid Build Coastguard Worker     return true;
193*c33452fbSAndroid Build Coastguard Worker }
194*c33452fbSAndroid Build Coastguard Worker 
195*c33452fbSAndroid Build Coastguard Worker // AreaConfiguration creation
createAreaConfiguration(const CSyncerSet * pSyncerSet) const196*c33452fbSAndroid Build Coastguard Worker CAreaConfiguration *CConfigurableElement::createAreaConfiguration(
197*c33452fbSAndroid Build Coastguard Worker     const CSyncerSet *pSyncerSet) const
198*c33452fbSAndroid Build Coastguard Worker {
199*c33452fbSAndroid Build Coastguard Worker     return new CAreaConfiguration(this, pSyncerSet);
200*c33452fbSAndroid Build Coastguard Worker }
201*c33452fbSAndroid Build Coastguard Worker 
202*c33452fbSAndroid Build Coastguard Worker // Parameter access
accessValue(CPathNavigator & pathNavigator,std::string & strValue,bool bSet,CParameterAccessContext & parameterAccessContext) const203*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::accessValue(CPathNavigator &pathNavigator, std::string &strValue,
204*c33452fbSAndroid Build Coastguard Worker                                        bool bSet,
205*c33452fbSAndroid Build Coastguard Worker                                        CParameterAccessContext &parameterAccessContext) const
206*c33452fbSAndroid Build Coastguard Worker {
207*c33452fbSAndroid Build Coastguard Worker     std::string *pStrChildName = pathNavigator.next();
208*c33452fbSAndroid Build Coastguard Worker 
209*c33452fbSAndroid Build Coastguard Worker     if (!pStrChildName) {
210*c33452fbSAndroid Build Coastguard Worker 
211*c33452fbSAndroid Build Coastguard Worker         parameterAccessContext.setError((bSet ? "Can't set " : "Can't get ") +
212*c33452fbSAndroid Build Coastguard Worker                                         pathNavigator.getCurrentPath() +
213*c33452fbSAndroid Build Coastguard Worker                                         " because it is not a parameter");
214*c33452fbSAndroid Build Coastguard Worker 
215*c33452fbSAndroid Build Coastguard Worker         return false;
216*c33452fbSAndroid Build Coastguard Worker     }
217*c33452fbSAndroid Build Coastguard Worker 
218*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pChild =
219*c33452fbSAndroid Build Coastguard Worker         static_cast<const CConfigurableElement *>(findChild(*pStrChildName));
220*c33452fbSAndroid Build Coastguard Worker 
221*c33452fbSAndroid Build Coastguard Worker     if (!pChild) {
222*c33452fbSAndroid Build Coastguard Worker 
223*c33452fbSAndroid Build Coastguard Worker         parameterAccessContext.setError("Path not found: " + pathNavigator.getCurrentPath());
224*c33452fbSAndroid Build Coastguard Worker 
225*c33452fbSAndroid Build Coastguard Worker         return false;
226*c33452fbSAndroid Build Coastguard Worker     }
227*c33452fbSAndroid Build Coastguard Worker 
228*c33452fbSAndroid Build Coastguard Worker     return pChild->accessValue(pathNavigator, strValue, bSet, parameterAccessContext);
229*c33452fbSAndroid Build Coastguard Worker }
230*c33452fbSAndroid Build Coastguard Worker 
231*c33452fbSAndroid Build Coastguard Worker // Whole element access
getSettingsAsBytes(std::vector<uint8_t> & bytes,CParameterAccessContext & parameterAccessContext) const232*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::getSettingsAsBytes(std::vector<uint8_t> &bytes,
233*c33452fbSAndroid Build Coastguard Worker                                               CParameterAccessContext &parameterAccessContext) const
234*c33452fbSAndroid Build Coastguard Worker {
235*c33452fbSAndroid Build Coastguard Worker     bytes.resize(getFootPrint());
236*c33452fbSAndroid Build Coastguard Worker 
237*c33452fbSAndroid Build Coastguard Worker     parameterAccessContext.getParameterBlackboard()->readBytes(
238*c33452fbSAndroid Build Coastguard Worker         bytes, getOffset() - parameterAccessContext.getBaseOffset());
239*c33452fbSAndroid Build Coastguard Worker }
240*c33452fbSAndroid Build Coastguard Worker 
setSettingsAsBytes(const std::vector<uint8_t> & bytes,CParameterAccessContext & parameterAccessContext) const241*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::setSettingsAsBytes(const std::vector<uint8_t> &bytes,
242*c33452fbSAndroid Build Coastguard Worker                                               CParameterAccessContext &parameterAccessContext) const
243*c33452fbSAndroid Build Coastguard Worker {
244*c33452fbSAndroid Build Coastguard Worker     CParameterBlackboard *pParameterBlackboard = parameterAccessContext.getParameterBlackboard();
245*c33452fbSAndroid Build Coastguard Worker 
246*c33452fbSAndroid Build Coastguard Worker     // Size
247*c33452fbSAndroid Build Coastguard Worker     size_t size = getFootPrint();
248*c33452fbSAndroid Build Coastguard Worker 
249*c33452fbSAndroid Build Coastguard Worker     // Check sizes match
250*c33452fbSAndroid Build Coastguard Worker     if (size != bytes.size()) {
251*c33452fbSAndroid Build Coastguard Worker 
252*c33452fbSAndroid Build Coastguard Worker         parameterAccessContext.setError(std::string("Wrong size: Expected: ") +
253*c33452fbSAndroid Build Coastguard Worker                                         std::to_string(size) + " Provided: " +
254*c33452fbSAndroid Build Coastguard Worker                                         std::to_string(bytes.size()));
255*c33452fbSAndroid Build Coastguard Worker 
256*c33452fbSAndroid Build Coastguard Worker         return false;
257*c33452fbSAndroid Build Coastguard Worker     }
258*c33452fbSAndroid Build Coastguard Worker 
259*c33452fbSAndroid Build Coastguard Worker     // Write bytes
260*c33452fbSAndroid Build Coastguard Worker     pParameterBlackboard->writeBytes(bytes, getOffset() - parameterAccessContext.getBaseOffset());
261*c33452fbSAndroid Build Coastguard Worker 
262*c33452fbSAndroid Build Coastguard Worker     if (not parameterAccessContext.getAutoSync()) {
263*c33452fbSAndroid Build Coastguard Worker         // Auto sync is not activated, sync will be defered until an explicit request
264*c33452fbSAndroid Build Coastguard Worker         return true;
265*c33452fbSAndroid Build Coastguard Worker     }
266*c33452fbSAndroid Build Coastguard Worker 
267*c33452fbSAndroid Build Coastguard Worker     CSyncerSet syncerSet;
268*c33452fbSAndroid Build Coastguard Worker     fillSyncerSet(syncerSet);
269*c33452fbSAndroid Build Coastguard Worker     core::Results res;
270*c33452fbSAndroid Build Coastguard Worker     if (not syncerSet.sync(*parameterAccessContext.getParameterBlackboard(), false, &res)) {
271*c33452fbSAndroid Build Coastguard Worker 
272*c33452fbSAndroid Build Coastguard Worker         parameterAccessContext.setError(utility::asString(res));
273*c33452fbSAndroid Build Coastguard Worker         return false;
274*c33452fbSAndroid Build Coastguard Worker     }
275*c33452fbSAndroid Build Coastguard Worker     return true;
276*c33452fbSAndroid Build Coastguard Worker }
277*c33452fbSAndroid Build Coastguard Worker 
getConfigurableElementContext() const278*c33452fbSAndroid Build Coastguard Worker std::list<const CConfigurableElement *> CConfigurableElement::getConfigurableElementContext() const
279*c33452fbSAndroid Build Coastguard Worker {
280*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableElement *> configurableElementPath;
281*c33452fbSAndroid Build Coastguard Worker 
282*c33452fbSAndroid Build Coastguard Worker     const CElement *element = this;
283*c33452fbSAndroid Build Coastguard Worker     while (element != nullptr and isOfConfigurableElementType(element)) {
284*c33452fbSAndroid Build Coastguard Worker         auto configurableElement = static_cast<const CConfigurableElement *>(element);
285*c33452fbSAndroid Build Coastguard Worker 
286*c33452fbSAndroid Build Coastguard Worker         configurableElementPath.push_back(configurableElement);
287*c33452fbSAndroid Build Coastguard Worker         element = element->getParent();
288*c33452fbSAndroid Build Coastguard Worker     }
289*c33452fbSAndroid Build Coastguard Worker 
290*c33452fbSAndroid Build Coastguard Worker     return configurableElementPath;
291*c33452fbSAndroid Build Coastguard Worker }
292*c33452fbSAndroid Build Coastguard Worker 
293*c33452fbSAndroid Build Coastguard Worker // Used for simulation and virtual subsystems
setDefaultValues(CParameterAccessContext & parameterAccessContext) const294*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::setDefaultValues(CParameterAccessContext &parameterAccessContext) const
295*c33452fbSAndroid Build Coastguard Worker {
296*c33452fbSAndroid Build Coastguard Worker     // Propagate to children
297*c33452fbSAndroid Build Coastguard Worker     size_t uiNbChildren = getNbChildren();
298*c33452fbSAndroid Build Coastguard Worker 
299*c33452fbSAndroid Build Coastguard Worker     for (size_t index = 0; index < uiNbChildren; index++) {
300*c33452fbSAndroid Build Coastguard Worker 
301*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement =
302*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableElement *>(getChild(index));
303*c33452fbSAndroid Build Coastguard Worker 
304*c33452fbSAndroid Build Coastguard Worker         pConfigurableElement->setDefaultValues(parameterAccessContext);
305*c33452fbSAndroid Build Coastguard Worker     }
306*c33452fbSAndroid Build Coastguard Worker }
307*c33452fbSAndroid Build Coastguard Worker 
308*c33452fbSAndroid Build Coastguard Worker // Element properties
showProperties(std::string & strResult) const309*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::showProperties(std::string &strResult) const
310*c33452fbSAndroid Build Coastguard Worker {
311*c33452fbSAndroid Build Coastguard Worker     base::showProperties(strResult);
312*c33452fbSAndroid Build Coastguard Worker 
313*c33452fbSAndroid Build Coastguard Worker     strResult += "Total size: " + getFootprintAsString() + "\n";
314*c33452fbSAndroid Build Coastguard Worker }
315*c33452fbSAndroid Build Coastguard Worker 
logValue(utility::ErrorContext & context) const316*c33452fbSAndroid Build Coastguard Worker std::string CConfigurableElement::logValue(utility::ErrorContext &context) const
317*c33452fbSAndroid Build Coastguard Worker {
318*c33452fbSAndroid Build Coastguard Worker     return logValue(static_cast<CParameterAccessContext &>(context));
319*c33452fbSAndroid Build Coastguard Worker }
320*c33452fbSAndroid Build Coastguard Worker 
logValue(CParameterAccessContext &) const321*c33452fbSAndroid Build Coastguard Worker std::string CConfigurableElement::logValue(CParameterAccessContext & /*ctx*/) const
322*c33452fbSAndroid Build Coastguard Worker {
323*c33452fbSAndroid Build Coastguard Worker     // By default, an element does not have a value. Only leaf elements have
324*c33452fbSAndroid Build Coastguard Worker     // one. This method could be pure virtual but then, several derived classes
325*c33452fbSAndroid Build Coastguard Worker     // would need to implement it in order to simply return an empty string.
326*c33452fbSAndroid Build Coastguard Worker     return "";
327*c33452fbSAndroid Build Coastguard Worker }
328*c33452fbSAndroid Build Coastguard Worker 
329*c33452fbSAndroid Build Coastguard Worker // Offset
setOffset(size_t offset)330*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::setOffset(size_t offset)
331*c33452fbSAndroid Build Coastguard Worker {
332*c33452fbSAndroid Build Coastguard Worker     // Assign offset locally
333*c33452fbSAndroid Build Coastguard Worker     _offset = offset;
334*c33452fbSAndroid Build Coastguard Worker 
335*c33452fbSAndroid Build Coastguard Worker     // Propagate to children
336*c33452fbSAndroid Build Coastguard Worker     size_t uiNbChildren = getNbChildren();
337*c33452fbSAndroid Build Coastguard Worker 
338*c33452fbSAndroid Build Coastguard Worker     for (size_t index = 0; index < uiNbChildren; index++) {
339*c33452fbSAndroid Build Coastguard Worker 
340*c33452fbSAndroid Build Coastguard Worker         CConfigurableElement *pConfigurableElement =
341*c33452fbSAndroid Build Coastguard Worker             static_cast<CConfigurableElement *>(getChild(index));
342*c33452fbSAndroid Build Coastguard Worker 
343*c33452fbSAndroid Build Coastguard Worker         pConfigurableElement->setOffset(offset);
344*c33452fbSAndroid Build Coastguard Worker 
345*c33452fbSAndroid Build Coastguard Worker         offset += pConfigurableElement->getFootPrint();
346*c33452fbSAndroid Build Coastguard Worker     }
347*c33452fbSAndroid Build Coastguard Worker }
348*c33452fbSAndroid Build Coastguard Worker 
getOffset() const349*c33452fbSAndroid Build Coastguard Worker size_t CConfigurableElement::getOffset() const
350*c33452fbSAndroid Build Coastguard Worker {
351*c33452fbSAndroid Build Coastguard Worker     return _offset;
352*c33452fbSAndroid Build Coastguard Worker }
353*c33452fbSAndroid Build Coastguard Worker 
354*c33452fbSAndroid Build Coastguard Worker // Memory
getFootPrint() const355*c33452fbSAndroid Build Coastguard Worker size_t CConfigurableElement::getFootPrint() const
356*c33452fbSAndroid Build Coastguard Worker {
357*c33452fbSAndroid Build Coastguard Worker     size_t uiSize = 0;
358*c33452fbSAndroid Build Coastguard Worker     size_t uiNbChildren = getNbChildren();
359*c33452fbSAndroid Build Coastguard Worker 
360*c33452fbSAndroid Build Coastguard Worker     for (size_t index = 0; index < uiNbChildren; index++) {
361*c33452fbSAndroid Build Coastguard Worker 
362*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement =
363*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableElement *>(getChild(index));
364*c33452fbSAndroid Build Coastguard Worker 
365*c33452fbSAndroid Build Coastguard Worker         uiSize += pConfigurableElement->getFootPrint();
366*c33452fbSAndroid Build Coastguard Worker     }
367*c33452fbSAndroid Build Coastguard Worker 
368*c33452fbSAndroid Build Coastguard Worker     return uiSize;
369*c33452fbSAndroid Build Coastguard Worker }
370*c33452fbSAndroid Build Coastguard Worker 
371*c33452fbSAndroid Build Coastguard Worker // Browse parent path to find syncer
getSyncer() const372*c33452fbSAndroid Build Coastguard Worker ISyncer *CConfigurableElement::getSyncer() const
373*c33452fbSAndroid Build Coastguard Worker {
374*c33452fbSAndroid Build Coastguard Worker     // Check parent
375*c33452fbSAndroid Build Coastguard Worker     const CElement *pParent = getParent();
376*c33452fbSAndroid Build Coastguard Worker 
377*c33452fbSAndroid Build Coastguard Worker     if (isOfConfigurableElementType(pParent)) {
378*c33452fbSAndroid Build Coastguard Worker 
379*c33452fbSAndroid Build Coastguard Worker         return static_cast<const CConfigurableElement *>(pParent)->getSyncer();
380*c33452fbSAndroid Build Coastguard Worker     }
381*c33452fbSAndroid Build Coastguard Worker     return nullptr;
382*c33452fbSAndroid Build Coastguard Worker }
383*c33452fbSAndroid Build Coastguard Worker 
384*c33452fbSAndroid Build Coastguard Worker // Syncer set (me, ascendant or descendant ones)
fillSyncerSet(CSyncerSet & syncerSet) const385*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::fillSyncerSet(CSyncerSet &syncerSet) const
386*c33452fbSAndroid Build Coastguard Worker {
387*c33452fbSAndroid Build Coastguard Worker     //  Try me or ascendants
388*c33452fbSAndroid Build Coastguard Worker     ISyncer *pMineOrAscendantSyncer = getSyncer();
389*c33452fbSAndroid Build Coastguard Worker 
390*c33452fbSAndroid Build Coastguard Worker     if (pMineOrAscendantSyncer) {
391*c33452fbSAndroid Build Coastguard Worker 
392*c33452fbSAndroid Build Coastguard Worker         // Provide found syncer object
393*c33452fbSAndroid Build Coastguard Worker         syncerSet += pMineOrAscendantSyncer;
394*c33452fbSAndroid Build Coastguard Worker 
395*c33452fbSAndroid Build Coastguard Worker         // Done
396*c33452fbSAndroid Build Coastguard Worker         return;
397*c33452fbSAndroid Build Coastguard Worker     }
398*c33452fbSAndroid Build Coastguard Worker     // Fetch descendant ones
399*c33452fbSAndroid Build Coastguard Worker     fillSyncerSetFromDescendant(syncerSet);
400*c33452fbSAndroid Build Coastguard Worker }
401*c33452fbSAndroid Build Coastguard Worker 
402*c33452fbSAndroid Build Coastguard Worker // Syncer set (descendant)
fillSyncerSetFromDescendant(CSyncerSet & syncerSet) const403*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::fillSyncerSetFromDescendant(CSyncerSet &syncerSet) const
404*c33452fbSAndroid Build Coastguard Worker {
405*c33452fbSAndroid Build Coastguard Worker     // Dig
406*c33452fbSAndroid Build Coastguard Worker     size_t uiNbChildren = getNbChildren();
407*c33452fbSAndroid Build Coastguard Worker 
408*c33452fbSAndroid Build Coastguard Worker     for (size_t index = 0; index < uiNbChildren; index++) {
409*c33452fbSAndroid Build Coastguard Worker 
410*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement =
411*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableElement *>(getChild(index));
412*c33452fbSAndroid Build Coastguard Worker 
413*c33452fbSAndroid Build Coastguard Worker         pConfigurableElement->fillSyncerSetFromDescendant(syncerSet);
414*c33452fbSAndroid Build Coastguard Worker     }
415*c33452fbSAndroid Build Coastguard Worker }
416*c33452fbSAndroid Build Coastguard Worker 
417*c33452fbSAndroid Build Coastguard Worker // Configurable domain association
addAttachedConfigurableDomain(const CConfigurableDomain * pConfigurableDomain)418*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::addAttachedConfigurableDomain(
419*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain)
420*c33452fbSAndroid Build Coastguard Worker {
421*c33452fbSAndroid Build Coastguard Worker     _configurableDomainList.push_back(pConfigurableDomain);
422*c33452fbSAndroid Build Coastguard Worker }
423*c33452fbSAndroid Build Coastguard Worker 
removeAttachedConfigurableDomain(const CConfigurableDomain * pConfigurableDomain)424*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::removeAttachedConfigurableDomain(
425*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain)
426*c33452fbSAndroid Build Coastguard Worker {
427*c33452fbSAndroid Build Coastguard Worker     _configurableDomainList.remove(pConfigurableDomain);
428*c33452fbSAndroid Build Coastguard Worker }
429*c33452fbSAndroid Build Coastguard Worker 
430*c33452fbSAndroid Build Coastguard Worker // Belonging domain
belongsTo(const CConfigurableDomain * pConfigurableDomain) const431*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::belongsTo(const CConfigurableDomain *pConfigurableDomain) const
432*c33452fbSAndroid Build Coastguard Worker {
433*c33452fbSAndroid Build Coastguard Worker     if (containsConfigurableDomain(pConfigurableDomain)) {
434*c33452fbSAndroid Build Coastguard Worker 
435*c33452fbSAndroid Build Coastguard Worker         return true;
436*c33452fbSAndroid Build Coastguard Worker     }
437*c33452fbSAndroid Build Coastguard Worker     return belongsToDomainAscending(pConfigurableDomain);
438*c33452fbSAndroid Build Coastguard Worker }
439*c33452fbSAndroid Build Coastguard Worker 
440*c33452fbSAndroid Build Coastguard Worker // Belonging domains
getBelongingDomains(std::list<const CConfigurableDomain * > & configurableDomainList) const441*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::getBelongingDomains(
442*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableDomain *> &configurableDomainList) const
443*c33452fbSAndroid Build Coastguard Worker {
444*c33452fbSAndroid Build Coastguard Worker     configurableDomainList.insert(configurableDomainList.end(), _configurableDomainList.begin(),
445*c33452fbSAndroid Build Coastguard Worker                                   _configurableDomainList.end());
446*c33452fbSAndroid Build Coastguard Worker 
447*c33452fbSAndroid Build Coastguard Worker     // Check parent
448*c33452fbSAndroid Build Coastguard Worker     const CElement *pParent = getParent();
449*c33452fbSAndroid Build Coastguard Worker 
450*c33452fbSAndroid Build Coastguard Worker     if (isOfConfigurableElementType(pParent)) {
451*c33452fbSAndroid Build Coastguard Worker 
452*c33452fbSAndroid Build Coastguard Worker         static_cast<const CConfigurableElement *>(pParent)->getBelongingDomains(
453*c33452fbSAndroid Build Coastguard Worker             configurableDomainList);
454*c33452fbSAndroid Build Coastguard Worker     }
455*c33452fbSAndroid Build Coastguard Worker }
456*c33452fbSAndroid Build Coastguard Worker 
listBelongingDomains(std::string & strResult,bool bVertical) const457*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::listBelongingDomains(std::string &strResult, bool bVertical) const
458*c33452fbSAndroid Build Coastguard Worker {
459*c33452fbSAndroid Build Coastguard Worker     // Get belonging domain list
460*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableDomain *> configurableDomainList;
461*c33452fbSAndroid Build Coastguard Worker 
462*c33452fbSAndroid Build Coastguard Worker     getBelongingDomains(configurableDomainList);
463*c33452fbSAndroid Build Coastguard Worker 
464*c33452fbSAndroid Build Coastguard Worker     // Fill list
465*c33452fbSAndroid Build Coastguard Worker     listDomains(configurableDomainList, strResult, bVertical);
466*c33452fbSAndroid Build Coastguard Worker }
467*c33452fbSAndroid Build Coastguard Worker 
468*c33452fbSAndroid Build Coastguard Worker // Elements with no domains
listRogueElements(std::string & strResult) const469*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::listRogueElements(std::string &strResult) const
470*c33452fbSAndroid Build Coastguard Worker {
471*c33452fbSAndroid Build Coastguard Worker     // Get rogue element aggregate list (no associated domain)
472*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableElement *> rogueElementList;
473*c33452fbSAndroid Build Coastguard Worker 
474*c33452fbSAndroid Build Coastguard Worker     CConfigurableElementAggregator configurableElementAggregator(
475*c33452fbSAndroid Build Coastguard Worker         rogueElementList, &CConfigurableElement::hasNoDomainAssociated);
476*c33452fbSAndroid Build Coastguard Worker 
477*c33452fbSAndroid Build Coastguard Worker     configurableElementAggregator.aggegate(this);
478*c33452fbSAndroid Build Coastguard Worker 
479*c33452fbSAndroid Build Coastguard Worker     // Build list as std::string
480*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableElement *>::const_iterator it;
481*c33452fbSAndroid Build Coastguard Worker 
482*c33452fbSAndroid Build Coastguard Worker     for (it = rogueElementList.begin(); it != rogueElementList.end(); ++it) {
483*c33452fbSAndroid Build Coastguard Worker 
484*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
485*c33452fbSAndroid Build Coastguard Worker 
486*c33452fbSAndroid Build Coastguard Worker         strResult += pConfigurableElement->getPath() + "\n";
487*c33452fbSAndroid Build Coastguard Worker     }
488*c33452fbSAndroid Build Coastguard Worker }
489*c33452fbSAndroid Build Coastguard Worker 
isRogue() const490*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::isRogue() const
491*c33452fbSAndroid Build Coastguard Worker {
492*c33452fbSAndroid Build Coastguard Worker     // Check not belonging to any domin from current level and towards ascendents
493*c33452fbSAndroid Build Coastguard Worker     if (getBelongingDomainCount() != 0) {
494*c33452fbSAndroid Build Coastguard Worker 
495*c33452fbSAndroid Build Coastguard Worker         return false;
496*c33452fbSAndroid Build Coastguard Worker     }
497*c33452fbSAndroid Build Coastguard Worker 
498*c33452fbSAndroid Build Coastguard Worker     // Get a list of elements (current + descendants) with no domains associated
499*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableElement *> rogueElementList;
500*c33452fbSAndroid Build Coastguard Worker 
501*c33452fbSAndroid Build Coastguard Worker     CConfigurableElementAggregator agregator(rogueElementList,
502*c33452fbSAndroid Build Coastguard Worker                                              &CConfigurableElement::hasNoDomainAssociated);
503*c33452fbSAndroid Build Coastguard Worker 
504*c33452fbSAndroid Build Coastguard Worker     agregator.aggegate(this);
505*c33452fbSAndroid Build Coastguard Worker 
506*c33452fbSAndroid Build Coastguard Worker     // Check only one element found which ought to be current one
507*c33452fbSAndroid Build Coastguard Worker     return (rogueElementList.size() == 1) && (rogueElementList.front() == this);
508*c33452fbSAndroid Build Coastguard Worker }
509*c33452fbSAndroid Build Coastguard Worker 
510*c33452fbSAndroid Build Coastguard Worker // Footprint as string
getFootprintAsString() const511*c33452fbSAndroid Build Coastguard Worker std::string CConfigurableElement::getFootprintAsString() const
512*c33452fbSAndroid Build Coastguard Worker {
513*c33452fbSAndroid Build Coastguard Worker     // Get size as string
514*c33452fbSAndroid Build Coastguard Worker     return std::to_string(getFootPrint()) + " byte(s)";
515*c33452fbSAndroid Build Coastguard Worker }
516*c33452fbSAndroid Build Coastguard Worker 
517*c33452fbSAndroid Build Coastguard Worker // Matching check for no domain association
hasNoDomainAssociated() const518*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::hasNoDomainAssociated() const
519*c33452fbSAndroid Build Coastguard Worker {
520*c33452fbSAndroid Build Coastguard Worker     return _configurableDomainList.empty();
521*c33452fbSAndroid Build Coastguard Worker }
522*c33452fbSAndroid Build Coastguard Worker 
523*c33452fbSAndroid Build Coastguard Worker // Matching check for no valid associated domains
hasNoValidDomainAssociated() const524*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::hasNoValidDomainAssociated() const
525*c33452fbSAndroid Build Coastguard Worker {
526*c33452fbSAndroid Build Coastguard Worker     if (_configurableDomainList.empty()) {
527*c33452fbSAndroid Build Coastguard Worker 
528*c33452fbSAndroid Build Coastguard Worker         // No domains associated
529*c33452fbSAndroid Build Coastguard Worker         return true;
530*c33452fbSAndroid Build Coastguard Worker     }
531*c33452fbSAndroid Build Coastguard Worker 
532*c33452fbSAndroid Build Coastguard Worker     ConfigurableDomainListConstIterator it;
533*c33452fbSAndroid Build Coastguard Worker 
534*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable domains for validity checking
535*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableDomainList.begin(); it != _configurableDomainList.end(); ++it) {
536*c33452fbSAndroid Build Coastguard Worker 
537*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pConfigurableDomain = *it;
538*c33452fbSAndroid Build Coastguard Worker 
539*c33452fbSAndroid Build Coastguard Worker         if (pConfigurableDomain->isApplicableConfigurationValid(this)) {
540*c33452fbSAndroid Build Coastguard Worker 
541*c33452fbSAndroid Build Coastguard Worker             return false;
542*c33452fbSAndroid Build Coastguard Worker         }
543*c33452fbSAndroid Build Coastguard Worker     }
544*c33452fbSAndroid Build Coastguard Worker 
545*c33452fbSAndroid Build Coastguard Worker     return true;
546*c33452fbSAndroid Build Coastguard Worker }
547*c33452fbSAndroid Build Coastguard Worker 
548*c33452fbSAndroid Build Coastguard Worker // Owning domains
listAssociatedDomains(std::string & strResult,bool bVertical) const549*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::listAssociatedDomains(std::string &strResult, bool bVertical) const
550*c33452fbSAndroid Build Coastguard Worker {
551*c33452fbSAndroid Build Coastguard Worker     // Fill list
552*c33452fbSAndroid Build Coastguard Worker     listDomains(_configurableDomainList, strResult, bVertical);
553*c33452fbSAndroid Build Coastguard Worker }
554*c33452fbSAndroid Build Coastguard Worker 
getBelongingDomainCount() const555*c33452fbSAndroid Build Coastguard Worker size_t CConfigurableElement::getBelongingDomainCount() const
556*c33452fbSAndroid Build Coastguard Worker {
557*c33452fbSAndroid Build Coastguard Worker     // Get belonging domain list
558*c33452fbSAndroid Build Coastguard Worker     std::list<const CConfigurableDomain *> configurableDomainList;
559*c33452fbSAndroid Build Coastguard Worker 
560*c33452fbSAndroid Build Coastguard Worker     getBelongingDomains(configurableDomainList);
561*c33452fbSAndroid Build Coastguard Worker 
562*c33452fbSAndroid Build Coastguard Worker     return configurableDomainList.size();
563*c33452fbSAndroid Build Coastguard Worker }
564*c33452fbSAndroid Build Coastguard Worker 
listDomains(const std::list<const CConfigurableDomain * > & configurableDomainList,std::string & strResult,bool bVertical) const565*c33452fbSAndroid Build Coastguard Worker void CConfigurableElement::listDomains(
566*c33452fbSAndroid Build Coastguard Worker     const std::list<const CConfigurableDomain *> &configurableDomainList, std::string &strResult,
567*c33452fbSAndroid Build Coastguard Worker     bool bVertical) const
568*c33452fbSAndroid Build Coastguard Worker {
569*c33452fbSAndroid Build Coastguard Worker     // Fill list
570*c33452fbSAndroid Build Coastguard Worker     ConfigurableDomainListConstIterator it;
571*c33452fbSAndroid Build Coastguard Worker     bool bFirst = true;
572*c33452fbSAndroid Build Coastguard Worker 
573*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable domains for comparison
574*c33452fbSAndroid Build Coastguard Worker     for (it = configurableDomainList.begin(); it != configurableDomainList.end(); ++it) {
575*c33452fbSAndroid Build Coastguard Worker 
576*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pConfigurableDomain = *it;
577*c33452fbSAndroid Build Coastguard Worker 
578*c33452fbSAndroid Build Coastguard Worker         if (!bVertical && !bFirst) {
579*c33452fbSAndroid Build Coastguard Worker 
580*c33452fbSAndroid Build Coastguard Worker             strResult += ", ";
581*c33452fbSAndroid Build Coastguard Worker         }
582*c33452fbSAndroid Build Coastguard Worker 
583*c33452fbSAndroid Build Coastguard Worker         strResult += pConfigurableDomain->getName();
584*c33452fbSAndroid Build Coastguard Worker 
585*c33452fbSAndroid Build Coastguard Worker         if (bVertical) {
586*c33452fbSAndroid Build Coastguard Worker 
587*c33452fbSAndroid Build Coastguard Worker             strResult += "\n";
588*c33452fbSAndroid Build Coastguard Worker         } else {
589*c33452fbSAndroid Build Coastguard Worker 
590*c33452fbSAndroid Build Coastguard Worker             bFirst = false;
591*c33452fbSAndroid Build Coastguard Worker         }
592*c33452fbSAndroid Build Coastguard Worker     }
593*c33452fbSAndroid Build Coastguard Worker }
594*c33452fbSAndroid Build Coastguard Worker 
containsConfigurableDomain(const CConfigurableDomain * pConfigurableDomain) const595*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::containsConfigurableDomain(
596*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain) const
597*c33452fbSAndroid Build Coastguard Worker {
598*c33452fbSAndroid Build Coastguard Worker     ConfigurableDomainListConstIterator it;
599*c33452fbSAndroid Build Coastguard Worker 
600*c33452fbSAndroid Build Coastguard Worker     // Browse all configurable domains for comparison
601*c33452fbSAndroid Build Coastguard Worker     for (it = _configurableDomainList.begin(); it != _configurableDomainList.end(); ++it) {
602*c33452fbSAndroid Build Coastguard Worker 
603*c33452fbSAndroid Build Coastguard Worker         if (pConfigurableDomain == *it) {
604*c33452fbSAndroid Build Coastguard Worker 
605*c33452fbSAndroid Build Coastguard Worker             return true;
606*c33452fbSAndroid Build Coastguard Worker         }
607*c33452fbSAndroid Build Coastguard Worker     }
608*c33452fbSAndroid Build Coastguard Worker     return false;
609*c33452fbSAndroid Build Coastguard Worker }
610*c33452fbSAndroid Build Coastguard Worker 
611*c33452fbSAndroid Build Coastguard Worker // Belonging domain ascending search
belongsToDomainAscending(const CConfigurableDomain * pConfigurableDomain) const612*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::belongsToDomainAscending(
613*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain) const
614*c33452fbSAndroid Build Coastguard Worker {
615*c33452fbSAndroid Build Coastguard Worker     // Check parent
616*c33452fbSAndroid Build Coastguard Worker     const CElement *pParent = getParent();
617*c33452fbSAndroid Build Coastguard Worker 
618*c33452fbSAndroid Build Coastguard Worker     if (isOfConfigurableElementType(pParent)) {
619*c33452fbSAndroid Build Coastguard Worker 
620*c33452fbSAndroid Build Coastguard Worker         return static_cast<const CConfigurableElement *>(pParent)->belongsTo(pConfigurableDomain);
621*c33452fbSAndroid Build Coastguard Worker     }
622*c33452fbSAndroid Build Coastguard Worker     return false;
623*c33452fbSAndroid Build Coastguard Worker }
624*c33452fbSAndroid Build Coastguard Worker 
625*c33452fbSAndroid Build Coastguard Worker // Belonging subsystem
getBelongingSubsystem() const626*c33452fbSAndroid Build Coastguard Worker const CSubsystem *CConfigurableElement::getBelongingSubsystem() const
627*c33452fbSAndroid Build Coastguard Worker {
628*c33452fbSAndroid Build Coastguard Worker     const CElement *pParent = getParent();
629*c33452fbSAndroid Build Coastguard Worker 
630*c33452fbSAndroid Build Coastguard Worker     // Stop at system class
631*c33452fbSAndroid Build Coastguard Worker     if (!pParent->getParent()) {
632*c33452fbSAndroid Build Coastguard Worker 
633*c33452fbSAndroid Build Coastguard Worker         return nullptr;
634*c33452fbSAndroid Build Coastguard Worker     }
635*c33452fbSAndroid Build Coastguard Worker 
636*c33452fbSAndroid Build Coastguard Worker     return static_cast<const CConfigurableElement *>(pParent)->getBelongingSubsystem();
637*c33452fbSAndroid Build Coastguard Worker }
638*c33452fbSAndroid Build Coastguard Worker 
639*c33452fbSAndroid Build Coastguard Worker // Check element is a parameter
isParameter() const640*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::isParameter() const
641*c33452fbSAndroid Build Coastguard Worker {
642*c33452fbSAndroid Build Coastguard Worker     return false;
643*c33452fbSAndroid Build Coastguard Worker }
644*c33452fbSAndroid Build Coastguard Worker 
645*c33452fbSAndroid Build Coastguard Worker // Check parent is still of current type (by structure knowledge)
isOfConfigurableElementType(const CElement * pParent) const646*c33452fbSAndroid Build Coastguard Worker bool CConfigurableElement::isOfConfigurableElementType(const CElement *pParent) const
647*c33452fbSAndroid Build Coastguard Worker {
648*c33452fbSAndroid Build Coastguard Worker     assert(pParent);
649*c33452fbSAndroid Build Coastguard Worker 
650*c33452fbSAndroid Build Coastguard Worker     // Up to system class
651*c33452fbSAndroid Build Coastguard Worker     return !!pParent->getParent();
652*c33452fbSAndroid Build Coastguard Worker }
653