blob: 844ade754c7985dbe36bc204d68c0be3bd5976db [file] [log] [blame]
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +01001/*
David Wagnerb76c9d62014-02-05 18:30:24 +01002 * Copyright (c) 2011-2014, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation and/or
13 * other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Patrick Benavoli68a91282011-08-31 11:23:23 +020029 */
Kevin Rocardace81f82012-12-11 16:19:17 +010030#include <cassert>
Patrick Benavoli68a91282011-08-31 11:23:23 +020031#include "ConfigurableDomains.h"
32#include "ConfigurableDomain.h"
33#include "ConfigurableElement.h"
34#include "BinaryStream.h"
Patrick Benavoli6ba361d2011-08-31 11:23:24 +020035#include "AutoLog.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020036
37#define base CBinarySerializableElement
38
Sebastien Gonzalved9526492014-02-20 22:28:03 +010039using std::string;
40
Patrick Benavoli95ac0342011-11-07 20:32:51 +010041CConfigurableDomains::CConfigurableDomains()
Patrick Benavoli68a91282011-08-31 11:23:23 +020042{
43}
44
45string CConfigurableDomains::getKind() const
46{
47 return "ConfigurableDomains";
48}
49
50bool CConfigurableDomains::childrenAreDynamic() const
51{
52 return true;
53}
54
55// Ensure validity on whole domains from main blackboard
56void CConfigurableDomains::validate(const CParameterBlackboard* pMainBlackboard)
57{
58 // Delegate to domains
Patrick Benavoli911844b2014-07-23 01:27:00 +020059 size_t uiChild;
60 size_t uiNbConfigurableDomains = getNbChildren();
Patrick Benavoli68a91282011-08-31 11:23:23 +020061
62 for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
63
64 CConfigurableDomain* pChildConfigurableDomain = static_cast<CConfigurableDomain*>(getChild(uiChild));
65
66 pChildConfigurableDomain->validate(pMainBlackboard);
67 }
68}
69
70// Configuration application if required
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010071void CConfigurableDomains::apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet& syncerSet, bool bForce) const
Patrick Benavoli68a91282011-08-31 11:23:23 +020072{
Patrick Benavoli6ba361d2011-08-31 11:23:24 +020073 CAutoLog autoLog(this, "Applying configurations");
Patrick Benavoli68a91282011-08-31 11:23:23 +020074
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010075 /// Delegate to domains
Patrick Benavoli68a91282011-08-31 11:23:23 +020076
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010077 // Start with domains that can be synchronized all at once (with passed syncer set)
Patrick Benavoli911844b2014-07-23 01:27:00 +020078 size_t uiChild;
79 size_t uiNbConfigurableDomains = getNbChildren();
Patrick Benavoli68a91282011-08-31 11:23:23 +020080
81 for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
82
Patrick Benavoli63499d42011-10-24 18:50:03 +020083 const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
Patrick Benavoli68a91282011-08-31 11:23:23 +020084
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010085 // Apply and collect syncers when relevant
86 pChildConfigurableDomain->apply(pParameterBlackboard, &syncerSet, bForce);
Patrick Benavoli68a91282011-08-31 11:23:23 +020087 }
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010088 // Synchronize those collected syncers
Kevin Rocardace81f82012-12-11 16:19:17 +010089 syncerSet.sync(*pParameterBlackboard, false, NULL);
Patrick Benavoli63499d42011-10-24 18:50:03 +020090
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010091 // Then deal with domains that need to synchronize along apply
Patrick Benavoli63499d42011-10-24 18:50:03 +020092 for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
93
94 const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
95
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +010096 // Apply and synchronize when relevant
97 pChildConfigurableDomain->apply(pParameterBlackboard, NULL, bForce);
Patrick Benavoli63499d42011-10-24 18:50:03 +020098 }
Patrick Benavoli68a91282011-08-31 11:23:23 +020099}
100
101// From IXmlSource
102void CConfigurableDomains::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
103{
104 // Set attribute
105 xmlElement.setAttributeString("SystemClassName", getName());
106
David Wagner8cb5d882014-12-09 15:26:06 +0100107 base::childrenToXml(xmlElement, serializingContext);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200108}
109
110// Configuration/Domains handling
111/// Domains
112bool CConfigurableDomains::createDomain(const string& strName, string& strError)
113{
114 // Already exists?
115 if (findChild(strName)) {
116
117 strError = "Already existing configurable domain";
118
119 return false;
120 }
121
Kevin Rocardace81f82012-12-11 16:19:17 +0100122 log_info("Creating configurable domain \"%s\"", strName.c_str());
Patrick Benavoli68a91282011-08-31 11:23:23 +0200123
124 // Creation/Hierarchy
125 addChild(new CConfigurableDomain(strName));
126
127 return true;
128}
129
David Wagnerfd211972014-12-10 15:01:22 +0100130bool CConfigurableDomains::addDomain(CConfigurableDomain& domain, bool bOverwrite,
131 string& strError)
132{
133 string strErrorDrop;
134
135 string strDomainName(domain.getName());
136 CConfigurableDomain* pExistingDomain = findConfigurableDomain(strDomainName, strErrorDrop);
137
138 if (pExistingDomain) {
139 if (!bOverwrite) {
140 strError = "Can't add domain \"" + strDomainName +
141 "\" because it already exists and overwrite was not requested.";
142 return false;
143 }
144
145 deleteDomain(*pExistingDomain);
146 }
147
148 log_info("Adding configurable domain \"" + strDomainName + "\"");
149
150 addChild(&domain);
151
152 return true;
153}
154
155void CConfigurableDomains::deleteDomain(CConfigurableDomain& configurableDomain)
156{
157 log_info("Deleting configurable domain \"" + configurableDomain.getName() + "\"");
158
159 removeChild(&configurableDomain);
160
161 delete &configurableDomain;
162}
163
Patrick Benavoli68a91282011-08-31 11:23:23 +0200164bool CConfigurableDomains::deleteDomain(const string& strName, string& strError)
165{
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100166 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strName, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200167
David Wagnerfd211972014-12-10 15:01:22 +0100168 if (pConfigurableDomain) {
169 deleteDomain(*pConfigurableDomain);
170 return true;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200171 }
172
David Wagnerfd211972014-12-10 15:01:22 +0100173 return false;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200174}
175
Kevin Rocard170f0a42012-06-18 13:56:05 +0200176void CConfigurableDomains::deleteAllDomains()
177{
Kevin Rocardace81f82012-12-11 16:19:17 +0100178 log_info("Deleting all configurable domains");
Kevin Rocard170f0a42012-06-18 13:56:05 +0200179
180 //remove Children
181 clean();
182}
183
Patrick Benavoli68a91282011-08-31 11:23:23 +0200184bool CConfigurableDomains::renameDomain(const string& strName, const string& strNewName, string& strError)
185{
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100186 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strName, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200187
188 if (!pConfigurableDomain) {
189
Patrick Benavoli68a91282011-08-31 11:23:23 +0200190 return false;
191 }
192
Kevin Rocardace81f82012-12-11 16:19:17 +0100193 log_info("Renaming configurable domain \"%s\" to \"%s\"", strName.c_str(), strNewName.c_str());
Patrick Benavoli68a91282011-08-31 11:23:23 +0200194
195 // Rename
196 return pConfigurableDomain->rename(strNewName, strError);
197}
198
Patrick Benavoli63499d42011-10-24 18:50:03 +0200199bool CConfigurableDomains::setSequenceAwareness(const string& strDomain, bool bSequenceAware, string& strError)
200{
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100201 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200202
203 if (!pConfigurableDomain) {
204
Patrick Benavoli63499d42011-10-24 18:50:03 +0200205 return false;
206 }
207
208 pConfigurableDomain->setSequenceAwareness(bSequenceAware);
209
210 return true;
211}
212
213bool CConfigurableDomains::getSequenceAwareness(const string& strDomain, bool& bSequenceAware, string& strError) const
214{
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100215 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200216
217 if (!pConfigurableDomain) {
218
Patrick Benavoli63499d42011-10-24 18:50:03 +0200219 return false;
220 }
221
222 bSequenceAware = pConfigurableDomain->getSequenceAwareness();
223
224 return true;
225}
226
Patrick Benavoli68a91282011-08-31 11:23:23 +0200227/// Configurations
228bool CConfigurableDomains::listConfigurations(const string& strDomain, string& strResult) const
229{
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100230 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200231
232 if (!pConfigurableDomain) {
233
Patrick Benavoli68a91282011-08-31 11:23:23 +0200234 return false;
235 }
236 // delegate
237 pConfigurableDomain->listChildren(strResult);
238
239 return true;
240}
241
242bool CConfigurableDomains::createConfiguration(const string& strDomain, const string& strConfiguration, const CParameterBlackboard* pMainBlackboard, string& strError)
243{
244 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100245 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200246
247 if (!pConfigurableDomain) {
248
Patrick Benavoli68a91282011-08-31 11:23:23 +0200249 return false;
250 }
251 // Delegate
252 return pConfigurableDomain->createConfiguration(strConfiguration, pMainBlackboard, strError);
253}
254
255bool CConfigurableDomains::deleteConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
256{
257 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100258 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200259
260 if (!pConfigurableDomain) {
261
Patrick Benavoli68a91282011-08-31 11:23:23 +0200262 return false;
263 }
264 // Delegate
265 return pConfigurableDomain->deleteConfiguration(strConfiguration, strError);
266}
267
268bool CConfigurableDomains::renameConfiguration(const string& strDomain, const string& strConfigurationName, const string& strNewConfigurationName, string& strError)
269{
270 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100271 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200272
273 if (!pConfigurableDomain) {
274
Patrick Benavoli68a91282011-08-31 11:23:23 +0200275 return false;
276 }
277 // Delegate
278 return pConfigurableDomain->renameConfiguration(strConfigurationName, strNewConfigurationName, strError);
279}
280
281bool CConfigurableDomains::listDomainElements(const string& strDomain, string& strResult) const
282{
283 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100284 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200285
286 if (!pConfigurableDomain) {
287
Patrick Benavoli68a91282011-08-31 11:23:23 +0200288 return false;
289 }
290 // Delegate
291 pConfigurableDomain->listAssociatedToElements(strResult);
292
293 return true;
294}
295
296bool CConfigurableDomains::split(const string& strDomain, CConfigurableElement* pConfigurableElement, string& strError)
297{
298 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100299 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200300
301 if (!pConfigurableDomain) {
302
Patrick Benavoli68a91282011-08-31 11:23:23 +0200303 return false;
304 }
305 // Delegate
306 pConfigurableDomain->split(pConfigurableElement, strError);
307
308 return true;
309}
310
311void CConfigurableDomains::listAssociatedElements(string& strResult) const
312{
313 strResult = "\n";
314
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100315 std::set<const CConfigurableElement*> configurableElementSet;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200316
317 // Get all owned configurable elements
318 gatherAllOwnedConfigurableElements(configurableElementSet);
319
320 // Fill result
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100321 std::set<const CConfigurableElement*>::const_iterator it;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200322
323 for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
324
325 const CConfigurableElement* pConfigurableElement = *it;
326
327 string strAssociatedDomainList;
328
329 pConfigurableElement->listAssociatedDomains(strAssociatedDomainList, false);
330
331 strResult += pConfigurableElement->getPath() + " [" + strAssociatedDomainList + "]\n";
332 }
333}
334
335void CConfigurableDomains::listConflictingElements(string& strResult) const
336{
337 strResult = "\n";
338
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100339 std::set<const CConfigurableElement*> configurableElementSet;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200340
341 // Get all owned configurable elements
342 gatherAllOwnedConfigurableElements(configurableElementSet);
343
344 // Fill result
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100345 std::set<const CConfigurableElement*>::const_iterator it;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200346
347 for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
348
349 const CConfigurableElement* pConfigurableElement = *it;
350
351 if (pConfigurableElement->getBelongingDomainCount() > 1) {
352
353 string strBelongingDomainList;
354
355 pConfigurableElement->listBelongingDomains(strBelongingDomainList, false);
356
357 strResult += pConfigurableElement->getPath() + " contained in multiple domains: " + strBelongingDomainList + "\n";
358 }
359 }
360}
361
Patrick Benavoli63499d42011-10-24 18:50:03 +0200362void CConfigurableDomains::listDomains(string& strResult) const
363{
364 strResult = "\n";
365
366 // List domains
Patrick Benavoli911844b2014-07-23 01:27:00 +0200367 size_t uiChild;
368 size_t uiNbConfigurableDomains = getNbChildren();
Patrick Benavoli63499d42011-10-24 18:50:03 +0200369
370 for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
371
372 const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
373
374 // Name
375 strResult += pChildConfigurableDomain->getName();
376
377 // Sequence awareness
378 if (pChildConfigurableDomain->getSequenceAwareness()) {
379
Patrick Benavoli9bed7ce2011-11-20 20:04:35 +0100380 strResult += " [sequence aware]";
Patrick Benavoli63499d42011-10-24 18:50:03 +0200381 }
Patrick Benavoli9bed7ce2011-11-20 20:04:35 +0100382 strResult += "\n";
Patrick Benavoli63499d42011-10-24 18:50:03 +0200383 }
384}
385
Patrick Benavoli68a91282011-08-31 11:23:23 +0200386// Gather configurable elements owned by any domain
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100387void CConfigurableDomains::gatherAllOwnedConfigurableElements(std::set<const CConfigurableElement*>& configurableElementSet) const
Patrick Benavoli68a91282011-08-31 11:23:23 +0200388{
389 // Delegate to domains
Patrick Benavoli911844b2014-07-23 01:27:00 +0200390 size_t uiChild;
391 size_t uiNbConfigurableDomains = getNbChildren();
Patrick Benavoli68a91282011-08-31 11:23:23 +0200392
393 for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
394
395 const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
396
397 pChildConfigurableDomain->gatherConfigurableElements(configurableElementSet);
398 }
399}
400
401// Config restore
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100402bool CConfigurableDomains::restoreConfiguration(const string& strDomain, const string& strConfiguration, CParameterBlackboard* pMainBlackboard, bool bAutoSync, std::list<string>& lstrError) const
Patrick Benavoli68a91282011-08-31 11:23:23 +0200403{
Kevin Rocardace81f82012-12-11 16:19:17 +0100404 string strError;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200405 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100406 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200407
408 if (!pConfigurableDomain) {
409
Kevin Rocardace81f82012-12-11 16:19:17 +0100410 lstrError.push_back(strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200411 return false;
412 }
413 // Delegate
Kevin Rocardace81f82012-12-11 16:19:17 +0100414 return pConfigurableDomain->restoreConfiguration(strConfiguration, pMainBlackboard, bAutoSync, lstrError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200415}
416
417// Config save
418bool CConfigurableDomains::saveConfiguration(const string& strDomain, const string& strConfiguration, const CParameterBlackboard* pMainBlackboard, string& strError)
419{
420 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100421 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200422
423 if (!pConfigurableDomain) {
424
Patrick Benavoli68a91282011-08-31 11:23:23 +0200425 return false;
426 }
427 // Delegate
428 return pConfigurableDomain->saveConfiguration(strConfiguration, pMainBlackboard, strError);
429}
430
Sebastien Gonzalved9526492014-02-20 22:28:03 +0100431bool CConfigurableDomains::setElementSequence(const string& strDomain, const string& strConfiguration, const std::vector<string>& astrNewElementSequence, string& strError)
Patrick Benavoli63499d42011-10-24 18:50:03 +0200432{
433 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100434 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200435
436 if (!pConfigurableDomain) {
437
Patrick Benavoli63499d42011-10-24 18:50:03 +0200438 return false;
439 }
440
441 // Delegate to domain
442 return pConfigurableDomain->setElementSequence(strConfiguration, astrNewElementSequence, strError);
443}
444
445bool CConfigurableDomains::getElementSequence(const string& strDomain, const string& strConfiguration, string& strResult) const
446{
447 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100448 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200449
450 if (!pConfigurableDomain) {
451
Patrick Benavoli63499d42011-10-24 18:50:03 +0200452 return false;
453 }
454 // Delegate to domain
455 return pConfigurableDomain->getElementSequence(strConfiguration, strResult);
456}
457
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100458bool CConfigurableDomains::setApplicationRule(const string& strDomain, const string& strConfiguration, const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError)
459{
460 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
461
462 if (!pConfigurableDomain) {
463
464 return false;
465 }
466
467 // Delegate to domain
468 return pConfigurableDomain->setApplicationRule(strConfiguration, strApplicationRule, pSelectionCriteriaDefinition, strError);
469}
470
471bool CConfigurableDomains::clearApplicationRule(const string& strDomain, const string& strConfiguration, string& strError)
472{
473 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
474
475 if (!pConfigurableDomain) {
476
477 return false;
478 }
479
480 // Delegate to domain
481 return pConfigurableDomain->clearApplicationRule(strConfiguration, strError);
482}
483
484bool CConfigurableDomains::getApplicationRule(const string& strDomain, const string& strConfiguration, string& strResult) const
485{
486 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strResult);
487
488 if (!pConfigurableDomain) {
489
490 return false;
491 }
492
493 // Delegate to domain
494 return pConfigurableDomain->getApplicationRule(strConfiguration, strResult);
495}
496
Patrick Benavoli68a91282011-08-31 11:23:23 +0200497// Last applied configurations
498void CConfigurableDomains::listLastAppliedConfigurations(string& strResult) const
499{
Patrick Benavoli68a91282011-08-31 11:23:23 +0200500 // Browse domains
Patrick Benavoli911844b2014-07-23 01:27:00 +0200501 size_t uiChild;
502 size_t uiNbConfigurableDomains = getNbChildren();
Patrick Benavoli68a91282011-08-31 11:23:23 +0200503
504 for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
505
506 const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
507
Frédéric Boisnard8b243f52012-09-06 18:03:20 +0200508 strResult += pChildConfigurableDomain->getName() + ": " + pChildConfigurableDomain->getLastAppliedConfigurationName() + " [" + pChildConfigurableDomain->getPendingConfigurationName() + "]\n";
Patrick Benavoli68a91282011-08-31 11:23:23 +0200509 }
510}
511
512// Configurable element - domain association
513bool CConfigurableDomains::addConfigurableElementToDomain(const string& strDomain, CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError)
514{
515 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100516 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200517
518 if (!pConfigurableDomain) {
519
Patrick Benavoli68a91282011-08-31 11:23:23 +0200520 return false;
521 }
522 // Delegate
523 return pConfigurableDomain->addConfigurableElement(pConfigurableElement, pMainBlackboard, strError);
524}
525
526bool CConfigurableDomains::removeConfigurableElementFromDomain(const string& strDomain, CConfigurableElement* pConfigurableElement, string& strError)
527{
528 // Find domain
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100529 CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200530
531 if (!pConfigurableDomain) {
532
Patrick Benavoli68a91282011-08-31 11:23:23 +0200533 return false;
534 }
535 // Delegate
536 return pConfigurableDomain->removeConfigurableElement(pConfigurableElement, strError);
537}
538
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +0100539CParameterBlackboard* CConfigurableDomains::findConfigurationBlackboard(const string& strDomain,
540 const string& strConfiguration,
541 const CConfigurableElement* pConfigurableElement,
542 uint32_t& uiBaseOffset,
543 bool& bIsLastApplied,
544 string& strError) const
545{
546 log_info("Find configuration blackboard for Domain:%s, Configuration:%s, Element:%s",
547 strDomain.c_str(), strConfiguration.c_str(), pConfigurableElement->getPath().c_str());
548
549 // Find domain
550 const CConfigurableDomain* pConfigurableDomain = findConfigurableDomain(strDomain, strError);
551
552 if (!pConfigurableDomain) {
553
554 return NULL;
555 }
556
557 // Check that element belongs to the domain
558 if (!pConfigurableElement->belongsTo(pConfigurableDomain)) {
559
560 strError = "Element \"" + pConfigurableElement->getPath() + "\" does not belong to domain \"" + strDomain + "\"";
561
562 return NULL;
563 }
564
565 // Find Configuration Blackboard and Base Offset
566 return pConfigurableDomain->findConfigurationBlackboard(strConfiguration, pConfigurableElement, uiBaseOffset, bIsLastApplied, strError);
567}
568
Patrick Benavoli68a91282011-08-31 11:23:23 +0200569// Binary settings load/store
570bool CConfigurableDomains::serializeSettings(const string& strBinarySettingsFilePath, bool bOut, uint8_t uiStructureChecksum, string& strError)
571{
572 // Instantiate byte stream
573 CBinaryStream binarySettingsStream(strBinarySettingsFilePath, bOut, getDataSize(), uiStructureChecksum);
574
575 // Open file
576 if (!binarySettingsStream.open(strError)) {
577
578 strError = "Unable to open binary settings file " + strBinarySettingsFilePath + ": " + strError;
579
580 return false;
581 }
582
583 // Serialize
584 binarySerialize(binarySettingsStream);
585
586 // Close stream
587 binarySettingsStream.close();
588
589 return true;
590}
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100591
592// Domain retrieval
593CConfigurableDomain* CConfigurableDomains::findConfigurableDomain(const string& strDomain, string& strError)
594{
David Wagner12de2f22014-12-04 11:40:00 +0100595 // Call the const equivalent
596 return const_cast<CConfigurableDomain*>(
597 static_cast<const CConfigurableDomains*>(this)->findConfigurableDomain(strDomain, strError)
598 );
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100599}
600
601const CConfigurableDomain* CConfigurableDomains::findConfigurableDomain(const string& strDomain, string& strError) const
602{
603 // Find domain
604 const CConfigurableDomain* pConfigurableDomain = static_cast<const CConfigurableDomain*>(findChild(strDomain));
605
606 if (!pConfigurableDomain) {
607
608 strError = "Configurable domain " + strDomain + " not found";
609
610 return NULL;
611 }
612
613 return pConfigurableDomain;
614}