Home | History | Annotate | Download | only in parameter
      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 "InstanceConfigurableElement.h"
     31 #include "Mapper.h"
     32 #include "SyncerSet.h"
     33 #include "Syncer.h"
     34 #include "TypeElement.h"
     35 #include "ParameterAccessContext.h"
     36 #include <assert.h>
     37 
     38 #define base CConfigurableElement
     39 
     40 CInstanceConfigurableElement::CInstanceConfigurableElement(const std::string &strName,
     41                                                            const CTypeElement *pTypeElement)
     42     : base(strName), _pTypeElement(pTypeElement)
     43 {
     44 }
     45 
     46 std::string CInstanceConfigurableElement::getKind() const
     47 {
     48     // Delegate
     49     return _pTypeElement->getKind();
     50 }
     51 
     52 std::string CInstanceConfigurableElement::getXmlElementName() const
     53 {
     54     // Delegate
     55     return _pTypeElement->getXmlElementName();
     56 }
     57 
     58 // Type element
     59 const CTypeElement *CInstanceConfigurableElement::getTypeElement() const
     60 {
     61     return _pTypeElement;
     62 }
     63 
     64 // Mapping
     65 bool CInstanceConfigurableElement::getMappingData(const std::string &strKey,
     66                                                   const std::string *&pStrValue) const
     67 {
     68     // Delegate
     69     return getTypeElement()->getMappingData(strKey, pStrValue);
     70 }
     71 
     72 // Returns the formatted mapping
     73 std::string CInstanceConfigurableElement::getFormattedMapping() const
     74 {
     75     // Delegate
     76     return getTypeElement()->getFormattedMapping();
     77 }
     78 
     79 bool CInstanceConfigurableElement::map(IMapper &mapper, std::string &strError)
     80 {
     81     bool bHasMappingData = getTypeElement()->hasMappingData();
     82     bool bKeepDiving = true;
     83 
     84     // Begin
     85     if (bHasMappingData && !mapper.mapBegin(this, bKeepDiving, strError)) {
     86 
     87         return false;
     88     }
     89 
     90     // Go on through children?
     91     if (bKeepDiving) {
     92 
     93         // Map children
     94         size_t uiNbChildren = getNbChildren();
     95         size_t uiChild;
     96 
     97         for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
     98 
     99             CInstanceConfigurableElement *pInstanceConfigurableChildElement =
    100                 static_cast<CInstanceConfigurableElement *>(getChild(uiChild));
    101 
    102             if (!pInstanceConfigurableChildElement->map(mapper, strError)) {
    103 
    104                 return false;
    105             }
    106         }
    107     }
    108 
    109     // End
    110     if (bHasMappingData) {
    111 
    112         mapper.mapEnd();
    113     }
    114     return true;
    115 }
    116 
    117 // Element properties
    118 void CInstanceConfigurableElement::showProperties(std::string &strResult) const
    119 {
    120     base::showProperties(strResult);
    121 
    122     // Delegate to type element
    123     _pTypeElement->showProperties(strResult);
    124 }
    125 
    126 // Scalar or Array?
    127 bool CInstanceConfigurableElement::isScalar() const
    128 {
    129     return _pTypeElement->isScalar();
    130 }
    131 
    132 // Array Length
    133 size_t CInstanceConfigurableElement::getArrayLength() const
    134 {
    135     return _pTypeElement->getArrayLength();
    136 }
    137 
    138 // Sync to HW
    139 void CInstanceConfigurableElement::setSyncer(ISyncer *pSyncer)
    140 {
    141     assert(!_pSyncer);
    142 
    143     _pSyncer = pSyncer;
    144 }
    145 
    146 void CInstanceConfigurableElement::unsetSyncer()
    147 {
    148     _pSyncer = NULL;
    149 }
    150 
    151 // Syncer
    152 ISyncer *CInstanceConfigurableElement::getSyncer() const
    153 {
    154     if (_pSyncer) {
    155 
    156         return _pSyncer;
    157     }
    158     // Check parent
    159     return base::getSyncer();
    160 }
    161 
    162 // Syncer set (descendant)
    163 void CInstanceConfigurableElement::fillSyncerSetFromDescendant(CSyncerSet &syncerSet) const
    164 {
    165     if (_pSyncer) {
    166 
    167         syncerSet += _pSyncer;
    168     } else {
    169         // Continue digging
    170         base::fillSyncerSetFromDescendant(syncerSet);
    171     }
    172 }
    173 
    174 bool CInstanceConfigurableElement::sync(CParameterAccessContext &parameterAccessContext) const
    175 {
    176     if (!parameterAccessContext.getAutoSync()) {
    177 
    178         // AutoSync is disabled, do not perform the sync.
    179         // This is not an error, but the expected behavior so return true anyway.
    180         return true;
    181     }
    182     ISyncer *pSyncer = getSyncer();
    183 
    184     if (!pSyncer) {
    185 
    186         parameterAccessContext.setError("Unable to synchronize modification. No Syncer object "
    187                                         "associated to configurable element:");
    188 
    189         return false;
    190     }
    191     std::string strError;
    192 
    193     if (!pSyncer->sync(*parameterAccessContext.getParameterBlackboard(), false, strError)) {
    194 
    195         parameterAccessContext.setError(strError);
    196 
    197         return false;
    198     }
    199     return true;
    200 }
    201 
    202 // Check parameter access path well formed for leaf elements
    203 bool CInstanceConfigurableElement::checkPathExhausted(CPathNavigator &pathNavigator,
    204                                                       utility::ErrorContext &errorContext)
    205 {
    206     std::string *pStrChildName = pathNavigator.next();
    207 
    208     if (pStrChildName) {
    209 
    210         // Should be leaf element
    211         errorContext.setError("Path not found: " + pathNavigator.getCurrentPath());
    212 
    213         return false;
    214     }
    215     return true;
    216 }
    217 
    218 void CInstanceConfigurableElement::structureToXml(CXmlElement &xmlElement,
    219                                                   CXmlSerializingContext &serializingContext) const
    220 {
    221     base::structureToXml(xmlElement, serializingContext);
    222     // Since Description belongs to the Type of Element, delegate it to the type element.
    223     getTypeElement()->setXmlDescriptionAttribute(xmlElement);
    224 }
    225