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