blob: f7243c40e94d426155aefc651bccc5a766fd37ac [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
Patrick Benavoli68a91282011-08-31 11:23:23 +0200321// Save data from current
322void CDomainConfiguration::save(const CParameterBlackboard* pMainBlackboard)
323{
324 AreaConfigurationListIterator it;
325
326 // Just propagate to areas
327 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
328
329 CAreaConfiguration* pAreaConfiguration = *it;
330
331 pAreaConfiguration->save(pMainBlackboard);
332 }
333}
334
335// Apply data to current
Patrick Benavoli63499d42011-10-24 18:50:03 +0200336bool CDomainConfiguration::restore(CParameterBlackboard* pMainBlackboard, bool bSync, string& strError) const
Patrick Benavoli68a91282011-08-31 11:23:23 +0200337{
338 AreaConfigurationListIterator it;
339
340 // Just propagate to areas
Patrick Benavoli63499d42011-10-24 18:50:03 +0200341 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) {
Patrick Benavoli68a91282011-08-31 11:23:23 +0200342
343 const CAreaConfiguration* pAreaConfiguration = *it;
344
Patrick Benavoli63499d42011-10-24 18:50:03 +0200345 if (!pAreaConfiguration->restore(pMainBlackboard, bSync, strError)) {
346
347 return false;
348 }
Patrick Benavoli68a91282011-08-31 11:23:23 +0200349 }
Patrick Benavoli63499d42011-10-24 18:50:03 +0200350
351 return true;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200352}
353
354// Ensure validity for configurable element area configuration
355void CDomainConfiguration::validate(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard)
356{
357 CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
358
359 // Delegate
360 pAreaConfigurationToValidate->validate(pMainBlackboard);
361}
362
363// Ensure validity of all area configurations
364void CDomainConfiguration::validate(const CParameterBlackboard* pMainBlackboard)
365{
366 AreaConfigurationListIterator it;
367
368 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
369
370 CAreaConfiguration* pAreaConfiguration = *it;
371
372 pAreaConfiguration->validate(pMainBlackboard);
373 }
374}
375
376// Return configuration validity for given configurable element
377bool CDomainConfiguration::isValid(const CConfigurableElement* pConfigurableElement) const
378{
379 // Get child configurable elemnt's area configuration
380 CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement);
381
382 assert(pAreaConfiguration);
383
384 return pAreaConfiguration->isValid();
385}
386
387// Ensure validity of configurable element's area configuration by copying in from a valid one
388void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration, const CConfigurableElement* pConfigurableElement)
389{
390 // Retrieve related area configurations
391 CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
392 const CAreaConfiguration* pAreaConfigurationToValidateAgainst = pValidDomainConfiguration->getAreaConfiguration(pConfigurableElement);
393
394 // Delegate to area
395 pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
396}
397
398// Ensure validity of all configurable element's area configuration by copying in from a valid ones
399void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration)
400{
401 // Copy in configuration data from against domain
402 AreaConfigurationListIterator it, itAgainst;
403
404 for (it = _areaConfigurationList.begin(), itAgainst = pValidDomainConfiguration->_areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it, ++itAgainst) {
405
406 CAreaConfiguration* pAreaConfigurationToValidate = *it;
407 const CAreaConfiguration* pAreaConfigurationToValidateAgainst = *itAgainst;
408
409 // Delegate to area
410 pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
411 }
412}
413
414// Dynamic data application
415bool CDomainConfiguration::isApplicable() const
416{
417 const CCompoundRule* pRule = getRule();
418
419 return pRule && pRule->matches();
420}
421
422// Merge existing configurations to given configurable element ones
423void CDomainConfiguration::merge(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement)
424{
425 // Retrieve related area configurations
426 CAreaConfiguration* pAreaConfigurationToMergeTo = getAreaConfiguration(pToConfigurableElement);
427 const CAreaConfiguration* pAreaConfigurationToMergeFrom = getAreaConfiguration(pFromConfigurableElement);
428
429 // Do the merge
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200430 pAreaConfigurationToMergeFrom->copyToOuter(pAreaConfigurationToMergeTo);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200431}
432
433// Domain splitting
434void CDomainConfiguration::split(CConfigurableElement* pFromConfigurableElement)
435{
436 // Retrieve related area configuration
437 const CAreaConfiguration* pAreaConfigurationToSplitFrom = getAreaConfiguration(pFromConfigurableElement);
438
439 // Go through children areas to copy configuration data to them
440 uint32_t uiNbConfigurableElementChildren = pFromConfigurableElement->getNbChildren();
441 uint32_t uiChild;
442
443 for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
444
445 CConfigurableElement* pToChildConfigurableElement = static_cast<CConfigurableElement*>(pFromConfigurableElement->getChild(uiChild));
446
447 // Get child configurable elemnt's area configuration
448 CAreaConfiguration* pChildAreaConfiguration = getAreaConfiguration(pToChildConfigurableElement);
449
450 // Do the copy
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200451 pChildAreaConfiguration->copyFromOuter(pAreaConfigurationToSplitFrom);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200452 }
453}
454
455// AreaConfiguration retrieval from configurable element
456CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(const CConfigurableElement* pConfigurableElement) const
457{
458 AreaConfigurationListIterator it;
459
460 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
461
462 CAreaConfiguration* pAreaConfiguration = *it;
463
464 if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) {
465
466 return pAreaConfiguration;
467 }
468 }
469 // Not found?
470 assert(0);
471
472 return NULL;
473}
474
Patrick Benavoli63499d42011-10-24 18:50:03 +0200475// AreaConfiguration retrieval from present area configurations
476CAreaConfiguration* CDomainConfiguration::findAreaConfiguration(const string& strConfigurableElementPath) const
477{
Patrick Benavoli4bed9212011-10-27 14:18:00 +0200478 return findAreaConfiguration(strConfigurableElementPath, _areaConfigurationList);
Patrick Benavoli63499d42011-10-24 18:50:03 +0200479}
480
481// AreaConfiguration retrieval from given area configuration list
482CAreaConfiguration* CDomainConfiguration::findAreaConfiguration(const string& strConfigurableElementPath, const list<CAreaConfiguration*>& areaConfigurationList) const
483{
484 AreaConfigurationListIterator it;
485
486 for (it = areaConfigurationList.begin(); it != areaConfigurationList.end(); ++it) {
487
488 CAreaConfiguration* pAreaConfiguration = *it;
489
490 if (pAreaConfiguration->getConfigurableElement()->getPath() == strConfigurableElementPath) {
491
492 return pAreaConfiguration;
493 }
494 }
495
496 // Not found
497 return NULL;
498}
499
500// Area configuration ordering
501void CDomainConfiguration::reorderAreaConfigurations(const list<CAreaConfiguration*>& areaConfigurationList)
502{
503 // Ensure elements in provided list appear first and ordered the same way in internal one
504
505 // Remove all elements present in the provided list from the internal one
506 AreaConfigurationListIterator it;
507
508 for (it = areaConfigurationList.begin(); it != areaConfigurationList.end(); ++it) {
509
510 _orderedAreaConfigurationList.remove(*it);
511 }
512
513 // Prepended provided elements into internal list
514 _orderedAreaConfigurationList.insert(_orderedAreaConfigurationList.begin(), areaConfigurationList.begin(), areaConfigurationList.end());
515}
516
517// Find area configuration rank from regular list: for ordered list maintainance
518uint32_t CDomainConfiguration::getAreaConfigurationRank(const CAreaConfiguration* pAreaConfiguration) const
519{
520 uint32_t uiAreaConfigurationRank;
521 AreaConfigurationListIterator it;
522
523 // Propagate request to areas
524 for (it = _areaConfigurationList.begin(), uiAreaConfigurationRank = 0; it != _areaConfigurationList.end(); ++it, ++uiAreaConfigurationRank) {
525
526 if (*it == pAreaConfiguration) {
527
528 return uiAreaConfigurationRank;
529 }
530 }
531
532 assert(0);
533
534 return 0;
535}
536
537// Find area configuration from regular list based on rank: for ordered list maintainance
538CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(uint32_t uiAreaConfigurationRank) const
539{
540 AreaConfigurationListIterator it;
541 uint32_t uiCurrentAreaConfigurationRank;
542
543 // Propagate request to areas
544 for (it = _areaConfigurationList.begin(), uiCurrentAreaConfigurationRank = 0; it != _areaConfigurationList.end(); ++it, ++uiCurrentAreaConfigurationRank) {
545
546 if (uiCurrentAreaConfigurationRank == uiAreaConfigurationRank) {
547
548 return *it;
549 }
550 }
551
552 assert(0);
553
554 return NULL;
555}
556
Patrick Benavoli68a91282011-08-31 11:23:23 +0200557// Rule
558const CCompoundRule* CDomainConfiguration::getRule() const
559{
560 if (getNbChildren()) {
561 // Rule created
562 return static_cast<const CCompoundRule*>(getChild(ECompoundRule));
563 }
564 return NULL;
565}
566
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100567CCompoundRule* CDomainConfiguration::getRule()
568{
569 if (getNbChildren()) {
570 // Rule created
571 return static_cast<CCompoundRule*>(getChild(ECompoundRule));
572 }
573 return NULL;
574}
575
576void CDomainConfiguration::setRule(CCompoundRule* pRule)
577{
578 CCompoundRule* pOldRule = getRule();
579
580 if (pOldRule) {
581 // Remove previous rule
582 removeChild(pOldRule);
583
584 delete pOldRule;
585 }
586
587 // Set new one
588 if (pRule) {
589 // Chain
590 addChild(pRule);
591 }
592}
593
Patrick Benavoli68a91282011-08-31 11:23:23 +0200594// Serialization
595void CDomainConfiguration::binarySerialize(CBinaryStream& binaryStream)
596{
597 AreaConfigurationListIterator it;
598
Patrick Benavoli63499d42011-10-24 18:50:03 +0200599 // Area configurations order
600 if (binaryStream.isOut()) {
601
602 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) {
603
604 // Get rank
605 uint32_t uiAreaConfigurationRank = getAreaConfigurationRank(*it);
606
607 // Store it
608 binaryStream.write((const uint8_t*)&uiAreaConfigurationRank, sizeof(uiAreaConfigurationRank));
609 }
610 } else {
611
612 // Empty ordered list first
613 _orderedAreaConfigurationList.resize(0);
614
615 uint32_t uiAreaConfiguration;
616
617 for (uiAreaConfiguration = 0; uiAreaConfiguration < _areaConfigurationList.size(); uiAreaConfiguration++) {
618
619 // Get rank
620 uint32_t uiAreaConfigurationRank;
621
622 binaryStream.read((uint8_t*)&uiAreaConfigurationRank, sizeof(uiAreaConfigurationRank));
623
624 _orderedAreaConfigurationList.push_back(getAreaConfiguration(uiAreaConfigurationRank));
625 }
626 }
627
628 // Propagate to areas
Patrick Benavoli68a91282011-08-31 11:23:23 +0200629 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
630
631 CAreaConfiguration* pAreaConfiguration = *it;
632
633 pAreaConfiguration->serialize(binaryStream);
634 }
635}
636
637// Data size
638uint32_t CDomainConfiguration::getDataSize() const
639{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200640 uint32_t uiDataSize;
641
642 // Add necessary size to store area configurations order
643 uiDataSize = _areaConfigurationList.size() * sizeof(uint32_t);
644
645 // Propagate request to areas
Patrick Benavoli68a91282011-08-31 11:23:23 +0200646 AreaConfigurationListIterator it;
647
Patrick Benavoli68a91282011-08-31 11:23:23 +0200648 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
649
650 const CAreaConfiguration* pAreaConfiguration = *it;
651
652 uiDataSize += pAreaConfiguration->getSize();
653 }
654 return uiDataSize;
655}