summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2020-11-29 20:16:53 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-11-30 07:25:58 +0100
commitfca175a7509b598560a612bc58b4817690665688 (patch)
treeacbe29935efff06e37ac4b032778f63f5dd179e9 /xmloff
parentf7e2f5bca938aa916830e07895d2da6820282055 (diff)
fastparser in XMLEmbeddedObjectImportContext
Change-Id: I3ba7d21bd85c494b73b3b90e73386e958e479f72 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106842 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'xmloff')
-rw-r--r--xmloff/inc/XMLEmbeddedObjectImportContext.hxx5
-rw-r--r--xmloff/source/core/XMLEmbeddedObjectImportContext.cxx31
-rw-r--r--xmloff/source/draw/ximpshap.cxx31
-rw-r--r--xmloff/source/draw/ximpshap.hxx3
-rw-r--r--xmloff/source/text/XMLTextFrameContext.cxx119
5 files changed, 90 insertions, 99 deletions
diff --git a/xmloff/inc/XMLEmbeddedObjectImportContext.hxx b/xmloff/inc/XMLEmbeddedObjectImportContext.hxx
index 95942f2331c5..1f5bbdd0787c 100644
--- a/xmloff/inc/XMLEmbeddedObjectImportContext.hxx
+++ b/xmloff/inc/XMLEmbeddedObjectImportContext.hxx
@@ -38,9 +38,8 @@ public:
const OUString& GetFilterServiceName() const { return sFilterService; }
const OUString& GetFilterCLSID() const { return sCLSID; }
- XMLEmbeddedObjectImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
- const OUString& rLName,
- const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList );
+ XMLEmbeddedObjectImportContext( SvXMLImport& rImport, sal_Int32 nElement,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
virtual ~XMLEmbeddedObjectImportContext() override;
diff --git a/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx b/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
index a8cc84392627..cc8115700403 100644
--- a/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
+++ b/xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
@@ -25,6 +25,7 @@
#include <com/sun/star/document/XImporter.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/util/XModifiable2.hpp>
+#include <sal/log.hxx>
#include <tools/globname.hxx>
#include <comphelper/classids.hxx>
#include <xmloff/namespacemap.hxx>
@@ -82,7 +83,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > XMLEmbeddedObjectImpor
sal_Int32 ,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
{
- // we carry no state, so just re-use the same instance
+ // we have no state, so avoid allocation cost, and just use a single instance
return this;
}
@@ -139,34 +140,30 @@ void XMLEmbeddedObjectImportContext::SetComponent( Reference< XComponent > const
}
XMLEmbeddedObjectImportContext::XMLEmbeddedObjectImportContext(
- SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
- const Reference< XAttributeList >& xAttrList ) :
- SvXMLImportContext( rImport, nPrfx, rLName )
+ SvXMLImport& rImport, sal_Int32 nElement,
+ const Reference< XFastAttributeList >& xAttrList ) :
+ SvXMLImportContext( rImport )
{
SvGlobalName aName;
- if( nPrfx == XML_NAMESPACE_MATH &&
- IsXMLToken( rLName, XML_MATH ) )
+ if( nElement == XML_ELEMENT(MATH, XML_MATH) )
{
sFilterService = XML_IMPORT_FILTER_MATH;
aName = SvGlobalName(SO3_SM_CLASSID);
}
- else if( nPrfx == XML_NAMESPACE_OFFICE &&
- IsXMLToken( rLName, XML_DOCUMENT ) )
+ else if( nElement == XML_ELEMENT(OFFICE, XML_DOCUMENT) )
{
OUString sMime;
- sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
- for( sal_Int16 i=0; i < nAttrCount; i++ )
+ for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
{
- const OUString& rAttrName = xAttrList->getNameByIndex( i );
- OUString aLocalName;
- sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
- if( nPrefix == XML_NAMESPACE_OFFICE &&
- IsXMLToken( aLocalName, XML_MIMETYPE ) )
+ switch (aIter.getToken())
{
- sMime = xAttrList->getValueByIndex( i );
- break;
+ case XML_ELEMENT(OFFICE, XML_MIMETYPE):
+ sMime = aIter.toString();
+ break;
+ default:
+ XMLOFF_WARN_UNKNOWN("xmloff", aIter);
}
}
diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
index 65a7e2fb0eef..e9ff3b51b5cd 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -2739,26 +2739,21 @@ void SdXMLObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const OUStri
SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
}
-SvXMLImportContextRef SdXMLObjectShapeContext::CreateChildContext(
- sal_uInt16 nPrefix, const OUString& rLocalName,
- const uno::Reference<xml::sax::XAttributeList>& xAttrList )
+css::uno::Reference< css::xml::sax::XFastContextHandler > SdXMLObjectShapeContext::createFastChildContext(
+ sal_Int32 nElement,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
{
- SvXMLImportContextRef xContext;
-
- if((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_BINARY_DATA))
+ if(nElement == XML_ELEMENT(OFFICE, XML_BINARY_DATA))
{
mxBase64Stream = GetImport().GetStreamForEmbeddedObjectURLFromBase64();
if( mxBase64Stream.is() )
- xContext = new XMLBase64ImportContext( GetImport(), nPrefix,
- rLocalName, xAttrList,
- mxBase64Stream );
+ return new XMLBase64ImportContext( GetImport(), mxBase64Stream );
}
- else if( ((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_DOCUMENT)) ||
- ((XML_NAMESPACE_MATH == nPrefix) && IsXMLToken(rLocalName, XML_MATH)) )
+ else if( nElement == XML_ELEMENT(OFFICE, XML_DOCUMENT) ||
+ nElement == XML_ELEMENT(MATH, XML_MATH) )
{
rtl::Reference<XMLEmbeddedObjectImportContext> xEContext(
- new XMLEmbeddedObjectImportContext(GetImport(), nPrefix,
- rLocalName, xAttrList));
+ new XMLEmbeddedObjectImportContext(GetImport(), nElement, xAttrList));
maCLSID = xEContext->GetFilterCLSID();
if( !maCLSID.isEmpty() )
{
@@ -2773,8 +2768,16 @@ SvXMLImportContextRef SdXMLObjectShapeContext::CreateChildContext(
xEContext->SetComponent(xComp);
}
}
- xContext = xEContext.get();
+ return xEContext.get();
}
+ return nullptr;
+}
+
+SvXMLImportContextRef SdXMLObjectShapeContext::CreateChildContext(
+ sal_uInt16 nPrefix, const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList>& xAttrList )
+{
+ SvXMLImportContextRef xContext;
// delegate to parent class if no context could be created
if (!xContext)
diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
index 8a29b037229a..84a76b315d55 100644
--- a/xmloff/source/draw/ximpshap.hxx
+++ b/xmloff/source/draw/ximpshap.hxx
@@ -421,6 +421,9 @@ public:
virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+
virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList ) override;
diff --git a/xmloff/source/text/XMLTextFrameContext.cxx b/xmloff/source/text/XMLTextFrameContext.cxx
index 08ad2d7dc489..0cf2d1832736 100644
--- a/xmloff/source/text/XMLTextFrameContext.cxx
+++ b/xmloff/source/text/XMLTextFrameContext.cxx
@@ -154,44 +154,36 @@ namespace {
class XMLTextFrameParam_Impl : public SvXMLImportContext
{
public:
-
-
- XMLTextFrameParam_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
- const OUString& rLName,
- const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList,
+ XMLTextFrameParam_Impl( SvXMLImport& rImport,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList,
ParamMap &rParamMap);
};
}
XMLTextFrameParam_Impl::XMLTextFrameParam_Impl(
- SvXMLImport& rImport, sal_uInt16 nPrfx,
- const OUString& rLName,
- const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList,
+ SvXMLImport& rImport,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList,
ParamMap &rParamMap):
- SvXMLImportContext( rImport, nPrfx, rLName )
+ SvXMLImportContext( rImport )
{
OUString sName, sValue;
bool bFoundValue = false; // to allow empty values
- sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
- for( sal_Int16 i=0; i < nAttrCount; i++ )
+ for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
{
- const OUString& rAttrName = xAttrList->getNameByIndex( i );
- const OUString& rValue = xAttrList->getValueByIndex( i );
-
- OUString aLocalName;
- sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
- if ( XML_NAMESPACE_DRAW == nPrefix )
+ switch (aIter.getToken())
{
- if( IsXMLToken(aLocalName, XML_VALUE) )
- {
- sValue = rValue;
- bFoundValue=true;
- }
- else if( IsXMLToken(aLocalName, XML_NAME) )
+ case XML_ELEMENT(DRAW, XML_VALUE):
{
- sName = rValue;
+ sValue = aIter.toString();
+ bFoundValue = true;
+ break;
}
+ case XML_ELEMENT(DRAW, XML_NAME):
+ sName = aIter.toString();
+ break;
+ default:
+ XMLOFF_WARN_UNKNOWN("xmloff", aIter);
}
}
if (!sName.isEmpty() && bFoundValue )
@@ -409,6 +401,9 @@ public:
virtual void SAL_CALL characters( const OUString& rChars ) override;
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
+
SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix,
const OUString& rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList ) override;
@@ -1169,60 +1164,44 @@ void XMLTextFrameContext_Impl::endFastElement(sal_Int32 )
GetImport().GetTextImport()->endAppletOrPlugin( xPropSet, aParamMap);
}
-SvXMLImportContextRef XMLTextFrameContext_Impl::CreateChildContext(
- sal_uInt16 nPrefix,
- const OUString& rLocalName,
- const Reference< XAttributeList > & xAttrList )
+css::uno::Reference< css::xml::sax::XFastContextHandler > XMLTextFrameContext_Impl::createFastChildContext(
+ sal_Int32 nElement,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
{
- SvXMLImportContext *pContext = nullptr;
-
- if( XML_NAMESPACE_DRAW == nPrefix )
+ if( nElement == XML_ELEMENT(DRAW, XML_PARAM) )
{
- if ( (nType == XML_TEXT_FRAME_APPLET || nType == XML_TEXT_FRAME_PLUGIN) &&
- IsXMLToken( rLocalName, XML_PARAM ) )
- {
- pContext = new XMLTextFrameParam_Impl( GetImport(),
- nPrefix, rLocalName,
+ if ( nType == XML_TEXT_FRAME_APPLET || nType == XML_TEXT_FRAME_PLUGIN )
+ return new XMLTextFrameParam_Impl( GetImport(),
xAttrList, aParamMap );
- }
}
- else if( XML_NAMESPACE_OFFICE == nPrefix )
+ else if( nElement == XML_ELEMENT(OFFICE, XML_BINARY_DATA) )
{
- if( IsXMLToken( rLocalName, XML_BINARY_DATA ) )
+ if( !xPropSet.is() && !xBase64Stream.is() && !bCreateFailed )
{
- if( !xPropSet.is() && !xBase64Stream.is() && !bCreateFailed )
+ switch( nType )
{
- switch( nType )
- {
- case XML_TEXT_FRAME_GRAPHIC:
- xBase64Stream =
- GetImport().GetStreamForGraphicObjectURLFromBase64();
- break;
- case XML_TEXT_FRAME_OBJECT_OLE:
- xBase64Stream =
- GetImport().GetStreamForEmbeddedObjectURLFromBase64();
- break;
- }
- if( xBase64Stream.is() )
- pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
- rLocalName, xAttrList,
- xBase64Stream );
+ case XML_TEXT_FRAME_GRAPHIC:
+ xBase64Stream =
+ GetImport().GetStreamForGraphicObjectURLFromBase64();
+ break;
+ case XML_TEXT_FRAME_OBJECT_OLE:
+ xBase64Stream =
+ GetImport().GetStreamForEmbeddedObjectURLFromBase64();
+ break;
}
+ if( xBase64Stream.is() )
+ return new XMLBase64ImportContext( GetImport(), xBase64Stream );
}
}
// Correction of condition which also avoids warnings. (#i100480#)
- if( !pContext &&
- ( XML_TEXT_FRAME_OBJECT == nType &&
- ( ( XML_NAMESPACE_OFFICE == nPrefix &&
- IsXMLToken( rLocalName, XML_DOCUMENT ) ) ||
- ( XML_NAMESPACE_MATH == nPrefix &&
- IsXMLToken( rLocalName, XML_MATH ) ) ) ) )
+ if( XML_TEXT_FRAME_OBJECT == nType &&
+ ( nElement == XML_ELEMENT(OFFICE, XML_DOCUMENT) ||
+ nElement == XML_ELEMENT(MATH, XML_MATH) ) )
{
if( !xPropSet.is() && !bCreateFailed )
{
XMLEmbeddedObjectImportContext *pEContext =
- new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
- rLocalName, xAttrList );
+ new XMLEmbeddedObjectImportContext( GetImport(), nElement, xAttrList );
sFilterService = pEContext->GetFilterServiceName();
if( !sFilterService.isEmpty() )
{
@@ -1237,10 +1216,20 @@ SvXMLImportContextRef XMLTextFrameContext_Impl::CreateChildContext(
pEContext->SetComponent( aXComponent );
}
}
- pContext = pEContext;
+ return pEContext;
}
}
- if( !pContext && xOldTextCursor.is() ) // text-box
+ return nullptr;
+}
+
+SvXMLImportContextRef XMLTextFrameContext_Impl::CreateChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< XAttributeList > & xAttrList )
+{
+ SvXMLImportContext *pContext = nullptr;
+
+ if( xOldTextCursor.is() ) // text-box
pContext = GetImport().GetTextImport()->CreateTextChildContext(
GetImport(), nPrefix, rLocalName, xAttrList,
XMLTextType::TextBox );