xref: /aosp_15_r20/external/parameter-framework/upstream/parameter/ConfigurableDomains.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 <cassert>
31*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableDomains.h"
32*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableDomain.h"
33*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableElement.h"
34*c33452fbSAndroid Build Coastguard Worker 
35*c33452fbSAndroid Build Coastguard Worker #define base CElement
36*c33452fbSAndroid Build Coastguard Worker 
37*c33452fbSAndroid Build Coastguard Worker using std::string;
38*c33452fbSAndroid Build Coastguard Worker 
getKind() const39*c33452fbSAndroid Build Coastguard Worker string CConfigurableDomains::getKind() const
40*c33452fbSAndroid Build Coastguard Worker {
41*c33452fbSAndroid Build Coastguard Worker     return "ConfigurableDomains";
42*c33452fbSAndroid Build Coastguard Worker }
43*c33452fbSAndroid Build Coastguard Worker 
childrenAreDynamic() const44*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::childrenAreDynamic() const
45*c33452fbSAndroid Build Coastguard Worker {
46*c33452fbSAndroid Build Coastguard Worker     return true;
47*c33452fbSAndroid Build Coastguard Worker }
48*c33452fbSAndroid Build Coastguard Worker 
49*c33452fbSAndroid Build Coastguard Worker // Ensure validity on whole domains from main blackboard
validate(const CParameterBlackboard * pMainBlackboard)50*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::validate(const CParameterBlackboard *pMainBlackboard)
51*c33452fbSAndroid Build Coastguard Worker {
52*c33452fbSAndroid Build Coastguard Worker     // Delegate to domains
53*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurableDomains = getNbChildren();
54*c33452fbSAndroid Build Coastguard Worker 
55*c33452fbSAndroid Build Coastguard Worker     for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
56*c33452fbSAndroid Build Coastguard Worker 
57*c33452fbSAndroid Build Coastguard Worker         CConfigurableDomain *pChildConfigurableDomain =
58*c33452fbSAndroid Build Coastguard Worker             static_cast<CConfigurableDomain *>(getChild(child));
59*c33452fbSAndroid Build Coastguard Worker 
60*c33452fbSAndroid Build Coastguard Worker         pChildConfigurableDomain->validate(pMainBlackboard);
61*c33452fbSAndroid Build Coastguard Worker     }
62*c33452fbSAndroid Build Coastguard Worker }
63*c33452fbSAndroid Build Coastguard Worker 
64*c33452fbSAndroid Build Coastguard Worker // Configuration application if required
apply(CParameterBlackboard * pParameterBlackboard,CSyncerSet & syncerSet,bool bForce,core::Results & infos) const65*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet &syncerSet,
66*c33452fbSAndroid Build Coastguard Worker                                  bool bForce, core::Results &infos) const
67*c33452fbSAndroid Build Coastguard Worker {
68*c33452fbSAndroid Build Coastguard Worker     /// Delegate to domains
69*c33452fbSAndroid Build Coastguard Worker 
70*c33452fbSAndroid Build Coastguard Worker     // Start with domains that can be synchronized all at once (with passed syncer set)
71*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurableDomains = getNbChildren();
72*c33452fbSAndroid Build Coastguard Worker 
73*c33452fbSAndroid Build Coastguard Worker     for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
74*c33452fbSAndroid Build Coastguard Worker 
75*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pChildConfigurableDomain =
76*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableDomain *>(getChild(child));
77*c33452fbSAndroid Build Coastguard Worker 
78*c33452fbSAndroid Build Coastguard Worker         std::string info;
79*c33452fbSAndroid Build Coastguard Worker         // Apply and collect syncers when relevant
80*c33452fbSAndroid Build Coastguard Worker         pChildConfigurableDomain->apply(pParameterBlackboard, &syncerSet, bForce, info);
81*c33452fbSAndroid Build Coastguard Worker 
82*c33452fbSAndroid Build Coastguard Worker         if (!info.empty()) {
83*c33452fbSAndroid Build Coastguard Worker             infos.push_back(info);
84*c33452fbSAndroid Build Coastguard Worker         }
85*c33452fbSAndroid Build Coastguard Worker     }
86*c33452fbSAndroid Build Coastguard Worker     // Synchronize those collected syncers
87*c33452fbSAndroid Build Coastguard Worker     syncerSet.sync(*pParameterBlackboard, false, nullptr);
88*c33452fbSAndroid Build Coastguard Worker 
89*c33452fbSAndroid Build Coastguard Worker     // Then deal with domains that need to synchronize along apply
90*c33452fbSAndroid Build Coastguard Worker     for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
91*c33452fbSAndroid Build Coastguard Worker 
92*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pChildConfigurableDomain =
93*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableDomain *>(getChild(child));
94*c33452fbSAndroid Build Coastguard Worker 
95*c33452fbSAndroid Build Coastguard Worker         std::string info;
96*c33452fbSAndroid Build Coastguard Worker         // Apply and synchronize when relevant
97*c33452fbSAndroid Build Coastguard Worker         pChildConfigurableDomain->apply(pParameterBlackboard, nullptr, bForce, info);
98*c33452fbSAndroid Build Coastguard Worker         if (!info.empty()) {
99*c33452fbSAndroid Build Coastguard Worker             infos.push_back(info);
100*c33452fbSAndroid Build Coastguard Worker         }
101*c33452fbSAndroid Build Coastguard Worker     }
102*c33452fbSAndroid Build Coastguard Worker }
103*c33452fbSAndroid Build Coastguard Worker 
104*c33452fbSAndroid Build Coastguard Worker // From IXmlSource
toXml(CXmlElement & xmlElement,CXmlSerializingContext & serializingContext) const105*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::toXml(CXmlElement &xmlElement,
106*c33452fbSAndroid Build Coastguard Worker                                  CXmlSerializingContext &serializingContext) const
107*c33452fbSAndroid Build Coastguard Worker {
108*c33452fbSAndroid Build Coastguard Worker     // Set attribute
109*c33452fbSAndroid Build Coastguard Worker     xmlElement.setAttribute("SystemClassName", getName());
110*c33452fbSAndroid Build Coastguard Worker 
111*c33452fbSAndroid Build Coastguard Worker     base::childrenToXml(xmlElement, serializingContext);
112*c33452fbSAndroid Build Coastguard Worker }
113*c33452fbSAndroid Build Coastguard Worker 
114*c33452fbSAndroid Build Coastguard Worker // Configuration/Domains handling
115*c33452fbSAndroid Build Coastguard Worker /// Domains
createDomain(const string & strName,string & strError)116*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::createDomain(const string &strName, string &strError)
117*c33452fbSAndroid Build Coastguard Worker {
118*c33452fbSAndroid Build Coastguard Worker     // Already exists?
119*c33452fbSAndroid Build Coastguard Worker     if (findChild(strName)) {
120*c33452fbSAndroid Build Coastguard Worker 
121*c33452fbSAndroid Build Coastguard Worker         strError = "Already existing configurable domain";
122*c33452fbSAndroid Build Coastguard Worker 
123*c33452fbSAndroid Build Coastguard Worker         return false;
124*c33452fbSAndroid Build Coastguard Worker     }
125*c33452fbSAndroid Build Coastguard Worker 
126*c33452fbSAndroid Build Coastguard Worker     // Creation/Hierarchy
127*c33452fbSAndroid Build Coastguard Worker     addChild(new CConfigurableDomain(strName));
128*c33452fbSAndroid Build Coastguard Worker 
129*c33452fbSAndroid Build Coastguard Worker     return true;
130*c33452fbSAndroid Build Coastguard Worker }
131*c33452fbSAndroid Build Coastguard Worker 
addDomain(CConfigurableDomain & domain,bool bOverwrite,string & strError)132*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::addDomain(CConfigurableDomain &domain, bool bOverwrite, string &strError)
133*c33452fbSAndroid Build Coastguard Worker {
134*c33452fbSAndroid Build Coastguard Worker     string strErrorDrop;
135*c33452fbSAndroid Build Coastguard Worker 
136*c33452fbSAndroid Build Coastguard Worker     string strDomainName(domain.getName());
137*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pExistingDomain = findConfigurableDomain(strDomainName, strErrorDrop);
138*c33452fbSAndroid Build Coastguard Worker 
139*c33452fbSAndroid Build Coastguard Worker     if (pExistingDomain) {
140*c33452fbSAndroid Build Coastguard Worker         if (!bOverwrite) {
141*c33452fbSAndroid Build Coastguard Worker             strError = "Can't add domain \"" + strDomainName +
142*c33452fbSAndroid Build Coastguard Worker                        "\" because it already exists and overwrite was not requested.";
143*c33452fbSAndroid Build Coastguard Worker             return false;
144*c33452fbSAndroid Build Coastguard Worker         }
145*c33452fbSAndroid Build Coastguard Worker 
146*c33452fbSAndroid Build Coastguard Worker         deleteDomain(*pExistingDomain);
147*c33452fbSAndroid Build Coastguard Worker     }
148*c33452fbSAndroid Build Coastguard Worker 
149*c33452fbSAndroid Build Coastguard Worker     addChild(&domain);
150*c33452fbSAndroid Build Coastguard Worker 
151*c33452fbSAndroid Build Coastguard Worker     return true;
152*c33452fbSAndroid Build Coastguard Worker }
153*c33452fbSAndroid Build Coastguard Worker 
deleteDomain(CConfigurableDomain & configurableDomain)154*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::deleteDomain(CConfigurableDomain &configurableDomain)
155*c33452fbSAndroid Build Coastguard Worker {
156*c33452fbSAndroid Build Coastguard Worker     removeChild(&configurableDomain);
157*c33452fbSAndroid Build Coastguard Worker 
158*c33452fbSAndroid Build Coastguard Worker     delete &configurableDomain;
159*c33452fbSAndroid Build Coastguard Worker }
160*c33452fbSAndroid Build Coastguard Worker 
deleteDomain(const string & strName,string & strError)161*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::deleteDomain(const string &strName, string &strError)
162*c33452fbSAndroid Build Coastguard Worker {
163*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strName, strError);
164*c33452fbSAndroid Build Coastguard Worker 
165*c33452fbSAndroid Build Coastguard Worker     if (pConfigurableDomain) {
166*c33452fbSAndroid Build Coastguard Worker         deleteDomain(*pConfigurableDomain);
167*c33452fbSAndroid Build Coastguard Worker         return true;
168*c33452fbSAndroid Build Coastguard Worker     }
169*c33452fbSAndroid Build Coastguard Worker 
170*c33452fbSAndroid Build Coastguard Worker     return false;
171*c33452fbSAndroid Build Coastguard Worker }
172*c33452fbSAndroid Build Coastguard Worker 
deleteAllDomains()173*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::deleteAllDomains()
174*c33452fbSAndroid Build Coastguard Worker {
175*c33452fbSAndroid Build Coastguard Worker     // remove Children
176*c33452fbSAndroid Build Coastguard Worker     clean();
177*c33452fbSAndroid Build Coastguard Worker }
178*c33452fbSAndroid Build Coastguard Worker 
renameDomain(const string & strName,const string & strNewName,string & strError)179*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::renameDomain(const string &strName, const string &strNewName,
180*c33452fbSAndroid Build Coastguard Worker                                         string &strError)
181*c33452fbSAndroid Build Coastguard Worker {
182*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strName, strError);
183*c33452fbSAndroid Build Coastguard Worker 
184*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
185*c33452fbSAndroid Build Coastguard Worker 
186*c33452fbSAndroid Build Coastguard Worker         return false;
187*c33452fbSAndroid Build Coastguard Worker     }
188*c33452fbSAndroid Build Coastguard Worker 
189*c33452fbSAndroid Build Coastguard Worker     // Rename
190*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->rename(strNewName, strError);
191*c33452fbSAndroid Build Coastguard Worker }
192*c33452fbSAndroid Build Coastguard Worker 
setSequenceAwareness(const string & strDomain,bool bSequenceAware,string & strError)193*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::setSequenceAwareness(const string &strDomain, bool bSequenceAware,
194*c33452fbSAndroid Build Coastguard Worker                                                 string &strError)
195*c33452fbSAndroid Build Coastguard Worker {
196*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
197*c33452fbSAndroid Build Coastguard Worker 
198*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
199*c33452fbSAndroid Build Coastguard Worker 
200*c33452fbSAndroid Build Coastguard Worker         return false;
201*c33452fbSAndroid Build Coastguard Worker     }
202*c33452fbSAndroid Build Coastguard Worker 
203*c33452fbSAndroid Build Coastguard Worker     pConfigurableDomain->setSequenceAwareness(bSequenceAware);
204*c33452fbSAndroid Build Coastguard Worker 
205*c33452fbSAndroid Build Coastguard Worker     return true;
206*c33452fbSAndroid Build Coastguard Worker }
207*c33452fbSAndroid Build Coastguard Worker 
getSequenceAwareness(const string & strDomain,bool & bSequenceAware,string & strError) const208*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::getSequenceAwareness(const string &strDomain, bool &bSequenceAware,
209*c33452fbSAndroid Build Coastguard Worker                                                 string &strError) const
210*c33452fbSAndroid Build Coastguard Worker {
211*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
212*c33452fbSAndroid Build Coastguard Worker 
213*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
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     bSequenceAware = pConfigurableDomain->getSequenceAwareness();
219*c33452fbSAndroid Build Coastguard Worker 
220*c33452fbSAndroid Build Coastguard Worker     return true;
221*c33452fbSAndroid Build Coastguard Worker }
222*c33452fbSAndroid Build Coastguard Worker 
223*c33452fbSAndroid Build Coastguard Worker /// Configurations
listConfigurations(const string & strDomain,string & strResult) const224*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::listConfigurations(const string &strDomain, string &strResult) const
225*c33452fbSAndroid Build Coastguard Worker {
226*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
227*c33452fbSAndroid Build Coastguard Worker 
228*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
229*c33452fbSAndroid Build Coastguard Worker 
230*c33452fbSAndroid Build Coastguard Worker         return false;
231*c33452fbSAndroid Build Coastguard Worker     }
232*c33452fbSAndroid Build Coastguard Worker     // delegate
233*c33452fbSAndroid Build Coastguard Worker     pConfigurableDomain->listChildren(strResult);
234*c33452fbSAndroid Build Coastguard Worker 
235*c33452fbSAndroid Build Coastguard Worker     return true;
236*c33452fbSAndroid Build Coastguard Worker }
237*c33452fbSAndroid Build Coastguard Worker 
createConfiguration(const string & strDomain,const string & strConfiguration,const CParameterBlackboard * pMainBlackboard,string & strError)238*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::createConfiguration(const string &strDomain,
239*c33452fbSAndroid Build Coastguard Worker                                                const string &strConfiguration,
240*c33452fbSAndroid Build Coastguard Worker                                                const CParameterBlackboard *pMainBlackboard,
241*c33452fbSAndroid Build Coastguard Worker                                                string &strError)
242*c33452fbSAndroid Build Coastguard Worker {
243*c33452fbSAndroid Build Coastguard Worker     // Find domain
244*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
245*c33452fbSAndroid Build Coastguard Worker 
246*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
247*c33452fbSAndroid Build Coastguard Worker 
248*c33452fbSAndroid Build Coastguard Worker         return false;
249*c33452fbSAndroid Build Coastguard Worker     }
250*c33452fbSAndroid Build Coastguard Worker     // Delegate
251*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->createConfiguration(strConfiguration, pMainBlackboard, strError);
252*c33452fbSAndroid Build Coastguard Worker }
253*c33452fbSAndroid Build Coastguard Worker 
deleteConfiguration(const string & strDomain,const string & strConfiguration,string & strError)254*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::deleteConfiguration(const string &strDomain,
255*c33452fbSAndroid Build Coastguard Worker                                                const string &strConfiguration, string &strError)
256*c33452fbSAndroid Build Coastguard Worker {
257*c33452fbSAndroid Build Coastguard Worker     // Find domain
258*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
259*c33452fbSAndroid Build Coastguard Worker 
260*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
261*c33452fbSAndroid Build Coastguard Worker 
262*c33452fbSAndroid Build Coastguard Worker         return false;
263*c33452fbSAndroid Build Coastguard Worker     }
264*c33452fbSAndroid Build Coastguard Worker     // Delegate
265*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->deleteConfiguration(strConfiguration, strError);
266*c33452fbSAndroid Build Coastguard Worker }
267*c33452fbSAndroid Build Coastguard Worker 
renameConfiguration(const string & strDomain,const string & strConfigurationName,const string & strNewConfigurationName,string & strError)268*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::renameConfiguration(const string &strDomain,
269*c33452fbSAndroid Build Coastguard Worker                                                const string &strConfigurationName,
270*c33452fbSAndroid Build Coastguard Worker                                                const string &strNewConfigurationName,
271*c33452fbSAndroid Build Coastguard Worker                                                string &strError)
272*c33452fbSAndroid Build Coastguard Worker {
273*c33452fbSAndroid Build Coastguard Worker     // Find domain
274*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
275*c33452fbSAndroid Build Coastguard Worker 
276*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
277*c33452fbSAndroid Build Coastguard Worker 
278*c33452fbSAndroid Build Coastguard Worker         return false;
279*c33452fbSAndroid Build Coastguard Worker     }
280*c33452fbSAndroid Build Coastguard Worker     // Delegate
281*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->renameConfiguration(strConfigurationName, strNewConfigurationName,
282*c33452fbSAndroid Build Coastguard Worker                                                     strError);
283*c33452fbSAndroid Build Coastguard Worker }
284*c33452fbSAndroid Build Coastguard Worker 
listDomainElements(const string & strDomain,string & strResult) const285*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::listDomainElements(const string &strDomain, string &strResult) const
286*c33452fbSAndroid Build Coastguard Worker {
287*c33452fbSAndroid Build Coastguard Worker     // Find domain
288*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
289*c33452fbSAndroid Build Coastguard Worker 
290*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
291*c33452fbSAndroid Build Coastguard Worker 
292*c33452fbSAndroid Build Coastguard Worker         return false;
293*c33452fbSAndroid Build Coastguard Worker     }
294*c33452fbSAndroid Build Coastguard Worker     // Delegate
295*c33452fbSAndroid Build Coastguard Worker     pConfigurableDomain->listAssociatedToElements(strResult);
296*c33452fbSAndroid Build Coastguard Worker 
297*c33452fbSAndroid Build Coastguard Worker     return true;
298*c33452fbSAndroid Build Coastguard Worker }
299*c33452fbSAndroid Build Coastguard Worker 
split(const string & domainName,CConfigurableElement * element,core::Results & infos)300*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::split(const string &domainName, CConfigurableElement *element,
301*c33452fbSAndroid Build Coastguard Worker                                  core::Results &infos)
302*c33452fbSAndroid Build Coastguard Worker {
303*c33452fbSAndroid Build Coastguard Worker     // Find domain
304*c33452fbSAndroid Build Coastguard Worker     std::string error;
305*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
306*c33452fbSAndroid Build Coastguard Worker 
307*c33452fbSAndroid Build Coastguard Worker     if (domain == nullptr) {
308*c33452fbSAndroid Build Coastguard Worker 
309*c33452fbSAndroid Build Coastguard Worker         infos.push_back(error);
310*c33452fbSAndroid Build Coastguard Worker         return false;
311*c33452fbSAndroid Build Coastguard Worker     }
312*c33452fbSAndroid Build Coastguard Worker     // Delegate
313*c33452fbSAndroid Build Coastguard Worker     domain->split(element, infos);
314*c33452fbSAndroid Build Coastguard Worker 
315*c33452fbSAndroid Build Coastguard Worker     return true;
316*c33452fbSAndroid Build Coastguard Worker }
317*c33452fbSAndroid Build Coastguard Worker 
listAssociatedElements(string & strResult) const318*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::listAssociatedElements(string &strResult) const
319*c33452fbSAndroid Build Coastguard Worker {
320*c33452fbSAndroid Build Coastguard Worker     std::set<const CConfigurableElement *> configurableElementSet;
321*c33452fbSAndroid Build Coastguard Worker 
322*c33452fbSAndroid Build Coastguard Worker     // Get all owned configurable elements
323*c33452fbSAndroid Build Coastguard Worker     gatherAllOwnedConfigurableElements(configurableElementSet);
324*c33452fbSAndroid Build Coastguard Worker 
325*c33452fbSAndroid Build Coastguard Worker     // Fill result
326*c33452fbSAndroid Build Coastguard Worker     std::set<const CConfigurableElement *>::const_iterator it;
327*c33452fbSAndroid Build Coastguard Worker 
328*c33452fbSAndroid Build Coastguard Worker     for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
329*c33452fbSAndroid Build Coastguard Worker 
330*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
331*c33452fbSAndroid Build Coastguard Worker 
332*c33452fbSAndroid Build Coastguard Worker         string strAssociatedDomainList;
333*c33452fbSAndroid Build Coastguard Worker 
334*c33452fbSAndroid Build Coastguard Worker         pConfigurableElement->listAssociatedDomains(strAssociatedDomainList, false);
335*c33452fbSAndroid Build Coastguard Worker 
336*c33452fbSAndroid Build Coastguard Worker         strResult += pConfigurableElement->getPath() + " [" + strAssociatedDomainList + "]\n";
337*c33452fbSAndroid Build Coastguard Worker     }
338*c33452fbSAndroid Build Coastguard Worker }
339*c33452fbSAndroid Build Coastguard Worker 
listConflictingElements(string & strResult) const340*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::listConflictingElements(string &strResult) const
341*c33452fbSAndroid Build Coastguard Worker {
342*c33452fbSAndroid Build Coastguard Worker     std::set<const CConfigurableElement *> configurableElementSet;
343*c33452fbSAndroid Build Coastguard Worker 
344*c33452fbSAndroid Build Coastguard Worker     // Get all owned configurable elements
345*c33452fbSAndroid Build Coastguard Worker     gatherAllOwnedConfigurableElements(configurableElementSet);
346*c33452fbSAndroid Build Coastguard Worker 
347*c33452fbSAndroid Build Coastguard Worker     // Fill result
348*c33452fbSAndroid Build Coastguard Worker     std::set<const CConfigurableElement *>::const_iterator it;
349*c33452fbSAndroid Build Coastguard Worker 
350*c33452fbSAndroid Build Coastguard Worker     for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
351*c33452fbSAndroid Build Coastguard Worker 
352*c33452fbSAndroid Build Coastguard Worker         const CConfigurableElement *pConfigurableElement = *it;
353*c33452fbSAndroid Build Coastguard Worker 
354*c33452fbSAndroid Build Coastguard Worker         if (pConfigurableElement->getBelongingDomainCount() > 1) {
355*c33452fbSAndroid Build Coastguard Worker 
356*c33452fbSAndroid Build Coastguard Worker             string strBelongingDomainList;
357*c33452fbSAndroid Build Coastguard Worker 
358*c33452fbSAndroid Build Coastguard Worker             pConfigurableElement->listBelongingDomains(strBelongingDomainList, false);
359*c33452fbSAndroid Build Coastguard Worker 
360*c33452fbSAndroid Build Coastguard Worker             strResult += pConfigurableElement->getPath() + " contained in multiple domains: " +
361*c33452fbSAndroid Build Coastguard Worker                          strBelongingDomainList + "\n";
362*c33452fbSAndroid Build Coastguard Worker         }
363*c33452fbSAndroid Build Coastguard Worker     }
364*c33452fbSAndroid Build Coastguard Worker }
365*c33452fbSAndroid Build Coastguard Worker 
listDomains(string & strResult) const366*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::listDomains(string &strResult) const
367*c33452fbSAndroid Build Coastguard Worker {
368*c33452fbSAndroid Build Coastguard Worker     // List domains
369*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurableDomains = getNbChildren();
370*c33452fbSAndroid Build Coastguard Worker 
371*c33452fbSAndroid Build Coastguard Worker     for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
372*c33452fbSAndroid Build Coastguard Worker 
373*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pChildConfigurableDomain =
374*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableDomain *>(getChild(child));
375*c33452fbSAndroid Build Coastguard Worker 
376*c33452fbSAndroid Build Coastguard Worker         // Name
377*c33452fbSAndroid Build Coastguard Worker         strResult += pChildConfigurableDomain->getName();
378*c33452fbSAndroid Build Coastguard Worker 
379*c33452fbSAndroid Build Coastguard Worker         // Sequence awareness
380*c33452fbSAndroid Build Coastguard Worker         if (pChildConfigurableDomain->getSequenceAwareness()) {
381*c33452fbSAndroid Build Coastguard Worker 
382*c33452fbSAndroid Build Coastguard Worker             strResult += " [sequence aware]";
383*c33452fbSAndroid Build Coastguard Worker         }
384*c33452fbSAndroid Build Coastguard Worker         strResult += "\n";
385*c33452fbSAndroid Build Coastguard Worker     }
386*c33452fbSAndroid Build Coastguard Worker }
387*c33452fbSAndroid Build Coastguard Worker 
388*c33452fbSAndroid Build Coastguard Worker // Gather configurable elements owned by any domain
gatherAllOwnedConfigurableElements(std::set<const CConfigurableElement * > & configurableElementSet) const389*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::gatherAllOwnedConfigurableElements(
390*c33452fbSAndroid Build Coastguard Worker     std::set<const CConfigurableElement *> &configurableElementSet) const
391*c33452fbSAndroid Build Coastguard Worker {
392*c33452fbSAndroid Build Coastguard Worker     // Delegate to domains
393*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurableDomains = getNbChildren();
394*c33452fbSAndroid Build Coastguard Worker 
395*c33452fbSAndroid Build Coastguard Worker     for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
396*c33452fbSAndroid Build Coastguard Worker 
397*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pChildConfigurableDomain =
398*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableDomain *>(getChild(child));
399*c33452fbSAndroid Build Coastguard Worker 
400*c33452fbSAndroid Build Coastguard Worker         pChildConfigurableDomain->gatherConfigurableElements(configurableElementSet);
401*c33452fbSAndroid Build Coastguard Worker     }
402*c33452fbSAndroid Build Coastguard Worker }
403*c33452fbSAndroid Build Coastguard Worker 
404*c33452fbSAndroid Build Coastguard Worker // Config restore
restoreConfiguration(const string & domainName,const string & configurationName,CParameterBlackboard * mainBlackboard,bool autoSync,core::Results & errors) const405*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::restoreConfiguration(const string &domainName,
406*c33452fbSAndroid Build Coastguard Worker                                                 const string &configurationName,
407*c33452fbSAndroid Build Coastguard Worker                                                 CParameterBlackboard *mainBlackboard, bool autoSync,
408*c33452fbSAndroid Build Coastguard Worker                                                 core::Results &errors) const
409*c33452fbSAndroid Build Coastguard Worker {
410*c33452fbSAndroid Build Coastguard Worker     string error;
411*c33452fbSAndroid Build Coastguard Worker     // Find domain
412*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
413*c33452fbSAndroid Build Coastguard Worker 
414*c33452fbSAndroid Build Coastguard Worker     if (domain == nullptr) {
415*c33452fbSAndroid Build Coastguard Worker 
416*c33452fbSAndroid Build Coastguard Worker         errors.push_back(error);
417*c33452fbSAndroid Build Coastguard Worker         return false;
418*c33452fbSAndroid Build Coastguard Worker     }
419*c33452fbSAndroid Build Coastguard Worker     // Delegate
420*c33452fbSAndroid Build Coastguard Worker     return domain->restoreConfiguration(configurationName, mainBlackboard, autoSync, errors);
421*c33452fbSAndroid Build Coastguard Worker }
422*c33452fbSAndroid Build Coastguard Worker 
423*c33452fbSAndroid Build Coastguard Worker // Config save
saveConfiguration(const string & strDomain,const string & strConfiguration,const CParameterBlackboard * pMainBlackboard,string & strError)424*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::saveConfiguration(const string &strDomain,
425*c33452fbSAndroid Build Coastguard Worker                                              const string &strConfiguration,
426*c33452fbSAndroid Build Coastguard Worker                                              const CParameterBlackboard *pMainBlackboard,
427*c33452fbSAndroid Build Coastguard Worker                                              string &strError)
428*c33452fbSAndroid Build Coastguard Worker {
429*c33452fbSAndroid Build Coastguard Worker     // Find domain
430*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
431*c33452fbSAndroid Build Coastguard Worker 
432*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
433*c33452fbSAndroid Build Coastguard Worker 
434*c33452fbSAndroid Build Coastguard Worker         return false;
435*c33452fbSAndroid Build Coastguard Worker     }
436*c33452fbSAndroid Build Coastguard Worker     // Delegate
437*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->saveConfiguration(strConfiguration, pMainBlackboard, strError);
438*c33452fbSAndroid Build Coastguard Worker }
439*c33452fbSAndroid Build Coastguard Worker 
setElementSequence(const string & strDomain,const string & strConfiguration,const std::vector<string> & astrNewElementSequence,string & strError)440*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::setElementSequence(const string &strDomain,
441*c33452fbSAndroid Build Coastguard Worker                                               const string &strConfiguration,
442*c33452fbSAndroid Build Coastguard Worker                                               const std::vector<string> &astrNewElementSequence,
443*c33452fbSAndroid Build Coastguard Worker                                               string &strError)
444*c33452fbSAndroid Build Coastguard Worker {
445*c33452fbSAndroid Build Coastguard Worker     // Find domain
446*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
447*c33452fbSAndroid Build Coastguard Worker 
448*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
449*c33452fbSAndroid Build Coastguard Worker 
450*c33452fbSAndroid Build Coastguard Worker         return false;
451*c33452fbSAndroid Build Coastguard Worker     }
452*c33452fbSAndroid Build Coastguard Worker 
453*c33452fbSAndroid Build Coastguard Worker     // Delegate to domain
454*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->setElementSequence(strConfiguration, astrNewElementSequence,
455*c33452fbSAndroid Build Coastguard Worker                                                    strError);
456*c33452fbSAndroid Build Coastguard Worker }
457*c33452fbSAndroid Build Coastguard Worker 
getElementSequence(const string & strDomain,const string & strConfiguration,string & strResult) const458*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::getElementSequence(const string &strDomain,
459*c33452fbSAndroid Build Coastguard Worker                                               const string &strConfiguration,
460*c33452fbSAndroid Build Coastguard Worker                                               string &strResult) const
461*c33452fbSAndroid Build Coastguard Worker {
462*c33452fbSAndroid Build Coastguard Worker     // Find domain
463*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
464*c33452fbSAndroid Build Coastguard Worker 
465*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
466*c33452fbSAndroid Build Coastguard Worker 
467*c33452fbSAndroid Build Coastguard Worker         return false;
468*c33452fbSAndroid Build Coastguard Worker     }
469*c33452fbSAndroid Build Coastguard Worker     // Delegate to domain
470*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->getElementSequence(strConfiguration, strResult);
471*c33452fbSAndroid Build Coastguard Worker }
472*c33452fbSAndroid Build Coastguard Worker 
setApplicationRule(const string & strDomain,const string & strConfiguration,const string & strApplicationRule,const CSelectionCriteriaDefinition * pSelectionCriteriaDefinition,string & strError)473*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::setApplicationRule(
474*c33452fbSAndroid Build Coastguard Worker     const string &strDomain, const string &strConfiguration, const string &strApplicationRule,
475*c33452fbSAndroid Build Coastguard Worker     const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition, string &strError)
476*c33452fbSAndroid Build Coastguard Worker {
477*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
478*c33452fbSAndroid Build Coastguard Worker 
479*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
480*c33452fbSAndroid Build Coastguard Worker 
481*c33452fbSAndroid Build Coastguard Worker         return false;
482*c33452fbSAndroid Build Coastguard Worker     }
483*c33452fbSAndroid Build Coastguard Worker 
484*c33452fbSAndroid Build Coastguard Worker     // Delegate to domain
485*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->setApplicationRule(strConfiguration, strApplicationRule,
486*c33452fbSAndroid Build Coastguard Worker                                                    pSelectionCriteriaDefinition, strError);
487*c33452fbSAndroid Build Coastguard Worker }
488*c33452fbSAndroid Build Coastguard Worker 
clearApplicationRule(const string & strDomain,const string & strConfiguration,string & strError)489*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::clearApplicationRule(const string &strDomain,
490*c33452fbSAndroid Build Coastguard Worker                                                 const string &strConfiguration, string &strError)
491*c33452fbSAndroid Build Coastguard Worker {
492*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
493*c33452fbSAndroid Build Coastguard Worker 
494*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
495*c33452fbSAndroid Build Coastguard Worker 
496*c33452fbSAndroid Build Coastguard Worker         return false;
497*c33452fbSAndroid Build Coastguard Worker     }
498*c33452fbSAndroid Build Coastguard Worker 
499*c33452fbSAndroid Build Coastguard Worker     // Delegate to domain
500*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->clearApplicationRule(strConfiguration, strError);
501*c33452fbSAndroid Build Coastguard Worker }
502*c33452fbSAndroid Build Coastguard Worker 
getApplicationRule(const string & strDomain,const string & strConfiguration,string & strResult) const503*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::getApplicationRule(const string &strDomain,
504*c33452fbSAndroid Build Coastguard Worker                                               const string &strConfiguration,
505*c33452fbSAndroid Build Coastguard Worker                                               string &strResult) const
506*c33452fbSAndroid Build Coastguard Worker {
507*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
508*c33452fbSAndroid Build Coastguard Worker 
509*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
510*c33452fbSAndroid Build Coastguard Worker 
511*c33452fbSAndroid Build Coastguard Worker         return false;
512*c33452fbSAndroid Build Coastguard Worker     }
513*c33452fbSAndroid Build Coastguard Worker 
514*c33452fbSAndroid Build Coastguard Worker     // Delegate to domain
515*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->getApplicationRule(strConfiguration, strResult);
516*c33452fbSAndroid Build Coastguard Worker }
517*c33452fbSAndroid Build Coastguard Worker 
518*c33452fbSAndroid Build Coastguard Worker // Last applied configurations
listLastAppliedConfigurations(string & strResult) const519*c33452fbSAndroid Build Coastguard Worker void CConfigurableDomains::listLastAppliedConfigurations(string &strResult) const
520*c33452fbSAndroid Build Coastguard Worker {
521*c33452fbSAndroid Build Coastguard Worker     // Browse domains
522*c33452fbSAndroid Build Coastguard Worker     size_t uiNbConfigurableDomains = getNbChildren();
523*c33452fbSAndroid Build Coastguard Worker 
524*c33452fbSAndroid Build Coastguard Worker     for (size_t child = 0; child < uiNbConfigurableDomains; child++) {
525*c33452fbSAndroid Build Coastguard Worker 
526*c33452fbSAndroid Build Coastguard Worker         const CConfigurableDomain *pChildConfigurableDomain =
527*c33452fbSAndroid Build Coastguard Worker             static_cast<const CConfigurableDomain *>(getChild(child));
528*c33452fbSAndroid Build Coastguard Worker 
529*c33452fbSAndroid Build Coastguard Worker         strResult += pChildConfigurableDomain->getName() + ": " +
530*c33452fbSAndroid Build Coastguard Worker                      pChildConfigurableDomain->getLastAppliedConfigurationName() + " [" +
531*c33452fbSAndroid Build Coastguard Worker                      pChildConfigurableDomain->getPendingConfigurationName() + "]\n";
532*c33452fbSAndroid Build Coastguard Worker     }
533*c33452fbSAndroid Build Coastguard Worker }
534*c33452fbSAndroid Build Coastguard Worker 
535*c33452fbSAndroid Build Coastguard Worker // Configurable element - domain association
addConfigurableElementToDomain(const string & domainName,CConfigurableElement * element,const CParameterBlackboard * mainBlackboard,core::Results & infos)536*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::addConfigurableElementToDomain(
537*c33452fbSAndroid Build Coastguard Worker     const string &domainName, CConfigurableElement *element,
538*c33452fbSAndroid Build Coastguard Worker     const CParameterBlackboard *mainBlackboard, core::Results &infos)
539*c33452fbSAndroid Build Coastguard Worker {
540*c33452fbSAndroid Build Coastguard Worker     // Find domain
541*c33452fbSAndroid Build Coastguard Worker     std::string error;
542*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *domain = findConfigurableDomain(domainName, error);
543*c33452fbSAndroid Build Coastguard Worker 
544*c33452fbSAndroid Build Coastguard Worker     if (domain == nullptr) {
545*c33452fbSAndroid Build Coastguard Worker 
546*c33452fbSAndroid Build Coastguard Worker         infos.push_back(error);
547*c33452fbSAndroid Build Coastguard Worker         return false;
548*c33452fbSAndroid Build Coastguard Worker     }
549*c33452fbSAndroid Build Coastguard Worker     // Delegate
550*c33452fbSAndroid Build Coastguard Worker     return domain->addConfigurableElement(element, mainBlackboard, infos);
551*c33452fbSAndroid Build Coastguard Worker }
552*c33452fbSAndroid Build Coastguard Worker 
removeConfigurableElementFromDomain(const string & strDomain,CConfigurableElement * pConfigurableElement,string & strError)553*c33452fbSAndroid Build Coastguard Worker bool CConfigurableDomains::removeConfigurableElementFromDomain(
554*c33452fbSAndroid Build Coastguard Worker     const string &strDomain, CConfigurableElement *pConfigurableElement, string &strError)
555*c33452fbSAndroid Build Coastguard Worker {
556*c33452fbSAndroid Build Coastguard Worker     // Find domain
557*c33452fbSAndroid Build Coastguard Worker     CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
558*c33452fbSAndroid Build Coastguard Worker 
559*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
560*c33452fbSAndroid Build Coastguard Worker 
561*c33452fbSAndroid Build Coastguard Worker         return false;
562*c33452fbSAndroid Build Coastguard Worker     }
563*c33452fbSAndroid Build Coastguard Worker     // Delegate
564*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->removeConfigurableElement(pConfigurableElement, strError);
565*c33452fbSAndroid Build Coastguard Worker }
566*c33452fbSAndroid Build Coastguard Worker 
findConfigurationBlackboard(const string & strDomain,const string & strConfiguration,const CConfigurableElement * pConfigurableElement,size_t & baseOffset,bool & bIsLastApplied,string & strError) const567*c33452fbSAndroid Build Coastguard Worker CParameterBlackboard *CConfigurableDomains::findConfigurationBlackboard(
568*c33452fbSAndroid Build Coastguard Worker     const string &strDomain, const string &strConfiguration,
569*c33452fbSAndroid Build Coastguard Worker     const CConfigurableElement *pConfigurableElement, size_t &baseOffset, bool &bIsLastApplied,
570*c33452fbSAndroid Build Coastguard Worker     string &strError) const
571*c33452fbSAndroid Build Coastguard Worker {
572*c33452fbSAndroid Build Coastguard Worker     // Find domain
573*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain = findConfigurableDomain(strDomain, strError);
574*c33452fbSAndroid Build Coastguard Worker 
575*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
576*c33452fbSAndroid Build Coastguard Worker 
577*c33452fbSAndroid Build Coastguard Worker         return nullptr;
578*c33452fbSAndroid Build Coastguard Worker     }
579*c33452fbSAndroid Build Coastguard Worker 
580*c33452fbSAndroid Build Coastguard Worker     // Check that element belongs to the domain
581*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableElement->belongsTo(pConfigurableDomain)) {
582*c33452fbSAndroid Build Coastguard Worker 
583*c33452fbSAndroid Build Coastguard Worker         strError = "Element \"" + pConfigurableElement->getPath() +
584*c33452fbSAndroid Build Coastguard Worker                    "\" does not belong to domain \"" + strDomain + "\"";
585*c33452fbSAndroid Build Coastguard Worker 
586*c33452fbSAndroid Build Coastguard Worker         return nullptr;
587*c33452fbSAndroid Build Coastguard Worker     }
588*c33452fbSAndroid Build Coastguard Worker 
589*c33452fbSAndroid Build Coastguard Worker     // Find Configuration Blackboard and Base Offset
590*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain->findConfigurationBlackboard(strConfiguration, pConfigurableElement,
591*c33452fbSAndroid Build Coastguard Worker                                                             baseOffset, bIsLastApplied, strError);
592*c33452fbSAndroid Build Coastguard Worker }
593*c33452fbSAndroid Build Coastguard Worker 
594*c33452fbSAndroid Build Coastguard Worker // Domain retrieval
findConfigurableDomain(const string & strDomain,string & strError)595*c33452fbSAndroid Build Coastguard Worker CConfigurableDomain *CConfigurableDomains::findConfigurableDomain(const string &strDomain,
596*c33452fbSAndroid Build Coastguard Worker                                                                   string &strError)
597*c33452fbSAndroid Build Coastguard Worker {
598*c33452fbSAndroid Build Coastguard Worker     // Call the const equivalent
599*c33452fbSAndroid Build Coastguard Worker     return const_cast<CConfigurableDomain *>(
600*c33452fbSAndroid Build Coastguard Worker         static_cast<const CConfigurableDomains *>(this)->findConfigurableDomain(strDomain,
601*c33452fbSAndroid Build Coastguard Worker                                                                                 strError));
602*c33452fbSAndroid Build Coastguard Worker }
603*c33452fbSAndroid Build Coastguard Worker 
findConfigurableDomain(const string & strDomain,string & strError) const604*c33452fbSAndroid Build Coastguard Worker const CConfigurableDomain *CConfigurableDomains::findConfigurableDomain(const string &strDomain,
605*c33452fbSAndroid Build Coastguard Worker                                                                         string &strError) const
606*c33452fbSAndroid Build Coastguard Worker {
607*c33452fbSAndroid Build Coastguard Worker     // Find domain
608*c33452fbSAndroid Build Coastguard Worker     const CConfigurableDomain *pConfigurableDomain =
609*c33452fbSAndroid Build Coastguard Worker         static_cast<const CConfigurableDomain *>(findChild(strDomain));
610*c33452fbSAndroid Build Coastguard Worker 
611*c33452fbSAndroid Build Coastguard Worker     if (!pConfigurableDomain) {
612*c33452fbSAndroid Build Coastguard Worker 
613*c33452fbSAndroid Build Coastguard Worker         strError = "Configurable domain " + strDomain + " not found";
614*c33452fbSAndroid Build Coastguard Worker 
615*c33452fbSAndroid Build Coastguard Worker         return nullptr;
616*c33452fbSAndroid Build Coastguard Worker     }
617*c33452fbSAndroid Build Coastguard Worker 
618*c33452fbSAndroid Build Coastguard Worker     return pConfigurableDomain;
619*c33452fbSAndroid Build Coastguard Worker }
620