1 /* 2 * 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. 29 */ 30 #include "DomainConfiguration.h" 31 #include "AreaConfiguration.h" 32 #include "ConfigurableElement.h" 33 #include "CompoundRule.h" 34 #include "Subsystem.h" 35 #include "XmlDomainSerializingContext.h" 36 #include "XmlDomainImportContext.h" 37 #include "XmlDomainExportContext.h" 38 #include "ConfigurationAccessContext.h" 39 #include <assert.h> 40 #include "RuleParser.h" 41 42 #define base CBinarySerializableElement 43 44 using std::string; 45 46 CDomainConfiguration::CDomainConfiguration(const string& strName) : base(strName) 47 { 48 } 49 50 CDomainConfiguration::~CDomainConfiguration() 51 { 52 AreaConfigurationListIterator it; 53 54 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 55 56 delete *it; 57 } 58 } 59 60 // Class kind 61 string CDomainConfiguration::getKind() const 62 { 63 return "Configuration"; 64 } 65 66 // Child dynamic creation 67 bool CDomainConfiguration::childrenAreDynamic() const 68 { 69 return true; 70 } 71 72 // XML configuration settings parsing 73 bool CDomainConfiguration::parseSettings(CXmlElement& xmlConfigurationSettingsElement, CXmlSerializingContext& serializingContext) 74 { 75 // Actual XML context 76 CXmlDomainImportContext& xmlDomainImportContext = static_cast<CXmlDomainImportContext&>(serializingContext); 77 78 // Take care of configurable elements / area configurations ranks 79 std::list<CAreaConfiguration*> areaConfigurationList; 80 81 // Parse configurable element's configuration settings 82 CXmlElement::CChildIterator it(xmlConfigurationSettingsElement); 83 84 CXmlElement xmlConfigurableElementSettingsElement; 85 86 while (it.next(xmlConfigurableElementSettingsElement)) { 87 88 // Retrieve area configuration 89 string strConfigurableElementPath = xmlConfigurableElementSettingsElement.getAttributeString("Path"); 90 91 CAreaConfiguration* pAreaConfiguration = findAreaConfiguration(strConfigurableElementPath); 92 93 if (!pAreaConfiguration) { 94 95 xmlDomainImportContext.setError("Configurable Element " + strConfigurableElementPath + " referred to by Configuration " + getPath() + " not associated to Domain"); 96 97 return false; 98 } 99 // Ranks 100 areaConfigurationList.push_back(pAreaConfiguration); 101 102 // Parse 103 if (!serializeConfigurableElementSettings(pAreaConfiguration, xmlConfigurableElementSettingsElement, xmlDomainImportContext, false)) { 104 105 return false; 106 } 107 } 108 109 // Reorder area configurations according to XML content 110 reorderAreaConfigurations(areaConfigurationList); 111 112 return true; 113 } 114 115 // XML configuration settings composing 116 void CDomainConfiguration::composeSettings(CXmlElement& xmlConfigurationSettingsElement, CXmlSerializingContext& serializingContext) const 117 { 118 // Go through all are configurations 119 AreaConfigurationListIterator it; 120 121 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) { 122 123 const CAreaConfiguration* pAreaConfiguration = *it; 124 125 // Retrieve configurable element 126 const CConfigurableElement* pConfigurableElement = pAreaConfiguration->getConfigurableElement(); 127 128 // Create configurable element child element 129 CXmlElement xmlConfigurableElementSettingsElement; 130 131 xmlConfigurationSettingsElement.createChild(xmlConfigurableElementSettingsElement, "ConfigurableElement"); 132 133 // Set Path attribute 134 xmlConfigurableElementSettingsElement.setAttributeString("Path", pConfigurableElement->getPath()); 135 136 // Delegate composing to area configuration 137 ((CDomainConfiguration&)(*this)).serializeConfigurableElementSettings((CAreaConfiguration*)pAreaConfiguration, xmlConfigurableElementSettingsElement, serializingContext, true); 138 } 139 } 140 141 // Serialize one configuration for one configurable element 142 bool CDomainConfiguration::serializeConfigurableElementSettings(CAreaConfiguration* pAreaConfiguration, CXmlElement& xmlConfigurableElementSettingsElement, CXmlSerializingContext& serializingContext, bool bSerializeOut) 143 { 144 // Actual XML context 145 CXmlDomainExportContext& xmlDomainExportContext = 146 static_cast<CXmlDomainExportContext&>(serializingContext); 147 148 // Configurable Element 149 const CConfigurableElement* pConfigurableElement = pAreaConfiguration->getConfigurableElement(); 150 151 // Element content 152 CXmlElement xmlConfigurableElementSettingsElementContent; 153 154 // Deal with element itself 155 if (!bSerializeOut) { 156 157 // Check structure 158 if (xmlConfigurableElementSettingsElement.getNbChildElements() != 1) { 159 160 // Structure error 161 serializingContext.setError("Struture error encountered while parsing settings of " + pConfigurableElement->getKind() + " " + pConfigurableElement->getName() + " in Configuration " + getPath()); 162 163 return false; 164 } 165 166 // Check name and kind 167 if (!xmlConfigurableElementSettingsElement.getChildElement(pConfigurableElement->getKind(), pConfigurableElement->getName(), xmlConfigurableElementSettingsElementContent)) { 168 169 serializingContext.setError("Couldn't find settings for " + pConfigurableElement->getKind() + " " + pConfigurableElement->getName() + " for Configuration " + getPath()); 170 171 return false; 172 } 173 } else { 174 175 // Create child XML element 176 xmlConfigurableElementSettingsElement.createChild(xmlConfigurableElementSettingsElementContent, pConfigurableElement->getKind()); 177 178 // Set Name 179 xmlConfigurableElementSettingsElementContent.setNameAttribute(pConfigurableElement->getName()); 180 } 181 182 // Change context type to parameter settings access 183 string strError; 184 185 // Create configuration access context 186 CConfigurationAccessContext configurationAccessContext(strError, bSerializeOut); 187 188 // Provide current value space 189 configurationAccessContext.setValueSpaceRaw(xmlDomainExportContext.valueSpaceIsRaw()); 190 191 // Provide current output raw format 192 configurationAccessContext.setOutputRawFormat(xmlDomainExportContext.outputRawFormatIsHex()); 193 194 // Get subsystem 195 const CSubsystem* pSubsystem = pConfigurableElement->getBelongingSubsystem(); 196 197 if (pSubsystem && pSubsystem != pConfigurableElement) { 198 199 // Element is a descendant of subsystem 200 201 // Deal with Endianness 202 configurationAccessContext.setBigEndianSubsystem(pSubsystem->isBigEndian()); 203 } 204 205 // Have domain configuration parse settings for configurable element 206 if (!pAreaConfiguration->serializeXmlSettings(xmlConfigurableElementSettingsElementContent, configurationAccessContext)) { 207 208 // Forward error 209 xmlDomainExportContext.setError(strError); 210 211 return false; 212 } 213 return true; 214 } 215 216 // Configurable Elements association 217 void CDomainConfiguration::addConfigurableElement(const CConfigurableElement* pConfigurableElement, const CSyncerSet* pSyncerSet) 218 { 219 CAreaConfiguration* pAreaConfiguration = pConfigurableElement->createAreaConfiguration(pSyncerSet); 220 221 _areaConfigurationList.push_back(pAreaConfiguration); 222 _orderedAreaConfigurationList.push_back(pAreaConfiguration); 223 } 224 225 void CDomainConfiguration::removeConfigurableElement(const CConfigurableElement* pConfigurableElement) 226 { 227 CAreaConfiguration* pAreaConfigurationToRemove = getAreaConfiguration(pConfigurableElement); 228 229 _areaConfigurationList.remove(pAreaConfigurationToRemove); 230 _orderedAreaConfigurationList.remove(pAreaConfigurationToRemove); 231 232 delete pAreaConfigurationToRemove; 233 } 234 235 // Sequence management 236 bool CDomainConfiguration::setElementSequence(const std::vector<string>& astrNewElementSequence, string& strError) 237 { 238 // Build a new list of AreaConfiguration objects 239 std::list<CAreaConfiguration*> areaConfigurationList; 240 241 uint32_t uiConfigurableElement; 242 243 for (uiConfigurableElement = 0; uiConfigurableElement < astrNewElementSequence.size(); uiConfigurableElement++) { 244 245 string strConfigurableElementPath = astrNewElementSequence[uiConfigurableElement]; 246 247 CAreaConfiguration* pAreaConfiguration = findAreaConfiguration(strConfigurableElementPath); 248 249 if (!pAreaConfiguration) { 250 251 strError = "Element " + strConfigurableElementPath + " not found in domain"; 252 253 return false; 254 } 255 // Check not already present in the list 256 if (findAreaConfiguration(strConfigurableElementPath, areaConfigurationList)) { 257 258 strError = "Element " + strConfigurableElementPath + " provided more than once"; 259 260 return false; 261 } 262 263 // Store new ordered area configuration 264 areaConfigurationList.push_back(pAreaConfiguration); 265 } 266 267 // Reorder area configurations according to given path list 268 reorderAreaConfigurations(areaConfigurationList); 269 270 return true; 271 } 272 273 void CDomainConfiguration::getElementSequence(string& strResult) const 274 { 275 strResult = "\n"; 276 277 AreaConfigurationListIterator it; 278 279 // List configurable element paths out of ordered area configuration list 280 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) { 281 282 const CAreaConfiguration* pAreaConfiguration = *it; 283 284 const CConfigurableElement* pConfigurableElement = pAreaConfiguration->getConfigurableElement(); 285 286 strResult += pConfigurableElement->getPath() + "\n"; 287 } 288 } 289 290 // Application rule 291 bool CDomainConfiguration::setApplicationRule(const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError) 292 { 293 // Parser 294 CRuleParser ruleParser(strApplicationRule, pSelectionCriteriaDefinition); 295 296 // Attempt to parse it 297 if (!ruleParser.parse(NULL, strError)) { 298 299 return false; 300 } 301 // Replace compound rule 302 setRule(ruleParser.grabRootRule()); 303 304 return true; 305 } 306 307 void CDomainConfiguration::clearApplicationRule() 308 { 309 // Replace compound rule 310 setRule(NULL); 311 } 312 313 void CDomainConfiguration::getApplicationRule(string& strResult) const 314 { 315 // Rule 316 const CCompoundRule* pRule = getRule(); 317 318 if (pRule) { 319 // Start clear 320 strResult.clear(); 321 322 // Dump rule 323 pRule->dump(strResult); 324 325 } else { 326 327 strResult = "<none>"; 328 } 329 } 330 331 /** 332 * Get the Configuration Blackboard. 333 * 334 * Fetch the Configuration Blackboard related to the ConfigurableElement given in parameter. This 335 * Element is used to retrieve the correct AreaConfiguration where the Blackboard is stored. 336 * 337 * @param[in] pConfigurableElement A pointer to a ConfigurableElement that is part of the 338 * Domain. This must have been checked previously, as an 339 * assertion is performed. 340 * 341 * return Pointer to the Blackboard of the Configuration. 342 */ 343 CParameterBlackboard* CDomainConfiguration::getBlackboard(const CConfigurableElement* pConfigurableElement) const 344 { 345 AreaConfigurationListIterator it; 346 347 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 348 349 CAreaConfiguration* pAreaConfiguration = *it; 350 351 // Check if the Element is associated with the Domain 352 if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) { 353 354 return &pAreaConfiguration->getBlackboard(); 355 } 356 } 357 358 assert(0); 359 return NULL; 360 } 361 362 // Save data from current 363 void CDomainConfiguration::save(const CParameterBlackboard* pMainBlackboard) 364 { 365 AreaConfigurationListIterator it; 366 367 // Just propagate to areas 368 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 369 370 CAreaConfiguration* pAreaConfiguration = *it; 371 372 pAreaConfiguration->save(pMainBlackboard); 373 } 374 } 375 376 // Apply data to current 377 bool CDomainConfiguration::restore(CParameterBlackboard* pMainBlackboard, bool bSync, std::list<string>* plstrError) const 378 { 379 bool bSuccess = true; 380 381 AreaConfigurationListIterator it; 382 383 // Just propagate to areas 384 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) { 385 386 const CAreaConfiguration* pAreaConfiguration = *it; 387 388 bSuccess &= pAreaConfiguration->restore(pMainBlackboard, bSync, plstrError); 389 } 390 391 return bSuccess; 392 } 393 394 // Ensure validity for configurable element area configuration 395 void CDomainConfiguration::validate(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard) 396 { 397 CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement); 398 399 // Delegate 400 pAreaConfigurationToValidate->validate(pMainBlackboard); 401 } 402 403 // Ensure validity of all area configurations 404 void CDomainConfiguration::validate(const CParameterBlackboard* pMainBlackboard) 405 { 406 AreaConfigurationListIterator it; 407 408 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 409 410 CAreaConfiguration* pAreaConfiguration = *it; 411 412 pAreaConfiguration->validate(pMainBlackboard); 413 } 414 } 415 416 // Return configuration validity for given configurable element 417 bool CDomainConfiguration::isValid(const CConfigurableElement* pConfigurableElement) const 418 { 419 // Get child configurable elemnt's area configuration 420 CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement); 421 422 assert(pAreaConfiguration); 423 424 return pAreaConfiguration->isValid(); 425 } 426 427 // Ensure validity of configurable element's area configuration by copying in from a valid one 428 void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration, const CConfigurableElement* pConfigurableElement) 429 { 430 // Retrieve related area configurations 431 CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement); 432 const CAreaConfiguration* pAreaConfigurationToValidateAgainst = pValidDomainConfiguration->getAreaConfiguration(pConfigurableElement); 433 434 // Delegate to area 435 pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst); 436 } 437 438 // Ensure validity of all configurable element's area configuration by copying in from a valid ones 439 void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration) 440 { 441 // Copy in configuration data from against domain 442 AreaConfigurationListIterator it, itAgainst; 443 444 for (it = _areaConfigurationList.begin(), itAgainst = pValidDomainConfiguration->_areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it, ++itAgainst) { 445 446 CAreaConfiguration* pAreaConfigurationToValidate = *it; 447 const CAreaConfiguration* pAreaConfigurationToValidateAgainst = *itAgainst; 448 449 // Delegate to area 450 pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst); 451 } 452 } 453 454 // Dynamic data application 455 bool CDomainConfiguration::isApplicable() const 456 { 457 const CCompoundRule* pRule = getRule(); 458 459 return pRule && pRule->matches(); 460 } 461 462 // Merge existing configurations to given configurable element ones 463 void CDomainConfiguration::merge(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement) 464 { 465 // Retrieve related area configurations 466 CAreaConfiguration* pAreaConfigurationToMergeTo = getAreaConfiguration(pToConfigurableElement); 467 const CAreaConfiguration* pAreaConfigurationToMergeFrom = getAreaConfiguration(pFromConfigurableElement); 468 469 // Do the merge 470 pAreaConfigurationToMergeFrom->copyToOuter(pAreaConfigurationToMergeTo); 471 } 472 473 // Domain splitting 474 void CDomainConfiguration::split(CConfigurableElement* pFromConfigurableElement) 475 { 476 // Retrieve related area configuration 477 const CAreaConfiguration* pAreaConfigurationToSplitFrom = getAreaConfiguration(pFromConfigurableElement); 478 479 // Go through children areas to copy configuration data to them 480 size_t uiNbConfigurableElementChildren = pFromConfigurableElement->getNbChildren(); 481 size_t uiChild; 482 483 for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) { 484 485 CConfigurableElement* pToChildConfigurableElement = static_cast<CConfigurableElement*>(pFromConfigurableElement->getChild(uiChild)); 486 487 // Get child configurable elemnt's area configuration 488 CAreaConfiguration* pChildAreaConfiguration = getAreaConfiguration(pToChildConfigurableElement); 489 490 // Do the copy 491 pChildAreaConfiguration->copyFromOuter(pAreaConfigurationToSplitFrom); 492 } 493 } 494 495 // AreaConfiguration retrieval from configurable element 496 CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(const CConfigurableElement* pConfigurableElement) const 497 { 498 AreaConfigurationListIterator it; 499 500 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 501 502 CAreaConfiguration* pAreaConfiguration = *it; 503 504 if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) { 505 506 return pAreaConfiguration; 507 } 508 } 509 // Not found? 510 assert(0); 511 512 return NULL; 513 } 514 515 // AreaConfiguration retrieval from present area configurations 516 CAreaConfiguration* CDomainConfiguration::findAreaConfiguration(const string& strConfigurableElementPath) const 517 { 518 return findAreaConfiguration(strConfigurableElementPath, _areaConfigurationList); 519 } 520 521 // AreaConfiguration retrieval from given area configuration list 522 CAreaConfiguration* CDomainConfiguration::findAreaConfiguration(const string& strConfigurableElementPath, const std::list<CAreaConfiguration*>& areaConfigurationList) const 523 { 524 AreaConfigurationListIterator it; 525 526 for (it = areaConfigurationList.begin(); it != areaConfigurationList.end(); ++it) { 527 528 CAreaConfiguration* pAreaConfiguration = *it; 529 530 if (pAreaConfiguration->getConfigurableElement()->getPath() == strConfigurableElementPath) { 531 532 return pAreaConfiguration; 533 } 534 } 535 536 // Not found 537 return NULL; 538 } 539 540 // Area configuration ordering 541 void CDomainConfiguration::reorderAreaConfigurations(const std::list<CAreaConfiguration*>& areaConfigurationList) 542 { 543 // Ensure elements in provided list appear first and ordered the same way in internal one 544 545 // Remove all elements present in the provided list from the internal one 546 AreaConfigurationListIterator it; 547 548 for (it = areaConfigurationList.begin(); it != areaConfigurationList.end(); ++it) { 549 550 _orderedAreaConfigurationList.remove(*it); 551 } 552 553 // Prepended provided elements into internal list 554 _orderedAreaConfigurationList.insert(_orderedAreaConfigurationList.begin(), areaConfigurationList.begin(), areaConfigurationList.end()); 555 } 556 557 // Find area configuration rank from regular list: for ordered list maintainance 558 uint32_t CDomainConfiguration::getAreaConfigurationRank(const CAreaConfiguration* pAreaConfiguration) const 559 { 560 uint32_t uiAreaConfigurationRank; 561 AreaConfigurationListIterator it; 562 563 // Propagate request to areas 564 for (it = _areaConfigurationList.begin(), uiAreaConfigurationRank = 0; it != _areaConfigurationList.end(); ++it, ++uiAreaConfigurationRank) { 565 566 if (*it == pAreaConfiguration) { 567 568 return uiAreaConfigurationRank; 569 } 570 } 571 572 assert(0); 573 574 return 0; 575 } 576 577 // Find area configuration from regular list based on rank: for ordered list maintainance 578 CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(uint32_t uiAreaConfigurationRank) const 579 { 580 AreaConfigurationListIterator it; 581 uint32_t uiCurrentAreaConfigurationRank; 582 583 // Propagate request to areas 584 for (it = _areaConfigurationList.begin(), uiCurrentAreaConfigurationRank = 0; it != _areaConfigurationList.end(); ++it, ++uiCurrentAreaConfigurationRank) { 585 586 if (uiCurrentAreaConfigurationRank == uiAreaConfigurationRank) { 587 588 return *it; 589 } 590 } 591 592 assert(0); 593 594 return NULL; 595 } 596 597 // Rule 598 const CCompoundRule* CDomainConfiguration::getRule() const 599 { 600 if (getNbChildren()) { 601 // Rule created 602 return static_cast<const CCompoundRule*>(getChild(ECompoundRule)); 603 } 604 return NULL; 605 } 606 607 CCompoundRule* CDomainConfiguration::getRule() 608 { 609 if (getNbChildren()) { 610 // Rule created 611 return static_cast<CCompoundRule*>(getChild(ECompoundRule)); 612 } 613 return NULL; 614 } 615 616 void CDomainConfiguration::setRule(CCompoundRule* pRule) 617 { 618 CCompoundRule* pOldRule = getRule(); 619 620 if (pOldRule) { 621 // Remove previous rule 622 removeChild(pOldRule); 623 624 delete pOldRule; 625 } 626 627 // Set new one 628 if (pRule) { 629 // Chain 630 addChild(pRule); 631 } 632 } 633 634 // Serialization 635 void CDomainConfiguration::binarySerialize(CBinaryStream& binaryStream) 636 { 637 AreaConfigurationListIterator it; 638 639 // Area configurations order 640 if (binaryStream.isOut()) { 641 642 for (it = _orderedAreaConfigurationList.begin(); it != _orderedAreaConfigurationList.end(); ++it) { 643 644 // Get rank 645 uint32_t uiAreaConfigurationRank = getAreaConfigurationRank(*it); 646 647 // Store it 648 binaryStream.write((const uint8_t*)&uiAreaConfigurationRank, sizeof(uiAreaConfigurationRank)); 649 } 650 } else { 651 652 // Empty ordered list first 653 _orderedAreaConfigurationList.resize(0); 654 655 uint32_t uiAreaConfiguration; 656 657 for (uiAreaConfiguration = 0; uiAreaConfiguration < _areaConfigurationList.size(); uiAreaConfiguration++) { 658 659 // Get rank 660 uint32_t uiAreaConfigurationRank; 661 662 binaryStream.read((uint8_t*)&uiAreaConfigurationRank, sizeof(uiAreaConfigurationRank)); 663 664 _orderedAreaConfigurationList.push_back(getAreaConfiguration(uiAreaConfigurationRank)); 665 } 666 } 667 668 // Propagate to areas 669 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 670 671 CAreaConfiguration* pAreaConfiguration = *it; 672 673 pAreaConfiguration->serialize(binaryStream); 674 } 675 } 676 677 // Data size 678 size_t CDomainConfiguration::getDataSize() const 679 { 680 size_t uiDataSize; 681 682 // Add necessary size to store area configurations order 683 uiDataSize = _areaConfigurationList.size() * sizeof(uint32_t); 684 685 // Propagate request to areas 686 AreaConfigurationListIterator it; 687 688 for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) { 689 690 const CAreaConfiguration* pAreaConfiguration = *it; 691 692 uiDataSize += pAreaConfiguration->getSize(); 693 } 694 return uiDataSize; 695 } 696