In structure XML files, implement component library files inclusion

BZ: 168727

In the PFW structure file, it is not possible to include a component
library from another XML file.

Implement the possibility to import component from another XML file
that would be included in a structure XML file and that would
describe a component library.

Change-Id: Id6125140de1c8e9882375d01199f695b929f45e2
Signed-off-by: Guillaume Denneulin <guillaume.denneulin@intel.com>
diff --git a/xmlserializer/XmlFileDocSource.cpp b/xmlserializer/XmlFileDocSource.cpp
index 4df2ad1..53e7c86 100644
--- a/xmlserializer/XmlFileDocSource.cpp
+++ b/xmlserializer/XmlFileDocSource.cpp
@@ -24,6 +24,7 @@
 
 #include "XmlFileDocSource.h"
 #include <libxml/parser.h>
+#include <libxml/xinclude.h>
 
 #define base CXmlDocSource
 
@@ -32,7 +33,7 @@
                                      const string& strRootElementType,
                                      const string& strRootElementName,
                                      const string& strNameAttrituteName) :
-        base(xmlReadFile(strXmlInstanceFile.c_str(),NULL, 0),
+        base(readFile(strXmlInstanceFile),
              strXmlSchemaFile,
              strRootElementType,
              strRootElementName,
@@ -44,7 +45,7 @@
 CXmlFileDocSource::CXmlFileDocSource(const string& strXmlInstanceFile,
                                      const string& strXmlSchemaFile,
                                      const string& strRootElementType) :
-        base(xmlReadFile(strXmlInstanceFile.c_str(), NULL, 0),
+        base(readFile(strXmlInstanceFile),
              strXmlSchemaFile,
              strRootElementType),
         _strXmlInstanceFile(strXmlInstanceFile)
@@ -66,7 +67,7 @@
 
 bool CXmlFileDocSource::populate(CXmlSerializingContext& serializingContext)
 {
-    if (!base::validate(serializingContext)) {
+    if (!validate(serializingContext)) {
 
         // Add the file's name in the error message
         serializingContext.appendLineToError("File : " + _strXmlInstanceFile);
@@ -76,3 +77,23 @@
 
     return true;
 }
+
+_xmlDoc* CXmlFileDocSource::readFile(const string& strFileName)
+{
+    // Read xml file
+    xmlDocPtr pDoc = xmlReadFile(strFileName.c_str(), NULL, 0);
+
+    if (!pDoc) {
+
+        return NULL;
+    }
+    // Process file inclusion
+    // WARNING: this symbol is available if libxml2 has been compiled with LIBXML_XINCLUDE_ENABLED
+    if (xmlXIncludeProcess(pDoc) < 0) {
+
+        xmlFreeDoc(pDoc);
+        return NULL;
+    }
+
+    return pDoc;
+}
diff --git a/xmlserializer/XmlFileDocSource.h b/xmlserializer/XmlFileDocSource.h
index 98ba6e3..1efafe2 100644
--- a/xmlserializer/XmlFileDocSource.h
+++ b/xmlserializer/XmlFileDocSource.h
@@ -73,6 +73,17 @@
     virtual bool isParsable(CXmlSerializingContext& serializingContext) const;
 
 private:
+    /**
+     * Read xml file
+     *
+     * This function reads an xml file and processes eventual included files
+     * WARNING: to compile this function, libxml2 has to be compiled with LIBXML_XINCLUDE_ENABLED
+     *
+     * @param[in] strFileName the file name
+     *
+     * @return a pointer to generated xml document object
+     */
+    static _xmlDoc* readFile(const string& strFileName);
 
     /**
       * Instance file