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 ¶meterAccessContext) 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