blob: ec6e1863c4eb12c1b61f18ed0c738f99c5f9c2c5 [file] [log] [blame]
Kevin Rocard93250d12012-07-19 17:48:30 +02001/*
Patrick Benavoli68a91282011-08-31 11:23:23 +02002 * INTEL CONFIDENTIAL
3 * Copyright © 2011 Intel
4 * Corporation All Rights Reserved.
5 *
6 * The source code contained or described herein and all documents related to
7 * the source code ("Material") are owned by Intel Corporation or its suppliers
8 * or licensors. Title to the Material remains with Intel Corporation or its
9 * suppliers and licensors. The Material contains trade secrets and proprietary
10 * and confidential information of Intel or its suppliers and licensors. The
11 * Material is protected by worldwide copyright and trade secret laws and
12 * treaty provisions. No part of the Material may be used, copied, reproduced,
13 * modified, published, uploaded, posted, transmitted, distributed, or
14 * disclosed in any way without Intel’s prior express written permission.
15 *
16 * No license under any patent, copyright, trade secret or other intellectual
17 * property right is granted to or conferred upon you by disclosure or delivery
18 * of the Materials, either expressly, by implication, inducement, estoppel or
19 * otherwise. Any license under such intellectual property rights must be
20 * express and approved by Intel in writing.
21 *
Patrick Benavoli68a91282011-08-31 11:23:23 +020022 * CREATED: 2011-06-01
23 * UPDATED: 2011-07-27
Patrick Benavoli68a91282011-08-31 11:23:23 +020024 */
25#include "DomainConfiguration.h"
26#include "AreaConfiguration.h"
27#include "ConfigurableElement.h"
28#include "CompoundRule.h"
Patrick Benavoli63499d42011-10-24 18:50:03 +020029#include "Subsystem.h"
30#include "XmlDomainSerializingContext.h"
31#include "ConfigurationAccessContext.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020032#include <assert.h>
Patrick Benavoli0bd50542011-11-29 11:10:27 +010033#include "RuleParser.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020034
35#define base CBinarySerializableElement
36
37CDomainConfiguration::CDomainConfiguration(const string& strName) : base(strName)
38{
39}
40
41CDomainConfiguration::~CDomainConfiguration()
42{
43 AreaConfigurationListIterator it;
44
45 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
46
47 delete *it;
48 }
49}
50
51// Class kind
52string CDomainConfiguration::getKind() const
53{
54 return "Configuration";
55}
56
57// Child dynamic creation
58bool CDomainConfiguration::childrenAreDynamic() const
59{
60 return true;
61}
62
63// XML configuration settings parsing
Patrick Benavoli63499d42011-10-24 18:50:03 +020064bool CDomainConfiguration::parseSettings(CXmlElement& xmlConfigurationSettingsElement, CXmlSerializingContext& serializingContext)
Patrick Benavoli68a91282011-08-31 11:23:23 +020065{
Patrick Benavoli63499d42011-10-24 18:50:03 +020066 // Actual XML context
67 CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
Patrick Benavoli68a91282011-08-31 11:23:23 +020068
Patrick Benavoli63499d42011-10-24 18:50:03 +020069 // Take care of configurable elements / area configurations ranks
70 list<CAreaConfiguration*> areaConfigurationList;
Patrick Benavoli68a91282011-08-31 11:23:23 +020071
Patrick Benavoli63499d42011-10-24 18:50:03 +020072 // Parse configurable element's configuration settings
73 CXmlElement::CChildIterator it(xmlConfigurationSettingsElement);
74
75 CXmlElement xmlConfigurableElementSettingsElement;
76
77 while (it.next(xmlConfigurableElementSettingsElement)) {
78
79 // Retrieve area configuration
80 string strConfigurableElementPath = xmlConfigurableElementSettingsElement.getAttributeString("Path");
81
82 CAreaConfiguration* pAreaConfiguration = findAreaConfiguration(strConfigurableElementPath);
83
84 if (!pAreaConfiguration) {
85
86 xmlDomainSerializingContext.setError("Configurable Element " + strConfigurableElementPath + " referred to by Configuration " + getPath() + " not associated to Domain");
87
88 return false;
89 }
90 // Ranks
91 areaConfigurationList.push_back(pAreaConfiguration);
92
93 // Parse
94 if (!serializeConfigurableElementSettings(pAreaConfiguration, xmlConfigurableElementSettingsElement, xmlDomainSerializingContext, false)) {
95
96 return false;
97 }
98 }
99
100 // Reorder area configurations according to XML content
101 reorderAreaConfigurations(areaConfigurationList);
102
103 return true;
104}
105
106// XML configuration settings composing
107void CDomainConfiguration::composeSettings(CXmlElement& xmlConfigurationSettingsElement, CXmlSerializingContext& serializingContext) const
108{
109 // Go through all are configurations
110 AreaConfigurationListIterator it;
111
112 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) {
113
114 const CAreaConfiguration* pAreaConfiguration = *it;
115
116 // Retrieve configurable element
117 const CConfigurableElement* pConfigurableElement = pAreaConfiguration->getConfigurableElement();
118
119 // Create configurable element child element
120 CXmlElement xmlConfigurableElementSettingsElement;
121
122 xmlConfigurationSettingsElement.createChild(xmlConfigurableElementSettingsElement, "ConfigurableElement");
123
124 // Set Path attribute
125 xmlConfigurableElementSettingsElement.setAttributeString("Path", pConfigurableElement->getPath());
126
127 // Delegate composing to area configuration
128 ((CDomainConfiguration&)(*this)).serializeConfigurableElementSettings((CAreaConfiguration*)pAreaConfiguration, xmlConfigurableElementSettingsElement, serializingContext, true);
129 }
130}
131
132// Serialize one configuration for one configurable element
133bool CDomainConfiguration::serializeConfigurableElementSettings(CAreaConfiguration* pAreaConfiguration, CXmlElement& xmlConfigurableElementSettingsElement, CXmlSerializingContext& serializingContext, bool bSerializeOut)
134{
135 // Actual XML context
136 CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
137
138 // Configurable Element
139 const CConfigurableElement* pConfigurableElement = pAreaConfiguration->getConfigurableElement();
140
141 // Element content
142 CXmlElement xmlConfigurableElementSettingsElementContent;
143
144 // Deal with element itself
145 if (!bSerializeOut) {
146
147 // Check structure
148 if (xmlConfigurableElementSettingsElement.getNbChildElements() != 1) {
149
150 // Structure error
151 serializingContext.setError("Struture error encountered while parsing settings of " + pConfigurableElement->getKind() + " " + pConfigurableElement->getName() + " in Configuration " + getPath());
152
153 return false;
154 }
155
156 // Check name and kind
157 if (!xmlConfigurableElementSettingsElement.getChildElement(pConfigurableElement->getKind(), pConfigurableElement->getName(), xmlConfigurableElementSettingsElementContent)) {
158
159 serializingContext.setError("Couldn't find settings for " + pConfigurableElement->getKind() + " " + pConfigurableElement->getName() + " for Configuration " + getPath());
160
161 return false;
162 }
163 } else {
164
165 // Create child XML element
166 xmlConfigurableElementSettingsElement.createChild(xmlConfigurableElementSettingsElementContent, pConfigurableElement->getKind());
167
168 // Set Name
169 xmlConfigurableElementSettingsElementContent.setNameAttribute(pConfigurableElement->getName());
170 }
171
172 // Change context type to parameter settings access
173 string strError;
174
175 // Create configuration access context
176 CConfigurationAccessContext configurationAccessContext(strError, bSerializeOut);
177
178 // Provide current value space
179 configurationAccessContext.setValueSpaceRaw(xmlDomainSerializingContext.valueSpaceIsRaw());
180
181 // Provide current output raw format
182 configurationAccessContext.setOutputRawFormat(xmlDomainSerializingContext.outputRawFormatIsHex());
183
184 // Get subsystem
185 const CSubsystem* pSubsystem = pConfigurableElement->getBelongingSubsystem();
186
187 if (pSubsystem && pSubsystem != pConfigurableElement) {
188
189 // Element is a descendant of subsystem
190
191 // Deal with Endianness
192 configurationAccessContext.setBigEndianSubsystem(pSubsystem->isBigEndian());
193 }
194
195 // Have domain configuration parse settings for configurable element
196 if (!pAreaConfiguration->serializeXmlSettings(xmlConfigurableElementSettingsElementContent, configurationAccessContext)) {
197
198 // Forward error
199 xmlDomainSerializingContext.setError(strError);
200
201 return false;
202 }
203 return true;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200204}
205
206// Configurable Elements association
Patrick Benavoli63499d42011-10-24 18:50:03 +0200207void CDomainConfiguration::addConfigurableElement(const CConfigurableElement* pConfigurableElement, const CSyncerSet* pSyncerSet)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200208{
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200209 CAreaConfiguration* pAreaConfiguration = pConfigurableElement->createAreaConfiguration(pSyncerSet);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200210
211 _areaConfigurationList.push_back(pAreaConfiguration);
212 _orderedAreaConfigurationList.push_back(pAreaConfiguration);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200213}
214
215void CDomainConfiguration::removeConfigurableElement(const CConfigurableElement* pConfigurableElement)
216{
217 CAreaConfiguration* pAreaConfigurationToRemove = getAreaConfiguration(pConfigurableElement);
218
219 _areaConfigurationList.remove(pAreaConfigurationToRemove);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200220 _orderedAreaConfigurationList.remove(pAreaConfigurationToRemove);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200221
222 delete pAreaConfigurationToRemove;
223}
224
Patrick Benavoli63499d42011-10-24 18:50:03 +0200225// Sequence management
226bool CDomainConfiguration::setElementSequence(const vector<string>& astrNewElementSequence, string& strError)
227{
228 // Build a new list of AreaConfiguration objects
229 list<CAreaConfiguration*> areaConfigurationList;
230
231 uint32_t uiConfigurableElement;
232
233 for (uiConfigurableElement = 0; uiConfigurableElement < astrNewElementSequence.size(); uiConfigurableElement++) {
234
235 string strConfigurableElementPath = astrNewElementSequence[uiConfigurableElement];
236
237 CAreaConfiguration* pAreaConfiguration = findAreaConfiguration(strConfigurableElementPath);
238
239 if (!pAreaConfiguration) {
240
241 strError = "Element " + strConfigurableElementPath + " not found in domain";
242
243 return false;
244 }
245 // Check not already present in the list
246 if (findAreaConfiguration(strConfigurableElementPath, areaConfigurationList)) {
247
248 strError = "Element " + strConfigurableElementPath + " provided more than once";
249
250 return false;
251 }
252
253 // Store new ordered area configuration
254 areaConfigurationList.push_back(pAreaConfiguration);
255 }
256
257 // Reorder area configurations according to given path list
258 reorderAreaConfigurations(areaConfigurationList);
259
260 return true;
261}
262
263void CDomainConfiguration::getElementSequence(string& strResult) const
264{
265 strResult = "\n";
266
267 AreaConfigurationListIterator it;
268
269 // List configurable element paths out of ordered area configuration list
270 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) {
271
272 const CAreaConfiguration* pAreaConfiguration = *it;
273
274 const CConfigurableElement* pConfigurableElement = pAreaConfiguration->getConfigurableElement();
275
276 strResult += pConfigurableElement->getPath() + "\n";
277 }
278}
279
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100280// Application rule
281bool CDomainConfiguration::setApplicationRule(const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError)
282{
283 // Parser
284 CRuleParser ruleParser(strApplicationRule, pSelectionCriteriaDefinition);
285
286 // Attempt to parse it
287 if (!ruleParser.parse(NULL, strError)) {
288
289 return false;
290 }
291 // Replace compound rule
292 setRule(ruleParser.grabRootRule());
293
294 return true;
295}
296
297void CDomainConfiguration::clearApplicationRule()
298{
299 // Replace compound rule
300 setRule(NULL);
301}
302
303void CDomainConfiguration::getApplicationRule(string& strResult) const
304{
305 // Rule
306 const CCompoundRule* pRule = getRule();
307
308 if (pRule) {
309 // Start clear
310 strResult.clear();
311
312 // Dump rule
313 pRule->dump(strResult);
314
315 } else {
316
317 strResult = "<none>";
318 }
319}
320
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +0100321/**
322 * Get the Configuration Blackboard.
323 *
324 * Fetch the Configuration Blackboard related to the ConfigurableElement given in parameter. This
325 * Element is used to retrieve the correct AreaConfiguration where the Blackboard is stored.
326 *
327 * @param[in] pConfigurableElement A pointer to a ConfigurableElement that is part of the
328 * Domain. This must have been checked previously, as an
329 * assertion is performed.
330 *
331 * return Pointer to the Blackboard of the Configuration.
332 */
333CParameterBlackboard* CDomainConfiguration::getBlackboard(const CConfigurableElement* pConfigurableElement) const
334{
335 AreaConfigurationListIterator it;
336
337 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
338
339 CAreaConfiguration* pAreaConfiguration = *it;
340
341 // Check if the Element is associated with the Domain
342 if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) {
343
344 return &pAreaConfiguration->getBlackboard();
345 }
346 }
347
348 assert(0);
349 return NULL;
350}
351
Patrick Benavoli68a91282011-08-31 11:23:23 +0200352// Save data from current
353void CDomainConfiguration::save(const CParameterBlackboard* pMainBlackboard)
354{
355 AreaConfigurationListIterator it;
356
357 // Just propagate to areas
358 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
359
360 CAreaConfiguration* pAreaConfiguration = *it;
361
362 pAreaConfiguration->save(pMainBlackboard);
363 }
364}
365
366// Apply data to current
Kevin Rocardace81f82012-12-11 16:19:17 +0100367bool CDomainConfiguration::restore(CParameterBlackboard* pMainBlackboard, bool bSync, list<string>* plstrError) const
Patrick Benavoli68a91282011-08-31 11:23:23 +0200368{
Kevin Rocardace81f82012-12-11 16:19:17 +0100369 bool bSuccess = true;
370
Patrick Benavoli68a91282011-08-31 11:23:23 +0200371 AreaConfigurationListIterator it;
372
373 // Just propagate to areas
Patrick Benavoli63499d42011-10-24 18:50:03 +0200374 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) {
Patrick Benavoli68a91282011-08-31 11:23:23 +0200375
376 const CAreaConfiguration* pAreaConfiguration = *it;
377
Kevin Rocardace81f82012-12-11 16:19:17 +0100378 bSuccess &= pAreaConfiguration->restore(pMainBlackboard, bSync, plstrError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200379 }
Patrick Benavoli63499d42011-10-24 18:50:03 +0200380
Kevin Rocardace81f82012-12-11 16:19:17 +0100381 return bSuccess;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200382}
383
384// Ensure validity for configurable element area configuration
385void CDomainConfiguration::validate(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard)
386{
387 CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
388
389 // Delegate
390 pAreaConfigurationToValidate->validate(pMainBlackboard);
391}
392
393// Ensure validity of all area configurations
394void CDomainConfiguration::validate(const CParameterBlackboard* pMainBlackboard)
395{
396 AreaConfigurationListIterator it;
397
398 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
399
400 CAreaConfiguration* pAreaConfiguration = *it;
401
402 pAreaConfiguration->validate(pMainBlackboard);
403 }
404}
405
406// Return configuration validity for given configurable element
407bool CDomainConfiguration::isValid(const CConfigurableElement* pConfigurableElement) const
408{
409 // Get child configurable elemnt's area configuration
410 CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement);
411
412 assert(pAreaConfiguration);
413
414 return pAreaConfiguration->isValid();
415}
416
417// Ensure validity of configurable element's area configuration by copying in from a valid one
418void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration, const CConfigurableElement* pConfigurableElement)
419{
420 // Retrieve related area configurations
421 CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
422 const CAreaConfiguration* pAreaConfigurationToValidateAgainst = pValidDomainConfiguration->getAreaConfiguration(pConfigurableElement);
423
424 // Delegate to area
425 pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
426}
427
428// Ensure validity of all configurable element's area configuration by copying in from a valid ones
429void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration)
430{
431 // Copy in configuration data from against domain
432 AreaConfigurationListIterator it, itAgainst;
433
434 for (it = _areaConfigurationList.begin(), itAgainst = pValidDomainConfiguration->_areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it, ++itAgainst) {
435
436 CAreaConfiguration* pAreaConfigurationToValidate = *it;
437 const CAreaConfiguration* pAreaConfigurationToValidateAgainst = *itAgainst;
438
439 // Delegate to area
440 pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
441 }
442}
443
444// Dynamic data application
445bool CDomainConfiguration::isApplicable() const
446{
447 const CCompoundRule* pRule = getRule();
448
449 return pRule && pRule->matches();
450}
451
452// Merge existing configurations to given configurable element ones
453void CDomainConfiguration::merge(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement)
454{
455 // Retrieve related area configurations
456 CAreaConfiguration* pAreaConfigurationToMergeTo = getAreaConfiguration(pToConfigurableElement);
457 const CAreaConfiguration* pAreaConfigurationToMergeFrom = getAreaConfiguration(pFromConfigurableElement);
458
459 // Do the merge
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200460 pAreaConfigurationToMergeFrom->copyToOuter(pAreaConfigurationToMergeTo);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200461}
462
463// Domain splitting
464void CDomainConfiguration::split(CConfigurableElement* pFromConfigurableElement)
465{
466 // Retrieve related area configuration
467 const CAreaConfiguration* pAreaConfigurationToSplitFrom = getAreaConfiguration(pFromConfigurableElement);
468
469 // Go through children areas to copy configuration data to them
470 uint32_t uiNbConfigurableElementChildren = pFromConfigurableElement->getNbChildren();
471 uint32_t uiChild;
472
473 for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
474
475 CConfigurableElement* pToChildConfigurableElement = static_cast<CConfigurableElement*>(pFromConfigurableElement->getChild(uiChild));
476
477 // Get child configurable elemnt's area configuration
478 CAreaConfiguration* pChildAreaConfiguration = getAreaConfiguration(pToChildConfigurableElement);
479
480 // Do the copy
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200481 pChildAreaConfiguration->copyFromOuter(pAreaConfigurationToSplitFrom);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200482 }
483}
484
485// AreaConfiguration retrieval from configurable element
486CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(const CConfigurableElement* pConfigurableElement) const
487{
488 AreaConfigurationListIterator it;
489
490 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
491
492 CAreaConfiguration* pAreaConfiguration = *it;
493
494 if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) {
495
496 return pAreaConfiguration;
497 }
498 }
499 // Not found?
500 assert(0);
501
502 return NULL;
503}
504
Patrick Benavoli63499d42011-10-24 18:50:03 +0200505// AreaConfiguration retrieval from present area configurations
506CAreaConfiguration* CDomainConfiguration::findAreaConfiguration(const string& strConfigurableElementPath) const
507{
Patrick Benavoli4bed9212011-10-27 14:18:00 +0200508 return findAreaConfiguration(strConfigurableElementPath, _areaConfigurationList);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200509}
510
511// AreaConfiguration retrieval from given area configuration list
512CAreaConfiguration* CDomainConfiguration::findAreaConfiguration(const string& strConfigurableElementPath, const list<CAreaConfiguration*>& areaConfigurationList) const
513{
514 AreaConfigurationListIterator it;
515
516 for (it = areaConfigurationList.begin(); it != areaConfigurationList.end(); ++it) {
517
518 CAreaConfiguration* pAreaConfiguration = *it;
519
520 if (pAreaConfiguration->getConfigurableElement()->getPath() == strConfigurableElementPath) {
521
522 return pAreaConfiguration;
523 }
524 }
525
526 // Not found
527 return NULL;
528}
529
530// Area configuration ordering
531void CDomainConfiguration::reorderAreaConfigurations(const list<CAreaConfiguration*>& areaConfigurationList)
532{
533 // Ensure elements in provided list appear first and ordered the same way in internal one
534
535 // Remove all elements present in the provided list from the internal one
536 AreaConfigurationListIterator it;
537
538 for (it = areaConfigurationList.begin(); it != areaConfigurationList.end(); ++it) {
539
540 _orderedAreaConfigurationList.remove(*it);
541 }
542
543 // Prepended provided elements into internal list
544 _orderedAreaConfigurationList.insert(_orderedAreaConfigurationList.begin(), areaConfigurationList.begin(), areaConfigurationList.end());
545}
546
547// Find area configuration rank from regular list: for ordered list maintainance
548uint32_t CDomainConfiguration::getAreaConfigurationRank(const CAreaConfiguration* pAreaConfiguration) const
549{
550 uint32_t uiAreaConfigurationRank;
551 AreaConfigurationListIterator it;
552
553 // Propagate request to areas
554 for (it = _areaConfigurationList.begin(), uiAreaConfigurationRank = 0; it != _areaConfigurationList.end(); ++it, ++uiAreaConfigurationRank) {
555
556 if (*it == pAreaConfiguration) {
557
558 return uiAreaConfigurationRank;
559 }
560 }
561
562 assert(0);
563
564 return 0;
565}
566
567// Find area configuration from regular list based on rank: for ordered list maintainance
568CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(uint32_t uiAreaConfigurationRank) const
569{
570 AreaConfigurationListIterator it;
571 uint32_t uiCurrentAreaConfigurationRank;
572
573 // Propagate request to areas
574 for (it = _areaConfigurationList.begin(), uiCurrentAreaConfigurationRank = 0; it != _areaConfigurationList.end(); ++it, ++uiCurrentAreaConfigurationRank) {
575
576 if (uiCurrentAreaConfigurationRank == uiAreaConfigurationRank) {
577
578 return *it;
579 }
580 }
581
582 assert(0);
583
584 return NULL;
585}
586
Patrick Benavoli68a91282011-08-31 11:23:23 +0200587// Rule
588const CCompoundRule* CDomainConfiguration::getRule() const
589{
590 if (getNbChildren()) {
591 // Rule created
592 return static_cast<const CCompoundRule*>(getChild(ECompoundRule));
593 }
594 return NULL;
595}
596
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100597CCompoundRule* CDomainConfiguration::getRule()
598{
599 if (getNbChildren()) {
600 // Rule created
601 return static_cast<CCompoundRule*>(getChild(ECompoundRule));
602 }
603 return NULL;
604}
605
606void CDomainConfiguration::setRule(CCompoundRule* pRule)
607{
608 CCompoundRule* pOldRule = getRule();
609
610 if (pOldRule) {
611 // Remove previous rule
612 removeChild(pOldRule);
613
614 delete pOldRule;
615 }
616
617 // Set new one
618 if (pRule) {
619 // Chain
620 addChild(pRule);
621 }
622}
623
Patrick Benavoli68a91282011-08-31 11:23:23 +0200624// Serialization
625void CDomainConfiguration::binarySerialize(CBinaryStream& binaryStream)
626{
627 AreaConfigurationListIterator it;
628
Patrick Benavoli63499d42011-10-24 18:50:03 +0200629 // Area configurations order
630 if (binaryStream.isOut()) {
631
632 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) {
633
634 // Get rank
635 uint32_t uiAreaConfigurationRank = getAreaConfigurationRank(*it);
636
637 // Store it
638 binaryStream.write((const uint8_t*)&uiAreaConfigurationRank, sizeof(uiAreaConfigurationRank));
639 }
640 } else {
641
642 // Empty ordered list first
643 _orderedAreaConfigurationList.resize(0);
644
645 uint32_t uiAreaConfiguration;
646
647 for (uiAreaConfiguration = 0; uiAreaConfiguration < _areaConfigurationList.size(); uiAreaConfiguration++) {
648
649 // Get rank
650 uint32_t uiAreaConfigurationRank;
651
652 binaryStream.read((uint8_t*)&uiAreaConfigurationRank, sizeof(uiAreaConfigurationRank));
653
654 _orderedAreaConfigurationList.push_back(getAreaConfiguration(uiAreaConfigurationRank));
655 }
656 }
657
658 // Propagate to areas
Patrick Benavoli68a91282011-08-31 11:23:23 +0200659 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
660
661 CAreaConfiguration* pAreaConfiguration = *it;
662
663 pAreaConfiguration->serialize(binaryStream);
664 }
665}
666
667// Data size
668uint32_t CDomainConfiguration::getDataSize() const
669{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200670 uint32_t uiDataSize;
671
672 // Add necessary size to store area configurations order
673 uiDataSize = _areaConfigurationList.size() * sizeof(uint32_t);
674
675 // Propagate request to areas
Patrick Benavoli68a91282011-08-31 11:23:23 +0200676 AreaConfigurationListIterator it;
677
Patrick Benavoli68a91282011-08-31 11:23:23 +0200678 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
679
680 const CAreaConfiguration* pAreaConfiguration = *it;
681
682 uiDataSize += pAreaConfiguration->getSize();
683 }
684 return uiDataSize;
685}