/* * Copyright (c) 2011-2016, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include <mutex> #include <map> #include <vector> #include "RemoteCommandHandlerTemplate.h" #include "PathNavigator.h" #include "SelectionCriterionType.h" #include "SelectionCriterion.h" #include "Element.h" #include "XmlDocSink.h" #include "XmlDocSource.h" #include "XmlDomainExportContext.h" #include "Results.h" #include "ElementHandle.h" #include <log/LogWrapper.h> #include <log/Context.h> #include <istream> #include <memory> #include <ostream> #include <string> class CElementLibrarySet; class CSubsystemLibrary; class CSystemClass; class CSelectionCriteria; class CParameterFrameworkConfiguration; class CParameterBlackboard; class CConfigurableDomains; class IRemoteProcessorServerInterface; class CParameterHandle; class CSubsystemPlugins; class CParameterAccessContext; class CConfigurableElement; class CParameterMgr : private CElement { enum ChildElement { EFrameworkConfiguration, ESelectionCriteria, ESystemClass, EConfigurableDomains }; enum ElementLibrary { EFrameworkConfigurationLibrary, EParameterCreationLibrary, EParameterConfigurationLibrary }; // Parameter handle friendship friend class ElementHandle; public: // Construction CParameterMgr(const std::string &strConfigurationFilePath, core::log::ILogger &logger); virtual ~CParameterMgr(); /** Load plugins, structures and settings from the config file given. * * @param[out] strError is a std::string describing the error if an error occurred * undefined otherwise. * * @return true if no error occurred, false otherwise. */ bool load(std::string &strError); // Remote command parsers using CommandHandler = std::unique_ptr<TRemoteCommandHandlerTemplate<CParameterMgr>>; /** Create and return a command handler for this ParameterMgr instance * * @returns a Command Handler */ CommandHandler createCommandHandler(); // Selection Criteria CSelectionCriterionType *createSelectionCriterionType(bool bIsInclusive); CSelectionCriterion *createSelectionCriterion( const std::string &strName, const CSelectionCriterionType *pSelectionCriterionType); // Selection criterion retrieval CSelectionCriterion *getSelectionCriterion(const std::string &strName); // Configuration application void applyConfigurations(); /** const version of getConfigurableElement */ const CConfigurableElement *getConfigurableElement(const std::string &strPath, std::string &strError) const; /** Returns the CConfigurableElement corresponding to the path given in argument. * * @param[in] strPath A std::string representing a path to an element. * @param[out] strError Error message * * @return A const pointer to the corresponding CConfigurableElement. * On error, NULL is returned and the error is explained in strError. */ CConfigurableElement *getConfigurableElement(const std::string &strPath, std::string &strError); // Dynamic parameter handling CParameterHandle *createParameterHandle(const std::string &strPath, std::string &strError); /** Creates a handle to a configurable element. * * The returned object is owned by the client who is responsible to delete it. * * @param[in] path A string representing a path to a configurable element. * @param[out] error On error: an human readable error message * On success: undefined * * @return An element handle on success * nullptr on error */ ElementHandle *createElementHandle(const std::string &path, std::string &error); /** Is the remote interface forcefully disabled ? */ bool getForceNoRemoteInterface() const; /** * Forcefully disable the remote interface or cancel this policy * * @param[in] bForceNoRemoteInterface disable the remote interface if true. */ void setForceNoRemoteInterface(bool bForceNoRemoteInterface); /** Should start fail in case of missing subsystems. * * @param[in] bFail: If set to true, parameterMgr start will fail on missing subsystems. * If set to false, missing subsystems will fallback on virtual subsystem. */ void setFailureOnMissingSubsystem(bool bFail); /** Would start fail in case of missing subsystems. * * @return true if the subsystem will fail on missing subsystem, false otherwise. */ bool getFailureOnMissingSubsystem() const; /** Should start fail in failed settings load. * * @param[in] bFail: If set to true, parameterMgr start will fail on failed settings load. * If set to false, failed settings load will be ignored. */ void setFailureOnFailedSettingsLoad(bool bFail); /** Would start fail in case of failed settings load. * * @return failure on failed settings load policy state. */ bool getFailureOnFailedSettingsLoad() const; /** Get the XML Schemas URI * * @returns the XML Schemas URI */ const std::string &getSchemaUri() const; /** Override the XML Schemas URI * * @param[in] schemaUri XML Schemas URI */ void setSchemaUri(const std::string &schemaUri); /** Should .xml files be validated on start ? * * @param[in] bValidate: * If set to true, parameterMgr will report an error * when being unable to validate .xml files * If set to false, no .xml/xsd validation will happen * (default behaviour) * * @return false if unable to set, true otherwise. */ void setValidateSchemasOnStart(bool bValidate); /** Would .xml files be validated on start? * * @return areSchemasValidated */ bool getValidateSchemasOnStart() const; //////////// Tuning ///////////// /** * Activate / deactivate the tuning mode. * * @param[in] bOn true if tuning mode activation is requested, false for desactivation * @param[out] strError human readable error * @return true if request is successful, false if the Parameter Manager is already in the mode * requested or in case of error. * If false, strError is set with the associated human readable error. */ bool setTuningMode(bool bOn, std::string &strError); bool tuningModeOn() const; // Current value space for user set/get value interpretation void setValueSpace(bool bIsRaw); bool valueSpaceIsRaw(); // Current Output Raw Format for user get value interpretation void setOutputRawFormat(bool bIsHex); bool outputRawFormatIsHex(); // Automatic hardware synchronization control (during tuning session) bool setAutoSync(bool bAutoSyncOn, std::string &strError); bool autoSyncOn() const; bool sync(std::string &strError); // User set/get parameters bool accessParameterValue(const std::string &strPath, std::string &strValue, bool bSet, std::string &strError); /** * Returns the element mapping corresponding to the path given in parameter. * * @param[in] strPath Path of an element * @param[out] strValue A sting containing the mapping * * @return true if a mapping was found for this element */ bool getParameterMapping(const std::string &strPath, std::string &strValue) const; bool accessConfigurationValue(const std::string &strDomain, const std::string &stConfiguration, const std::string &strPath, std::string &strValue, bool bSet, std::string &strError); ////////// Configuration/Domains handling ////////////// // Creation/Deletion bool createDomain(const std::string &strName, std::string &strError); bool renameDomain(const std::string &strName, const std::string &strNewName, std::string &strError); bool deleteDomain(const std::string &strName, std::string &strError); bool deleteAllDomains(std::string &strError); bool setSequenceAwareness(const std::string &strName, bool bSequenceAware, std::string &strResult); bool getSequenceAwareness(const std::string &strName, bool &bSequenceAware, std::string &strResult); bool createConfiguration(const std::string &strDomain, const std::string &strConfiguration, std::string &strError); bool deleteConfiguration(const std::string &strDomain, const std::string &strConfiguration, std::string &strError); bool renameConfiguration(const std::string &strDomain, const std::string &strConfiguration, const std::string &strNewConfiguration, std::string &strError); /** Restore a configuration * * @param[in] strDomain the domain name * @param[in] strConfiguration the configuration name * @param[out] errors errors encountered during restoration * @return true if success false otherwise */ bool restoreConfiguration(const std::string &strDomain, const std::string &strConfiguration, core::Results &errors); bool saveConfiguration(const std::string &strDomain, const std::string &strConfiguration, std::string &strError); // Configurable element - domain association bool addConfigurableElementToDomain(const std::string &strDomain, const std::string &strConfigurableElementPath, std::string &strError); bool removeConfigurableElementFromDomain(const std::string &strDomain, const std::string &strConfigurableElementPath, std::string &strError); bool split(const std::string &strDomain, const std::string &strConfigurableElementPath, std::string &strError); bool setElementSequence(const std::string &strDomain, const std::string &strConfiguration, const std::vector<std::string> &astrNewElementSequence, std::string &strError); bool getApplicationRule(const std::string &strDomain, const std::string &strConfiguration, std::string &strResult); bool setApplicationRule(const std::string &strDomain, const std::string &strConfiguration, const std::string &strApplicationRule, std::string &strError); bool clearApplicationRule(const std::string &strDomain, const std::string &strConfiguration, std::string &strError); /** * Method that imports Configurable Domains from an Xml source. * * @param[in] xmlSource a std::string containing an xml description or a path to an xml file * @param[in] withSettings a boolean that determines if the settings should be used in the * xml description * @param[in] fromFile a boolean that determines if the source is an xml description in * xmlSource or contained in a file. In that case xmlSource is just the file path. * @param[out] errorMsg is used as the error output * * @return false if any error occures */ bool importDomainsXml(const std::string &xmlSource, bool withSettings, bool fromFile, std::string &errorMsg); /** * Method that imports a single Configurable Domain from an Xml source. * * @param[in] xmlSource a string containing an xml description or a path to an xml file * @param[in] overwrite when importing an existing domain, allow * overwriting or return an error * @param[in] withSettings a boolean that determines if the settings should be used in the * xml description * @param[in] fromFile a boolean that determines if the source is an xml description in * xmlSource or contained in a file. In that case xmlSource is just the file path. * @param[out] errorMsg is used as the error output * * @return false if any error occurs */ bool importSingleDomainXml(const std::string &xmlSource, bool overwrite, bool withSettings, bool fromFile, std::string &errorMsg); /** * Method that exports Configurable Domains to an Xml destination. * * @param[in,out] xmlDest a string containing an xml description or a path to an xml file * @param[in] withSettings a boolean that determines if the settings should be used in the * xml description * @param[in] toFile a boolean that determines if the destination is an xml description in * xmlDest or contained in a file. In that case xmlDest is just the file path. * @param[out] errorMsg is used as the error output * * @return false if any error occurs, true otherwise. */ bool exportDomainsXml(std::string &xmlDest, bool withSettings, bool toFile, std::string &errorMsg) const; /** * Method that exports a given Configurable Domain to an Xml destination. * * @param[in,out] xmlDest a string containing an xml description or a path to an xml file * @param[in] domainName the name of the domain to be exported * @param[in] withSettings a boolean that determines if the settings should be used in the * xml description * @param[in] toFile a boolean that determines if the destination is an xml description in * xmlDest or contained in a file. In that case xmlDest is just the file path. * @param[out] errorMsg is used as the error output * * @return false if any error occurs, true otherwise. */ bool exportSingleDomainXml(std::string &xmlDest, const std::string &domainName, bool withSettings, bool toFile, std::string &errorMsg) const; /** * Method that exports an Xml description of the passed element into a string * * @param[in] pXmlSource The source element to export * @param[in] strRootElementType The XML root element name of the exported instance document * @param[in] xmlSerializingContext the context to use for serialization * Is an rvalue as it must be destructed after this function * call to set the error. * Additionally, using it for an other serialization would * override the error. * @param[out] strResult contains the xml description or the error description in case false is * returned * * @return true for success, false if any error occurs during the creation of the xml * description (validation or encoding) */ bool exportElementToXMLString(const IXmlSource *pXmlSource, const std::string &strRootElementType, CXmlSerializingContext &&xmlSerializingContext, std::string &strResult) const; // CElement virtual std::string getKind() const; private: CParameterMgr(const CParameterMgr &); CParameterMgr &operator=(const CParameterMgr &); // Init virtual bool init(std::string &strError); // Version std::string getVersion() const; // This using is here for internal reasons: CommandHandler is public and is // a unique_ptr but we want the type that's inside. And for legacy reason // because that's the original name before a rework; this directive avoids // renaming a lot of stuff. using CCommandHandler = CommandHandler::element_type; using RemoteCommandParser = CCommandHandler::CommandStatus (CParameterMgr::*)( const IRemoteCommand &remoteCommand, std::string &strResult); // Parser descriptions struct SRemoteCommandParserItem { const char *_pcCommandName; CParameterMgr::RemoteCommandParser _pfnParser; size_t _minArgumentCount; const char *_pcHelp; const char *_pcDescription; }; ////////////////:: Remote command parsers /// Version CCommandHandler::CommandStatus versionCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Status CCommandHandler::CommandStatus statusCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Tuning Mode CCommandHandler::CommandStatus setTuningModeCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getTuningModeCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Value Space CCommandHandler::CommandStatus setValueSpaceCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getValueSpaceCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Output Raw Format CCommandHandler::CommandStatus setOutputRawFormatCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getOutputRawFormatCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /// Sync CCommandHandler::CommandStatus setAutoSyncCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getAutoSyncCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus syncCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Criteria CCommandHandler::CommandStatus listCriteriaCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Domains CCommandHandler::CommandStatus listDomainsCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus createDomainCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus deleteDomainCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus deleteAllDomainsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus renameDomainCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setSequenceAwarenessCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getSequenceAwarenessCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus listDomainElementsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus addElementCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus removeElementCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus splitDomainCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Configurations CCommandHandler::CommandStatus listConfigurationsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus dumpDomainsCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus createConfigurationCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus deleteConfigurationCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus renameConfigurationCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus saveConfigurationCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus restoreConfigurationCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setElementSequenceCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getElementSequenceCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setRuleCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus clearRuleCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getRuleCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Elements/Parameters CCommandHandler::CommandStatus listElementsCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus listParametersCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getElementStructureXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getElementBytesCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setElementBytesCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getElementXMLCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setElementXMLCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus dumpElementCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getElementSizeCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus showPropertiesCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getParameterCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setParameterCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus getConfigurationParameterCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus setConfigurationParameterCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus listBelongingDomainsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus listAssociatedDomainsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus showMappingCommandProcess(const IRemoteCommand &remoteCommand, std::string &strResult); /// Browse CCommandHandler::CommandStatus listAssociatedElementsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus listConflictingElementsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus listRogueElementsCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /// Settings Import/Export CCommandHandler::CommandStatus exportDomainsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus importDomainsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus exportDomainsWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); CCommandHandler::CommandStatus importDomainsWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /** * Command handler method for exportDomainWithSettingsXML command. * * @param[in] remoteCommand contains the arguments of the received command. * @param[out] result a std::string containing the result of the command * * @return CCommandHandler::ESucceeded if command succeeded or CCommandHandler::EFailed * in the other case */ CCommandHandler::CommandStatus exportDomainWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &result); CCommandHandler::CommandStatus importDomainWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /** * Command handler method for getDomainsWithSettings command. * * @param[in] remoteCommand contains the arguments of the received command. * @param[out] strResult a std::string containing the result of the command * * @return CCommandHandler::ESucceeded if command succeeded or CCommandHandler::EFailed * in the other case */ CCommandHandler::CommandStatus getDomainsWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /** * Command handler method for getDomainWithSettings command. * * @param[in] remoteCommand contains the arguments of the received command. * @param[out] strResult a string containing the result of the command * * @return CCommandHandler::ESucceeded if command succeeded or CCommandHandler::EFailed * in the other case */ CCommandHandler::CommandStatus getDomainWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /** * Command handler method for setDomainsWithSettings command. * * @param[in] remoteCommand contains the arguments of the received command. * @param[out] strResult a std::string containing the result of the command * * @return CCommandHandler::ESucceeded if command succeeded or CCommandHandler::EFailed * in the other case */ CCommandHandler::CommandStatus setDomainsWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); /** * Command handler method for setDomainWithSettings command. * * @param[in] remoteCommand contains the arguments of the received command. * @param[out] result a std::string containing the result of the command * * @return CCommandHandler::ESucceeded if command succeeded or CCommandHandler::EFailed * in the other case */ CCommandHandler::CommandStatus setDomainWithSettingsXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &result); /** * Command handler method for getSystemClass command. * * @param[in] remoteCommand contains the arguments of the received command. * @param[out] strResult a std::string containing the result of the command * * @return CCommandHandler::ESucceeded if command succeeded or CCommandHandler::EFailed * in the other case */ CCommandHandler::CommandStatus getSystemClassXMLCommandProcess( const IRemoteCommand &remoteCommand, std::string &strResult); // Max command usage length, use for formatting void setMaxCommandUsageLength(); // For tuning, check we're in tuning mode bool checkTuningModeOn(std::string &strError) const; // Blackboard (dynamic parameter handling) std::mutex &getBlackboardMutex(); // Blackboard reference (dynamic parameter handling) CParameterBlackboard *getParameterBlackboard(); // Parameter access bool accessValue(CParameterAccessContext ¶meterAccessContext, const std::string &strPath, std::string &strValue, bool bSet, std::string &strError); bool doSetValue(const std::string &strPath, const std::string &strValue, bool bRawValueSpace, bool bDynamicAccess, std::string &strError) const; bool doGetValue(const std::string &strPath, std::string &strValue, bool bRawValueSpace, bool bHexOutputRawFormat, bool bDynamicAccess, std::string &strError) const; // Framework global configuration loading bool loadFrameworkConfiguration(std::string &strError); /** Load required subsystems * * @param[out] error error description if there is one * @return true if succeed false otherwise */ bool loadSubsystems(std::string &error); // System class Structure loading bool loadStructure(std::string &strError); // System class Structure loading bool loadSettings(std::string &strError); bool loadSettingsFromConfigFile(std::string &strError); /** Get settings from a configurable element in binary format. * * @param[in] element configurable element. * @param[out] settings current element settings (in mainblackboard) in binary format * * @return true on success, false on error */ void getSettingsAsBytes(const CConfigurableElement &element, std::vector<uint8_t> &settings) const; /** Assign settings to a configurable element in binary format. * * @param[in] element configurable element. * @param[in] settings the settings as byte array (binary). * @param[out] error error message filled in case of error * * @return true in case of success, false oherwise, in which case error is filled with error * message. */ bool setSettingsAsBytes(const CConfigurableElement &element, const std::vector<uint8_t> &settings, std::string &error); /** Assign settings to a configurable element in XML format. * * @param[in] configurableElement The element to set. * @param[in] settings The settings to set. * @param[out] error human readable error message filled in case of error, * undefined in case of success. * @return true in case of success, false otherwise */ bool setSettingsAsXML(CConfigurableElement *configurableElement, const std::string &settings, std::string &error); /** Get settings from a configurable element in XML format. * * @param[in] configurableElement The element to get settings from. * @param[out] result on success: the exported setttings in XML * on error: human readable error message * * @return true in case of success, false otherwise. */ bool getSettingsAsXML(const CConfigurableElement *configurableElement, std::string &result) const; /** Parse an XML stream into an element * * @param[in] elementSerializingContext serializing context * @param[out] pRootElement the receiving element * @param[in] input the input XML stream * @param[in] baseUri the XML input file URI or "" * @param[in] eElementLibrary which element library to be used * @param[in] replace Should the element be overridden or modified in place * @param[in] strNameAttributeName the name of the element's XML "name" attribute * * @returns true if parsing succeeded, false otherwise */ bool xmlParse(CXmlElementSerializingContext &elementSerializingContext, CElement *pRootElement, _xmlDoc *doc, const std::string &baseUri, ElementLibrary eElementLibrary, bool replace = true, const std::string &strNameAttributeName = "Name"); /** Wrapper for converting public APIs semantics to internal API * * Public APIs have a string argument that can either contain: * - a path to an XML file or; * - an actual XML document. * They also have a boolean argument specifying which of the two cases it * is. * * Instead, the internal APIs only take an std::istream argument. This * method opens the file as a stream if applicable or simply wrap the * string in a stream. It then passes the stream to the internal methods. * * @param[in] xmlSource the XML source (either a path or an actual xml * document) * @param[in] fromFile specifies whether xmlSource is a path or an * actual XML document * @param[in] withSettings if false, only import the configurations * applicability rules; if true, also import their settings * @param[out] element the receiving element * @param[in] nameAttributeName the name of the element's XML "name" * attribute * @param[out] errorMsg string used as output for any error message * * @returns true if the import succeeded, false otherwise */ bool wrapLegacyXmlImport(const std::string &xmlSource, bool fromFile, bool withSettings, CElement &element, const std::string &nameAttributeName, std::string &errorMsg); /** * Export an element object to an Xml destination. * * * @param[out] output the stream to output the XML to * @param[in] xmlSerializingContext the serializing context * @param[in] element object to be serialized. * * @return false if any error occurs, true otherwise. */ bool serializeElement(std::ostream &output, CXmlSerializingContext &xmlSerializingContext, const CElement &element) const; /** Wrapper for converting public APIs semantics to internal API * * Public APIs have a string argument that can either: * - contain a path to an XML file or; * - receive an actual XML document. * They also have a boolean argument specifying which of the two cases it * is. * * Instead, the internal APIs only take an std::ostream argument. This * method opens the file as a stream if applicable or simply wrap the * string in a stream. It then passes the stream to the internal methods. * * @param[in] xmlDest the XML sink (either a path or any string that * will be filled) * @param[in] toFile specifies whether xmlSource is a path or a * string that will receive an actual XML document * @param[in] withSettings if false, only export the configurations * applicability rules; if true, also export their settings * @param[out] element the element to be exported * @param[out] errorMsg string used as output for any error message * * @returns true if the export succeeded, false otherwise */ bool wrapLegacyXmlExport(std::string &xmlDest, bool toFile, bool withSettings, const CElement &element, std::string &errorMsg) const; /** Wrapper for converting public APIs semantics to internal API * * @see wrapLegacyXmlExport */ bool wrapLegacyXmlExportToFile(std::string &xmlDest, const CElement &element, CXmlDomainExportContext &context) const; /** Wrapper for converting public APIs semantics to internal API * * @see wrapLegacyXmlExport */ bool wrapLegacyXmlExportToString(std::string &xmlDest, const CElement &element, CXmlDomainExportContext &context) const; // Framework Configuration CParameterFrameworkConfiguration *getFrameworkConfiguration(); const CParameterFrameworkConfiguration *getConstFrameworkConfiguration(); // Selection Criteria CSelectionCriteria *getSelectionCriteria(); const CSelectionCriteria *getConstSelectionCriteria(); // System Class CSystemClass *getSystemClass(); const CSystemClass *getConstSystemClass() const; // Configurable Domains CConfigurableDomains *getConfigurableDomains(); const CConfigurableDomains *getConstConfigurableDomains(); const CConfigurableDomains *getConstConfigurableDomains() const; // Apply configurations void doApplyConfigurations(bool bForce); // Dynamic object creation libraries feeding void feedElementLibraries(); // Remote Processor Server connection handling bool isRemoteInterfaceRequired(); bool handleRemoteProcessingInterface(std::string &strError); /** Log the result of a function * * @param[in] isSuccess indicates if the previous function has succeed * @param[in] result function provided result string * @return isSuccess parameter */ bool logResult(bool isSuccess, const std::string &result); /** Info logger call helper */ inline core::log::details::Info info(); /** Warning logger call helper */ inline core::log::details::Warning warning(); // Tuning bool _bTuningModeIsOn{false}; // Value Space bool _bValueSpaceIsRaw{false}; // Output Raw Format bool _bOutputRawFormatIsHex{false}; // Automatic synchronization to HW during Tuning session bool _bAutoSyncOn{true}; // Current Parameter Settings CParameterBlackboard *_pMainParameterBlackboard; // Dynamic object creation CElementLibrarySet *_pElementLibrarySet; // XML parsing, object creation handling std::string _xmlConfigurationUri; std::string _schemaUri; // Place where schemas stand // Subsystem plugin location const CSubsystemPlugins *_pSubsystemPlugins{nullptr}; // Remote Processor Server IRemoteProcessorServerInterface *_pRemoteProcessorServer{nullptr}; // Parser description array static const SRemoteCommandParserItem gastRemoteCommandParserItems[]; // Maximum command usage length size_t _maxCommandUsageLength{0}; // Blackboard access mutex std::mutex _blackboardMutex; /** Application main logger based on the one provided by the client */ mutable core::log::Logger _logger; /** If set to false, the remote interface won't be started no matter what. * If set to true - the default - it has no impact on the policy for * starting the remote interface. */ bool _bForceNoRemoteInterface{false}; /** If set to true, missing subsystem will abort parameterMgr start. * If set to false, missing subsystem will fallback on virtual subsystem. */ bool _bFailOnMissingSubsystem{true}; /** If set to true, unparsable or discording domains will abort parameterMgr start. * If set to false, unparsable or discording domains * will continue the parameterMgr start with no domains. */ bool _bFailOnFailedSettingsLoad{true}; /** * If set to true, parameterMgr will report an error * when being unable to validate .xml files * If set to false, no .xml/xsd validation will happen (default behaviour) */ bool _bValidateSchemasOnStart{false}; };