1b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner/* 29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2011-2015, Intel Corporation 3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved. 4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification, 6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met: 7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this 9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer. 10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice, 12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or 13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution. 14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors 16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without 17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission. 18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */ 3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "TypeElement.h" 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "MappingData.h" 3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "Tokenizer.h" 3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "InstanceConfigurableElement.h" 349368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "Utility.h" 359368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <list> 3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <assert.h> 3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#define base CElement 3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 409368eea42a1afb01dd44110582f997115b50e742François GaffieCTypeElement::CTypeElement(const std::string &strName) : base(strName) 4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4468a912857707864bbaaff9808717813105072a6ePatrick BenavoliCTypeElement::~CTypeElement() 4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli delete _pMappingData; 4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4968a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CTypeElement::isScalar() const 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 519368eea42a1afb01dd44110582f997115b50e742François Gaffie return !_arrayLength; 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 549368eea42a1afb01dd44110582f997115b50e742François Gaffiesize_t CTypeElement::getArrayLength() const 5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 569368eea42a1afb01dd44110582f997115b50e742François Gaffie return _arrayLength; 5768a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 59a6b01d2049a137932f303cdee554d8d2703d7af7Guillaume Denneulinint CTypeElement::toPlainInteger(int iSizeOptimizedData) const 60a6b01d2049a137932f303cdee554d8d2703d7af7Guillaume Denneulin{ 61a6b01d2049a137932f303cdee554d8d2703d7af7Guillaume Denneulin return iSizeOptimizedData; 62a6b01d2049a137932f303cdee554d8d2703d7af7Guillaume Denneulin} 63a6b01d2049a137932f303cdee554d8d2703d7af7Guillaume Denneulin 649368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CTypeElement::getMappingData(const std::string &strKey, const std::string *&pStrValue) const 6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (_pMappingData) { 6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 686ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli return _pMappingData->getValue(strKey, pStrValue); 6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7368a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CTypeElement::hasMappingData() const 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return !!_pMappingData; 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 782ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli// Element properties 799368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CTypeElement::showProperties(std::string &strResult) const 802ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli{ 81a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi // The description attribute may be found in the type and not from instance. 82a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi showDescriptionProperty(strResult); 83a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi // Prevent base from being called from the Parameter Type context as 84a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi // it would lead to duplicate the name attribute (duplicated in the type and instance 85a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi // which have a common base Element) 862ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli} 872ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli 889368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CTypeElement::populate(CElement *pElement) const 8968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Populate children 91911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiChild; 92911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t uiNbChildren = getNbChildren(); 9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli for (uiChild = 0; uiChild < uiNbChildren; uiChild++) { 9568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 969368eea42a1afb01dd44110582f997115b50e742François Gaffie const CTypeElement *pChildTypeElement = 979368eea42a1afb01dd44110582f997115b50e742François Gaffie static_cast<const CTypeElement *>(getChild(uiChild)); 9868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 999368eea42a1afb01dd44110582f997115b50e742François Gaffie CInstanceConfigurableElement *pInstanceConfigurableChildElement = 1009368eea42a1afb01dd44110582f997115b50e742François Gaffie pChildTypeElement->instantiate(); 10168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Affiliate 10368a912857707864bbaaff9808717813105072a6ePatrick Benavoli pElement->addChild(pInstanceConfigurableChildElement); 10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 10568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1079368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CTypeElement::fromXml(const CXmlElement &xmlElement, 1089368eea42a1afb01dd44110582f997115b50e742François Gaffie CXmlSerializingContext &serializingContext) 10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Array Length attribute 1119368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.getAttribute("ArrayLength", _arrayLength); 11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Manage mapping attribute 1139368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string rawMapping; 1149368eea42a1afb01dd44110582f997115b50e742François Gaffie if (xmlElement.getAttribute("Mapping", rawMapping) && !rawMapping.empty()) { 11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1169368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string error; 1179368eea42a1afb01dd44110582f997115b50e742François Gaffie if (!getMappingData()->init(rawMapping, error)) { 11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1199368eea42a1afb01dd44110582f997115b50e742François Gaffie serializingContext.setError("Invalid Mapping data from XML element '" + 1209368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.getPath() + "': " + error); 12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return base::fromXml(xmlElement, serializingContext); 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1279368eea42a1afb01dd44110582f997115b50e742François GaffieCInstanceConfigurableElement *CTypeElement::instantiate() const 12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 1299368eea42a1afb01dd44110582f997115b50e742François Gaffie CInstanceConfigurableElement *pInstanceConfigurableElement = doInstantiate(); 13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Populate 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli populate(pInstanceConfigurableElement); 13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return pInstanceConfigurableElement; 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 1379368eea42a1afb01dd44110582f997115b50e742François GaffieCMappingData *CTypeElement::getMappingData() 13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!_pMappingData) { 14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli _pMappingData = new CMappingData; 14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return _pMappingData; 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 145326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 1469368eea42a1afb01dd44110582f997115b50e742François Gaffiestd::string CTypeElement::getFormattedMapping(const CTypeElement *predecessor) const 1479368eea42a1afb01dd44110582f997115b50e742François Gaffie{ 1489368eea42a1afb01dd44110582f997115b50e742François Gaffie std::list<std::string> mappings; 1499368eea42a1afb01dd44110582f997115b50e742François Gaffie std::string mapping; 1509368eea42a1afb01dd44110582f997115b50e742François Gaffie 1519368eea42a1afb01dd44110582f997115b50e742François Gaffie // Try predecessor type first, then myself (in order to have higher-level 1529368eea42a1afb01dd44110582f997115b50e742François Gaffie // mappings displayed first) 1539368eea42a1afb01dd44110582f997115b50e742François Gaffie if (predecessor) { 1549368eea42a1afb01dd44110582f997115b50e742François Gaffie mapping = predecessor->getFormattedMapping(); 1559368eea42a1afb01dd44110582f997115b50e742François Gaffie if (not mapping.empty()) { 1569368eea42a1afb01dd44110582f997115b50e742François Gaffie mappings.push_back(mapping); 1579368eea42a1afb01dd44110582f997115b50e742François Gaffie } 1589368eea42a1afb01dd44110582f997115b50e742François Gaffie } 1599368eea42a1afb01dd44110582f997115b50e742François Gaffie 1609368eea42a1afb01dd44110582f997115b50e742François Gaffie // Explicitly call the root implementation instead of calling it virtually 1619368eea42a1afb01dd44110582f997115b50e742François Gaffie // (otherwise, it will infinitely recurse). 1629368eea42a1afb01dd44110582f997115b50e742François Gaffie mapping = CTypeElement::getFormattedMapping(); 1639368eea42a1afb01dd44110582f997115b50e742François Gaffie if (not mapping.empty()) { 1649368eea42a1afb01dd44110582f997115b50e742François Gaffie mappings.push_back(mapping); 1659368eea42a1afb01dd44110582f997115b50e742François Gaffie } 1669368eea42a1afb01dd44110582f997115b50e742François Gaffie 1679368eea42a1afb01dd44110582f997115b50e742François Gaffie return utility::asString(mappings, ", "); 1689368eea42a1afb01dd44110582f997115b50e742François Gaffie} 1699368eea42a1afb01dd44110582f997115b50e742François Gaffie 170d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalvestd::string CTypeElement::getFormattedMapping() const 171390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard{ 172390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard if (_pMappingData) { 173390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard 174390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard return _pMappingData->asString(); 175390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard } 176390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard return ""; 177390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard} 178390b36d8129d3ece769c8542d9d3d3895ab13fbbFrederic Boisnard 179326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron// From IXmlSource 1809368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CTypeElement::toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const 181326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron{ 182326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron if (!isScalar()) { 183326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 1849368eea42a1afb01dd44110582f997115b50e742François Gaffie xmlElement.setAttribute("ArrayLength", getArrayLength()); 185326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron } 186326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron 187326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron base::toXml(xmlElement, serializingContext); 188326a31df0dd401283de6170ed09bcf605f61ef7dGeorges-Henri Baron} 189