xref: /aosp_15_r20/external/parameter-framework/upstream/parameter/AreaConfiguration.cpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker  * Copyright (c) 2011-2015, Intel Corporation
3*c33452fbSAndroid Build Coastguard Worker  * All rights reserved.
4*c33452fbSAndroid Build Coastguard Worker  *
5*c33452fbSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without modification,
6*c33452fbSAndroid Build Coastguard Worker  * are permitted provided that the following conditions are met:
7*c33452fbSAndroid Build Coastguard Worker  *
8*c33452fbSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
9*c33452fbSAndroid Build Coastguard Worker  * list of conditions and the following disclaimer.
10*c33452fbSAndroid Build Coastguard Worker  *
11*c33452fbSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c33452fbSAndroid Build Coastguard Worker  * this list of conditions and the following disclaimer in the documentation and/or
13*c33452fbSAndroid Build Coastguard Worker  * other materials provided with the distribution.
14*c33452fbSAndroid Build Coastguard Worker  *
15*c33452fbSAndroid Build Coastguard Worker  * 3. Neither the name of the copyright holder nor the names of its contributors
16*c33452fbSAndroid Build Coastguard Worker  * may be used to endorse or promote products derived from this software without
17*c33452fbSAndroid Build Coastguard Worker  * specific prior written permission.
18*c33452fbSAndroid Build Coastguard Worker  *
19*c33452fbSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*c33452fbSAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*c33452fbSAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*c33452fbSAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23*c33452fbSAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*c33452fbSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*c33452fbSAndroid Build Coastguard Worker  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*c33452fbSAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*c33452fbSAndroid Build Coastguard Worker  */
30*c33452fbSAndroid Build Coastguard Worker #include "AreaConfiguration.h"
31*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableElement.h"
32*c33452fbSAndroid Build Coastguard Worker #include "ConfigurationAccessContext.h"
33*c33452fbSAndroid Build Coastguard Worker #include <assert.h>
34*c33452fbSAndroid Build Coastguard Worker 
CAreaConfiguration(const CConfigurableElement * pConfigurableElement,const CSyncerSet * pSyncerSet)35*c33452fbSAndroid Build Coastguard Worker CAreaConfiguration::CAreaConfiguration(const CConfigurableElement *pConfigurableElement,
36*c33452fbSAndroid Build Coastguard Worker                                        const CSyncerSet *pSyncerSet)
37*c33452fbSAndroid Build Coastguard Worker     : _pConfigurableElement(pConfigurableElement), _pSyncerSet(pSyncerSet)
38*c33452fbSAndroid Build Coastguard Worker {
39*c33452fbSAndroid Build Coastguard Worker     // Size blackboard
40*c33452fbSAndroid Build Coastguard Worker     _blackboard.setSize(_pConfigurableElement->getFootPrint());
41*c33452fbSAndroid Build Coastguard Worker }
42*c33452fbSAndroid Build Coastguard Worker 
CAreaConfiguration(const CConfigurableElement * pConfigurableElement,const CSyncerSet * pSyncerSet,size_t size)43*c33452fbSAndroid Build Coastguard Worker CAreaConfiguration::CAreaConfiguration(const CConfigurableElement *pConfigurableElement,
44*c33452fbSAndroid Build Coastguard Worker                                        const CSyncerSet *pSyncerSet, size_t size)
45*c33452fbSAndroid Build Coastguard Worker     : _pConfigurableElement(pConfigurableElement), _pSyncerSet(pSyncerSet)
46*c33452fbSAndroid Build Coastguard Worker {
47*c33452fbSAndroid Build Coastguard Worker     // Size blackboard
48*c33452fbSAndroid Build Coastguard Worker     _blackboard.setSize(size);
49*c33452fbSAndroid Build Coastguard Worker }
50*c33452fbSAndroid Build Coastguard Worker 
51*c33452fbSAndroid Build Coastguard Worker // Save data from current
save(const CParameterBlackboard * pMainBlackboard)52*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::save(const CParameterBlackboard *pMainBlackboard)
53*c33452fbSAndroid Build Coastguard Worker {
54*c33452fbSAndroid Build Coastguard Worker     copyFrom(pMainBlackboard, _pConfigurableElement->getOffset());
55*c33452fbSAndroid Build Coastguard Worker }
56*c33452fbSAndroid Build Coastguard Worker 
57*c33452fbSAndroid Build Coastguard Worker // Apply data to current
restore(CParameterBlackboard * pMainBlackboard,bool bSync,core::Results * errors) const58*c33452fbSAndroid Build Coastguard Worker bool CAreaConfiguration::restore(CParameterBlackboard *pMainBlackboard, bool bSync,
59*c33452fbSAndroid Build Coastguard Worker                                  core::Results *errors) const
60*c33452fbSAndroid Build Coastguard Worker {
61*c33452fbSAndroid Build Coastguard Worker     assert(_bValid);
62*c33452fbSAndroid Build Coastguard Worker 
63*c33452fbSAndroid Build Coastguard Worker     copyTo(pMainBlackboard, _pConfigurableElement->getOffset());
64*c33452fbSAndroid Build Coastguard Worker 
65*c33452fbSAndroid Build Coastguard Worker     // Synchronize if required
66*c33452fbSAndroid Build Coastguard Worker     return !bSync || _pSyncerSet->sync(*pMainBlackboard, false, errors);
67*c33452fbSAndroid Build Coastguard Worker }
68*c33452fbSAndroid Build Coastguard Worker 
69*c33452fbSAndroid Build Coastguard Worker // Ensure validity
validate(const CParameterBlackboard * pMainBlackboard)70*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::validate(const CParameterBlackboard *pMainBlackboard)
71*c33452fbSAndroid Build Coastguard Worker {
72*c33452fbSAndroid Build Coastguard Worker     if (!_bValid) {
73*c33452fbSAndroid Build Coastguard Worker 
74*c33452fbSAndroid Build Coastguard Worker         // Saving from blackboard make area configuration valid
75*c33452fbSAndroid Build Coastguard Worker         save(pMainBlackboard);
76*c33452fbSAndroid Build Coastguard Worker 
77*c33452fbSAndroid Build Coastguard Worker         _bValid = true;
78*c33452fbSAndroid Build Coastguard Worker     }
79*c33452fbSAndroid Build Coastguard Worker }
80*c33452fbSAndroid Build Coastguard Worker 
81*c33452fbSAndroid Build Coastguard Worker // Return validity
isValid() const82*c33452fbSAndroid Build Coastguard Worker bool CAreaConfiguration::isValid() const
83*c33452fbSAndroid Build Coastguard Worker {
84*c33452fbSAndroid Build Coastguard Worker     return _bValid;
85*c33452fbSAndroid Build Coastguard Worker }
86*c33452fbSAndroid Build Coastguard Worker 
87*c33452fbSAndroid Build Coastguard Worker // Ensure validity against given valid area configuration
validateAgainst(const CAreaConfiguration * pValidAreaConfiguration)88*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::validateAgainst(const CAreaConfiguration *pValidAreaConfiguration)
89*c33452fbSAndroid Build Coastguard Worker {
90*c33452fbSAndroid Build Coastguard Worker     // Should be called on purpose
91*c33452fbSAndroid Build Coastguard Worker     assert(!_bValid);
92*c33452fbSAndroid Build Coastguard Worker 
93*c33452fbSAndroid Build Coastguard Worker     // Check proper against area given
94*c33452fbSAndroid Build Coastguard Worker     assert(pValidAreaConfiguration->isValid());
95*c33452fbSAndroid Build Coastguard Worker 
96*c33452fbSAndroid Build Coastguard Worker     // Check compatibility
97*c33452fbSAndroid Build Coastguard Worker     assert(_pConfigurableElement == pValidAreaConfiguration->_pConfigurableElement);
98*c33452fbSAndroid Build Coastguard Worker 
99*c33452fbSAndroid Build Coastguard Worker     // Copy
100*c33452fbSAndroid Build Coastguard Worker     _blackboard.restoreFrom(&pValidAreaConfiguration->_blackboard, 0);
101*c33452fbSAndroid Build Coastguard Worker 
102*c33452fbSAndroid Build Coastguard Worker     // Set as valid
103*c33452fbSAndroid Build Coastguard Worker     _bValid = true;
104*c33452fbSAndroid Build Coastguard Worker }
105*c33452fbSAndroid Build Coastguard Worker 
106*c33452fbSAndroid Build Coastguard Worker // XML configuration settings parsing
serializeXmlSettings(CXmlElement & xmlConfigurableElementSettingsElementContent,CConfigurationAccessContext & configurationAccessContext)107*c33452fbSAndroid Build Coastguard Worker bool CAreaConfiguration::serializeXmlSettings(
108*c33452fbSAndroid Build Coastguard Worker     CXmlElement &xmlConfigurableElementSettingsElementContent,
109*c33452fbSAndroid Build Coastguard Worker     CConfigurationAccessContext &configurationAccessContext)
110*c33452fbSAndroid Build Coastguard Worker {
111*c33452fbSAndroid Build Coastguard Worker     // Assign blackboard to configuration context
112*c33452fbSAndroid Build Coastguard Worker     configurationAccessContext.setParameterBlackboard(&_blackboard);
113*c33452fbSAndroid Build Coastguard Worker 
114*c33452fbSAndroid Build Coastguard Worker     // Assign base offset to configuration context
115*c33452fbSAndroid Build Coastguard Worker     configurationAccessContext.setBaseOffset(_pConfigurableElement->getOffset());
116*c33452fbSAndroid Build Coastguard Worker 
117*c33452fbSAndroid Build Coastguard Worker     // Parse configuration settings (element contents)
118*c33452fbSAndroid Build Coastguard Worker     if (_pConfigurableElement->serializeXmlSettings(xmlConfigurableElementSettingsElementContent,
119*c33452fbSAndroid Build Coastguard Worker                                                     configurationAccessContext)) {
120*c33452fbSAndroid Build Coastguard Worker 
121*c33452fbSAndroid Build Coastguard Worker         if (!configurationAccessContext.serializeOut()) {
122*c33452fbSAndroid Build Coastguard Worker 
123*c33452fbSAndroid Build Coastguard Worker             // Serialized-in areas are valid
124*c33452fbSAndroid Build Coastguard Worker             _bValid = true;
125*c33452fbSAndroid Build Coastguard Worker         }
126*c33452fbSAndroid Build Coastguard Worker         return true;
127*c33452fbSAndroid Build Coastguard Worker     }
128*c33452fbSAndroid Build Coastguard Worker     return false;
129*c33452fbSAndroid Build Coastguard Worker }
130*c33452fbSAndroid Build Coastguard Worker 
131*c33452fbSAndroid Build Coastguard Worker // Compound handling
getConfigurableElement() const132*c33452fbSAndroid Build Coastguard Worker const CConfigurableElement *CAreaConfiguration::getConfigurableElement() const
133*c33452fbSAndroid Build Coastguard Worker {
134*c33452fbSAndroid Build Coastguard Worker     return _pConfigurableElement;
135*c33452fbSAndroid Build Coastguard Worker }
136*c33452fbSAndroid Build Coastguard Worker 
copyToOuter(CAreaConfiguration * pToAreaConfiguration) const137*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::copyToOuter(CAreaConfiguration *pToAreaConfiguration) const
138*c33452fbSAndroid Build Coastguard Worker {
139*c33452fbSAndroid Build Coastguard Worker     assert(_pConfigurableElement->isDescendantOf(pToAreaConfiguration->getConfigurableElement()));
140*c33452fbSAndroid Build Coastguard Worker 
141*c33452fbSAndroid Build Coastguard Worker     copyTo(&pToAreaConfiguration->_blackboard,
142*c33452fbSAndroid Build Coastguard Worker            _pConfigurableElement->getOffset() -
143*c33452fbSAndroid Build Coastguard Worker                pToAreaConfiguration->getConfigurableElement()->getOffset());
144*c33452fbSAndroid Build Coastguard Worker }
145*c33452fbSAndroid Build Coastguard Worker 
copyFromOuter(const CAreaConfiguration * pFromAreaConfiguration)146*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::copyFromOuter(const CAreaConfiguration *pFromAreaConfiguration)
147*c33452fbSAndroid Build Coastguard Worker {
148*c33452fbSAndroid Build Coastguard Worker     assert(_pConfigurableElement->isDescendantOf(pFromAreaConfiguration->getConfigurableElement()));
149*c33452fbSAndroid Build Coastguard Worker 
150*c33452fbSAndroid Build Coastguard Worker     copyFrom(&pFromAreaConfiguration->_blackboard,
151*c33452fbSAndroid Build Coastguard Worker              _pConfigurableElement->getOffset() -
152*c33452fbSAndroid Build Coastguard Worker                  pFromAreaConfiguration->getConfigurableElement()->getOffset());
153*c33452fbSAndroid Build Coastguard Worker 
154*c33452fbSAndroid Build Coastguard Worker     // Inner becomes valid
155*c33452fbSAndroid Build Coastguard Worker     setValid(true);
156*c33452fbSAndroid Build Coastguard Worker }
157*c33452fbSAndroid Build Coastguard Worker 
getBlackboard()158*c33452fbSAndroid Build Coastguard Worker CParameterBlackboard &CAreaConfiguration::getBlackboard()
159*c33452fbSAndroid Build Coastguard Worker {
160*c33452fbSAndroid Build Coastguard Worker     return _blackboard;
161*c33452fbSAndroid Build Coastguard Worker }
162*c33452fbSAndroid Build Coastguard Worker 
getBlackboard() const163*c33452fbSAndroid Build Coastguard Worker const CParameterBlackboard &CAreaConfiguration::getBlackboard() const
164*c33452fbSAndroid Build Coastguard Worker {
165*c33452fbSAndroid Build Coastguard Worker     return _blackboard;
166*c33452fbSAndroid Build Coastguard Worker }
167*c33452fbSAndroid Build Coastguard Worker 
168*c33452fbSAndroid Build Coastguard Worker // Store validity
setValid(bool bValid)169*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::setValid(bool bValid)
170*c33452fbSAndroid Build Coastguard Worker {
171*c33452fbSAndroid Build Coastguard Worker     _bValid = bValid;
172*c33452fbSAndroid Build Coastguard Worker }
173*c33452fbSAndroid Build Coastguard Worker 
174*c33452fbSAndroid Build Coastguard Worker // Blackboard copies
copyTo(CParameterBlackboard * pToBlackboard,size_t offset) const175*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::copyTo(CParameterBlackboard *pToBlackboard, size_t offset) const
176*c33452fbSAndroid Build Coastguard Worker {
177*c33452fbSAndroid Build Coastguard Worker     pToBlackboard->restoreFrom(&_blackboard, offset);
178*c33452fbSAndroid Build Coastguard Worker }
179*c33452fbSAndroid Build Coastguard Worker 
copyFrom(const CParameterBlackboard * pFromBlackboard,size_t offset)180*c33452fbSAndroid Build Coastguard Worker void CAreaConfiguration::copyFrom(const CParameterBlackboard *pFromBlackboard, size_t offset)
181*c33452fbSAndroid Build Coastguard Worker {
182*c33452fbSAndroid Build Coastguard Worker     pFromBlackboard->saveTo(&_blackboard, offset);
183*c33452fbSAndroid Build Coastguard Worker }
184