use fastparser in XMLEmbeddedObjectImportContext
Change-Id: I5fc61239e60a3129b350895293760a345baf3ce5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105260
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/xmloff/inc/XMLEmbeddedObjectImportContext.hxx b/xmloff/inc/XMLEmbeddedObjectImportContext.hxx
index 22f30ad..7f2a739 100644
--- a/xmloff/inc/XMLEmbeddedObjectImportContext.hxx
+++ b/xmloff/inc/XMLEmbeddedObjectImportContext.hxx
@@ -20,14 +20,14 @@
#ifndef INCLUDED_XMLOFF_INC_XMLEMBEDDEDOBJECTIMPORTCONTEXT_HXX
#define INCLUDED_XMLOFF_INC_XMLEMBEDDEDOBJECTIMPORTCONTEXT_HXX
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
#include <xmloff/xmlictxt.hxx>
namespace com::sun::star::lang { class XComponent; }
class XMLEmbeddedObjectImportContext final : public SvXMLImportContext
{
css::uno::Reference<css::xml::sax::XDocumentHandler > xHandler;
css::uno::Reference<css::xml::sax::XFastDocumentHandler > mxFastHandler;
css::uno::Reference<css::lang::XComponent > xComp;
OUString sFilterService;
@@ -48,7 +48,9 @@ public:
const OUString& rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual void SAL_CALL startFastElement(
sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
diff --git a/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx b/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
index 3b763d7..bfb182e 100644
--- a/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
+++ b/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
@@ -47,19 +47,21 @@ namespace {
class XMLEmbeddedObjectImportContext_Impl : public SvXMLImportContext
{
css::uno::Reference< css::xml::sax::XDocumentHandler > xHandler;
css::uno::Reference< css::xml::sax::XFastDocumentHandler > mxFastHandler;
public:
XMLEmbeddedObjectImportContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
const OUString& rLName,
const css::uno::Reference< css::xml::sax::XDocumentHandler >& rHandler );
const css::uno::Reference< css::xml::sax::XFastDocumentHandler >& rHandler );
virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix,
const OUString& rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual void SAL_CALL startFastElement(
sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
@@ -71,40 +73,37 @@ public:
XMLEmbeddedObjectImportContext_Impl::XMLEmbeddedObjectImportContext_Impl(
SvXMLImport& rImport, sal_uInt16 nPrfx,
const OUString& rLName,
const Reference< XDocumentHandler >& rHandler ) :
const Reference< XFastDocumentHandler >& rHandler ) :
SvXMLImportContext( rImport, nPrfx, rLName ),
xHandler( rHandler )
mxFastHandler( rHandler )
{
assert(xHandler);
assert(mxFastHandler);
}
SvXMLImportContextRef XMLEmbeddedObjectImportContext_Impl::CreateChildContext(
sal_uInt16 nPrefix,
const OUString& rLocalName,
sal_uInt16 /*nPrefix*/,
const OUString& /*rLocalName*/,
const Reference< XAttributeList >& )
{
return new XMLEmbeddedObjectImportContext_Impl( GetImport(),
nPrefix, rLocalName,
xHandler );
// we carry no state, so just re-use the same instance
return this;
}
void XMLEmbeddedObjectImportContext_Impl::StartElement(
const Reference< XAttributeList >& xAttrList )
void XMLEmbeddedObjectImportContext_Impl::startFastElement(
sal_Int32 nElement,
const Reference< XFastAttributeList >& xAttrList )
{
xHandler->startElement( GetImport().GetNamespaceMap().GetQNameByKey(
GetPrefix(), GetLocalName() ),
xAttrList );
mxFastHandler->startFastElement( nElement, xAttrList );
}
void XMLEmbeddedObjectImportContext_Impl::endFastElement(sal_Int32 )
void XMLEmbeddedObjectImportContext_Impl::endFastElement(sal_Int32 nElement)
{
xHandler->endElement( GetImport().GetNamespaceMap().GetQNameByKey(
GetPrefix(), GetLocalName() ) );
mxFastHandler->endFastElement( nElement );
}
void XMLEmbeddedObjectImportContext_Impl::characters( const OUString& rChars )
{
xHandler->characters( rChars );
mxFastHandler->characters( rChars );
}
@@ -123,12 +122,9 @@ void XMLEmbeddedObjectImportContext::SetComponent( Reference< XComponent > const
if( !xFilter.is() )
return;
if (SvXMLImport *pFastHandler = dynamic_cast<SvXMLImport*>(xFilter.get()))
xHandler.set( new SvXMLLegacyToFastDocHandler( pFastHandler ) );
else
xHandler.set(xFilter, UNO_QUERY);
assert( xHandler );
assert(dynamic_cast<SvXMLImport*>(xFilter.get()));
SvXMLImport *pFastHandler = dynamic_cast<SvXMLImport*>(xFilter.get());
mxFastHandler = pFastHandler;
try
{
@@ -139,7 +135,7 @@ void XMLEmbeddedObjectImportContext::SetComponent( Reference< XComponent > const
{
}
Reference < XImporter > xImporter( xHandler, UNO_QUERY );
Reference < XImporter > xImporter( mxFastHandler, UNO_QUERY );
xImporter->setTargetDocument( rComp );
xComp = rComp; // keep ref to component only if there is a handler
@@ -239,48 +235,31 @@ SvXMLImportContextRef XMLEmbeddedObjectImportContext::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName,
const Reference< XAttributeList >& )
{
if( xHandler.is() )
if( mxFastHandler.is() )
return new XMLEmbeddedObjectImportContext_Impl( GetImport(),
nPrefix, rLocalName,
xHandler );
mxFastHandler );
return nullptr;
}
void XMLEmbeddedObjectImportContext::StartElement(
const Reference< XAttributeList >& rAttrList )
void XMLEmbeddedObjectImportContext::startFastElement(
sal_Int32 nElement,
const Reference< XFastAttributeList >& rAttrList )
{
if( !xHandler.is() )
if( !mxFastHandler.is() )
return;
xHandler->startDocument();
// #i34042: copy namepspace declarations
SvXMLAttributeList *pAttrList = new SvXMLAttributeList( rAttrList );
Reference< XAttributeList > xAttrList( pAttrList );
const SvXMLNamespaceMap& rNamespaceMap = GetImport().GetNamespaceMap();
sal_uInt16 nPos = rNamespaceMap.GetFirstKey();
while( USHRT_MAX != nPos )
{
OUString aAttrName = "xmlns:" + rNamespaceMap.GetPrefixByKey( nPos );
if( xAttrList->getValueByName( aAttrName ).isEmpty() )
{
pAttrList->AddAttribute( aAttrName,
rNamespaceMap.GetNameByKey( nPos ) );
}
nPos = rNamespaceMap.GetNextKey( nPos );
}
xHandler->startElement( GetImport().GetNamespaceMap().GetQNameByKey(
GetPrefix(), GetLocalName() ),
xAttrList );
mxFastHandler->startDocument();
mxFastHandler->startFastElement( nElement, rAttrList );
}
void XMLEmbeddedObjectImportContext::endFastElement(sal_Int32 )
void XMLEmbeddedObjectImportContext::endFastElement(sal_Int32 nElement)
{
if( !xHandler.is() )
if( !mxFastHandler.is() )
return;
xHandler->endElement( GetImport().GetNamespaceMap().GetQNameByKey(
GetPrefix(), GetLocalName() ) );
xHandler->endDocument();
mxFastHandler->endFastElement( nElement );
mxFastHandler->endDocument();
try
{
@@ -295,8 +274,8 @@ void XMLEmbeddedObjectImportContext::endFastElement(sal_Int32 )
void XMLEmbeddedObjectImportContext::characters( const OUString& rChars )
{
if( xHandler.is() )
xHandler->characters( rChars );
if( mxFastHandler.is() )
mxFastHandler->characters( rChars );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */