[PFW] Access Configurations directly

BZ: 88357

This patch aims to enable direct access to Configurations
without using the main blackboard. 2 additional commands are
available:
- getConfigurationParameter <domain> <configuration> <param path>:
Get value for parameter at given path from configuration.
- setConfigurationParameter <domain> <configuration> <param path> <value>
Set value for parameter at given path to configuration.

Change-Id: I9357ba5141feee558fa3f7c10f62db14406433b6
Signed-off-by: Frédéric Boisnard <fredericx.boisnard@intel.com>
Reviewed-on: http://android.intel.com:8080/92325
Reviewed-by: cactus <cactus@intel.com>
Reviewed-by: Gonzalve, Sebastien <sebastien.gonzalve@intel.com>
Tested-by: Dixon, CharlesX <charlesx.dixon@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp
index b5b9683..e8ab863 100644
--- a/parameter/ParameterMgr.cpp
+++ b/parameter/ParameterMgr.cpp
@@ -42,7 +42,6 @@
 #include "FixedPointParameterType.h"
 #include "ParameterBlackboard.h"
 #include "Parameter.h"
-#include "ParameterBlackboard.h"
 #include "ParameterAccessContext.h"
 #include "XmlFileIncluderElement.h"
 #include "ParameterFrameworkConfiguration.h"
@@ -160,6 +159,8 @@
     { "setParameter", &CParameterMgr::setParameterCommmandProcess, 2, "<param path> <value>", "Set value for parameter at given path" },
     { "listBelongingDomains", &CParameterMgr::listBelongingDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path belongs to" },
     { "listAssociatedDomains", &CParameterMgr::listAssociatedDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path is associated to" },
+    { "getConfigurationParameter", &CParameterMgr::getConfigurationParameterCommmandProcess, 3, "<domain> <configuration> <param path>", "Get value for parameter at given path from configuration" },
+    { "setConfigurationParameter", &CParameterMgr::setConfigurationParameterCommmandProcess, 4, "<domain> <configuration> <param path> <value>", "Set value for parameter at given path to configuration" },
     /// Browse
     { "listAssociatedElements", &CParameterMgr::listAssociatedElementsCommmandProcess, 0, "", "List element sub-trees associated to at least one configurable domain" },
     { "listConflictingElements", &CParameterMgr::listConflictingElementsCommmandProcess, 0, "", "List element sub-trees contained in more than one configurable domain" },
@@ -1150,7 +1151,7 @@
 {
     string strValue;
 
-    if (!accessValue(remoteCommand.getArgument(0), strValue, false, strResult)) {
+    if (!accessParameterValue(remoteCommand.getArgument(0), strValue, false, strResult)) {
 
         return CCommandHandler::EFailed;
     }
@@ -1170,7 +1171,7 @@
     // Get value to set
     string strValue = remoteCommand.packArguments(1, remoteCommand.getArgumentCount() - 1);
 
-    return accessValue(remoteCommand.getArgument(0), strValue, true, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
+    return accessParameterValue(remoteCommand.getArgument(0), strValue, true, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
 }
 
 CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listBelongingDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
@@ -1240,6 +1241,35 @@
     return CCommandHandler::ESucceeded;
 }
 
+CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getConfigurationParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    string strOutputValue;
+    string strError;
+
+    if (!accessConfigurationValue(remoteCommand.getArgument(0), remoteCommand.getArgument(1), remoteCommand.getArgument(2), strOutputValue, false, strError)) {
+
+        strResult = strError;
+        return CCommandHandler::EFailed;
+    }
+    // Succeeded
+    strResult = strOutputValue;
+
+    return CCommandHandler::ESucceeded;
+}
+
+CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setConfigurationParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    // Get value to set
+    string strValue = remoteCommand.packArguments(3, remoteCommand.getArgumentCount() - 3);
+
+    bool bSuccess = accessConfigurationValue(remoteCommand.getArgument(0),
+                                            remoteCommand.getArgument(1),
+                                            remoteCommand.getArgument(2),
+                                            strValue, true, strResult);
+
+    return bSuccess ? CCommandHandler::EDone : CCommandHandler::EFailed;
+}
+
 /// Settings Import/Export
 CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::exportConfigurableDomainsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
 {
@@ -1297,8 +1327,70 @@
     return CCommandHandler::ESucceeded;
 }
 
+// User set/get parameters in main BlackBoard
+bool CParameterMgr::accessParameterValue(const string& strPath, string& strValue, bool bSet, string& strError)
+{
+    // Define context
+    CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex);
+
+    return accessValue(parameterAccessContext, strPath, strValue, bSet, strError);
+}
+
+// User set/get parameters in specific Configuration BlackBoard
+bool CParameterMgr::accessConfigurationValue(const string& strDomain, const string& strConfiguration, const string& strPath, string& strValue, bool bSet, string& strError)
+{
+    CElementLocator elementLocator(getSystemClass());
+
+    CElement* pLocatedElement = NULL;
+
+    if (!elementLocator.locate(strPath, &pLocatedElement, strError)) {
+
+        return false;
+    }
+
+    // Convert element
+    const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+    // Get the Configuration blackboard and the Base Offset of the configurable element in this blackboard
+    uint32_t uiBaseOffset;
+    bool bIsLastApplied;
+
+    CParameterBlackboard* pConfigurationBlackboard = getConstConfigurableDomains()->findConfigurationBlackboard(strDomain, strConfiguration, pConfigurableElement, uiBaseOffset, bIsLastApplied, strError);
+
+    if (!pConfigurationBlackboard) {
+
+        return false;
+    }
+
+    log_info("Element %s in Domain %s, offset: %d, base offset: %d", strPath.c_str(), strDomain.c_str(), pConfigurableElement->getOffset(), uiBaseOffset);
+
+    /// Update the Configuration Blackboard
+
+    // Define Configuration context using Base Offset
+    CParameterAccessContext parameterAccessContext(strError, pConfigurationBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex, uiBaseOffset);
+
+    // Access Value in the Configuration Blackboard
+    if (!accessValue(parameterAccessContext, strPath, strValue, bSet, strError)) {
+
+        return false;
+    }
+
+    /// If the Configuration is the last one applied, update the Main Blackboard as well
+
+    if (bIsLastApplied) {
+
+        // Define Main context
+        parameterAccessContext.setParameterBlackboard(_pMainParameterBlackboard);
+
+        // Access Value in the Main Blackboard
+        return accessValue(parameterAccessContext, strPath, strValue, bSet, strError);
+    }
+
+    return true;
+}
+
 // User set/get parameters
-bool CParameterMgr::accessValue(const string& strPath, string& strValue, bool bSet, string& strError)
+bool CParameterMgr::accessValue(CParameterAccessContext& parameterAccessContext, const string& strPath, string& strValue, bool bSet, string& strError)
 {
     // Lock state
     CAutoLock autoLock(&_blackboardMutex);
@@ -1311,9 +1403,6 @@
         return false;
     }
 
-    // Define context
-    CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex);
-
     // Auto Sync
     if (bSet) {