Add integer conversion that can take care of sign extension

BZ: 163707

When using signed integers of size 8 or 16, the bit of sign needs to
be propagated if the API called by the plugin wait for "int" type

Add the virtual toInteger function in CTypeElement for each parameter
type to take care of conversion to "int". Specialize this function in
the class CIntegerParameterType to take care of sign extension.

Change-Id: I41183dccbcc21212299d1dde86b3ad4ba8432ce4
Signed-off-by: Guillaume Denneulin <guillaume.denneulin@intel.com>
diff --git a/parameter/IntegerParameterType.cpp b/parameter/IntegerParameterType.cpp
old mode 100644
new mode 100755
index 3c3a626..b07194b
--- a/parameter/IntegerParameterType.cpp
+++ b/parameter/IntegerParameterType.cpp
@@ -343,6 +343,16 @@
     return _uiMin;
 }
 
+int CIntegerParameterType::toPlainInteger(int iSizeOptimizedData) const
+{
+    if (_bSigned) {
+
+        signExtend(iSizeOptimizedData);
+    }
+
+    return base::toPlainInteger(iSizeOptimizedData);
+}
+
 // Convert value provided by the user as a string into an int64
 bool CIntegerParameterType::convertValueFromString(const string& strValue, int64_t& iData, CParameterAccessContext& parameterAccessContext) const {
 
diff --git a/parameter/IntegerParameterType.h b/parameter/IntegerParameterType.h
old mode 100644
new mode 100755
index 9fb0dfd..29d28b7
--- a/parameter/IntegerParameterType.h
+++ b/parameter/IntegerParameterType.h
@@ -59,8 +59,12 @@
     // Element properties
     virtual void showProperties(string& strResult) const;
 
+    // Integer conversion
+    virtual int toPlainInteger(int iSizeOptimizedData) const;
+
     // CElement
     virtual string getKind() const;
+
 private:
     // Returns true if children dynamic creation is to be dealt with
     virtual bool childrenAreDynamic() const;
diff --git a/parameter/ParameterType.cpp b/parameter/ParameterType.cpp
old mode 100644
new mode 100755
index f7dda74..27df1dc
--- a/parameter/ParameterType.cpp
+++ b/parameter/ParameterType.cpp
@@ -112,13 +112,11 @@
     }
 }
 
-// Sign extension (32 bits)
 void CParameterType::signExtend(int32_t& iData) const
 {
     doSignExtend(iData);
 }
 
-// Sign extension (64 bits)
 void CParameterType::signExtend(int64_t& iData) const
 {
     doSignExtend(iData);
diff --git a/parameter/ParameterType.h b/parameter/ParameterType.h
old mode 100644
new mode 100755
index ed30ac3..2fcd9e5
--- a/parameter/ParameterType.h
+++ b/parameter/ParameterType.h
@@ -73,14 +73,27 @@
 
     // Default value handling (simulation only)
     virtual uint32_t getDefaultValue() const;
+
+    /**
+     * Sign extension (32 bits)
+     *
+     * @param[in:out] iData the data which will be sign extended
+     */
+    void signExtend(int32_t& iData) const;
+
+    /**
+     * Sign extension (64 bits)
+     *
+     * @param[in:out] iData the data which will be sign extended
+     */
+    void signExtend(int64_t& iData) const;
+
 protected:
     // Object creation
     virtual void populate(CElement* pElement) const;
     // Size
     void setSize(uint32_t uiSize);
-    // Sign extension
-    void signExtend(int32_t& iData) const;
-    void signExtend(int64_t& iData) const;
+
     // Check data has no bit set outside available range (based on byte size) and
     // check data is consistent with available range, with respect to its sign
     bool isEncodable(uint32_t uiData, bool bIsSigned) const;
diff --git a/parameter/SubsystemObject.cpp b/parameter/SubsystemObject.cpp
index eaf87aa..c8d4c1b 100755
--- a/parameter/SubsystemObject.cpp
+++ b/parameter/SubsystemObject.cpp
@@ -28,6 +28,7 @@
 #include "ParameterBlackboard.h"
 #include "ParameterAccessContext.h"
 #include "MappingContext.h"
+#include "ParameterType.h"
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
@@ -82,6 +83,23 @@
     return ostr.str();
 }
 
+int CSubsystemObject::toPlainInteger(
+        const CInstanceConfigurableElement *instanceConfigurableElement,
+        int sizeOptimizedData)
+{
+    if (instanceConfigurableElement) {
+
+        // Get actual element type
+        const CTypeElement *typeElement =
+            static_cast<const CParameterType *>(instanceConfigurableElement->getTypeElement());
+
+        // Do the extension
+        return typeElement->toPlainInteger(sizeOptimizedData);
+    }
+
+    return sizeOptimizedData;
+}
+
 // Default back synchronization
 void CSubsystemObject::setDefaultValues(CParameterBlackboard& parameterBlackboard) const
 {
diff --git a/parameter/SubsystemObject.h b/parameter/SubsystemObject.h
old mode 100644
new mode 100755
index ca52df8..1c6690d
--- a/parameter/SubsystemObject.h
+++ b/parameter/SubsystemObject.h
@@ -56,6 +56,17 @@
     static uint32_t asInteger(const string& strValue);
     static string asString(uint32_t uiValue);
 
+    /**
+     * Conversion of int8, int16, int32 to int (taking care of sign extension)
+     *
+     * @param[in] instanceConfigurableElement pointer to configurable element instance
+     * @param[in] sizeOptimizedData data to convert
+     *
+     * @return the data converted to int
+     */
+    int toPlainInteger(const CInstanceConfigurableElement *instanceConfigurableElement,
+                       int sizeOptimizedData);
+
     // Sync to/from HW
     virtual bool sendToHW(string& strError);
     virtual bool receiveFromHW(string& strError);
diff --git a/parameter/TypeElement.cpp b/parameter/TypeElement.cpp
old mode 100644
new mode 100755
index 5bfc2d7..59d4412
--- a/parameter/TypeElement.cpp
+++ b/parameter/TypeElement.cpp
@@ -49,6 +49,11 @@
     return _uiArrayLength;
 }
 
+int CTypeElement::toPlainInteger(int iSizeOptimizedData) const
+{
+    return iSizeOptimizedData;
+}
+
 bool CTypeElement::getMappingData(const string& strKey, const string*& pStrValue) const
 {
     if (_pMappingData) {
diff --git a/parameter/TypeElement.h b/parameter/TypeElement.h
old mode 100644
new mode 100755
index 353b0a5..6d801aa
--- a/parameter/TypeElement.h
+++ b/parameter/TypeElement.h
@@ -64,6 +64,15 @@
     // Array Length
     uint32_t getArrayLength() const;
 
+    /**
+     * Converts size optimized integer input data (int8, int16, int32) to plain int
+     *
+     * @param[in] iSizeOptimizedData the data to convert
+     *
+     * @return the data with int type
+     */
+    virtual int toPlainInteger(int iSizeOptimizedData) const;
+
 protected:
     // Object creation
     virtual void populate(CElement* pElement) const;