From 8154953add163554c00935486a1cf5677cef2609 Mon Sep 17 00:00:00 2001 From: Mohammed Abdul Azeem Date: Mon, 5 Sep 2016 14:38:30 +0530 Subject: ScXMLTableRowCellContext implements fast interfaces: Implementation of fast interfaces for contexts in path from ScXMLImport::CreateFastContext to ScXMLTableRowCellContext. FastParser is enabled and duplicates are avoided at all possible places. OOoXML filters still need those legacy paths we removed, so I had to temporarily map them to fast elements, which would increase their load time, but hopefully it should help us in the long run. Change-Id: Ie997a9a8b72787da2356abc99ea2cd57c2e5b670 Reviewed-on: https://gerrit.libreoffice.org/28648 Tested-by: Jenkins Reviewed-by: Michael Meeks Tested-by: Michael Meeks --- .../transform/ChartPlotAreaOASISTContext.cxx | 4 +- xmloff/source/transform/ControlOASISTContext.cxx | 4 +- xmloff/source/transform/ControlOOoTContext.cxx | 4 +- xmloff/source/transform/EventOOoTContext.cxx | 5 +- xmloff/source/transform/FormPropOASISTContext.cxx | 4 +- xmloff/source/transform/FormPropOOoTContext.cxx | 5 +- xmloff/source/transform/FrameOASISTContext.cxx | 5 +- xmloff/source/transform/FrameOOoTContext.cxx | 4 +- xmloff/source/transform/MetaTContext.cxx | 6 +-- xmloff/source/transform/NotesTContext.cxx | 4 +- xmloff/source/transform/OOo2Oasis.cxx | 12 ++--- xmloff/source/transform/Oasis2OOo.cxx | 4 +- xmloff/source/transform/PersAttrListTContext.cxx | 4 +- xmloff/source/transform/ProcAddAttrTContext.cxx | 2 +- xmloff/source/transform/ProcAttrTContext.cxx | 4 +- xmloff/source/transform/RenameElemTContext.cxx | 4 +- xmloff/source/transform/StyleOASISTContext.cxx | 10 ++-- xmloff/source/transform/StyleOOoTContext.cxx | 9 ++-- xmloff/source/transform/TransformerBase.cxx | 57 +++++++++++++++++++++- xmloff/source/transform/TransformerBase.hxx | 15 ++++++ xmloff/source/transform/TransformerContext.cxx | 4 +- 21 files changed, 117 insertions(+), 53 deletions(-) (limited to 'xmloff/source/transform') diff --git a/xmloff/source/transform/ChartPlotAreaOASISTContext.cxx b/xmloff/source/transform/ChartPlotAreaOASISTContext.cxx index 187333016852..ddd022e73a45 100644 --- a/xmloff/source/transform/ChartPlotAreaOASISTContext.cxx +++ b/xmloff/source/transform/ChartPlotAreaOASISTContext.cxx @@ -167,11 +167,11 @@ void XMLAxisOASISContext::EndElement() XML_CATEGORY ), "Axis Dimension: invalid new value" ); } - GetTransformer().GetDocHandler()->startElement( + GetTransformer().startFastElement( GetExportQName(), Reference< xml::sax::XAttributeList >( pMutableAttrList )); ExportContent(); - GetTransformer().GetDocHandler()->endElement( GetExportQName()); + GetTransformer().endFastElement( GetExportQName()); } else Export(); diff --git a/xmloff/source/transform/ControlOASISTContext.cxx b/xmloff/source/transform/ControlOASISTContext.cxx index 3b5ece6da769..f5940a241740 100644 --- a/xmloff/source/transform/ControlOASISTContext.cxx +++ b/xmloff/source/transform/ControlOASISTContext.cxx @@ -135,7 +135,7 @@ void XMLControlOASISTransformerContext::StartElement( } if( m_bCreateControl ) - GetTransformer().GetDocHandler()->startElement( m_aElemQName, + GetTransformer().startFastElement( m_aElemQName, xControlAttrList ); XMLTransformerContext::StartElement( xAttrList ); } @@ -144,7 +144,7 @@ void XMLControlOASISTransformerContext::EndElement() { XMLTransformerContext::EndElement(); if( m_bCreateControl ) - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/ControlOOoTContext.cxx b/xmloff/source/transform/ControlOOoTContext.cxx index b37a73491f94..9f42d35a5030 100644 --- a/xmloff/source/transform/ControlOOoTContext.cxx +++ b/xmloff/source/transform/ControlOOoTContext.cxx @@ -63,7 +63,7 @@ rtl::Reference XMLControlOOoTransformerContext::CreateChi GetTransformer().ProcessAttrList( m_xAttrList, OOO_FORM_CONTROL_ACTIONS, false ); - GetTransformer().GetDocHandler()->startElement( m_aElemQName, + GetTransformer().startFastElement( m_aElemQName, m_xAttrList ); } else @@ -77,7 +77,7 @@ rtl::Reference XMLControlOOoTransformerContext::CreateChi void XMLControlOOoTransformerContext::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } void XMLControlOOoTransformerContext::Characters( const OUString& rChars ) diff --git a/xmloff/source/transform/EventOOoTContext.cxx b/xmloff/source/transform/EventOOoTContext.cxx index 42cc1ab93ab0..264bc12d4206 100644 --- a/xmloff/source/transform/EventOOoTContext.cxx +++ b/xmloff/source/transform/EventOOoTContext.cxx @@ -209,8 +209,7 @@ void XMLEventOOoTransformerContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().GetDocHandler()->startElement( GetExportQName(), - xAttrList ); + GetTransformer().startFastElement( GetExportQName(), xAttrList ); } void XMLEventOOoTransformerContext::EndElement() @@ -218,7 +217,7 @@ void XMLEventOOoTransformerContext::EndElement() if( m_bPersistent ) XMLPersElemContentTContext::EndElement(); else - GetTransformer().GetDocHandler()->endElement( GetExportQName() ); + GetTransformer().endFastElement( GetExportQName() ); } rtl::Reference XMLEventOOoTransformerContext::CreateChildContext( diff --git a/xmloff/source/transform/FormPropOASISTContext.cxx b/xmloff/source/transform/FormPropOASISTContext.cxx index 2e68b23134a1..ab46e81e0010 100644 --- a/xmloff/source/transform/FormPropOASISTContext.cxx +++ b/xmloff/source/transform/FormPropOASISTContext.cxx @@ -196,10 +196,10 @@ void XMLFormPropOASISTransformerContext::StartElement( OUString aValueElemQName( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_FORM, GetXMLToken( XML_PROPERTY_VALUE ) ) ); - GetTransformer().GetDocHandler()->startElement( aValueElemQName, + GetTransformer().startFastElement( aValueElemQName, xAttrList ); GetTransformer().GetDocHandler()->characters( aValue ); - GetTransformer().GetDocHandler()->endElement( aValueElemQName ); + GetTransformer().endFastElement( aValueElemQName ); } } diff --git a/xmloff/source/transform/FormPropOOoTContext.cxx b/xmloff/source/transform/FormPropOOoTContext.cxx index 61ac2825e4d2..b590d067db43 100644 --- a/xmloff/source/transform/FormPropOOoTContext.cxx +++ b/xmloff/source/transform/FormPropOOoTContext.cxx @@ -243,9 +243,8 @@ void XMLFormPropOOoTransformerContext::EndElement() GetXMLToken( m_eValueTypeToken ) ); } - GetTransformer().GetDocHandler()->startElement( m_aElemQName, - m_xAttrList ); - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().startFastElement( m_aElemQName, m_xAttrList ); + GetTransformer().endFastElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/FrameOASISTContext.cxx b/xmloff/source/transform/FrameOASISTContext.cxx index ca5b1e9c2b94..4ed0d0ac9f01 100644 --- a/xmloff/source/transform/FrameOASISTContext.cxx +++ b/xmloff/source/transform/FrameOASISTContext.cxx @@ -145,8 +145,7 @@ rtl::Reference XMLFrameOASISTransformerContext::CreateChi GetTransformer().ProcessAttrList( m_xAttrList, OASIS_SHAPE_ACTIONS, false ); - GetTransformer().GetDocHandler()->startElement( m_aElemQName, - m_xAttrList ); + GetTransformer().startFastElement( m_aElemQName, m_xAttrList ); } else { @@ -175,7 +174,7 @@ rtl::Reference XMLFrameOASISTransformerContext::CreateChi void XMLFrameOASISTransformerContext::EndElement() { if( !m_bIgnoreElement ) - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } void XMLFrameOASISTransformerContext::Characters( const OUString& rChars ) diff --git a/xmloff/source/transform/FrameOOoTContext.cxx b/xmloff/source/transform/FrameOOoTContext.cxx index 0176964f7711..8c66584d8b26 100644 --- a/xmloff/source/transform/FrameOOoTContext.cxx +++ b/xmloff/source/transform/FrameOOoTContext.cxx @@ -91,7 +91,7 @@ void XMLFrameOOoTransformerContext::StartElement( } } - GetTransformer().GetDocHandler()->startElement( m_aElemQName, + GetTransformer().startFastElement( m_aElemQName, xFrameAttrList ); XMLTransformerContext::StartElement( xAttrList ); } @@ -140,7 +140,7 @@ void XMLFrameOOoTransformerContext::EndElement() { XMLTransformerContext::EndElement(); ExportContent(); - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } void XMLFrameOOoTransformerContext::Characters( const OUString& rChars ) diff --git a/xmloff/source/transform/MetaTContext.cxx b/xmloff/source/transform/MetaTContext.cxx index 0e4969ccbfec..e22b51d57f90 100644 --- a/xmloff/source/transform/MetaTContext.cxx +++ b/xmloff/source/transform/MetaTContext.cxx @@ -101,7 +101,7 @@ void XMLMetaTransformerContext::EndElement() Reference< XAttributeList > xAttrList = new XMLMutableAttributeList; - GetTransformer().GetDocHandler()->startElement( aKeywordsQName, + GetTransformer().startFastElement( aKeywordsQName, xAttrList ); } @@ -115,12 +115,12 @@ void XMLMetaTransformerContext::EndElement() } if( XML_KEYWORD == *pToken ) - GetTransformer().GetDocHandler()->endElement( aKeywordsQName ); + GetTransformer().endFastElement( aKeywordsQName ); } pToken++; } - GetTransformer().GetDocHandler()->endElement( GetQName() ); + GetTransformer().endFastElement( GetQName() ); } void XMLMetaTransformerContext::Characters( const OUString& ) diff --git a/xmloff/source/transform/NotesTContext.cxx b/xmloff/source/transform/NotesTContext.cxx index bef8abcd8e40..b28115f01acf 100644 --- a/xmloff/source/transform/NotesTContext.cxx +++ b/xmloff/source/transform/NotesTContext.cxx @@ -137,7 +137,7 @@ void XMLNotesTransformerContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().GetDocHandler()->startElement( GetExportQName(), + GetTransformer().startFastElement( GetExportQName(), xAttrList ); } @@ -149,7 +149,7 @@ void XMLNotesTransformerContext::EndElement() } else { - GetTransformer().GetDocHandler()->endElement( GetExportQName() ); + GetTransformer().endFastElement( GetExportQName() ); } } diff --git a/xmloff/source/transform/OOo2Oasis.cxx b/xmloff/source/transform/OOo2Oasis.cxx index c6cc7c421cb9..e5e188eb13a8 100644 --- a/xmloff/source/transform/OOo2Oasis.cxx +++ b/xmloff/source/transform/OOo2Oasis.cxx @@ -1213,12 +1213,12 @@ void XMLDocumentTransformerContext_Impl::StartElement( XML_NAMESPACE_SVG ) ); } - GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); + GetTransformer().startFastElement( m_aElemQName, xAttrList ); } void XMLDocumentTransformerContext_Impl::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); GetTransformer().SetClass( m_aOldClass ); } @@ -1267,13 +1267,13 @@ void XMLBodyTransformerContext_Impl::StartElement( m_aClassQName = GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, aClass ); - GetTransformer().GetDocHandler()->startElement( m_aClassQName, + GetTransformer().startFastElement( m_aClassQName, xAttrList ); } void XMLBodyTransformerContext_Impl::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aClassQName ); + GetTransformer().endFastElement( m_aClassQName ); XMLTransformerContext::EndElement(); } @@ -1483,12 +1483,12 @@ void XMLTableOOoTransformerContext_Impl::StartElement( } } - GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); + GetTransformer().startFastElement( m_aElemQName, xAttrList ); } void XMLTableOOoTransformerContext_Impl::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } XMLTransformerContext *OOo2OasisTransformer::CreateUserDefinedContext( diff --git a/xmloff/source/transform/Oasis2OOo.cxx b/xmloff/source/transform/Oasis2OOo.cxx index 257f1997f5e9..e90126430594 100644 --- a/xmloff/source/transform/Oasis2OOo.cxx +++ b/xmloff/source/transform/Oasis2OOo.cxx @@ -1226,12 +1226,12 @@ void XMLTableTransformerContext_Impl::StartElement( } } - GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); + GetTransformer().startFastElement( m_aElemQName, xAttrList ); } void XMLTableTransformerContext_Impl::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } class XMLBodyOASISTransformerContext_Impl : public XMLTransformerContext diff --git a/xmloff/source/transform/PersAttrListTContext.cxx b/xmloff/source/transform/PersAttrListTContext.cxx index c604a095cc21..f021af64ed95 100644 --- a/xmloff/source/transform/PersAttrListTContext.cxx +++ b/xmloff/source/transform/PersAttrListTContext.cxx @@ -161,9 +161,9 @@ bool XMLPersAttrListTContext::IsPersistent() const void XMLPersAttrListTContext::Export() { - GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList ); + GetTransformer().startFastElement( m_aElemQName, m_xAttrList ); ExportContent(); - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } void XMLPersAttrListTContext::ExportContent() diff --git a/xmloff/source/transform/ProcAddAttrTContext.cxx b/xmloff/source/transform/ProcAddAttrTContext.cxx index 2adf278b1bec..821ccd9db63c 100644 --- a/xmloff/source/transform/ProcAddAttrTContext.cxx +++ b/xmloff/source/transform/ProcAddAttrTContext.cxx @@ -60,7 +60,7 @@ void XMLProcAddAttrTransformerContext::StartElement( xAttrList = pMutableAttrList; } pMutableAttrList->AddAttribute( m_aAttrQName, m_aAttrValue ); - GetTransformer().GetDocHandler()->startElement( GetElemQName(), xAttrList ); + GetTransformer().startFastElement( GetElemQName(), xAttrList ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/ProcAttrTContext.cxx b/xmloff/source/transform/ProcAttrTContext.cxx index 4f142b3dadf1..0af4e4c63dad 100644 --- a/xmloff/source/transform/ProcAttrTContext.cxx +++ b/xmloff/source/transform/ProcAttrTContext.cxx @@ -56,12 +56,12 @@ void XMLProcAttrTransformerContext::StartElement( { Reference< XAttributeList > xAttrList( rAttrList ); GetTransformer().ProcessAttrList( xAttrList, m_nActionMap, false ); - GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); + GetTransformer().startFastElement( m_aElemQName, xAttrList ); } void XMLProcAttrTransformerContext::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/RenameElemTContext.cxx b/xmloff/source/transform/RenameElemTContext.cxx index 6816d66d6a50..81ea2daa4096 100644 --- a/xmloff/source/transform/RenameElemTContext.cxx +++ b/xmloff/source/transform/RenameElemTContext.cxx @@ -69,12 +69,12 @@ void XMLRenameElemTransformerContext::StartElement( xAttrList = pMutableAttrList; pMutableAttrList->AddAttribute( m_aAttrQName, m_aAttrValue ); } - GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); + GetTransformer().startFastElement( m_aElemQName, xAttrList ); } void XMLRenameElemTransformerContext::EndElement() { - GetTransformer().GetDocHandler()->endElement( m_aElemQName ); + GetTransformer().endFastElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/StyleOASISTContext.cxx b/xmloff/source/transform/StyleOASISTContext.cxx index 38a3d43ecb35..6018aa546c93 100644 --- a/xmloff/source/transform/StyleOASISTContext.cxx +++ b/xmloff/source/transform/StyleOASISTContext.cxx @@ -609,10 +609,9 @@ void XMLPropertiesTContext_Impl::StartElement( void XMLPropertiesTContext_Impl::Export() { - GetTransformer().GetDocHandler()->startElement( GetExportQName(), - m_xAttrList ); + GetTransformer().startFastElement( GetExportQName(), m_xAttrList ); ExportContent(); - GetTransformer().GetDocHandler()->endElement( GetExportQName() ); + GetTransformer().endFastElement( GetExportQName() ); } XMLPropType XMLPropertiesTContext_Impl::GetPropType( const OUString& rLocalName ) @@ -896,8 +895,7 @@ void XMLStyleOASISTContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().GetDocHandler()->startElement( GetExportQName(), - xAttrList ); + GetTransformer().startFastElement( GetExportQName(), xAttrList ); } void XMLStyleOASISTContext::EndElement() @@ -914,7 +912,7 @@ void XMLStyleOASISTContext::EndElement() m_xPropContext->Export(); m_xPropContext = nullptr; } - GetTransformer().GetDocHandler()->endElement( GetExportQName() ); + GetTransformer().endFastElement( GetExportQName() ); } } diff --git a/xmloff/source/transform/StyleOOoTContext.cxx b/xmloff/source/transform/StyleOOoTContext.cxx index bf841ca478fb..077e7b0a84c9 100644 --- a/xmloff/source/transform/StyleOOoTContext.cxx +++ b/xmloff/source/transform/StyleOOoTContext.cxx @@ -197,9 +197,9 @@ void XMLTypedPropertiesOOoTContext_Impl::Export() { if( m_xAttrList->getLength() || HasElementContent() ) { - GetTransformer().GetDocHandler()->startElement( GetQName(), m_xAttrList ); + GetTransformer().startFastElement( GetQName(), m_xAttrList ); ExportContent(); - GetTransformer().GetDocHandler()->endElement( GetQName() ); + GetTransformer().endFastElement( GetQName() ); } } @@ -1254,8 +1254,7 @@ void XMLStyleOOoTContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().GetDocHandler()->startElement( GetExportQName(), - xAttrList ); + GetTransformer().startFastElement( GetExportQName(), xAttrList ); } void XMLStyleOOoTContext::EndElement() @@ -1263,7 +1262,7 @@ void XMLStyleOOoTContext::EndElement() if( m_bPersistent ) XMLPersElemContentTContext::EndElement(); else - GetTransformer().GetDocHandler()->endElement( GetExportQName() ); + GetTransformer().endFastElement( GetExportQName() ); } void XMLStyleOOoTContext::Characters( const OUString& ) diff --git a/xmloff/source/transform/TransformerBase.cxx b/xmloff/source/transform/TransformerBase.cxx index f577072689d3..08c4a21d00e5 100644 --- a/xmloff/source/transform/TransformerBase.cxx +++ b/xmloff/source/transform/TransformerBase.cxx @@ -40,6 +40,7 @@ #include "TransformerTokenMap.hxx" #include "TransformerBase.hxx" +#include using namespace ::osl; using namespace ::xmloff::token; @@ -184,10 +185,13 @@ XMLTransformerActions *XMLTransformerBase::GetUserDefinedActions( sal_uInt16 ) XMLTransformerBase::XMLTransformerBase( XMLTransformerActionInit *pInit, ::xmloff::token::XMLTokenEnum *pTKMapInit ) throw () : + m_xTokenHandler( new FastTokenHandler() ), m_pNamespaceMap( new SvXMLNamespaceMap ), m_pReplaceNamespaceMap( new SvXMLNamespaceMap ), m_pElemActions( new XMLTransformerActions( pInit ) ), - m_pTokenMap( new XMLTransformerTokenMap( pTKMapInit ) ) + m_pTokenMap( new XMLTransformerTokenMap( pTKMapInit ) ), + m_xFastAttributes( new sax_fastparser::FastAttributeList( m_xTokenHandler.get(), + dynamic_cast< sax_fastparser::FastTokenHandlerBase *>( m_xTokenHandler.get() ) ) ) { GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK ); GetNamespaceMap().Add( GetXMLToken(XML_NP_DC), GetXMLToken(XML_N_DC), XML_NAMESPACE_DC ); @@ -429,7 +433,12 @@ void SAL_CALL XMLTransformerBase::initialize( const Sequence< Any >& aArguments // document handler if( cppu::UnoType::get().isAssignableFrom( pAny->getValueType() ) ) + { m_xHandler.set( *pAny, UNO_QUERY ); + m_xFastHandler.set( m_xHandler.get(), UNO_QUERY ); + if ( (dynamic_cast< SvXMLImport* >( m_xFastHandler.get() ) ) ) + m_xNamespaceHandler = (dynamic_cast< SvXMLImport* >( m_xFastHandler.get() ) )->getNamespaceHandler(); + } // property set to transport data across if( cppu::UnoType::get().isAssignableFrom( pAny->getValueType() ) ) @@ -1455,4 +1464,50 @@ bool XMLTransformerBase::isWriter() const xSI->supportsService("com.sun.star.text.GlobalDocument") ); } +void XMLTransformerBase::startFastElement( const OUString& rName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList ) +{ + if( m_xFastHandler.is() ) + { + OUString aLocalName; + sal_uInt16 nPrefix = m_pNamespaceMap->GetKeyByAttrName( rName, &aLocalName ); + nElement = NAMESPACE_TOKEN( nPrefix ) | m_xTokenHandler->getTokenDirect( + OUStringToOString( aLocalName, RTL_TEXTENCODING_ASCII_US ).getStr(), aLocalName.getLength() ) ; + m_xFastAttributes->clear(); + + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for( sal_Int16 i=0; i < nAttrCount; i++ ) + { + OUString aLocalAttrName; + const OUString& rAttrName = xAttrList->getNameByIndex( i ); + const OUString& rAttrValue = xAttrList->getValueByIndex( i ); + sal_uInt16 nAttrPrefix = m_pNamespaceMap->GetKeyByAttrName( rAttrName, &aLocalAttrName ); + if( XML_NAMESPACE_XMLNS == nAttrPrefix ) + { + if ( m_xNamespaceHandler.is() ) + m_xNamespaceHandler->registerNamespace( aLocalAttrName, rAttrValue ); + } + else + { + sal_Int32 nAttr = NAMESPACE_TOKEN( nAttrPrefix ) | m_xTokenHandler->getTokenDirect( + OUStringToOString( aLocalAttrName, RTL_TEXTENCODING_ASCII_US ).getStr(), aLocalAttrName.getLength() ) ; + m_xFastAttributes->add( nAttr, OUStringToOString( rAttrValue, RTL_TEXTENCODING_ASCII_US ).getStr() ); + } + } + m_xFastHandler->startFastElement( nElement, m_xFastAttributes.get() ); + } + else + m_xHandler->startElement( rName, xAttrList ); +} + +void XMLTransformerBase::endFastElement( const OUString& rName ) +{ + if( m_xFastHandler.is() ) + m_xFastHandler->endFastElement( nElement ); + else + m_xHandler->endElement( rName ); +} + + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/TransformerBase.hxx b/xmloff/source/transform/TransformerBase.hxx index a22fa7379c2c..2dbb32a74950 100644 --- a/xmloff/source/transform/TransformerBase.hxx +++ b/xmloff/source/transform/TransformerBase.hxx @@ -27,13 +27,17 @@ #include #include #include +#include +#include #include #include #include #include #include +#include #include "Transformer.hxx" +#include namespace com { namespace sun { namespace star { namespace i18n { class XCharacterClassification; } @@ -56,8 +60,11 @@ class XMLTransformerBase : public XMLTransformer css::uno::Reference< css::xml::sax::XLocator > m_xLocator; css::uno::Reference< css::xml::sax::XDocumentHandler > m_xHandler; // the handlers css::uno::Reference< css::xml::sax::XExtendedDocumentHandler > m_xExtHandler; + css::uno::Reference< css::xml::sax::XFastDocumentHandler > m_xFastHandler; css::uno::Reference< css::beans::XPropertySet > m_xPropSet; css::uno::Reference< css::i18n::XCharacterClassification > xCharClass; + rtl::Reference< xmloff::token::FastTokenHandler > m_xTokenHandler; + css::uno::Reference< css::xml::sax::XFastNamespaceHandler > m_xNamespaceHandler; OUString m_aExtPathPrefix; OUString m_aClass; @@ -68,6 +75,10 @@ class XMLTransformerBase : public XMLTransformer XMLTransformerActions *m_pElemActions; XMLTransformerTokenMap *m_pTokenMap; + //for feeding FastDocumentHandler + sal_Int32 nElement; + rtl::Reference< sax_fastparser::FastAttributeList > m_xFastAttributes; + protected: css::uno::Reference< css::frame::XModel > mxModel; @@ -187,6 +198,10 @@ public: bool isWriter() const; + void startFastElement( const OUString& rName, + const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ); + void endFastElement( const OUString& rName ); + }; #endif // INCLUDED_XMLOFF_SOURCE_TRANSFORM_TRANSFORMERBASE_HXX diff --git a/xmloff/source/transform/TransformerContext.cxx b/xmloff/source/transform/TransformerContext.cxx index 7181c2a1af11..5ff0d94f4fc1 100644 --- a/xmloff/source/transform/TransformerContext.cxx +++ b/xmloff/source/transform/TransformerContext.cxx @@ -62,12 +62,12 @@ rtl::Reference XMLTransformerContext::CreateChildContext( void XMLTransformerContext::StartElement( const Reference< XAttributeList >& rAttrList ) { - m_rTransformer.GetDocHandler()->startElement( m_aQName, rAttrList ); + m_rTransformer.startFastElement( m_aQName, rAttrList ); } void XMLTransformerContext::EndElement() { - m_rTransformer.GetDocHandler()->endElement( m_aQName ); + GetTransformer().endFastElement( m_aQName ); } void XMLTransformerContext::Characters( const OUString& rChars ) -- cgit