1 /*
2  * Copyright (c) 2015, Intel Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this
9  * list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation and/or
13  * other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software without
17  * specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 // The generated python module will be named "PyPfw"
31 // the "directors" feature is used to derive Python classes and make them look
32 // like derived C++ classes (calls to virtual methods will be properly
33 // forwarded to Python) - only on classes for which is it specified, see
34 // ILogger below..
35 %module(directors="1", threads="1") PyPfw
36 
37 %feature("director:except") {
38     if ($error != NULL) {
39         throw Swig::DirectorMethodException();
40     }
41 }
42 %exception {
43     try { $action }
catch(Swig::DirectorException & e)44     catch (Swig::DirectorException &e) { SWIG_fail; }
45 }
46 
47 %include "std_string.i"
48 %include "std_vector.i"
49 %include "typemaps.i"
50 
51 // We need to tell SWIG that std::vector<std::string> is a vector of strings
52 namespace std {
53     %template(StringVector) vector<string>;
54 }
55 
56 // Tells swig that 'std::string& strError' must be treated as output parameters
57 // TODO: make it return a tuple instead of a list
58 %apply std::string &OUTPUT { std::string& strError };
59 
60 // Automatic python docstring generation
61 // FIXME: because of the typemap above, the output type is wrong for methods
62 // that can return an error string.
63 // TODO: document each function manually ?
64 %feature("autodoc", "1");
65 
66 
67 // rename "CParameterMgrFullConnector" into the nicer "ParameterFramework" name
68 %rename(ParameterFramework) CParameterMgrFullConnector;
69 class CParameterMgrFullConnector
70 {
71 
72 %{
73 #include "ParameterMgrFullConnector.h"
74 %}
75 
76 public:
77     CParameterMgrFullConnector(const std::string& strConfigurationFilePath);
78 
79     bool start(std::string& strError);
80 
81     void setLogger(ILogger* pLogger);
82 
83     ISelectionCriterionTypeInterface* createSelectionCriterionType(bool bIsInclusive);
84     ISelectionCriterionInterface* createSelectionCriterion(const std::string& strName,
85             const ISelectionCriterionTypeInterface* pSelectionCriterionType);
86     ISelectionCriterionInterface* getSelectionCriterion(const std::string& strName);
87 
88     // Configuration application
89     void applyConfigurations();
90 
91     bool getForceNoRemoteInterface() const;
92     void setForceNoRemoteInterface(bool bForceNoRemoteInterface);
93 
94     bool setFailureOnMissingSubsystem(bool bFail, std::string& strError);
95     bool getFailureOnMissingSubsystem() const;
96 
97     bool setFailureOnFailedSettingsLoad(bool bFail, std::string& strError);
98     bool getFailureOnFailedSettingsLoad() const;
99 
100     void setSchemaUri(const std::string& schemaUri);
101     const std::string& getSchemaUri() const;
102 
103     bool setValidateSchemasOnStart(bool bValidate, std::string &strError);
104     bool getValidateSchemasOnStart() const;
105 
106     // Tuning mode
107     bool setTuningMode(bool bOn, std::string& strError);
108     bool isTuningModeOn() const;
109 
110     // Current value space for user set/get value interpretation
111     void setValueSpace(bool bIsRaw);
112     bool isValueSpaceRaw() const;
113 
114     // Current Output Raw Format for user get value interpretation
115     void setOutputRawFormat(bool bIsHex);
116     bool isOutputRawFormatHex() const;
117 
118     // Automatic hardware synchronization control (during tuning session)
119     bool setAutoSync(bool bAutoSyncOn, std::string& strError);
120     bool isAutoSyncOn() const;
121     bool sync(std::string& strError);
122 
123     // User set/get parameters
124 %apply std::string &INOUT { std::string& strValue };
125     bool accessParameterValue(const std::string& strPath, std::string& strValue, bool bSet, std::string& strError);
126     bool accessConfigurationValue(const std::string &strDomain, const std::string &strConfiguration, const std::string& strPath, std::string& strValue, bool bSet, std::string& strError);
127 %clear std::string& strValue;
128 
129     bool getParameterMapping(const std::string& strPath, std::string& strValue) const;
130 
131     // Creation/Deletion
132     bool createDomain(const std::string& strName, std::string& strError);
133     bool deleteDomain(const std::string& strName, std::string& strError);
134     bool renameDomain(const std::string& strName, const std::string& strNewName, std::string& strError);
135     bool deleteAllDomains(std::string& strError);
136 %apply std::string &OUTPUT { std::string& strResult }
137     bool setSequenceAwareness(const std::string& strName, bool bSequenceAware, std::string& strResult);
138     bool getSequenceAwareness(const std::string& strName, bool& bSequenceAware, std::string& strResult);
139 %clear std::string& strResult;
140     bool createConfiguration(const std::string& strDomain, const std::string& strConfiguration, std::string& strError);
141     bool deleteConfiguration(const std::string& strDomain, const std::string& strConfiguration, std::string& strError);
142     bool renameConfiguration(const std::string& strDomain, const std::string& strConfiguration, const std::string& strNewConfiguration, std::string& strError);
143 
144     // Save/Restore
145     bool restoreConfiguration(const std::string& strDomain, const std::string& strConfiguration, std::list<std::string>& strError);
146     bool saveConfiguration(const std::string& strDomain, const std::string& strConfiguration, std::string& strError);
147 
148     // Configurable element - domain association
149     bool addConfigurableElementToDomain(const std::string& strDomain, const std::string& strConfigurableElementPath, std::string& strError);
150     bool removeConfigurableElementFromDomain(const std::string& strDomain, const std::string& strConfigurableElementPath, std::string& strError);
151     bool split(const std::string& strDomain, const std::string& strConfigurableElementPath, std::string& strError);
152     bool setElementSequence(const std::string& strDomain, const std::string& strConfiguration, const std::vector<std::string>& astrNewElementSequence, std::string& strError);
153 
154     bool setApplicationRule(const std::string& strDomain, const std::string& strConfiguration, const std::string& strApplicationRule, std::string& strError);
155 %apply std::string &OUTPUT { std::string& strResult }
156     bool getApplicationRule(const std::string& strDomain, const std::string& strConfiguration, std::string& strResult);
157 %clear std::string& strResult;
158     bool clearApplicationRule(const std::string& strDomain, const std::string& strConfiguration, std::string& strError);
159 
160     bool importDomainsXml(const std::string& strXmlSource, bool bWithSettings, bool bFromFile,
161                           std::string& strError);
162     bool importSingleDomainXml(const std::string& strXmlSource, bool bOverwrite,
163                                std::string& strError);
164     bool importSingleDomainXml(const std::string& xmlSource, bool overwrite, bool withSettings,
165                                bool fromFile, std::string& strError);
166 
167 // Tells swig that "strXmlDest" in the two following methods are "inout"
168 // parameters
169 %apply std::string &INOUT { std::string& strXmlDest };
170     bool exportDomainsXml(std::string& strXmlDest, bool bWithSettings, bool bToFile,
171                           std::string& strError) const;
172 
173     bool exportSingleDomainXml(std::string& strXmlDest, const std::string& strDomainName, bool bWithSettings,
174                                bool bToFile, std::string& strError) const;
175 %clear std::string& strXmlDest;
176 };
177 
178 // SWIG nested class support is not complete - cf.
179 // http://swig.org/Doc2.0/SWIGPlus.html#SWIGPlus_nested_classes
180 // This link also explains how to trick SWIG and pretend that
181 // ILogger is a toplevel class (whereas it actually is an inner class of
182 // CParameterMgrFullConnector
183 // Logger interface
184 %feature("director") ILogger;
185 // The nested workaround is used to tell swig to ignore the
186 // inner class definition that would be redundant with the fake outer class.
187 // It would have been useful if ParameterMgrFullConnector.h was included
188 // (as opposed to copying the class definition in this .i).
189 // As their is no conflicting ILogger definition, this workaround is useless.
190 class ILogger
191 {
192     public:
193         virtual void info(const std::string& log) = 0;
194         virtual void warning(const std::string& log) = 0;
195     protected:
~ILogger()196         virtual ~ILogger() {}
197 };
198 %{
199 typedef CParameterMgrFullConnector::ILogger ILogger;
200 %}
201 
202 class ISelectionCriterionTypeInterface
203 {
204 %{
205 #include "SelectionCriterionTypeInterface.h"
206 %}
207 
208 public:
209     virtual bool addValuePair(int iValue, const std::string& strValue, std::string& strError) = 0;
210     virtual bool getNumericalValue(const std::string& strValue, int& iValue) const = 0;
211     virtual bool getLiteralValue(int iValue, std::string& strValue) const = 0;
212     virtual bool isTypeInclusive() const = 0;
213     virtual std::string getFormattedState(int iValue) const = 0;
214 
215 protected:
~ISelectionCriterionTypeInterface()216     virtual ~ISelectionCriterionTypeInterface() {}
217 };
218 
219 class ISelectionCriterionInterface
220 {
221 %{
222 #include "SelectionCriterionInterface.h"
223 %}
224 
225 public:
226     virtual void setCriterionState(int iState) = 0;
227     virtual int getCriterionState() const = 0;
228     virtual std::string getCriterionName() const = 0;
229     virtual const ISelectionCriterionTypeInterface* getCriterionType() const = 0;
230 
231 protected:
~ISelectionCriterionInterface()232     virtual ~ISelectionCriterionInterface() {}
233 };
234