From 1a0a026a5770ca2e8ca66e1e8daed101301c7e30 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 30 Nov 2017 16:36:03 +0100 Subject: EPUB export: handle custom media dir in cover image / XMP metadata By changing the default to /cover. and /.xmp. Change-Id: I736aefafba5aa5208917d9ed40119ca7721cdde3 Reviewed-on: https://gerrit.libreoffice.org/45604 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- writerperfect/source/writer/exp/xmlimp.cxx | 88 ++++++++++++------------------ 1 file changed, 35 insertions(+), 53 deletions(-) (limited to 'writerperfect/source/writer/exp') diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx index f933487a59b8..ad4928f17a65 100644 --- a/writerperfect/source/writer/exp/xmlimp.cxx +++ b/writerperfect/source/writer/exp/xmlimp.cxx @@ -49,6 +49,37 @@ OUString GetMimeType(const OUString &rExtension) return it == vMimeTypes.end() ? OUString() : it->second; } +/// Determines the base directory for cover images, XMP metadata, popup images. +OUString FindMediaDir(const OUString &rDocumentBaseURL, const uno::Sequence &rFilterData) +{ + OUString aMediaDir; + + // See if filter data contains a media directory explicitly. + for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i) + { + if (rFilterData[i].Name == "RVNGMediaDir") + { + rFilterData[i].Value >>= aMediaDir; + break; + } + } + + if (!aMediaDir.isEmpty()) + return aMediaDir + "/"; + + // Not set explicitly, try to pick it up from the base directory. + INetURLObject aURL(rDocumentBaseURL); + try + { + aMediaDir = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aURL.GetBase()) + "/"; + } + catch (const rtl::MalformedUriException &rException) + { + SAL_WARN("writerperfect", "FindMediaDir: convertRelToAbs() failed:" << rException.getMessage()); + } + return aMediaDir; +} + /// Picks up a cover image from the base directory. OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, const uno::Sequence &rFilterData) { @@ -75,8 +106,6 @@ OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, c if (rDocumentBaseURL.isEmpty()) return aRet; - INetURLObject aDocumentBaseURL(rDocumentBaseURL); - static const std::initializer_list vExtensions = { "gif", @@ -85,17 +114,10 @@ OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, c "svg" }; + OUString aMediaDir = FindMediaDir(rDocumentBaseURL, rFilterData); for (const auto &rExtension : vExtensions) { - try - { - aRet = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aDocumentBaseURL.GetBase() + ".cover-image." + rExtension); - } - catch (const rtl::MalformedUriException &rException) - { - SAL_WARN("writerperfect", "FindCoverImage: convertRelToAbs() failed:" << rException.getMessage()); - } - + aRet = aMediaDir + "cover." + rExtension; if (!aRet.isEmpty()) { SvFileStream aStream(aRet, StreamMode::READ); @@ -113,37 +135,6 @@ OUString FindCoverImage(const OUString &rDocumentBaseURL, OUString &rMimeType, c return aRet; } -/// Determines the base directory for cover images, XMP metadata, popup images. -OUString FindMediaDir(const OUString &rDocumentBaseURL, const uno::Sequence &rFilterData) -{ - OUString aMediaDir; - - // See if filter data contains a media directory explicitly. - for (sal_Int32 i = 0; i < rFilterData.getLength(); ++i) - { - if (rFilterData[i].Name == "RVNGMediaDir") - { - rFilterData[i].Value >>= aMediaDir; - break; - } - } - - if (!aMediaDir.isEmpty()) - return aMediaDir + "/"; - - // Not set explicitly, try to pick it up from the base directory. - INetURLObject aURL(rDocumentBaseURL); - try - { - aMediaDir = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aURL.GetBase()) + "/"; - } - catch (const rtl::MalformedUriException &rException) - { - SAL_WARN("writerperfect", "FindMediaDir: convertRelToAbs() failed:" << rException.getMessage()); - } - return aMediaDir; -} - /// Picks up XMP metadata from the base directory. void FindXMPMetadata(const uno::Reference &xContext, const OUString &rDocumentBaseURL, const uno::Sequence &rFilterData, librevenge::RVNGPropertyList &rMetaData) { @@ -187,18 +178,9 @@ void FindXMPMetadata(const uno::Reference &xContext, con if (rDocumentBaseURL.isEmpty()) return; + OUString aMediaDir = FindMediaDir(rDocumentBaseURL, rFilterData); INetURLObject aDocumentBaseURL(rDocumentBaseURL); - OUString aURL; - try - { - aURL = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aDocumentBaseURL.GetBase() + ".xmp"); - } - catch (const rtl::MalformedUriException &rException) - { - SAL_WARN("writerperfect", "FindXMPMetadata: convertRelToAbs() failed:" << rException.getMessage()); - return; - } - + OUString aURL = aMediaDir + aDocumentBaseURL.GetBase() + ".xmp"; SvFileStream aStream(aURL, StreamMode::READ); if (!aStream.IsOpen()) return; -- cgit