unoxml/source/dom/documentbuilder.cxx | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
New commits: commit 9a224357cba5dfe5376cab9791ffccb6c089d8a6 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Thu Jan 16 02:04:53 2020 +0000 Commit: Ashod Nakashian <ashnak...@gmail.com> CommitDate: Thu Jan 16 04:43:59 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/+/86899 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/unoxml/source/dom/documentbuilder.cxx b/unoxml/source/dom/documentbuilder.cxx index 8d244ab6d6e9..9bf3154ce9aa 100644 --- a/unoxml/source/dom/documentbuilder.cxx +++ b/unoxml/source/dom/documentbuilder.cxx @@ -40,6 +40,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> @@ -401,11 +402,25 @@ 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 ), UNO_QUERY_THROW); + + // loop over every layout entry in current file + xRet = parse( xInStream ); + + xInStream->closeInput(); + xInStream.clear(); + + } else + xRet = CDocument::CreateCDocument(pDoc).get(); + return xRet; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits