From 607935650fab97092c960df54830e20b4f6b93a7 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Sun, 22 Nov 2020 20:00:54 +0200 Subject: fastparser in SwXMLTableContext Change-Id: I52ea773993a19384c5a7ad3eb95b518446ea5e96 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106360 Tested-by: Jenkins Reviewed-by: Noel Grandin --- sw/source/filter/xml/xmltbli.cxx | 245 +++++++++++++++++--------------------- sw/source/filter/xml/xmltbli.hxx | 10 +- sw/source/filter/xml/xmltexti.cxx | 5 +- 3 files changed, 119 insertions(+), 141 deletions(-) (limited to 'sw/source/filter/xml') diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx index 560e568c5f8e..e3061074329d 100644 --- a/sw/source/filter/xml/xmltbli.cxx +++ b/sw/source/filter/xml/xmltbli.cxx @@ -413,8 +413,8 @@ class SwXMLTableCellContext_Impl : public SvXMLImportContext public: SwXMLTableCellContext_Impl( - SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, - const Reference< xml::sax::XAttributeList > & xAttrList, + SwXMLImport& rImport, sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList, SwXMLTableContext *pTable ); virtual SvXMLImportContextRef CreateChildContext( @@ -428,10 +428,10 @@ public: } SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl( - SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, - const Reference< xml::sax::XAttributeList > & xAttrList, + SwXMLImport& rImport, sal_Int32 /*nElement*/, + const Reference< xml::sax::XFastAttributeList > & xAttrList, SwXMLTableContext *pTable ) : - SvXMLImportContext( rImport, nPrfx, rLName ), + SvXMLImportContext( rImport ), m_sFormula(), m_xMyTable( pTable ), m_fValue( 0.0 ), @@ -446,115 +446,107 @@ SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl( m_bHasTableContent( false ) { m_sSaveParaDefault = GetImport().GetTextImport()->GetCellParaStyleDefault(); - 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; - const sal_uInt16 nPrefix = - GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, - &aLocalName ); - const OUString& rValue = xAttrList->getValueByIndex( i ); - const SvXMLTokenMap& rTokenMap = - GetSwImport().GetTableCellAttrTokenMap(); - switch( rTokenMap.Get( nPrefix, aLocalName ) ) + const OUString sValue = aIter.toString(); + switch( aIter.getToken() ) { - case XML_TOK_TABLE_STYLE_NAME: - m_aStyleName = rValue; - GetImport().GetTextImport()->SetCellParaStyleDefault(rValue); + case XML_ELEMENT(TABLE, XML_STYLE_NAME): + m_aStyleName = sValue; + GetImport().GetTextImport()->SetCellParaStyleDefault(sValue); break; - case XML_TOK_TABLE_NUM_COLS_SPANNED: - m_nColSpan = static_cast(std::max(1, rValue.toInt32())); + case XML_ELEMENT(TABLE, XML_NUMBER_COLUMNS_SPANNED): + m_nColSpan = static_cast(std::max(1, sValue.toInt32())); if (m_nColSpan > 256) { SAL_INFO("sw.xml", "ignoring huge table:number-columns-spanned " << m_nColSpan); m_nColSpan = 1; } break; - case XML_TOK_TABLE_NUM_ROWS_SPANNED: - m_nRowSpan = static_cast(std::max(1, rValue.toInt32())); + case XML_ELEMENT(TABLE, XML_NUMBER_ROWS_SPANNED): + m_nRowSpan = static_cast(std::max(1, sValue.toInt32())); if (m_nRowSpan > 8192 || (m_nRowSpan > 256 && utl::ConfigManager::IsFuzzing())) { SAL_INFO("sw.xml", "ignoring huge table:number-rows-spanned " << m_nRowSpan); m_nRowSpan = 1; } break; - case XML_TOK_TABLE_NUM_COLS_REPEATED: - m_nColRepeat = static_cast(std::max(1, rValue.toInt32())); + case XML_ELEMENT(TABLE, XML_NUMBER_COLUMNS_REPEATED): + m_nColRepeat = static_cast(std::max(1, sValue.toInt32())); if (m_nColRepeat > 256) { SAL_INFO("sw.xml", "ignoring huge table:number-columns-repeated " << m_nColRepeat); m_nColRepeat = 1; } break; - case XML_TOK_TABLE_FORMULA: + case XML_ELEMENT(TABLE, XML_FORMULA): { OUString sTmp; const sal_uInt16 nPrefix2 = GetImport().GetNamespaceMap(). - GetKeyByAttrValueQName(rValue, &sTmp); - m_sFormula = XML_NAMESPACE_OOOW == nPrefix2 ? sTmp : rValue; + GetKeyByAttrValueQName(sValue, &sTmp); + m_sFormula = XML_NAMESPACE_OOOW == nPrefix2 ? sTmp : sValue; } break; - case XML_TOK_TABLE_VALUE: + case XML_ELEMENT(OFFICE, XML_VALUE): { double fTmp; - if (::sax::Converter::convertDouble(fTmp, rValue)) + if (::sax::Converter::convertDouble(fTmp, sValue)) { m_fValue = fTmp; m_bHasValue = true; } } break; - case XML_TOK_TABLE_TIME_VALUE: + case XML_ELEMENT(OFFICE, XML_TIME_VALUE): { double fTmp; - if (::sax::Converter::convertDuration(fTmp, rValue)) + if (::sax::Converter::convertDuration(fTmp, sValue)) { m_fValue = fTmp; m_bHasValue = true; } } break; - case XML_TOK_TABLE_DATE_VALUE: + case XML_ELEMENT(OFFICE, XML_DATE_VALUE): { double fTmp; if (GetImport().GetMM100UnitConverter().convertDateTime(fTmp, - rValue)) + sValue)) { m_fValue = fTmp; m_bHasValue = true; } } break; - case XML_TOK_TABLE_BOOLEAN_VALUE: + case XML_ELEMENT(OFFICE, XML_BOOLEAN_VALUE): { bool bTmp(false); - if (::sax::Converter::convertBool(bTmp, rValue)) + if (::sax::Converter::convertBool(bTmp, sValue)) { m_fValue = (bTmp ? 1.0 : 0.0); m_bHasValue = true; } } break; - case XML_TOK_TABLE_PROTECTED: + case XML_ELEMENT(TABLE, XML_PROTECT): // for backwards compatibility with SRC629 (and before) + case XML_ELEMENT(TABLE, XML_PROTECTED): { bool bTmp(false); - if (::sax::Converter::convertBool(bTmp, rValue)) + if (::sax::Converter::convertBool(bTmp, sValue)) { m_bProtect = bTmp; } } break; - case XML_TOK_TABLE_STRING_VALUE: + case XML_ELEMENT(OFFICE, XML_STRING_VALUE): { - m_StringValue = rValue; + m_StringValue = sValue; m_bHasStringValue = true; } break; - case XML_TOK_TABLE_VALUE_TYPE: + case XML_ELEMENT(OFFICE, XML_VALUE_TYPE): { - if ("string" == rValue) + if ("string" == sValue) { m_bValueTypeIsString = true; } @@ -563,6 +555,8 @@ SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl( // but we've been reading those without checking forever. } break; + default: + SAL_WARN("sw", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aIter.toString()); } } } @@ -627,8 +621,7 @@ SvXMLImportContextRef SwXMLTableCellContext_Impl::CreateChildContext( if( !HasContent() ) { SwXMLTableContext *pTableContext = - new SwXMLTableContext( GetSwImport(), nPrefix, rLocalName, - GetTable() ); + new SwXMLTableContext( GetSwImport(), GetTable() ); pContext = pTableContext; if( GetTable()->IsValid() ) InsertContent( pTableContext ); @@ -861,13 +854,12 @@ class SwXMLTableRowContext_Impl : public SvXMLImportContext public: SwXMLTableRowContext_Impl( - SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, - const Reference< xml::sax::XAttributeList > & xAttrList, + SwXMLImport& rImport, sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList, SwXMLTableContext *pTable, bool bInHead=false ); - virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, - const OUString& rLocalName, - const Reference< xml::sax::XAttributeList > & xAttrList ) override; + virtual css::uno::Reference SAL_CALL createFastChildContext( sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList ) override; virtual void SAL_CALL endFastElement(sal_Int32 nElement) override; @@ -877,52 +869,43 @@ public: } SwXMLTableRowContext_Impl::SwXMLTableRowContext_Impl( SwXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLName, - const Reference< xml::sax::XAttributeList > & xAttrList, + sal_Int32 /*nElement*/, + const Reference< xml::sax::XFastAttributeList > & xAttrList, SwXMLTableContext *pTable, bool bInHead ) : - SvXMLImportContext( rImport, nPrfx, rLName ), + SvXMLImportContext( rImport ), xMyTable( pTable ), nRowRepeat( 1 ) { OUString aStyleName, aDfltCellStyleName; OUString sXmlId; - 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; - const sal_uInt16 nPrefix = - GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, - &aLocalName ); - const OUString& rValue = xAttrList->getValueByIndex( i ); - if( XML_NAMESPACE_TABLE == nPrefix ) + const OUString sValue = aIter.toString(); + switch(aIter.getToken()) { - if( IsXMLToken( aLocalName, XML_STYLE_NAME ) ) - { - aStyleName = rValue; - } - else if( IsXMLToken( aLocalName, XML_NUMBER_ROWS_REPEATED ) ) + case XML_ELEMENT(TABLE, XML_STYLE_NAME): + aStyleName = sValue; + break; + case XML_ELEMENT(STYLE, XML_NUMBER_ROWS_REPEATED): { - nRowRepeat = static_cast(std::max(1, rValue.toInt32())); + nRowRepeat = static_cast(std::max(1, sValue.toInt32())); if (nRowRepeat > 8192 || (nRowRepeat > 256 && utl::ConfigManager::IsFuzzing())) { SAL_INFO("sw.xml", "ignoring huge table:number-rows-repeated " << nRowRepeat); nRowRepeat = 1; } + break; } - else if( IsXMLToken( aLocalName, XML_DEFAULT_CELL_STYLE_NAME ) ) - { - aDfltCellStyleName = rValue; - } - } - else if ( (XML_NAMESPACE_XML == nPrefix) && - IsXMLToken( aLocalName, XML_ID ) ) - { - sXmlId = rValue; + case XML_ELEMENT(STYLE, XML_DEFAULT_CELL_STYLE_NAME): + aDfltCellStyleName = sValue; + break; + case XML_ELEMENT(XML, XML_ID): + sXmlId = sValue; + break; + default: + SAL_WARN("sw", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << sValue); } } if( GetTable()->IsValid() ) @@ -940,27 +923,25 @@ void SwXMLTableRowContext_Impl::endFastElement(sal_Int32 ) } } -SvXMLImportContextRef SwXMLTableRowContext_Impl::CreateChildContext( - sal_uInt16 nPrefix, const OUString& rLocalName, - const Reference< xml::sax::XAttributeList > & xAttrList ) +css::uno::Reference SwXMLTableRowContext_Impl::createFastChildContext( + sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList ) { SvXMLImportContext *pContext = nullptr; - if( XML_NAMESPACE_TABLE == nPrefix || XML_NAMESPACE_LO_EXT == nPrefix ) + if( nElement == XML_ELEMENT(TABLE, XML_TABLE_CELL) || + nElement == XML_ELEMENT(LO_EXT, XML_TABLE_CELL) ) { - if( IsXMLToken( rLocalName, XML_TABLE_CELL ) ) - { - if( !GetTable()->IsValid() || GetTable()->IsInsertCellPossible() ) - pContext = new SwXMLTableCellContext_Impl( GetSwImport(), - nPrefix, - rLocalName, + if( !GetTable()->IsValid() || GetTable()->IsInsertCellPossible() ) + pContext = new SwXMLTableCellContext_Impl( GetSwImport(), nElement, xAttrList, GetTable() ); - } - else if( IsXMLToken( rLocalName, XML_COVERED_TABLE_CELL ) ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, - rLocalName ); } + else if( nElement == XML_ELEMENT(TABLE, XML_COVERED_TABLE_CELL) || + nElement == XML_ELEMENT(LO_EXT, XML_COVERED_TABLE_CELL) ) + pContext = new SvXMLImportContext( GetImport() ); + else + SAL_WARN("sw", "unknown element " << SvXMLImport::getPrefixAndNameFromToken(nElement)); return pContext; } @@ -977,14 +958,13 @@ class SwXMLTableRowsContext_Impl : public SvXMLImportContext public: - SwXMLTableRowsContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx, - const OUString& rLName, + SwXMLTableRowsContext_Impl( SwXMLImport& rImport, SwXMLTableContext *pTable, bool bHead ); - virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, - const OUString& rLocalName, - const Reference< xml::sax::XAttributeList > & xAttrList ) override; + virtual css::uno::Reference SAL_CALL createFastChildContext( + sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList ) override; SwXMLImport& GetSwImport() { return static_cast(GetImport()); } }; @@ -992,32 +972,26 @@ public: } SwXMLTableRowsContext_Impl::SwXMLTableRowsContext_Impl( SwXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLName, SwXMLTableContext *pTable, bool bHead ) : - SvXMLImportContext( rImport, nPrfx, rLName ), + SvXMLImportContext( rImport ), xMyTable( pTable ), bHeader( bHead ) { } -SvXMLImportContextRef SwXMLTableRowsContext_Impl::CreateChildContext( - sal_uInt16 nPrefix, - const OUString& rLocalName, - const Reference< xml::sax::XAttributeList > & xAttrList ) +css::uno::Reference SwXMLTableRowsContext_Impl::createFastChildContext( + sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList ) { - SvXMLImportContext *pContext = nullptr; - - if( XML_NAMESPACE_TABLE == nPrefix && - IsXMLToken( rLocalName, XML_TABLE_ROW ) && + if( nElement== XML_ELEMENT(TABLE, XML_TABLE_ROW ) && GetTable()->IsInsertRowPossible() ) - pContext = new SwXMLTableRowContext_Impl( GetSwImport(), nPrefix, - rLocalName, xAttrList, + return new SwXMLTableRowContext_Impl( GetSwImport(), nElement, + xAttrList, GetTable(), bHeader ); - - return pContext; + SAL_WARN("sw", "unknown element " << SvXMLImport::getPrefixAndNameFromToken(nElement)); + return nullptr; } class SwXMLDDETableContext_Impl : public SvXMLImportContext @@ -1223,10 +1197,8 @@ SwXMLTableCell_Impl *SwXMLTableContext::GetCell( sal_uInt32 nRow, SwXMLTableContext::SwXMLTableContext( SwXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList ) : - XMLTextTableContext( rImport, nPrfx, rLName ), + XMLTextTableContext( rImport ), m_pRows( new SwXMLTableRows_Impl ), m_pTableNode( nullptr ), m_pBox1( nullptr ), @@ -1362,10 +1334,8 @@ SwXMLTableContext::SwXMLTableContext( SwXMLImport& rImport, } SwXMLTableContext::SwXMLTableContext( SwXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLName, SwXMLTableContext *pTable ) : - XMLTextTableContext( rImport, nPrfx, rLName ), + XMLTextTableContext( rImport ), m_pRows( new SwXMLTableRows_Impl ), m_pTableNode( pTable->m_pTableNode ), m_pBox1( nullptr ), @@ -1396,6 +1366,28 @@ SwXMLTableContext::~SwXMLTableContext() GetImport().GetTextImport()->RedlineAdjustStartNodeCursor(); } +css::uno::Reference SwXMLTableContext::createFastChildContext( + sal_Int32 nElement, + const Reference< xml::sax::XFastAttributeList > & xAttrList ) +{ + bool bHeader = false; + switch (nElement) + { + case XML_ELEMENT(TABLE, XML_TABLE_ROW): + case XML_ELEMENT(LO_EXT, XML_TABLE_ROW): + if( IsInsertRowPossible() ) + return new SwXMLTableRowContext_Impl( GetSwImport(), nElement, xAttrList, this ); + break; + case XML_ELEMENT(TABLE, XML_TABLE_HEADER_ROWS): + bHeader = true; + [[fallthrough]]; + case XML_ELEMENT(TABLE, XML_TABLE_ROWS): + return new SwXMLTableRowsContext_Impl( GetSwImport(), this, bHeader ); + break; + } + return nullptr; +} + SvXMLImportContextRef SwXMLTableContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) @@ -1403,7 +1395,6 @@ SvXMLImportContextRef SwXMLTableContext::CreateChildContext( sal_uInt16 nPrefix, SvXMLImportContext *pContext = nullptr; const SvXMLTokenMap& rTokenMap = GetSwImport().GetTableElemTokenMap(); - bool bHeader = false; switch( rTokenMap.Get( nPrefix, rLocalName ) ) { case XML_TOK_TABLE_HEADER_COLS: @@ -1419,20 +1410,6 @@ SvXMLImportContextRef SwXMLTableContext::CreateChildContext( sal_uInt16 nPrefix, rLocalName, xAttrList, this ); break; - case XML_TOK_TABLE_HEADER_ROWS: - bHeader = true; - [[fallthrough]]; - case XML_TOK_TABLE_ROWS: - pContext = new SwXMLTableRowsContext_Impl( GetSwImport(), nPrefix, - rLocalName, - this, bHeader ); - break; - case XML_TOK_TABLE_ROW: - if( IsInsertRowPossible() ) - pContext = new SwXMLTableRowContext_Impl( GetSwImport(), nPrefix, - rLocalName, xAttrList, - this ); - break; case XML_TOK_OFFICE_DDE_SOURCE: // save context for later processing (discard old context, if approp.) if( IsValid() ) diff --git a/sw/source/filter/xml/xmltbli.hxx b/sw/source/filter/xml/xmltbli.hxx index 9dfaf06f1d74..31ca7e1ebb3a 100644 --- a/sw/source/filter/xml/xmltbli.hxx +++ b/sw/source/filter/xml/xmltbli.hxx @@ -136,15 +136,17 @@ class SwXMLTableContext : public XMLTextTableContext public: - SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx, - const OUString& rLName, + SwXMLTableContext( SwXMLImport& rImport, const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList ); - SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx, - const OUString& rLName, + SwXMLTableContext( SwXMLImport& rImport, SwXMLTableContext *pTable ); virtual ~SwXMLTableContext() override; + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( + sal_Int32 Element, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override; + virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList ) override; diff --git a/sw/source/filter/xml/xmltexti.cxx b/sw/source/filter/xml/xmltexti.cxx index cf0c7e6a85ba..13efb045f7b6 100644 --- a/sw/source/filter/xml/xmltexti.cxx +++ b/sw/source/filter/xml/xmltexti.cxx @@ -179,11 +179,10 @@ SwXMLTextImportHelper::~SwXMLTextImportHelper() SvXMLImportContext *SwXMLTextImportHelper::CreateTableChildContext( SvXMLImport& rImport, - sal_uInt16 nPrefix, const OUString& rLocalName, + sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/, const uno::Reference< XAttributeList > & xAttrList ) { - return new SwXMLTableContext( - static_cast(rImport), nPrefix, rLocalName, xAttrList ); + return new SwXMLTableContext( static_cast(rImport), xAttrList ); } bool SwXMLTextImportHelper::IsInHeaderFooter() const -- cgit