PFW: Add two commands to print xml settings and structure

BZ: 44910

Creates two commands that can be called through the command
line of the parameter-framework. First command getDomainXML
returns a string containing the xml structure of the
domains, configurations and settings. Second command
getSystemClassXML returns a string containing the xml
structure of all the instantiated parameter with their
attributes.

Change-Id: I9a35333802049a2177b8fc416754fdb67e6efff0
Signed-off-by: Georges-Henri Baron <georges-henrix.baron@intel.com>
Reviewed-on: http://android.intel.com:8080/55155
Reviewed-by: Rocard, KevinX <kevinx.rocard@intel.com>
Reviewed-by: Centelles, Sylvain <sylvain.centelles@intel.com>
Tested-by: Mendi, EduardoX <eduardox.mendi@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/parameter/BaseParameter.cpp b/parameter/BaseParameter.cpp
index caa9daa..7ca96a7 100644
--- a/parameter/BaseParameter.cpp
+++ b/parameter/BaseParameter.cpp
@@ -218,3 +218,10 @@
 
     return accessAsString(strValue, bSet, parameterAccessContext);
 }
+
+void CBaseParameter::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+
+    // Delegate to type element
+    getTypeElement()->toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/BaseParameter.h b/parameter/BaseParameter.h
index a9dc0e5..80636cb 100644
--- a/parameter/BaseParameter.h
+++ b/parameter/BaseParameter.h
@@ -64,6 +64,9 @@
     bool accessAsString(string& strValue, bool bSet, CParameterAccessContext& parameterAccessContext) const;
     virtual bool accessAsStringArray(vector<string>& astrValues, bool bSet, CParameterAccessContext& parameterAccessContext) const;
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
 protected:
     // Parameter Access
     virtual bool accessValue(CPathNavigator& pathNavigator, string& strValue, bool bSet, CParameterAccessContext& parameterAccessContext) const;
diff --git a/parameter/BitParameterBlockType.cpp b/parameter/BitParameterBlockType.cpp
index f89651a..e219553 100644
--- a/parameter/BitParameterBlockType.cpp
+++ b/parameter/BitParameterBlockType.cpp
@@ -62,3 +62,12 @@
 {
     return new CBitParameterBlock(getName(), this);
 }
+
+// From IXmlSource
+void CBitParameterBlockType::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Size
+    xmlElement.setAttributeString("Size", toString(_uiSize * 8));
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/BitParameterBlockType.h b/parameter/BitParameterBlockType.h
index c074f43..36845ff 100644
--- a/parameter/BitParameterBlockType.h
+++ b/parameter/BitParameterBlockType.h
@@ -37,6 +37,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     // CElement
     virtual string getKind() const;
 private:
diff --git a/parameter/BitParameterType.cpp b/parameter/BitParameterType.cpp
index 83865dc..6c5a90f 100644
--- a/parameter/BitParameterType.cpp
+++ b/parameter/BitParameterType.cpp
@@ -233,3 +233,19 @@
 
     return true;
 }
+
+// From IXmlSource
+void CBitParameterType::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Position
+    xmlElement.setAttributeString("Pos", toString(_uiBitPos));
+
+    // Size
+    xmlElement.setAttributeString("Size", toString(_uiBitSize));
+
+    // Maximum
+    xmlElement.setAttributeString("Max", toString(_uiMax));
+
+    base::toXml(xmlElement, serializingContext);
+
+}
diff --git a/parameter/BitParameterType.h b/parameter/BitParameterType.h
index fcf96c2..08201da 100644
--- a/parameter/BitParameterType.h
+++ b/parameter/BitParameterType.h
@@ -38,6 +38,8 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
     /// Conversion
     // String
     bool toBlackboard(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
diff --git a/parameter/EnumParameterType.cpp b/parameter/EnumParameterType.cpp
index c89aaf4..dcdbfaa 100644
--- a/parameter/EnumParameterType.cpp
+++ b/parameter/EnumParameterType.cpp
@@ -333,3 +333,11 @@
 
     return false;
 }
+// From IXmlSource
+void CEnumParameterType::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Size
+    xmlElement.setAttributeString("Size", toString(getSize() * 8));
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/EnumParameterType.h b/parameter/EnumParameterType.h
index 3e4c3a2..ea5f857 100644
--- a/parameter/EnumParameterType.h
+++ b/parameter/EnumParameterType.h
@@ -36,6 +36,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     /// Conversion
     // String
     virtual bool toBlackboard(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
diff --git a/parameter/EnumValuePair.cpp b/parameter/EnumValuePair.cpp
index 1a03134..49ee017 100644
--- a/parameter/EnumValuePair.cpp
+++ b/parameter/EnumValuePair.cpp
@@ -67,3 +67,15 @@
     // Convert value
     strValue = getNumericalAsString();
 }
+
+// From IXmlSource
+void CEnumValuePair::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Literal
+    xmlElement.setAttributeString("Literal", this->getName());
+
+    // Numerical
+    xmlElement.setAttributeString("Numerical", getNumericalAsString());
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/EnumValuePair.h b/parameter/EnumValuePair.h
index a9e8245..84c755e 100644
--- a/parameter/EnumValuePair.h
+++ b/parameter/EnumValuePair.h
@@ -38,6 +38,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     // CElement
     virtual string getKind() const;
 protected:
diff --git a/parameter/FixedPointParameterType.cpp b/parameter/FixedPointParameterType.cpp
index aa93ac2..3c9e20f 100644
--- a/parameter/FixedPointParameterType.cpp
+++ b/parameter/FixedPointParameterType.cpp
@@ -340,3 +340,18 @@
     // Convert
     return (double)iValue / (1UL << _uiFractional);
 }
+
+// From IXmlSource
+void CFixedPointParameterType::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Size
+    xmlElement.setAttributeString("Size", toString(getSize() * 8));
+
+    // Integral
+    xmlElement.setAttributeString("Integral", toString(_uiIntegral));
+
+    // Fractional
+    xmlElement.setAttributeString("Fractional", toString(_uiFractional));
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/FixedPointParameterType.h b/parameter/FixedPointParameterType.h
index 30922a0..617f121 100644
--- a/parameter/FixedPointParameterType.h
+++ b/parameter/FixedPointParameterType.h
@@ -34,6 +34,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     // XML Serialization value space handling
     // Value space handling for configuration import
     virtual void handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
diff --git a/parameter/IntegerParameterType.cpp b/parameter/IntegerParameterType.cpp
index 8fadf27..b6784d9 100644
--- a/parameter/IntegerParameterType.cpp
+++ b/parameter/IntegerParameterType.cpp
@@ -428,3 +428,33 @@
 {
     return static_cast<const CParameterAdaptation*>(findChildOfKind("Adaptation"));
 }
+
+// From IXmlSource
+void CIntegerParameterType::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Sign
+    xmlElement.setAttributeBoolean("Signed", _bSigned);
+
+    if (_bSigned) {
+
+        // Mininmum
+        xmlElement.setAttributeString("Min", toString((int32_t)_uiMin));
+
+        // Maximum
+        xmlElement.setAttributeString("Max", toString((int32_t)_uiMax));
+
+    } else {
+
+        // Minimum
+        xmlElement.setAttributeString("Min", toString(_uiMin));
+
+        // Maximum
+        xmlElement.setAttributeString("Max", toString(_uiMax));
+    }
+
+    // Size
+    xmlElement.setAttributeString("Size", toString(getSize() * 8));
+
+    base::toXml(xmlElement, serializingContext);
+
+}
diff --git a/parameter/IntegerParameterType.h b/parameter/IntegerParameterType.h
index b29f0ac..9fb0dfd 100644
--- a/parameter/IntegerParameterType.h
+++ b/parameter/IntegerParameterType.h
@@ -36,6 +36,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     /// Conversion
     // String
     virtual bool toBlackboard(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp
index ddce610..9f1d160 100644
--- a/parameter/ParameterMgr.cpp
+++ b/parameter/ParameterMgr.cpp
@@ -23,7 +23,6 @@
  * UPDATED: 2011-07-27
  */
 #include "ParameterMgr.h"
-#include "XmlParser.h"
 #include "XmlParameterSerializingContext.h"
 #include "XmlElementSerializingContext.h"
 #include "SystemClass.h"
@@ -54,7 +53,6 @@
 #include "ConfigurableDomains.h"
 #include "ConfigurableDomain.h"
 #include "DomainConfiguration.h"
-#include "XmlComposer.h"
 #include "XmlDomainSerializingContext.h"
 #include "BitParameterBlockType.h"
 #include "BitParameterType.h"
@@ -74,6 +72,11 @@
 #include "ParameterHandle.h"
 #include "LinearParameterAdaptation.h"
 #include "EnumValuePair.h"
+#include "XmlFileDocSink.h"
+#include "XmlFileDocSource.h"
+#include "XmlStringDocSink.h"
+#include "XmlMemoryDocSink.h"
+#include "XmlMemoryDocSource.h"
 
 #define base CElement
 
@@ -166,7 +169,10 @@
     { "exportDomainsWithSettingsXML", &CParameterMgr::exportConfigurableDomainsWithSettingsToXMLCommmandProcess, 1, "<file path> ", "Export domains including settings to XML file" },
     { "importDomainsWithSettingsXML", &CParameterMgr::importConfigurableDomainsWithSettingsFromXMLCommmandProcess, 1, "<file path>", "Import domains including settings from XML file" },
     { "exportSettings", &CParameterMgr::exportSettingsCommmandProcess, 1, "<file path>", "Export settings to binary file" },
-    { "importSettings", &CParameterMgr::importSettingsCommmandProcess, 1, "<file path>", "Import settings from binary file" }
+    { "importSettings", &CParameterMgr::importSettingsCommmandProcess, 1, "<file path>", "Import settings from binary file" },
+    { "getDomainsXML", &CParameterMgr::getDomainsXMLCommmandProcess, 0 ,"", "Print domains including settings as XML" },
+    /// Structure Export
+    { "getSystemClassXML", &CParameterMgr::getSystemClassXMLCommmandProcess, 0 ,"", "Print parameter structure as XML" }
 };
 // Remote command parsers array Size
 const uint32_t CParameterMgr::guiNbRemoteCommandParserItems = sizeof(gastRemoteCommandParserItems) / sizeof(gastRemoteCommandParserItems[0]);
@@ -510,43 +516,20 @@
     // Get Schema file associated to root element
     string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pRootElement->getKind() + ".xsd";
 
-    // Parse Structure XML file
-    CXmlParser parser(strXmlFilePath, strXmlSchemaFilePath, pRootElement->getKind(), elementSerializingContext);
-
-    if (!parser.open()) {
-
-        return false;
-    }
-
-    // Check Root element name attribute (if any)
-    string strRootElementName = parser.getRootElementAttributeString(strNameAttrituteName);
-
-    if (!strRootElementName.empty() && strRootElementName != pRootElement->getName()) {
-
-        elementSerializingContext.setError("Error: Wrong XML structure file " + strXmlFilePath);
-        elementSerializingContext.appendLineToError(pRootElement->getKind() + " element " + pRootElement->getName() + " mismatches expected " + pRootElement->getKind() + " type " + pRootElement->getName());
-
-        return false;
-    }
+    CXmlFileDocSource fileDocSource(strXmlFilePath, strXmlSchemaFilePath, pRootElement->getKind(), pRootElement->getName(), strNameAttrituteName);
 
     // Start clean
     pRootElement->clean();
 
-    // Parse
-    if (!parser.parse(pRootElement)) {
+    CXmlMemoryDocSink memorySink(pRootElement);
 
-        // Cleanup
+    if (!memorySink.process(fileDocSource, elementSerializingContext)) {
+        //Cleanup
         pRootElement->clean();
 
         return false;
     }
 
-    // Close parser
-    if (!parser.close()) {
-
-        return false;
-    }
-
     return true;
 }
 
@@ -1274,6 +1257,32 @@
     return importDomainsBinary(remoteCommand.getArgument(0), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
 }
 
+/// GUI commands
+
+CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getDomainsXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    (void)remoteCommand;
+
+    if (!getDomainsXMLString(strResult, true)) {
+
+        return CCommandHandler::EFailed;
+    }
+    // Succeeded
+    return CCommandHandler::ESucceeded;
+}
+
+CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getSystemClassXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    (void)remoteCommand;
+
+    if (!getSystemClassXMLString(strResult)) {
+
+        return CCommandHandler::EFailed;
+    }
+    // Succeeded
+    return CCommandHandler::ESucceeded;
+}
+
 // User set/get parameters
 bool CParameterMgr::accessValue(const string& strPath, string& strValue, bool bSet, string& strError)
 {
@@ -1646,21 +1655,13 @@
     // Output raw format
     xmlDomainSerializingContext.setOutputRawFormat(_bOutputRawFormatIsHex);
 
-    // Instantiate composer
-    CXmlComposer xmlComposer(strFileName, strXmlSchemaFilePath, pConfigurableDomains->getKind(), xmlDomainSerializingContext);
+    // Use a doc source by loading data from instantiated Configurable Domains
+    CXmlMemoryDocSource memorySource(pConfigurableDomains, pConfigurableDomains->getKind(), strXmlSchemaFilePath, "parameter-framework", getVersion());
 
-    // Open composer
-    if (!xmlComposer.open()) {
+    // Use a doc sink to write the doc data in a file
+    CXmlFileDocSink fileSink(strFileName);
 
-        return false;
-    }
-
-    // Compose
-    xmlComposer.compose(pConfigurableDomains, "parameter-framework", getVersion());
-
-    // Close composer
-    if (!xmlComposer.close()) {
-
+    if (!fileSink.process(memorySource, xmlDomainSerializingContext)) {
         return false;
     }
 
@@ -1891,3 +1892,63 @@
 {
     return static_cast<const CConfigurableDomains*>(getChild(EConfigurableDomains));
 }
+
+/// GUI commands functions
+
+bool CParameterMgr::getDomainsXMLString(string& strResult, bool bWithSettings)
+{
+
+    // Root element
+    const CConfigurableDomains* pConfigurableDomains = getConstConfigurableDomains();
+
+    // Get Schema file associated to root element
+    string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pConfigurableDomains->getKind() + ".xsd";
+
+    string strError;
+
+    // Context
+    CXmlDomainSerializingContext xmlDomainSerializingContext(strError, bWithSettings);
+
+    // Value space
+    xmlDomainSerializingContext.setValueSpaceRaw(_bValueSpaceIsRaw);
+
+    // Output raw format
+    xmlDomainSerializingContext.setOutputRawFormat(_bOutputRawFormatIsHex);
+
+    // Use a doc source by loading data from instantiated Configurable Domains
+    CXmlMemoryDocSource memorySource(pConfigurableDomains, pConfigurableDomains->getKind(), strXmlSchemaFilePath, "parameter-framework", getVersion());
+
+    // Use a doc sink the write the doc data in a string
+    CXmlStringDocSink stringSink(strResult);
+
+    if (!stringSink.process(memorySource, xmlDomainSerializingContext)) {
+        strResult = strError;
+
+        return false;
+    }
+
+    return true;
+}
+
+bool CParameterMgr::getSystemClassXMLString(string& strResult)
+{
+    // Root element
+    const CSystemClass* pSystemClass = getSystemClass();
+
+    string strError;
+
+    CXmlSerializingContext xmlSerializingContext(strError);
+
+    // Use a doc source by loading data from instantiated Configurable Domains
+    CXmlMemoryDocSource memorySource(pSystemClass, pSystemClass->getKind());
+
+    // Use a doc sink that write the doc data in a string
+    CXmlStringDocSink stringSink(strResult);
+
+    if (!stringSink.process(memorySource, xmlSerializingContext)) {
+        strResult = strError;
+        return false;
+    }
+
+    return true;
+}
diff --git a/parameter/ParameterMgr.h b/parameter/ParameterMgr.h
index 59b4ab3..78db932 100644
--- a/parameter/ParameterMgr.h
+++ b/parameter/ParameterMgr.h
@@ -32,6 +32,8 @@
 #include "Element.h"
 #include <map>
 #include <vector>
+#include "XmlDocSink.h"
+#include "XmlDocSource.h"
 
 
 class CElementLibrarySet;
@@ -159,6 +161,10 @@
     bool importDomainsBinary(const string& strFileName, string& strError);
     bool exportDomainsBinary(const string& strFileName, string& strError);
 
+    // GUI command XML send
+    bool getDomainsXMLString(string& strResult, bool bWithSettings);
+    bool getSystemClassXMLString(string& strResult);
+
     // Introspect
     void logStructureContent(string& strContent) const;
 
@@ -242,6 +248,9 @@
     CCommandHandler::CommandStatus importConfigurableDomainsWithSettingsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
     CCommandHandler::CommandStatus exportSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
     CCommandHandler::CommandStatus importSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+    /// GUI commands
+    CCommandHandler::CommandStatus getSystemClassXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+    CCommandHandler::CommandStatus getDomainsXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
 
     // Max command usage length, use for formatting
     void setMaxCommandUsageLength();
diff --git a/parameter/StringParameterType.cpp b/parameter/StringParameterType.cpp
index 12d3741..840528e 100644
--- a/parameter/StringParameterType.cpp
+++ b/parameter/StringParameterType.cpp
@@ -68,3 +68,12 @@
 {
     return _uiMaxLength;
 }
+
+// From IXmlSource
+void CStringParameterType::toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const
+{
+    // MaxLength
+    xmlElement.setAttributeInteger("MaxLength", _uiMaxLength);
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/StringParameterType.h b/parameter/StringParameterType.h
index 55d96c9..8ad3d70 100644
--- a/parameter/StringParameterType.h
+++ b/parameter/StringParameterType.h
@@ -39,6 +39,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     // Element properties
     virtual void showProperties(string& strResult) const;
 
diff --git a/parameter/SystemClass.cpp b/parameter/SystemClass.cpp
index e108c05..8d6b334 100644
--- a/parameter/SystemClass.cpp
+++ b/parameter/SystemClass.cpp
@@ -237,3 +237,11 @@
     return base::init(strError);
 }
 
+// From IXmlSource
+void CSystemClass::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    // Set the name of system class
+    xmlElement.setNameAttribute(getName());
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/SystemClass.h b/parameter/SystemClass.h
index 9dbbf92..5cb86e4 100644
--- a/parameter/SystemClass.h
+++ b/parameter/SystemClass.h
@@ -45,6 +45,9 @@
     virtual bool init(string& strError);
     virtual string getKind() const;
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
 private:
     CSystemClass(const CSystemClass&);
     CSystemClass& operator=(const CSystemClass&);
diff --git a/parameter/TypeElement.cpp b/parameter/TypeElement.cpp
index 4c32bc2..405dc7d 100644
--- a/parameter/TypeElement.cpp
+++ b/parameter/TypeElement.cpp
@@ -125,3 +125,14 @@
     }
     return _pMappingData;
 }
+
+// From IXmlSource
+void CTypeElement::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+    if (!isScalar()) {
+
+        xmlElement.setAttributeInteger("ArrayLength", getArrayLength());
+    }
+
+    base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/TypeElement.h b/parameter/TypeElement.h
index e8855c6..bf0b306 100644
--- a/parameter/TypeElement.h
+++ b/parameter/TypeElement.h
@@ -48,6 +48,9 @@
     // From IXmlSink
     virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
 
+    // From IXmlSource
+    virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
     // Scalar or Array?
     bool isScalar() const;
 
diff --git a/parameter/XmlFileIncluderElement.cpp b/parameter/XmlFileIncluderElement.cpp
index 6e93721..89e5c14 100644
--- a/parameter/XmlFileIncluderElement.cpp
+++ b/parameter/XmlFileIncluderElement.cpp
@@ -23,7 +23,8 @@
  * UPDATED: 2011-07-27
  */
 #include "XmlFileIncluderElement.h"
-#include "XmlParser.h"
+#include "XmlFileDocSource.h"
+#include "XmlMemoryDocSink.h"
 #include "XmlElementSerializingContext.h"
 #include "ElementLibrary.h"
 #include <assert.h>
@@ -52,17 +53,13 @@
     // Instantiate parser
     string strIncludedElementType = getIncludedElementType();
 
-    CXmlParser parser(strPath, elementSerializingContext.getXmlSchemaPathFolder() + "/" + strIncludedElementType + ".xsd", strIncludedElementType, elementSerializingContext);
-
-    if (!parser.open()) {
-
-        return false;
-    }
+    // Use a doc source that load data from a file
+    CXmlFileDocSource fileDocSource(strPath, elementSerializingContext.getXmlSchemaPathFolder() + "/" + strIncludedElementType + ".xsd", strIncludedElementType);
 
     // Get top level element
     CXmlElement childElement;
 
-    parser.getRootElement(childElement);
+    fileDocSource.getRootElement(childElement);
 
     // Create child element
     CElement* pChild = elementSerializingContext.getElementLibrary()->createElement(childElement);
@@ -78,7 +75,10 @@
         return false;
     }
 
-    if (!parser.parse(pChild)) {
+    // Use a doc sink that instantiate the structure from the doc source
+    CXmlMemoryDocSink memorySink(pChild);
+
+    if (!memorySink.process(fileDocSource, elementSerializingContext)) {
 
         return false;
     }