summaryrefslogtreecommitdiff
path: root/writerperfect/source/writer/exp/xmlimp.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-11-30 16:33:03 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-12-01 09:17:01 +0100
commit7dcb4fef3b2383f4dd4d5d5c9ebbe8f19f8f4c8e (patch)
tree1f98cde1b37dc8fce39a571243435e4e9cbb6409 /writerperfect/source/writer/exp/xmlimp.cxx
parent553a35bed7a7ffb5bcda98987eb4af8b79bc031f (diff)
EPUB export: support image popup for images and text
Handle relative links on image / text as data for a popup. Pick the images up from <base directory>/<base name>/<relative url> as a start. Change-Id: I9b6183d554e3792aa71dfffc19a671a0e4c302cc Reviewed-on: https://gerrit.libreoffice.org/45601 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'writerperfect/source/writer/exp/xmlimp.cxx')
-rw-r--r--writerperfect/source/writer/exp/xmlimp.cxx54
1 files changed, 53 insertions, 1 deletions
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
index bb3d067660b7..fdbc1d398243 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -12,6 +12,7 @@
#include <initializer_list>
#include <unordered_map>
+#include <com/sun/star/uri/UriReferenceFactory.hpp>
#include <com/sun/star/xml/sax/InputSource.hpp>
#include <com/sun/star/xml/sax/Parser.hpp>
#include <rtl/uri.hxx>
@@ -242,7 +243,8 @@ rtl::Reference<XMLImportContext> XMLOfficeDocContext::CreateChildContext(const O
XMLImport::XMLImport(const uno::Reference<uno::XComponentContext> &xContext, librevenge::RVNGTextInterface &rGenerator, const OUString &rURL, const uno::Sequence<beans::PropertyValue> &rDescriptor)
: mrGenerator(rGenerator),
- mxContext(xContext)
+ mxContext(xContext),
+ maDocumentBaseURL(rURL)
{
uno::Sequence<beans::PropertyValue> aFilterData;
for (sal_Int32 i = 0; i < rDescriptor.getLength(); ++i)
@@ -270,6 +272,8 @@ XMLImport::XMLImport(const uno::Reference<uno::XComponentContext> &xContext, lib
}
FindXMPMetadata(mxContext, rURL, aFilterData, maMetaData);
+
+ mxUriReferenceFactory = uri::UriReferenceFactory::create(mxContext);
}
const librevenge::RVNGPropertyListVector &XMLImport::GetCoverImages()
@@ -282,6 +286,54 @@ const librevenge::RVNGPropertyList &XMLImport::GetMetaData()
return maMetaData;
}
+bool XMLImport::FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList &rPropList)
+{
+ uno::Reference<uri::XUriReference> xUriRef;
+ try
+ {
+ xUriRef = mxUriReferenceFactory->parse(rURL);
+ }
+ catch (const uno::Exception &rException)
+ {
+ SAL_WARN("writerperfect", "XMLImport::FillPopupData: XUriReference::parse() failed:" << rException.Message);
+ }
+ bool bRelative = false;
+ if (xUriRef.is())
+ bRelative = !xUriRef->isAbsolute();
+ if (!bRelative)
+ return false;
+
+ OUString aAbs;
+ INetURLObject aBaseURL(maDocumentBaseURL);
+ try
+ {
+ aAbs = rtl::Uri::convertRelToAbs(maDocumentBaseURL, aBaseURL.GetBase() + "/" + rURL);
+ }
+ catch (const rtl::MalformedUriException &rException)
+ {
+ SAL_WARN("writerperfect", "XMLImport::FillPopupData: convertRelToAbs() failed:" << rException.getMessage());
+ }
+ if (aAbs.isEmpty())
+ return false;
+
+ SvFileStream aStream(aAbs, StreamMode::READ);
+ if (aStream.IsOpen())
+ {
+ librevenge::RVNGBinaryData aBinaryData;
+ SvMemoryStream aMemoryStream;
+ aMemoryStream.WriteStream(aStream);
+ aBinaryData.append(static_cast<const unsigned char *>(aMemoryStream.GetBuffer()), aMemoryStream.GetSize());
+ rPropList.insert("office:binary-data", aBinaryData);
+
+ INetURLObject aAbsURL(aAbs);
+ OUString aMimeType = GetMimeType(aAbsURL.GetExtension());
+ rPropList.insert("librevenge:mime-type", aMimeType.toUtf8().getStr());
+ return true;
+ }
+
+ return false;
+}
+
rtl::Reference<XMLImportContext> XMLImport::CreateContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
{
if (rName == "office:document")