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