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