[Libreoffice-commits] core.git: sw/qa sw/source
Miklos Vajna
vmiklos at collabora.co.uk
Mon Mar 5 17:27:34 UTC 2018
sw/qa/extras/htmlimport/data/reqif-ole-data.ole | 1
sw/qa/extras/htmlimport/data/reqif-ole-data.xhtml | 3 +
sw/qa/extras/htmlimport/htmlimport.cxx | 9 +++
sw/source/filter/html/htmlplug.cxx | 62 +++++++++++++++++-----
sw/source/filter/html/swhtml.cxx | 8 ++
sw/source/filter/html/swhtml.hxx | 2
6 files changed, 73 insertions(+), 12 deletions(-)
New commits:
commit c40afac8a39403f1c785151c9066becccf79078b
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Mon Mar 5 17:29:51 2018 +0100
sw XHTML import: map <object> to OLE objects
This handles native data only so far, replacement image still needs
doing.
Change-Id: I5f51bc7d837309fa0b88b277c1b754e435cb4208
Reviewed-on: https://gerrit.libreoffice.org/50778
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Tested-by: Jenkins <ci at libreoffice.org>
diff --git a/sw/qa/extras/htmlimport/data/reqif-ole-data.ole b/sw/qa/extras/htmlimport/data/reqif-ole-data.ole
new file mode 100644
index 000000000000..d3dc23d793e2
--- /dev/null
+++ b/sw/qa/extras/htmlimport/data/reqif-ole-data.ole
@@ -0,0 +1 @@
+{\pict}
diff --git a/sw/qa/extras/htmlimport/data/reqif-ole-data.xhtml b/sw/qa/extras/htmlimport/data/reqif-ole-data.xhtml
new file mode 100644
index 000000000000..9e0cfaa378b4
--- /dev/null
+++ b/sw/qa/extras/htmlimport/data/reqif-ole-data.xhtml
@@ -0,0 +1,3 @@
+<reqif-xhtml:div>
+ <reqif-xhtml:object data="reqif-ole-data.ole" type="text/rtf"/>
+</reqif-xhtml:div>
diff --git a/sw/qa/extras/htmlimport/htmlimport.cxx b/sw/qa/extras/htmlimport/htmlimport.cxx
index 2e42b9f841e8..03d500850edd 100644
--- a/sw/qa/extras/htmlimport/htmlimport.cxx
+++ b/sw/qa/extras/htmlimport/htmlimport.cxx
@@ -297,6 +297,15 @@ DECLARE_HTMLIMPORT_TEST(testReqIfBr, "reqif-br.xhtml")
CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("aaa\nbbb"));
}
+DECLARE_HTMLIMPORT_TEST(testReqIfOleData, "reqif-ole-data.xhtml")
+{
+ uno::Reference<text::XTextEmbeddedObjectsSupplier> xSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xObjects(xSupplier->getEmbeddedObjects(),
+ uno::UNO_QUERY);
+ // This was 0, <object> without URL was ignored.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xObjects->getCount());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/html/htmlplug.cxx b/sw/source/filter/html/htmlplug.cxx
index 54861e8aef25..3ebef3437dde 100644
--- a/sw/source/filter/html/htmlplug.cxx
+++ b/sw/source/filter/html/htmlplug.cxx
@@ -49,6 +49,7 @@
#include <swerror.h>
#include <ndole.hxx>
#include <swtable.hxx>
+#include <docsh.hxx>
#include "swhtml.hxx"
#include "wrthtml.hxx"
#include "htmlfly.hxx"
@@ -58,9 +59,12 @@
#include <com/sun/star/embed/Aspects.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
#include <comphelper/embeddedobjectcontainer.hxx>
#include <comphelper/classids.hxx>
+#include <rtl/uri.hxx>
+#include <comphelper/storagehelper.hxx>
using namespace com::sun::star;
@@ -291,6 +295,7 @@ void SwHTMLParser::SetSpace( const Size& rPixSpace,
void SwHTMLParser::InsertEmbed()
{
OUString aURL, aType, aName, aAlt, aId, aStyle, aClass;
+ OUString aData;
Size aSize( USHRT_MAX, USHRT_MAX );
Size aSpace( USHRT_MAX, USHRT_MAX );
bool bPrcWidth = false, bPrcHeight = false, bHidden = false;
@@ -357,6 +362,10 @@ void SwHTMLParser::InsertEmbed()
if( USHRT_MAX==aSpace.Height() )
aSpace.setHeight( static_cast<long>(rOption.GetNumber()) );
break;
+ case HtmlOptionId::DATA:
+ if (m_bXHTML && aURL.isEmpty())
+ aData = rOption.GetString();
+ break;
case HtmlOptionId::UNKNOWN:
if (rOption.GetTokenString().equalsIgnoreAsciiCase(
OOO_STRING_SW_HTML_O_Hidden))
@@ -399,31 +408,60 @@ void SwHTMLParser::InsertEmbed()
URIHelper::SmartRel2Abs(
INetURLObject(m_sBaseURL), aURL,
URIHelper::GetMaybeFileHdl()) );
+ bool bHasData = !aData.isEmpty();
+ try
+ {
+ aURLObj.SetURL(rtl::Uri::convertRelToAbs(m_sBaseURL, aData));
+ }
+ catch (const rtl::MalformedUriException& /*rException*/)
+ {
+ bHasData = false;
+ }
// do not insert plugin if it has neither URL nor type
bool bHasType = !aType.isEmpty();
- if( !bHasURL && !bHasType )
+ if( !bHasURL && !bHasType && !bHasData )
return;
// create the plug-in
comphelper::EmbeddedObjectContainer aCnt;
OUString aObjName;
- uno::Reference < embed::XEmbeddedObject > xObj = aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aObjName );
- if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
+ uno::Reference < embed::XEmbeddedObject > xObj;
+ if (!bHasData)
{
- uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
- if ( xSet.is() )
+ xObj = aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aObjName );
+ if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
{
- if( bHasURL )
- xSet->setPropertyValue("PluginURL", uno::makeAny( aURL ) );
- if( bHasType )
- xSet->setPropertyValue("PluginMimeType", uno::makeAny( aType ) );
+ uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
+ if ( xSet.is() )
+ {
+ if( bHasURL )
+ xSet->setPropertyValue("PluginURL", uno::makeAny( aURL ) );
+ if( bHasType )
+ xSet->setPropertyValue("PluginMimeType", uno::makeAny( aType ) );
- uno::Sequence < beans::PropertyValue > aProps;
- aCmdLst.FillSequence( aProps );
- xSet->setPropertyValue("PluginCommands", uno::makeAny( aProps ) );
+ uno::Sequence < beans::PropertyValue > aProps;
+ aCmdLst.FillSequence( aProps );
+ xSet->setPropertyValue("PluginCommands", uno::makeAny( aProps ) );
+ }
+ }
+ }
+ else if (SwDocShell* pDocSh = m_xDoc->GetDocShell())
+ {
+ // Has non-empty data attribute in XHTML: map that to an OLE object.
+ uno::Reference<embed::XStorage> xStorage = pDocSh->GetStorage();
+ aCnt.SwitchPersistence(xStorage);
+ aObjName = aCnt.CreateUniqueObjectName();
+ {
+ SvFileStream aFileStream(aURLObj.GetMainURL(INetURLObject::DecodeMechanism::NONE),
+ StreamMode::READ);
+ uno::Reference<io::XInputStream> xInStream(new utl::OStreamWrapper(aFileStream));
+ uno::Reference<io::XStream> xOutStream
+ = xStorage->openStreamElement(aObjName, embed::ElementModes::READWRITE);
+ comphelper::OStorageHelper::CopyInputToOutput(xInStream, xOutStream->getOutputStream());
}
+ xObj = aCnt.GetEmbeddedObject(aObjName);
}
SfxItemSet aFrameSet( m_xDoc->GetAttrPool(),
diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx
index 9e4212dbcd67..d798f0ba0a51 100644
--- a/sw/source/filter/html/swhtml.cxx
+++ b/sw/source/filter/html/swhtml.cxx
@@ -1413,6 +1413,11 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken )
break;
case HtmlTokenId::OBJECT_ON:
+ if (m_bXHTML)
+ {
+ InsertEmbed();
+ break;
+ }
#if HAVE_FEATURE_JAVA
NewObject();
m_bCallNextToken = m_pAppletImpl!=nullptr && m_xTable;
@@ -5559,7 +5564,10 @@ void SwHTMLParser::SetupFilterOptions()
OUString aFilterOptions = pItem->GetValue();
const OUString aXhtmlNsKey("xhtmlns=");
if (aFilterOptions.startsWith(aXhtmlNsKey))
+ {
SetNamespace(aFilterOptions.copy(aXhtmlNsKey.getLength()));
+ m_bXHTML = true;
+ }
}
namespace
diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
index d4b10d48fe8e..ffbb42d334aa 100644
--- a/sw/source/filter/html/swhtml.hxx
+++ b/sw/source/filter/html/swhtml.hxx
@@ -504,6 +504,8 @@ class SwHTMLParser : public SfxHTMLParser, public SwClient
SfxViewFrame* m_pTempViewFrame;
+ bool m_bXHTML = false;
+
void DeleteFormImpl();
void DocumentDetected();
More information about the Libreoffice-commits
mailing list