xref: /aosp_15_r20/external/parameter-framework/upstream/parameter/Subsystem.h (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 #pragma once
31*c33452fbSAndroid Build Coastguard Worker 
32*c33452fbSAndroid Build Coastguard Worker #include "parameter_export.h"
33*c33452fbSAndroid Build Coastguard Worker 
34*c33452fbSAndroid Build Coastguard Worker #include "ConfigurableElement.h"
35*c33452fbSAndroid Build Coastguard Worker #include "Mapper.h"
36*c33452fbSAndroid Build Coastguard Worker #include "MappingContext.h"
37*c33452fbSAndroid Build Coastguard Worker #include <log/Logger.h>
38*c33452fbSAndroid Build Coastguard Worker 
39*c33452fbSAndroid Build Coastguard Worker #include <list>
40*c33452fbSAndroid Build Coastguard Worker #include <stack>
41*c33452fbSAndroid Build Coastguard Worker #include <string>
42*c33452fbSAndroid Build Coastguard Worker #include <vector>
43*c33452fbSAndroid Build Coastguard Worker 
44*c33452fbSAndroid Build Coastguard Worker class CInstanceDefinition;
45*c33452fbSAndroid Build Coastguard Worker class CComponentLibrary;
46*c33452fbSAndroid Build Coastguard Worker class CSubsystemObject;
47*c33452fbSAndroid Build Coastguard Worker class CSubsystemObjectCreator;
48*c33452fbSAndroid Build Coastguard Worker class CInstanceConfigurableElement;
49*c33452fbSAndroid Build Coastguard Worker class CMappingData;
50*c33452fbSAndroid Build Coastguard Worker 
51*c33452fbSAndroid Build Coastguard Worker class PARAMETER_EXPORT CSubsystem : public CConfigurableElement, private IMapper
52*c33452fbSAndroid Build Coastguard Worker {
53*c33452fbSAndroid Build Coastguard Worker     // Subsystem objects iterator
54*c33452fbSAndroid Build Coastguard Worker     typedef std::list<CSubsystemObject *>::const_iterator SubsystemObjectListIterator;
55*c33452fbSAndroid Build Coastguard Worker 
56*c33452fbSAndroid Build Coastguard Worker public:
57*c33452fbSAndroid Build Coastguard Worker     /**
58*c33452fbSAndroid Build Coastguard Worker      * Class Constructor
59*c33452fbSAndroid Build Coastguard Worker      *
60*c33452fbSAndroid Build Coastguard Worker      * @param[in] strName subsystem name
61*c33452fbSAndroid Build Coastguard Worker      * @param[in] logger the main logger of the application
62*c33452fbSAndroid Build Coastguard Worker      */
63*c33452fbSAndroid Build Coastguard Worker     CSubsystem(const std::string &strName, core::log::Logger &logger);
64*c33452fbSAndroid Build Coastguard Worker     ~CSubsystem() override;
65*c33452fbSAndroid Build Coastguard Worker 
66*c33452fbSAndroid Build Coastguard Worker     bool structureFromXml(const CXmlElement &xmlElement,
67*c33452fbSAndroid Build Coastguard Worker                           CXmlSerializingContext &serializingContext) override;
68*c33452fbSAndroid Build Coastguard Worker 
69*c33452fbSAndroid Build Coastguard Worker     // Susbsystem sanity
70*c33452fbSAndroid Build Coastguard Worker     virtual bool isAlive() const;
71*c33452fbSAndroid Build Coastguard Worker 
72*c33452fbSAndroid Build Coastguard Worker     // Resynchronization after subsystem restart needed
73*c33452fbSAndroid Build Coastguard Worker     virtual bool needResync(bool bClear);
74*c33452fbSAndroid Build Coastguard Worker 
75*c33452fbSAndroid Build Coastguard Worker     // from CElement
76*c33452fbSAndroid Build Coastguard Worker     std::string getKind() const override;
77*c33452fbSAndroid Build Coastguard Worker 
78*c33452fbSAndroid Build Coastguard Worker     bool getMappingData(const std::string &strKey, const std::string *&pStrValue) const override;
79*c33452fbSAndroid Build Coastguard Worker     std::string getFormattedMapping() const override;
80*c33452fbSAndroid Build Coastguard Worker 
81*c33452fbSAndroid Build Coastguard Worker     /**
82*c33452fbSAndroid Build Coastguard Worker      * Fetch mapping data of an element.
83*c33452fbSAndroid Build Coastguard Worker      *
84*c33452fbSAndroid Build Coastguard Worker      * The mapping is represented as a std::string of all the mapping data (key:value) defined in
85*c33452fbSAndroid Build Coastguard Worker      * the
86*c33452fbSAndroid Build Coastguard Worker      * context of the element.
87*c33452fbSAndroid Build Coastguard Worker      * This method gathers the mapping data found in each Element of the configurableElementPath
88*c33452fbSAndroid Build Coastguard Worker      * list to format the resulting std::string.
89*c33452fbSAndroid Build Coastguard Worker      *
90*c33452fbSAndroid Build Coastguard Worker      * @param[in] configurableElementPath List of all the ConfigurableElements found
91*c33452fbSAndroid Build Coastguard Worker      * that have a mapping. Elements are added at the end of the list, so the root Element will be
92*c33452fbSAndroid Build Coastguard Worker      * the last one.
93*c33452fbSAndroid Build Coastguard Worker      *
94*c33452fbSAndroid Build Coastguard Worker      * @return Formatted std::string of the mapping data
95*c33452fbSAndroid Build Coastguard Worker      */
96*c33452fbSAndroid Build Coastguard Worker     virtual std::string getMapping(
97*c33452fbSAndroid Build Coastguard Worker         std::list<const CConfigurableElement *> &configurableElementPath) const;
98*c33452fbSAndroid Build Coastguard Worker 
99*c33452fbSAndroid Build Coastguard Worker protected:
100*c33452fbSAndroid Build Coastguard Worker     // Used for simulation and virtual subsystems
101*c33452fbSAndroid Build Coastguard Worker     void setDefaultValues(CParameterAccessContext &parameterAccessContext) const override;
102*c33452fbSAndroid Build Coastguard Worker 
103*c33452fbSAndroid Build Coastguard Worker     /// Functionality intendedn for derived Subsystems
104*c33452fbSAndroid Build Coastguard Worker     // Subsystem context mapping keys publication
105*c33452fbSAndroid Build Coastguard Worker     void addContextMappingKey(const std::string &strMappingKey);
106*c33452fbSAndroid Build Coastguard Worker     // Subsystem object creator publication (strong reference)
107*c33452fbSAndroid Build Coastguard Worker     void addSubsystemObjectFactory(CSubsystemObjectCreator *pSubsystemObjectCreator);
108*c33452fbSAndroid Build Coastguard Worker 
109*c33452fbSAndroid Build Coastguard Worker private:
110*c33452fbSAndroid Build Coastguard Worker     CSubsystem(const CSubsystem &);
111*c33452fbSAndroid Build Coastguard Worker     CSubsystem &operator=(const CSubsystem &);
112*c33452fbSAndroid Build Coastguard Worker 
113*c33452fbSAndroid Build Coastguard Worker     // Belonging subsystem
114*c33452fbSAndroid Build Coastguard Worker     const CSubsystem *getBelongingSubsystem() const override;
115*c33452fbSAndroid Build Coastguard Worker 
116*c33452fbSAndroid Build Coastguard Worker     // Mapping execution
117*c33452fbSAndroid Build Coastguard Worker     bool mapSubsystemElements(std::string &strError);
118*c33452fbSAndroid Build Coastguard Worker 
119*c33452fbSAndroid Build Coastguard Worker     /**
120*c33452fbSAndroid Build Coastguard Worker      * Handle a configurable element mapping.
121*c33452fbSAndroid Build Coastguard Worker      *
122*c33452fbSAndroid Build Coastguard Worker      * Add context mappings to the context and instantiate a subsystem object if needed.
123*c33452fbSAndroid Build Coastguard Worker      *
124*c33452fbSAndroid Build Coastguard Worker      * @param[in,out] pInstanceConfigurableElement The configurable element
125*c33452fbSAndroid Build Coastguard Worker      * @param[out] bKeepDiving Keep diving for mapping keys
126*c33452fbSAndroid Build Coastguard Worker                    Is set to true if a subsystem object (tree leave) has been instantiated.
127*c33452fbSAndroid Build Coastguard Worker                    Undetermined on error
128*c33452fbSAndroid Build Coastguard Worker      * @param[out] strError String filled with an human readable error on error,
129*c33452fbSAndroid Build Coastguard Worker                    left unmodified otherwise
130*c33452fbSAndroid Build Coastguard Worker      *
131*c33452fbSAndroid Build Coastguard Worker      * @return true on success, false on failure
132*c33452fbSAndroid Build Coastguard Worker      */
133*c33452fbSAndroid Build Coastguard Worker     bool mapBegin(CInstanceConfigurableElement *pInstanceConfigurableElement, bool &bKeepDiving,
134*c33452fbSAndroid Build Coastguard Worker                   std::string &strError) override;
135*c33452fbSAndroid Build Coastguard Worker     void mapEnd() override;
136*c33452fbSAndroid Build Coastguard Worker 
137*c33452fbSAndroid Build Coastguard Worker     // Mapping access
138*c33452fbSAndroid Build Coastguard Worker     /**
139*c33452fbSAndroid Build Coastguard Worker      * Generic mapping error handling
140*c33452fbSAndroid Build Coastguard Worker      *
141*c33452fbSAndroid Build Coastguard Worker      * Format an human readable error std::string from a key and a message in case of mapping error
142*c33452fbSAndroid Build Coastguard Worker      *
143*c33452fbSAndroid Build Coastguard Worker      * @param[in] strKey The key on which the error refers
144*c33452fbSAndroid Build Coastguard Worker      * @param[in] strMessage The error message
145*c33452fbSAndroid Build Coastguard Worker      * @param[in] pConfigurableElement The element on which the error refers
146*c33452fbSAndroid Build Coastguard Worker      *
147*c33452fbSAndroid Build Coastguard Worker      * returns The formated error std::string
148*c33452fbSAndroid Build Coastguard Worker      */
149*c33452fbSAndroid Build Coastguard Worker     std::string getMappingError(const std::string &strKey, const std::string &strMessage,
150*c33452fbSAndroid Build Coastguard Worker                                 const CConfigurableElement *pConfigurableElement) const;
151*c33452fbSAndroid Build Coastguard Worker 
152*c33452fbSAndroid Build Coastguard Worker     /**
153*c33452fbSAndroid Build Coastguard Worker      * Format the mapping data of the ConfigurableElements that have been gathered through recursive
154*c33452fbSAndroid Build Coastguard Worker      * calls to the getMapping() method.
155*c33452fbSAndroid Build Coastguard Worker      * These elements shall be evaluated from the root level to the leaves level, so the list must
156*c33452fbSAndroid Build Coastguard Worker      * be parsed in reverse order.
157*c33452fbSAndroid Build Coastguard Worker      *
158*c33452fbSAndroid Build Coastguard Worker      * @param[in] configurableElementPath List of ConfigurableElements containing mapping data
159*c33452fbSAndroid Build Coastguard Worker      *
160*c33452fbSAndroid Build Coastguard Worker      * @return String containing the formatted mapping
161*c33452fbSAndroid Build Coastguard Worker      */
162*c33452fbSAndroid Build Coastguard Worker     std::string formatMappingDataList(
163*c33452fbSAndroid Build Coastguard Worker         const std::list<const CConfigurableElement *> &configurableElementPath) const;
164*c33452fbSAndroid Build Coastguard Worker 
165*c33452fbSAndroid Build Coastguard Worker     /**
166*c33452fbSAndroid Build Coastguard Worker      * Find the SubystemObject which contains a specific CInstanceConfigurableElement.
167*c33452fbSAndroid Build Coastguard Worker      *
168*c33452fbSAndroid Build Coastguard Worker      * @param[in] pInstanceConfigurableElement The CInstanceConfigurableElement that is related to
169*c33452fbSAndroid Build Coastguard Worker      * the wanted SubsystemObject. Each SubsystemObject of the Subystem internal list is checked in
170*c33452fbSAndroid Build Coastguard Worker      * order to find a match.
171*c33452fbSAndroid Build Coastguard Worker      *
172*c33452fbSAndroid Build Coastguard Worker      * @return A pointer to the SubsystemObject related to pInstanceConfigurableElement
173*c33452fbSAndroid Build Coastguard Worker      */
174*c33452fbSAndroid Build Coastguard Worker     const CSubsystemObject *findSubsystemObjectFromConfigurableElement(
175*c33452fbSAndroid Build Coastguard Worker         const CInstanceConfigurableElement *pInstanceConfigurableElement) const;
176*c33452fbSAndroid Build Coastguard Worker 
177*c33452fbSAndroid Build Coastguard Worker     /**
178*c33452fbSAndroid Build Coastguard Worker      * Find the mapping data defined for the CInstanceConfigurableElement given in parameter, that
179*c33452fbSAndroid Build Coastguard Worker      * corresponds to Subsystem level mapping (Subsystem level mapping keys are defined in
180*c33452fbSAndroid Build Coastguard Worker      * CSubsystemObjectCreator classes).
181*c33452fbSAndroid Build Coastguard Worker      * The CInstanceConfigurableElement might as well contain local mapping data.
182*c33452fbSAndroid Build Coastguard Worker      *
183*c33452fbSAndroid Build Coastguard Worker      * @param[in] pInstanceConfigurableElement The element which mapping data will be parsed for
184*c33452fbSAndroid Build Coastguard Worker      * a match
185*c33452fbSAndroid Build Coastguard Worker      * @param[out] strMappingKey Mapping key defined at the Subsystem level
186*c33452fbSAndroid Build Coastguard Worker      * @param[out] strMappingValue Mapping value contained in pInstanceConfigurableElement
187*c33452fbSAndroid Build Coastguard Worker      */
188*c33452fbSAndroid Build Coastguard Worker     void findSubsystemLevelMappingKeyValue(
189*c33452fbSAndroid Build Coastguard Worker         const CInstanceConfigurableElement *pInstanceConfigurableElement,
190*c33452fbSAndroid Build Coastguard Worker         std::string &strMappingKey, std::string &strMappingValue) const;
191*c33452fbSAndroid Build Coastguard Worker 
192*c33452fbSAndroid Build Coastguard Worker     /**
193*c33452fbSAndroid Build Coastguard Worker      * Formats the mapping of a SubsystemObject
194*c33452fbSAndroid Build Coastguard Worker      *
195*c33452fbSAndroid Build Coastguard Worker      * @param[in] pInstanceConfigurableElement Element corresponding to a SubsystemObject
196*c33452fbSAndroid Build Coastguard Worker      *
197*c33452fbSAndroid Build Coastguard Worker      * @return String containing the formatted mapping
198*c33452fbSAndroid Build Coastguard Worker      */
199*c33452fbSAndroid Build Coastguard Worker     std::string getFormattedSubsystemMappingData(
200*c33452fbSAndroid Build Coastguard Worker         const CInstanceConfigurableElement *pInstanceConfigurableElement) const;
201*c33452fbSAndroid Build Coastguard Worker     /**
202*c33452fbSAndroid Build Coastguard Worker      * Generic context handling
203*c33452fbSAndroid Build Coastguard Worker      *
204*c33452fbSAndroid Build Coastguard Worker      * Feed context with mapping data of the current element
205*c33452fbSAndroid Build Coastguard Worker      *
206*c33452fbSAndroid Build Coastguard Worker      * @param[in] pConfigurableElement The element containing mapping data
207*c33452fbSAndroid Build Coastguard Worker      * @param[out] context The context mapping to update with the current element mapping values
208*c33452fbSAndroid Build Coastguard Worker      * @param[out] strError The formated error std::string
209*c33452fbSAndroid Build Coastguard Worker      *
210*c33452fbSAndroid Build Coastguard Worker      * @return true on success
211*c33452fbSAndroid Build Coastguard Worker      */
212*c33452fbSAndroid Build Coastguard Worker     bool handleMappingContext(const CConfigurableElement *pConfigurableElement,
213*c33452fbSAndroid Build Coastguard Worker                               CMappingContext &context, std::string &strError) const;
214*c33452fbSAndroid Build Coastguard Worker 
215*c33452fbSAndroid Build Coastguard Worker     /**
216*c33452fbSAndroid Build Coastguard Worker      * Looks if a subsystem object needs to be instantiated for the given configurable
217*c33452fbSAndroid Build Coastguard Worker      * element, then instantiate it if needed.
218*c33452fbSAndroid Build Coastguard Worker      *
219*c33452fbSAndroid Build Coastguard Worker      * @param[in,out] pInstanceConfigurableElement The configurable element to check
220*c33452fbSAndroid Build Coastguard Worker      *            for instanciation
221*c33452fbSAndroid Build Coastguard Worker      * @param[in] context The mapping values container
222*c33452fbSAndroid Build Coastguard Worker      * @param[out] bHasCreatedSubsystemObject If a subsystem object has been instantiated.
223*c33452fbSAndroid Build Coastguard Worker                    Undetermined on error
224*c33452fbSAndroid Build Coastguard Worker      * @param[out] strError String filled with an human readable error on error,
225*c33452fbSAndroid Build Coastguard Worker                    left unmodified otherwise
226*c33452fbSAndroid Build Coastguard Worker      *
227*c33452fbSAndroid Build Coastguard Worker      * @return true on success, false on failure
228*c33452fbSAndroid Build Coastguard Worker      */
229*c33452fbSAndroid Build Coastguard Worker     bool handleSubsystemObjectCreation(CInstanceConfigurableElement *pInstanceConfigurableElement,
230*c33452fbSAndroid Build Coastguard Worker                                        CMappingContext &context, bool &bHasCreatedSubsystemObject,
231*c33452fbSAndroid Build Coastguard Worker                                        std::string &strError);
232*c33452fbSAndroid Build Coastguard Worker 
233*c33452fbSAndroid Build Coastguard Worker     // Subsystem context mapping keys
234*c33452fbSAndroid Build Coastguard Worker     std::vector<std::string> _contextMappingKeyArray;
235*c33452fbSAndroid Build Coastguard Worker 
236*c33452fbSAndroid Build Coastguard Worker     // Subsystem object creator map
237*c33452fbSAndroid Build Coastguard Worker     std::vector<CSubsystemObjectCreator *> _subsystemObjectCreatorArray;
238*c33452fbSAndroid Build Coastguard Worker 
239*c33452fbSAndroid Build Coastguard Worker     // Subsystem sync objects (house keeping)
240*c33452fbSAndroid Build Coastguard Worker     std::list<CSubsystemObject *> _subsystemObjectList;
241*c33452fbSAndroid Build Coastguard Worker 
242*c33452fbSAndroid Build Coastguard Worker     // Mapping Context stack
243*c33452fbSAndroid Build Coastguard Worker     std::stack<CMappingContext> _contextStack;
244*c33452fbSAndroid Build Coastguard Worker 
245*c33452fbSAndroid Build Coastguard Worker     // Subelements
246*c33452fbSAndroid Build Coastguard Worker     CComponentLibrary *_pComponentLibrary;
247*c33452fbSAndroid Build Coastguard Worker     CInstanceDefinition *_pInstanceDefinition;
248*c33452fbSAndroid Build Coastguard Worker 
249*c33452fbSAndroid Build Coastguard Worker     //! Contains the mapping info at Subsystem level
250*c33452fbSAndroid Build Coastguard Worker     CMappingData *_pMappingData{nullptr};
251*c33452fbSAndroid Build Coastguard Worker 
252*c33452fbSAndroid Build Coastguard Worker     /** Logger which has to be provided to subsystem objects */
253*c33452fbSAndroid Build Coastguard Worker     core::log::Logger &_logger;
254*c33452fbSAndroid Build Coastguard Worker };
255