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 "AreaConfiguration.h" 31 #include "ConfigurableElement.h" 32 #include "ConfigurationAccessContext.h" 33 #include "BinaryStream.h" 34 #include <assert.h> 35 36 CAreaConfiguration::CAreaConfiguration(const CConfigurableElement* pConfigurableElement, const CSyncerSet* pSyncerSet) 37 : _pConfigurableElement(pConfigurableElement), _pSyncerSet(pSyncerSet), _bValid(false) 38 { 39 // Size blackboard 40 _blackboard.setSize(_pConfigurableElement->getFootPrint()); 41 } 42 43 CAreaConfiguration::CAreaConfiguration(const CConfigurableElement* pConfigurableElement, const CSyncerSet* pSyncerSet, uint32_t uiSize) 44 : _pConfigurableElement(pConfigurableElement), _pSyncerSet(pSyncerSet), _bValid(false) 45 { 46 // Size blackboard 47 _blackboard.setSize(uiSize); 48 } 49 50 // Save data from current 51 void CAreaConfiguration::save(const CParameterBlackboard* pMainBlackboard) 52 { 53 copyFrom(pMainBlackboard, _pConfigurableElement->getOffset()); 54 } 55 56 // Apply data to current 57 bool CAreaConfiguration::restore(CParameterBlackboard* pMainBlackboard, bool bSync, std::list<std::string>* plstrError) const 58 { 59 assert(_bValid); 60 61 copyTo(pMainBlackboard, _pConfigurableElement->getOffset()); 62 63 // Synchronize if required 64 return !bSync || _pSyncerSet->sync(*pMainBlackboard, false, plstrError); 65 } 66 67 // Ensure validity 68 void CAreaConfiguration::validate(const CParameterBlackboard* pMainBlackboard) 69 { 70 if (!_bValid) { 71 72 // Saving from blackboard make area configuration valid 73 save(pMainBlackboard); 74 75 _bValid = true; 76 } 77 } 78 79 // Return validity 80 bool CAreaConfiguration::isValid() const 81 { 82 return _bValid; 83 } 84 85 // Ensure validity against given valid area configuration 86 void CAreaConfiguration::validateAgainst(const CAreaConfiguration* pValidAreaConfiguration) 87 { 88 // Should be called on purpose 89 assert(!_bValid); 90 91 // Check proper against area given 92 assert(pValidAreaConfiguration->isValid()); 93 94 // Check compatibility 95 assert(_pConfigurableElement == pValidAreaConfiguration->_pConfigurableElement); 96 97 // Copy 98 _blackboard.restoreFrom(&pValidAreaConfiguration->_blackboard, 0); 99 100 // Set as valid 101 _bValid = true; 102 } 103 104 // XML configuration settings parsing 105 bool CAreaConfiguration::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElementContent, CConfigurationAccessContext& configurationAccessContext) 106 { 107 // Assign blackboard to configuration context 108 configurationAccessContext.setParameterBlackboard(&_blackboard); 109 110 // Assign base offset to configuration context 111 configurationAccessContext.setBaseOffset(_pConfigurableElement->getOffset()); 112 113 // Parse configuration settings (element contents) 114 if (_pConfigurableElement->serializeXmlSettings(xmlConfigurableElementSettingsElementContent, configurationAccessContext)) { 115 116 if (!configurationAccessContext.serializeOut()) { 117 118 // Serialized-in areas are valid 119 _bValid = true; 120 } 121 return true; 122 } 123 return false; 124 } 125 126 // Compound handling 127 const CConfigurableElement* CAreaConfiguration::getConfigurableElement() const 128 { 129 return _pConfigurableElement; 130 } 131 132 void CAreaConfiguration::copyToOuter(CAreaConfiguration* pToAreaConfiguration) const 133 { 134 assert(_pConfigurableElement->isDescendantOf(pToAreaConfiguration->getConfigurableElement())); 135 136 copyTo(&pToAreaConfiguration->_blackboard, _pConfigurableElement->getOffset() - pToAreaConfiguration->getConfigurableElement()->getOffset()); 137 } 138 139 void CAreaConfiguration::copyFromOuter(const CAreaConfiguration* pFromAreaConfiguration) 140 { 141 assert(_pConfigurableElement->isDescendantOf(pFromAreaConfiguration->getConfigurableElement())); 142 143 copyFrom(&pFromAreaConfiguration->_blackboard, _pConfigurableElement->getOffset() - pFromAreaConfiguration->getConfigurableElement()->getOffset()); 144 145 // Inner becomes valid 146 setValid(true); 147 } 148 149 // Serialization 150 void CAreaConfiguration::serialize(CBinaryStream& binaryStream) 151 { 152 // Delegate to blackboard 153 _blackboard.serialize(binaryStream); 154 155 if (!binaryStream.isOut()) { 156 157 // Serialized in areas are valid 158 _bValid = true; 159 } 160 } 161 162 // Data size 163 uint32_t CAreaConfiguration::getSize() const 164 { 165 return _blackboard.getSize(); 166 } 167 168 CParameterBlackboard& CAreaConfiguration::getBlackboard() 169 { 170 return _blackboard; 171 } 172 173 const CParameterBlackboard& CAreaConfiguration::getBlackboard() const 174 { 175 return _blackboard; 176 } 177 178 // Store validity 179 void CAreaConfiguration::setValid(bool bValid) 180 { 181 _bValid = bValid; 182 } 183 184 // Blackboard copies 185 void CAreaConfiguration::copyTo(CParameterBlackboard* pToBlackboard, uint32_t uiOffset) const 186 { 187 pToBlackboard->restoreFrom(&_blackboard, uiOffset); 188 } 189 190 void CAreaConfiguration::copyFrom(const CParameterBlackboard* pFromBlackboard, uint32_t uiOffset) 191 { 192 pFromBlackboard->saveTo(&_blackboard, uiOffset); 193 } 194 195