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