19368eea42a1afb01dd44110582f997115b50e742François Gaffie/*
29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2015, Intel Corporation
39368eea42a1afb01dd44110582f997115b50e742François Gaffie * All rights reserved.
49368eea42a1afb01dd44110582f997115b50e742François Gaffie *
59368eea42a1afb01dd44110582f997115b50e742François Gaffie * Redistribution and use in source and binary forms, with or without modification,
69368eea42a1afb01dd44110582f997115b50e742François Gaffie * are permitted provided that the following conditions are met:
79368eea42a1afb01dd44110582f997115b50e742François Gaffie *
89368eea42a1afb01dd44110582f997115b50e742François Gaffie * 1. Redistributions of source code must retain the above copyright notice, this
99368eea42a1afb01dd44110582f997115b50e742François Gaffie * list of conditions and the following disclaimer.
109368eea42a1afb01dd44110582f997115b50e742François Gaffie *
119368eea42a1afb01dd44110582f997115b50e742François Gaffie * 2. Redistributions in binary form must reproduce the above copyright notice,
129368eea42a1afb01dd44110582f997115b50e742François Gaffie * this list of conditions and the following disclaimer in the documentation and/or
139368eea42a1afb01dd44110582f997115b50e742François Gaffie * other materials provided with the distribution.
149368eea42a1afb01dd44110582f997115b50e742François Gaffie *
159368eea42a1afb01dd44110582f997115b50e742François Gaffie * 3. Neither the name of the copyright holder nor the names of its contributors
169368eea42a1afb01dd44110582f997115b50e742François Gaffie * may be used to endorse or promote products derived from this software without
179368eea42a1afb01dd44110582f997115b50e742François Gaffie * specific prior written permission.
189368eea42a1afb01dd44110582f997115b50e742François Gaffie *
199368eea42a1afb01dd44110582f997115b50e742François Gaffie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
209368eea42a1afb01dd44110582f997115b50e742François Gaffie * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
219368eea42a1afb01dd44110582f997115b50e742François Gaffie * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
229368eea42a1afb01dd44110582f997115b50e742François Gaffie * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
239368eea42a1afb01dd44110582f997115b50e742François Gaffie * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
249368eea42a1afb01dd44110582f997115b50e742François Gaffie * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
259368eea42a1afb01dd44110582f997115b50e742François Gaffie * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
269368eea42a1afb01dd44110582f997115b50e742François Gaffie * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
279368eea42a1afb01dd44110582f997115b50e742François Gaffie * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
289368eea42a1afb01dd44110582f997115b50e742François Gaffie * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
299368eea42a1afb01dd44110582f997115b50e742François Gaffie */
309368eea42a1afb01dd44110582f997115b50e742François Gaffie#pragma once
319368eea42a1afb01dd44110582f997115b50e742François Gaffie
329368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "Config.hpp"
339368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "ConfigFiles.hpp"
349368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "FailureWrapper.hpp"
359368eea42a1afb01dd44110582f997115b50e742François Gaffie
369368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <ParameterMgrFullConnector.h>
379368eea42a1afb01dd44110582f997115b50e742François Gaffie
389368eea42a1afb01dd44110582f997115b50e742François Gaffienamespace parameterFramework
399368eea42a1afb01dd44110582f997115b50e742François Gaffie{
409368eea42a1afb01dd44110582f997115b50e742François Gaffie
419368eea42a1afb01dd44110582f997115b50e742François Gaffie/** This forward declaration is an implementation detail, client should expect its presence.
429368eea42a1afb01dd44110582f997115b50e742François Gaffie * @note This forward definition should not be needed as the `friend class ElementHandle`
439368eea42a1afb01dd44110582f997115b50e742François Gaffie *       declaration in ParameterFramework is itself a forward declaration.
449368eea42a1afb01dd44110582f997115b50e742François Gaffie *       Unfortunately there seem to be a bug in visual studio 2015, it is required.
459368eea42a1afb01dd44110582f997115b50e742François Gaffie */
469368eea42a1afb01dd44110582f997115b50e742François Gaffieclass ElementHandle;
479368eea42a1afb01dd44110582f997115b50e742François Gaffie
489368eea42a1afb01dd44110582f997115b50e742François Gaffie/** Wrapper around the Parameter Framework to throw exceptions on errors and
499368eea42a1afb01dd44110582f997115b50e742François Gaffie *  have more user friendly methods.
509368eea42a1afb01dd44110582f997115b50e742François Gaffie *  @see parameterFramework::ElementHandle to access elements of the parameter tree.
519368eea42a1afb01dd44110582f997115b50e742François Gaffie */
529368eea42a1afb01dd44110582f997115b50e742François Gaffieclass ParameterFramework : private parameterFramework::ConfigFiles,
539368eea42a1afb01dd44110582f997115b50e742François Gaffie                           private FailureWrapper<CParameterMgrFullConnector>
549368eea42a1afb01dd44110582f997115b50e742François Gaffie{
559368eea42a1afb01dd44110582f997115b50e742François Gaffieprotected:
569368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Alias to the Platform Connector PF.
579368eea42a1afb01dd44110582f997115b50e742François Gaffie     * It should not be usefull as PF is a super set but is useful
589368eea42a1afb01dd44110582f997115b50e742François Gaffie     * to disambiguate overloaded method for MS visual compiler.
599368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
609368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PPF = CParameterMgrPlatformConnector;
619368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF = CParameterMgrFullConnector;
629368eea42a1afb01dd44110582f997115b50e742François Gaffie    using EH = ::ElementHandle;
639368eea42a1afb01dd44110582f997115b50e742François Gaffie
649368eea42a1afb01dd44110582f997115b50e742François Gaffiepublic:
659368eea42a1afb01dd44110582f997115b50e742François Gaffie    ParameterFramework(const Config &config = Config())
669368eea42a1afb01dd44110582f997115b50e742François Gaffie        : ConfigFiles(config), FailureWrapper(getPath())
679368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
689368eea42a1afb01dd44110582f997115b50e742François Gaffie        setForceNoRemoteInterface(true);
699368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
709368eea42a1afb01dd44110582f997115b50e742François Gaffie
719368eea42a1afb01dd44110582f997115b50e742François Gaffie    void start() { mayFailCall(&PF::start); }
729368eea42a1afb01dd44110582f997115b50e742François Gaffie
739368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** @name Forwarded methods
749368eea42a1afb01dd44110582f997115b50e742François Gaffie     * Forward those methods without modification as there are ergonomic and
759368eea42a1afb01dd44110582f997115b50e742François Gaffie     * can not fail (no failure to throw).
769368eea42a1afb01dd44110582f997115b50e742François Gaffie     * @{ */
779368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::applyConfigurations;
789368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::getFailureOnMissingSubsystem;
799368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::getFailureOnFailedSettingsLoad;
809368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::getForceNoRemoteInterface;
819368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::setForceNoRemoteInterface;
829368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::getSchemaUri;
839368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::setSchemaUri;
849368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::getValidateSchemasOnStart;
859368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::isValueSpaceRaw;
869368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::isOutputRawFormatHex;
879368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::isTuningModeOn;
889368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::isAutoSyncOn;
899368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::setLogger;
909368eea42a1afb01dd44110582f997115b50e742François Gaffie    using PF::createCommandHandler;
919368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** @} */
929368eea42a1afb01dd44110582f997115b50e742François Gaffie
939368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::setValidateSchemasOnStart to throw an exception on failure. */
949368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setValidateSchemasOnStart(bool validate)
959368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
969368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PPF::setValidateSchemasOnStart, validate);
979368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
989368eea42a1afb01dd44110582f997115b50e742François Gaffie
999368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::setFailureOnFailedSettingsLoad to throw an exception on failure. */
1009368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setFailureOnFailedSettingsLoad(bool fail)
1019368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1029368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PPF::setFailureOnFailedSettingsLoad, fail);
1039368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1049368eea42a1afb01dd44110582f997115b50e742François Gaffie
1059368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::setFailureOnMissingSubsystem to throw an exception on failure. */
1069368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setFailureOnMissingSubsystem(bool fail)
1079368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1089368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PPF::setFailureOnMissingSubsystem, fail);
1099368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1109368eea42a1afb01dd44110582f997115b50e742François Gaffie
1119368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Renaming for better readability (and coherency with PF::isValueSpaceRaw)
1129368eea42a1afb01dd44110582f997115b50e742François Gaffie     *  of PF::setValueSpace. */
1139368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setRawValueSpace(bool enable) { setValueSpace(enable); }
1149368eea42a1afb01dd44110582f997115b50e742François Gaffie
1159368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Renaming for better readability (and coherency with PF::isValueSpaceRaw)
1169368eea42a1afb01dd44110582f997115b50e742François Gaffie     *  of PF::setValueSpace. */
1179368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setHexOutputFormat(bool enable) { setOutputRawFormat(enable); }
1189368eea42a1afb01dd44110582f997115b50e742François Gaffie
1199368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::setTuningMode to throw an exception on failure. */
1209368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setTuningMode(bool enable) { mayFailCall(&PF::setTuningMode, enable); }
1219368eea42a1afb01dd44110582f997115b50e742François Gaffie
1229368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::setAutoSync to throw an exception on failure. */
1239368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setAutoSync(bool enable) { mayFailCall(&PF::setAutoSync, enable); }
1249368eea42a1afb01dd44110582f997115b50e742François Gaffie
1259368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::accessParameterValue in "set" mode (and rename it) to throw an
1269368eea42a1afb01dd44110582f997115b50e742François Gaffie     * exception on failure
1279368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1289368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setParameter(const std::string &path, std::string &value)
1299368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1309368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PF::accessParameterValue, path, value, true);
1319368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1329368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::accessParameterValue in "get" mode (and rename it) to throw an
1339368eea42a1afb01dd44110582f997115b50e742François Gaffie     * exception on failure
1349368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1359368eea42a1afb01dd44110582f997115b50e742François Gaffie    void getParameter(const std::string &path, std::string &value)
1369368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1379368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PF::accessParameterValue, path, value, false);
1389368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1399368eea42a1afb01dd44110582f997115b50e742François Gaffie
1409368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::accessConfigurationValue in "set" mode (and rename it) to throw an
1419368eea42a1afb01dd44110582f997115b50e742François Gaffie     * exception on failure
1429368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1439368eea42a1afb01dd44110582f997115b50e742François Gaffie    void setConfigurationParameter(const std::string domain, const std::string &configuration,
1449368eea42a1afb01dd44110582f997115b50e742François Gaffie                                   const std::string &path, std::string &value)
1459368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1469368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PF::accessConfigurationValue, domain, configuration, path, value, true);
1479368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1489368eea42a1afb01dd44110582f997115b50e742François Gaffie
1499368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Wrap PF::accessConfigurationValue in "get" mode (and rename it) to throw an
1509368eea42a1afb01dd44110582f997115b50e742François Gaffie     * exception on failure
1519368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1529368eea42a1afb01dd44110582f997115b50e742François Gaffie    void getConfigurationParameter(const std::string &domain, const std::string &configuration,
1539368eea42a1afb01dd44110582f997115b50e742François Gaffie                                   const std::string &path, std::string &value)
1549368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1559368eea42a1afb01dd44110582f997115b50e742François Gaffie        mayFailCall(&PF::accessConfigurationValue, domain, configuration, path, value, false);
1569368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1579368eea42a1afb01dd44110582f997115b50e742François Gaffie
1589368eea42a1afb01dd44110582f997115b50e742François Gaffieprivate:
1599368eea42a1afb01dd44110582f997115b50e742François Gaffie    /** Create an unwrapped element handle.
1609368eea42a1afb01dd44110582f997115b50e742François Gaffie     *
1619368eea42a1afb01dd44110582f997115b50e742François Gaffie     * Is not public as this method is intended to be used by ElementHandle facade.
1629368eea42a1afb01dd44110582f997115b50e742François Gaffie     */
1639368eea42a1afb01dd44110582f997115b50e742François Gaffie    EH createElementHandle(const std::string &path)
1649368eea42a1afb01dd44110582f997115b50e742François Gaffie    {
1659368eea42a1afb01dd44110582f997115b50e742François Gaffie        // PF::createElementHandle takes it's handler in the free store
1669368eea42a1afb01dd44110582f997115b50e742François Gaffie        std::unique_ptr<EH> newedHandle{mayFailCall(&PF::createElementHandle, path)};
1679368eea42a1afb01dd44110582f997115b50e742François Gaffie        EH handle{*newedHandle};
1689368eea42a1afb01dd44110582f997115b50e742François Gaffie        return handle;
1699368eea42a1afb01dd44110582f997115b50e742François Gaffie    }
1709368eea42a1afb01dd44110582f997115b50e742François Gaffie    friend class ElementHandle;
1719368eea42a1afb01dd44110582f997115b50e742François Gaffie};
1729368eea42a1afb01dd44110582f997115b50e742François Gaffie
1739368eea42a1afb01dd44110582f997115b50e742François Gaffie} // parameterFramework
174