diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-01-14 12:04:53 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-01-14 15:49:28 +0100 |
commit | f88dfa135950acdd51d3f9693720507bc35b5a5a (patch) | |
tree | c1d7b30379d6f86566d32aa58170e6bd3a252396 /svx | |
parent | 9a578e9861d930782fd9432e79741d3378a30589 (diff) |
use FastParser APIs in SvxXMLXTableImport
Change-Id: I744943bdcdecc10219898d23038eb5d0c2dfb5d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85479
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/inc/xmlxtimp.hxx | 5 | ||||
-rw-r--r-- | svx/source/xml/xmlxtimp.cxx | 108 |
2 files changed, 67 insertions, 46 deletions
diff --git a/svx/source/inc/xmlxtimp.hxx b/svx/source/inc/xmlxtimp.hxx index 600b32f23adc..e52e8b0178f3 100644 --- a/svx/source/inc/xmlxtimp.hxx +++ b/svx/source/inc/xmlxtimp.hxx @@ -45,9 +45,8 @@ public: const css::uno::Reference< css::container::XNameContainer >& xTable, bool *bOptLoadedFromStorage ) throw(); protected: - virtual SvXMLImportContext *CreateDocumentContext( sal_uInt16 nPrefix, - const OUString& rLocalName, - const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override; + virtual SvXMLImportContext *CreateFastContext( sal_Int32 Element, + const ::css::uno::Reference< ::css::xml::sax::XFastAttributeList >& xAttrList ) override; private: const css::uno::Reference< css::container::XNameContainer > & mrTable; diff --git a/svx/source/xml/xmlxtimp.cxx b/svx/source/xml/xmlxtimp.cxx index 548f3c7009aa..8bd042570309 100644 --- a/svx/source/xml/xmlxtimp.cxx +++ b/svx/source/xml/xmlxtimp.cxx @@ -52,6 +52,7 @@ #include <xmloff/attrlist.hxx> #include <xmlxtimp.hxx> +#include <tools/diagnose_ex.h> #include <cstdio> @@ -72,10 +73,15 @@ enum class SvxXMLTableImportContextEnum { Color, Marker, Dash, Hatch, Gradient, class SvxXMLTableImportContext : public SvXMLImportContext { public: - SvxXMLTableImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, SvxXMLTableImportContextEnum eContext, const uno::Reference< XNameContainer >& xTable, + SvxXMLTableImportContext( SvXMLImport& rImport, SvxXMLTableImportContextEnum eContext, const uno::Reference< XNameContainer >& xTable, bool bOOoFormat ); - virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList ) override; + virtual void SAL_CALL startFastElement( sal_Int32 /*nElement*/, + const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) override {} + + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext(sal_Int32 Element, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override; protected: void importColor( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName ); @@ -93,27 +99,36 @@ private: } -SvxXMLTableImportContext::SvxXMLTableImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, SvxXMLTableImportContextEnum eContext, const uno::Reference< XNameContainer >& xTable, bool bOOoFormat ) -: SvXMLImportContext( rImport, nPrfx, rLName ), mxTable( xTable ), meContext( eContext ), +SvxXMLTableImportContext::SvxXMLTableImportContext( SvXMLImport& rImport, SvxXMLTableImportContextEnum eContext, const uno::Reference< XNameContainer >& xTable, bool bOOoFormat ) +: SvXMLImportContext( rImport ), mxTable( xTable ), meContext( eContext ), mbOOoFormat( bOOoFormat ) { } -SvXMLImportContextRef SvxXMLTableImportContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< XAttributeList >& rAttrList ) +css::uno::Reference< css::xml::sax::XFastContextHandler > + SvxXMLTableImportContext::createFastChildContext(sal_Int32 nElement, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & rAttrList) { - if( XML_NAMESPACE_DRAW == nPrefix ) + sal_Int32 nNamespace = nElement & NMSP_MASK; + if( NAMESPACE_TOKEN(XML_NAMESPACE_DRAW) == nNamespace || + NAMESPACE_TOKEN(XML_NAMESPACE_DRAW_OOO) == nNamespace ) { - uno::Reference< XAttributeList > xAttrList( rAttrList ); + sax_fastparser::FastAttributeList *pFastAttribList = + sax_fastparser::FastAttributeList::castToFastAttributeList( rAttrList ); + SvXMLAttributeList *pAttrList = new SvXMLAttributeList; + for (auto& aIter : *pFastAttribList) + pAttrList->AddAttribute( + SvXMLImport::getNamespacePrefixFromToken(aIter.getToken(), nullptr) + ":" + + GetXMLToken(static_cast<XMLTokenEnum>(aIter.getToken() & TOKEN_MASK)), + aIter.toString()); if( mbOOoFormat && (SvxXMLTableImportContextEnum::Dash == meContext || SvxXMLTableImportContextEnum::Hatch == meContext || SvxXMLTableImportContextEnum::Bitmap == meContext) ) { - SvXMLAttributeList *pAttrList = new SvXMLAttributeList( rAttrList ); - xAttrList = pAttrList; - sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + sal_Int16 nAttrCount = pAttrList->getLength(); for( sal_Int16 i=0; i < nAttrCount; i++ ) { - const OUString& rAttrName = xAttrList->getNameByIndex( i ); + const OUString& rAttrName = pAttrList->getNameByIndex( i ); OUString aLocalName; sal_uInt16 nPrefix_ = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, @@ -122,11 +137,11 @@ SvXMLImportContextRef SvxXMLTableImportContext::CreateChildContext( sal_uInt16 n SvxXMLTableImportContextEnum::Bitmap == meContext && IsXMLToken( aLocalName, XML_HREF ) ) { - const OUString rValue = xAttrList->getValueByIndex( i ); + const OUString rValue = pAttrList->getValueByIndex( i ); if( !rValue.isEmpty() && '#' == rValue[0] ) pAttrList->SetValueByIndex( i, rValue.copy( 1 ) ); } - else if( XML_NAMESPACE_DRAW == nPrefix_ && + else if( (XML_NAMESPACE_DRAW == nPrefix_ || XML_NAMESPACE_DRAW_OOO == nPrefix_) && ( ( SvxXMLTableImportContextEnum::Dash == meContext && (IsXMLToken( aLocalName, XML_DOTS1_LENGTH ) || IsXMLToken( aLocalName, XML_DOTS2_LENGTH ) || @@ -134,7 +149,7 @@ SvXMLImportContextRef SvxXMLTableImportContext::CreateChildContext( sal_uInt16 n ( SvxXMLTableImportContextEnum::Hatch == meContext && IsXMLToken( aLocalName, XML_HATCH_DISTANCE ) ) ) ) { - const OUString rValue = xAttrList->getValueByIndex( i ); + const OUString rValue = pAttrList->getValueByIndex( i ); sal_Int32 nPos = rValue.getLength(); while( nPos && rValue[nPos-1] <= ' ' ) --nPos; @@ -155,22 +170,22 @@ SvXMLImportContextRef SvxXMLTableImportContext::CreateChildContext( sal_uInt16 n switch( meContext ) { case SvxXMLTableImportContextEnum::Color: - importColor( xAttrList, aAny, aName ); + importColor( pAttrList, aAny, aName ); break; case SvxXMLTableImportContextEnum::Marker: - importMarker( xAttrList, aAny, aName ); + importMarker( pAttrList, aAny, aName ); break; case SvxXMLTableImportContextEnum::Dash: - importDash( xAttrList, aAny, aName ); + importDash( pAttrList, aAny, aName ); break; case SvxXMLTableImportContextEnum::Hatch: - importHatch( xAttrList, aAny, aName ); + importHatch( pAttrList, aAny, aName ); break; case SvxXMLTableImportContextEnum::Gradient: - importGradient( xAttrList, aAny, aName ); + importGradient( pAttrList, aAny, aName ); break; case SvxXMLTableImportContextEnum::Bitmap: - importBitmap( xAttrList, aAny, aName ); + importBitmap( pAttrList, aAny, aName ); break; } @@ -188,10 +203,11 @@ SvXMLImportContextRef SvxXMLTableImportContext::CreateChildContext( sal_uInt16 n } catch (const uno::Exception&) { + DBG_UNHANDLED_EXCEPTION("svx"); } + return new SvXMLImportContext( GetImport() ); } - - return new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); + return nullptr; } void SvxXMLTableImportContext::importColor( const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName ) @@ -204,7 +220,7 @@ void SvxXMLTableImportContext::importColor( const uno::Reference< XAttributeList sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rFullAttrName, &aLocalName ); - if( XML_NAMESPACE_DRAW == nPrefix ) + if( XML_NAMESPACE_DRAW == nPrefix || XML_NAMESPACE_DRAW_OOO == nPrefix ) { if( aLocalName == GetXMLToken(XML_NAME) ) { @@ -303,9 +319,12 @@ SvxXMLXTableImport::SvxXMLXTableImport( { SetGraphicStorageHandler(xGraphicStorageHandler); + GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO); + GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE); + GetNamespaceMap().Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW); + GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK); + GetNamespaceMap().Add( "__ooo", GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO ); - GetNamespaceMap().Add( "__office", GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE ); - GetNamespaceMap().Add( "__draw", GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW ); GetNamespaceMap().Add( "__xlink", GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK ); // OOo namespaces for reading OOo 1.1 files @@ -416,45 +435,48 @@ bool SvxXMLXTableImport::load( const OUString &rPath, const OUString &rReferer, return bRet; } -SvXMLImportContext *SvxXMLXTableImport::CreateDocumentContext( - sal_uInt16 const nPrefix, const OUString& rLocalName, - const uno::Reference< XAttributeList >& /*xAttrList*/) +SvXMLImportContext *SvxXMLXTableImport::CreateFastContext( sal_Int32 nElement, + const ::css::uno::Reference< ::css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) { - if( XML_NAMESPACE_OOO == nPrefix || - XML_NAMESPACE_OFFICE == nPrefix ) + sal_Int32 nNamespace = nElement & NMSP_MASK; + if( NAMESPACE_TOKEN(XML_NAMESPACE_OOO) == nNamespace || + NAMESPACE_TOKEN(XML_NAMESPACE_OFFICE) == nNamespace || + NAMESPACE_TOKEN(XML_NAMESPACE_OFFICE_OOO) == nNamespace ) { - bool bOOoFormat = (XML_NAMESPACE_OFFICE == nPrefix); + bool bOOoFormat = (NAMESPACE_TOKEN(XML_NAMESPACE_OFFICE) == nNamespace) || + (NAMESPACE_TOKEN(XML_NAMESPACE_OFFICE_OOO) == nNamespace); Type aType = mrTable->getElementType(); + sal_Int32 nToken = nElement & TOKEN_MASK; - if ( rLocalName == "color-table" ) + if ( nToken == XML_COLOR_TABLE ) { if( aType == ::cppu::UnoType<sal_Int32>::get() ) - return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, SvxXMLTableImportContextEnum::Color, mrTable, bOOoFormat ); + return new SvxXMLTableImportContext( *this, SvxXMLTableImportContextEnum::Color, mrTable, bOOoFormat ); } - else if ( rLocalName == "marker-table" ) + else if ( nToken == XML_MARKER_TABLE ) { if( aType == cppu::UnoType<drawing::PolyPolygonBezierCoords>::get()) - return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, SvxXMLTableImportContextEnum::Marker, mrTable, bOOoFormat ); + return new SvxXMLTableImportContext( *this, SvxXMLTableImportContextEnum::Marker, mrTable, bOOoFormat ); } - else if ( rLocalName == "dash-table" ) + else if ( nToken == XML_DASH_TABLE ) { if( aType == cppu::UnoType<drawing::LineDash>::get()) - return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, SvxXMLTableImportContextEnum::Dash, mrTable, bOOoFormat ); + return new SvxXMLTableImportContext( *this, SvxXMLTableImportContextEnum::Dash, mrTable, bOOoFormat ); } - else if ( rLocalName == "hatch-table" ) + else if ( nToken == XML_HATCH_TABLE ) { if( aType == cppu::UnoType<drawing::Hatch>::get()) - return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, SvxXMLTableImportContextEnum::Hatch, mrTable, bOOoFormat ); + return new SvxXMLTableImportContext( *this, SvxXMLTableImportContextEnum::Hatch, mrTable, bOOoFormat ); } - else if ( rLocalName == "gradient-table" ) + else if ( nToken == XML_GRADIENT_TABLE ) { if( aType == cppu::UnoType<awt::Gradient>::get()) - return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, SvxXMLTableImportContextEnum::Gradient, mrTable, bOOoFormat ); + return new SvxXMLTableImportContext( *this, SvxXMLTableImportContextEnum::Gradient, mrTable, bOOoFormat ); } - else if ( rLocalName == "bitmap-table" ) + else if ( nToken == XML_BITMAP_TABLE ) { if( aType == ::cppu::UnoType<awt::XBitmap>::get()) - return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, SvxXMLTableImportContextEnum::Bitmap, mrTable, bOOoFormat ); + return new SvxXMLTableImportContext( *this, SvxXMLTableImportContextEnum::Bitmap, mrTable, bOOoFormat ); } } |