[Libreoffice-commits] core.git: unoxml/source

Michael Meeks (via logerrit) logerrit at kemper.freedesktop.org
Thu Jan 16 18:15:58 UTC 2020


 unoxml/source/dom/documentbuilder.cxx |   25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

New commits:
commit e217f2cec1505a65e4ca5651bf27449a606b09c3
Author:     Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Thu Jan 16 02:04:53 2020 +0000
Commit:     Michael Meeks <michael.meeks at collabora.com>
CommitDate: Thu Jan 16 19:15:23 2020 +0100

    unoxml: CDocumentBuilder::parseURI should handle non-file:/// URIs.
    
    The proximate symptom of this is of only some of the slide layouts
    applying in impress on Android. This is caused by not parsing the
    file:///assets/.../layoutlist.xml - which needs to use UCB and its
    cleverer osl/ file APIs.
    
    Change-Id: I22ed77170891c0ec136caaa29da69987a0e51a73
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86900
    Tested-by: Jenkins
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/unoxml/source/dom/documentbuilder.cxx b/unoxml/source/dom/documentbuilder.cxx
index 880d37abe31c..03f4b2a79e91 100644
--- a/unoxml/source/dom/documentbuilder.cxx
+++ b/unoxml/source/dom/documentbuilder.cxx
@@ -37,6 +37,7 @@
 #include <com/sun/star/xml/sax/SAXParseException.hpp>
 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
 #include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/ucb/SimpleFileAccess.hpp>
 
 #include <ucbhelper/content.hxx>
 #include <ucbhelper/commandenvironment.hxx>
@@ -393,11 +394,27 @@ namespace DOM
         OString oUri = OUStringToOString(sUri, RTL_TEXTENCODING_UTF8);
         char *uri = const_cast<char*>(oUri.getStr());
         xmlDocPtr pDoc = xmlCtxtReadFile(pContext.get(), uri, nullptr, 0);
+
+        Reference< XDocument > xRet;
+
+        // if we failed to parse the URI as a simple file, lets try via a ucb stream.
+        // For Android file:///assets/ URLs which must go via the osl/ file API.
         if (pDoc == nullptr) {
-            throwEx(pContext.get());
-        }
-        Reference< XDocument > const xRet(
-                CDocument::CreateCDocument(pDoc).get());
+            Reference < XSimpleFileAccess3 > xStreamAccess(
+                SimpleFileAccess::create( comphelper::getProcessComponentContext() ) );
+            Reference< XInputStream > xInStream = xStreamAccess->openFileRead( sUri );
+            if (!xInStream.is())
+                throwEx(pContext.get());
+
+            // loop over every layout entry in current file
+            xRet = parse( xInStream );
+
+            xInStream->closeInput();
+            xInStream.clear();
+
+        } else
+            xRet = CDocument::CreateCDocument(pDoc).get();
+
         return xRet;
     }
 


More information about the Libreoffice-commits mailing list