From 9f9e861c6d168e8318b9cdc761a387b0d650e5c0 Mon Sep 17 00:00:00 2001 From: Mohammed Abdul Azeem Date: Wed, 15 Mar 2017 10:20:06 +0530 Subject: Old-to-new mapping of attributes is moved into a Module: This should make it easy to reuse the mapping code wherever necessary and restores the loading of writerperfect documents. Change-Id: I505bffa47fe37270b0430d9ae5afec5072762b4c Reviewed-on: https://gerrit.libreoffice.org/35263 Tested-by: Jenkins Reviewed-by: David Tardon --- include/xmloff/xmlimp.hxx | 29 ++++++++ writerperfect/source/common/DocumentHandler.cxx | 5 +- xmloff/source/core/xmlimp.cxx | 84 ++++++++++++++++++++++ .../transform/ChartPlotAreaOASISTContext.cxx | 4 +- xmloff/source/transform/ControlOASISTContext.cxx | 4 +- xmloff/source/transform/ControlOOoTContext.cxx | 4 +- xmloff/source/transform/EventOOoTContext.cxx | 4 +- xmloff/source/transform/FormPropOASISTContext.cxx | 4 +- xmloff/source/transform/FormPropOOoTContext.cxx | 4 +- xmloff/source/transform/FrameOASISTContext.cxx | 4 +- 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 | 8 +-- xmloff/source/transform/StyleOOoTContext.cxx | 8 +-- xmloff/source/transform/TransformerBase.cxx | 59 ++------------- xmloff/source/transform/TransformerBase.hxx | 15 ---- xmloff/source/transform/TransformerContext.cxx | 4 +- 24 files changed, 168 insertions(+), 116 deletions(-) diff --git a/include/xmloff/xmlimp.hxx b/include/xmloff/xmlimp.hxx index c53b9c1bebac..72939eaced1f 100644 --- a/include/xmloff/xmlimp.hxx +++ b/include/xmloff/xmlimp.hxx @@ -53,6 +53,7 @@ #include #include #include +#include #include @@ -133,6 +134,33 @@ public: virtual OUString SAL_CALL getNamespaceURI( const OUString& rNamespacePrefix ) override; }; +class XMLOFF_DLLPUBLIC SvXMLLegacyToFastDocHandler : public ::cppu::WeakImplHelper< + css::xml::sax::XDocumentHandler, + css::document::XImporter > +{ +private: + rtl::Reference< SvXMLImport > mrImport; + rtl::Reference< sax_fastparser::FastAttributeList > mxFastAttributes; + +public: + SvXMLLegacyToFastDocHandler( const rtl::Reference< SvXMLImport > & rImport ); + + // XImporter + virtual void SAL_CALL setTargetDocument( const css::uno::Reference< css::lang::XComponent >& xDoc ) override; + + // css::xml::sax::XDocumentHandler + virtual void SAL_CALL startDocument() override; + virtual void SAL_CALL endDocument() override; + virtual void SAL_CALL startElement(const OUString& aName, + const css::uno::Reference< css::xml::sax::XAttributeList > & xAttribs) override; + virtual void SAL_CALL endElement(const OUString& aName) override; + virtual void SAL_CALL characters(const OUString& aChars) override; + virtual void SAL_CALL ignorableWhitespace(const OUString& aWhitespaces) override; + virtual void SAL_CALL processingInstruction(const OUString& aTarget, + const OUString& aData) override; + virtual void SAL_CALL setDocumentLocator(const css::uno::Reference< css::xml::sax::XLocator > & xLocator) override; +}; + class XMLOFF_DLLPUBLIC SvXMLImport : public cppu::WeakImplHelper< css::xml::sax::XExtendedDocumentHandler, @@ -145,6 +173,7 @@ class XMLOFF_DLLPUBLIC SvXMLImport : public cppu::WeakImplHelper< css::xml::sax::XFastParser> { friend class SvXMLImportContext; + friend class SvXMLLegacyToFastDocHandler; css::uno::Reference< css::xml::sax::XLocator > mxLocator; css::uno::Reference< css::frame::XModel > mxModel; diff --git a/writerperfect/source/common/DocumentHandler.cxx b/writerperfect/source/common/DocumentHandler.cxx index 3ea4d053e4a6..29788200b6de 100644 --- a/writerperfect/source/common/DocumentHandler.cxx +++ b/writerperfect/source/common/DocumentHandler.cxx @@ -16,6 +16,7 @@ #include #include +#include namespace writerperfect { @@ -110,8 +111,10 @@ using com::sun::star::xml::sax::XAttributeList; using com::sun::star::xml::sax::XDocumentHandler; DocumentHandler::DocumentHandler(Reference < XDocumentHandler > &xHandler) : - mxHandler(xHandler) + mxHandler( xHandler ) { + if (SvXMLImport *pFastHandler = dynamic_cast(mxHandler.get())) + mxHandler.set( new SvXMLLegacyToFastDocHandler( pFastHandler ) ); } void DocumentHandler::startDocument() diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index 3377a16b7a22..36de2638a874 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -2082,4 +2082,88 @@ OUString SvXMLImportFastNamespaceHandler::getNamespaceURI( const OUString&/* rNa return OUString(); } +SvXMLLegacyToFastDocHandler::SvXMLLegacyToFastDocHandler( const rtl::Reference< SvXMLImport > & rImport ) +: mrImport( rImport ), + mxFastAttributes( new sax_fastparser::FastAttributeList( mrImport->mxTokenHandler.get(), + dynamic_cast< sax_fastparser::FastTokenHandlerBase *>( mrImport->mxTokenHandler.get() ) ) ) +{ +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc ) +{ + mrImport->setTargetDocument( xDoc ); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::startDocument() +{ + mrImport->startDocument(); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::endDocument() +{ + mrImport->endDocument(); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::startElement( const OUString& rName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList ) +{ + mrImport->processNSAttributes(xAttrList); + OUString aLocalName; + sal_uInt16 nPrefix = mrImport->mpNamespaceMap->GetKeyByAttrName( rName, &aLocalName ); + Sequence< sal_Int8 > aLocalNameSeq( reinterpret_cast( + OUStringToOString( aLocalName, RTL_TEXTENCODING_UTF8 ).getStr()), aLocalName.getLength() ); + sal_Int32 mnElement = NAMESPACE_TOKEN( nPrefix ) | mrImport->mxTokenHandler->getTokenFromUTF8( aLocalNameSeq ); + mxFastAttributes->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 = mrImport->mpNamespaceMap->GetKeyByAttrName( rAttrName, &aLocalAttrName ); + if( XML_NAMESPACE_XMLNS != nAttrPrefix ) + { + Sequence< sal_Int8 > aAttrSeq( reinterpret_cast( + OUStringToOString( aLocalAttrName, RTL_TEXTENCODING_UTF8 ).getStr()), aLocalAttrName.getLength() ); + sal_Int32 nAttr = NAMESPACE_TOKEN( nAttrPrefix ) | mrImport->mxTokenHandler->getTokenFromUTF8( aAttrSeq ) ; + mxFastAttributes->add( nAttr, OUStringToOString( rAttrValue, RTL_TEXTENCODING_UTF8 ).getStr() ); + } + } + mrImport->startFastElement( mnElement, mxFastAttributes.get() ); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::endElement( const OUString& rName ) +{ + OUString aLocalName; + sal_uInt16 nPrefix = mrImport->mpNamespaceMap->GetKeyByAttrName( rName, &aLocalName ); + Sequence< sal_Int8 > aLocalNameSeq( reinterpret_cast( + OUStringToOString( aLocalName, RTL_TEXTENCODING_UTF8 ).getStr()), aLocalName.getLength() ); + sal_Int32 mnElement = NAMESPACE_TOKEN( nPrefix ) | mrImport->mxTokenHandler->getTokenFromUTF8( aLocalNameSeq ); + mrImport->endFastElement( mnElement ); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::characters( const OUString& aChars ) +{ + mrImport->characters( aChars ); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::ignorableWhitespace( const OUString& aWhitespaces ) +{ + mrImport->ignorableWhitespace( aWhitespaces ); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::processingInstruction( const OUString& aTarget, + const OUString& aData) +{ + mrImport->processingInstruction( aTarget, aData ); +} + +void SAL_CALL SvXMLLegacyToFastDocHandler::setDocumentLocator( const uno::Reference< xml::sax::XLocator >& rLocator ) +{ + mrImport->setDocumentLocator( rLocator ); +} + + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/ChartPlotAreaOASISTContext.cxx b/xmloff/source/transform/ChartPlotAreaOASISTContext.cxx index ddd022e73a45..187333016852 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().startFastElement( + GetTransformer().GetDocHandler()->startElement( GetExportQName(), Reference< xml::sax::XAttributeList >( pMutableAttrList )); ExportContent(); - GetTransformer().endFastElement( GetExportQName()); + GetTransformer().GetDocHandler()->endElement( GetExportQName()); } else Export(); diff --git a/xmloff/source/transform/ControlOASISTContext.cxx b/xmloff/source/transform/ControlOASISTContext.cxx index f5940a241740..3b5ece6da769 100644 --- a/xmloff/source/transform/ControlOASISTContext.cxx +++ b/xmloff/source/transform/ControlOASISTContext.cxx @@ -135,7 +135,7 @@ void XMLControlOASISTransformerContext::StartElement( } if( m_bCreateControl ) - GetTransformer().startFastElement( m_aElemQName, + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xControlAttrList ); XMLTransformerContext::StartElement( xAttrList ); } @@ -144,7 +144,7 @@ void XMLControlOASISTransformerContext::EndElement() { XMLTransformerContext::EndElement(); if( m_bCreateControl ) - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/ControlOOoTContext.cxx b/xmloff/source/transform/ControlOOoTContext.cxx index 9f42d35a5030..b37a73491f94 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().startFastElement( m_aElemQName, + GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList ); } else @@ -77,7 +77,7 @@ rtl::Reference XMLControlOOoTransformerContext::CreateChi void XMLControlOOoTransformerContext::EndElement() { - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } void XMLControlOOoTransformerContext::Characters( const OUString& rChars ) diff --git a/xmloff/source/transform/EventOOoTContext.cxx b/xmloff/source/transform/EventOOoTContext.cxx index 264bc12d4206..59bbfb1657fb 100644 --- a/xmloff/source/transform/EventOOoTContext.cxx +++ b/xmloff/source/transform/EventOOoTContext.cxx @@ -209,7 +209,7 @@ void XMLEventOOoTransformerContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().startFastElement( GetExportQName(), xAttrList ); + GetTransformer().GetDocHandler()->startElement( GetExportQName(), xAttrList ); } void XMLEventOOoTransformerContext::EndElement() @@ -217,7 +217,7 @@ void XMLEventOOoTransformerContext::EndElement() if( m_bPersistent ) XMLPersElemContentTContext::EndElement(); else - GetTransformer().endFastElement( GetExportQName() ); + GetTransformer().GetDocHandler()->endElement( GetExportQName() ); } rtl::Reference XMLEventOOoTransformerContext::CreateChildContext( diff --git a/xmloff/source/transform/FormPropOASISTContext.cxx b/xmloff/source/transform/FormPropOASISTContext.cxx index ab46e81e0010..2e68b23134a1 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().startFastElement( aValueElemQName, + GetTransformer().GetDocHandler()->startElement( aValueElemQName, xAttrList ); GetTransformer().GetDocHandler()->characters( aValue ); - GetTransformer().endFastElement( aValueElemQName ); + GetTransformer().GetDocHandler()->endElement( aValueElemQName ); } } diff --git a/xmloff/source/transform/FormPropOOoTContext.cxx b/xmloff/source/transform/FormPropOOoTContext.cxx index b590d067db43..187dad24dd20 100644 --- a/xmloff/source/transform/FormPropOOoTContext.cxx +++ b/xmloff/source/transform/FormPropOOoTContext.cxx @@ -243,8 +243,8 @@ void XMLFormPropOOoTransformerContext::EndElement() GetXMLToken( m_eValueTypeToken ) ); } - GetTransformer().startFastElement( m_aElemQName, m_xAttrList ); - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/FrameOASISTContext.cxx b/xmloff/source/transform/FrameOASISTContext.cxx index 4ed0d0ac9f01..cc68c4a88dfa 100644 --- a/xmloff/source/transform/FrameOASISTContext.cxx +++ b/xmloff/source/transform/FrameOASISTContext.cxx @@ -145,7 +145,7 @@ rtl::Reference XMLFrameOASISTransformerContext::CreateChi GetTransformer().ProcessAttrList( m_xAttrList, OASIS_SHAPE_ACTIONS, false ); - GetTransformer().startFastElement( m_aElemQName, m_xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList ); } else { @@ -174,7 +174,7 @@ rtl::Reference XMLFrameOASISTransformerContext::CreateChi void XMLFrameOASISTransformerContext::EndElement() { if( !m_bIgnoreElement ) - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } void XMLFrameOASISTransformerContext::Characters( const OUString& rChars ) diff --git a/xmloff/source/transform/FrameOOoTContext.cxx b/xmloff/source/transform/FrameOOoTContext.cxx index 8c66584d8b26..0176964f7711 100644 --- a/xmloff/source/transform/FrameOOoTContext.cxx +++ b/xmloff/source/transform/FrameOOoTContext.cxx @@ -91,7 +91,7 @@ void XMLFrameOOoTransformerContext::StartElement( } } - GetTransformer().startFastElement( m_aElemQName, + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xFrameAttrList ); XMLTransformerContext::StartElement( xAttrList ); } @@ -140,7 +140,7 @@ void XMLFrameOOoTransformerContext::EndElement() { XMLTransformerContext::EndElement(); ExportContent(); - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } void XMLFrameOOoTransformerContext::Characters( const OUString& rChars ) diff --git a/xmloff/source/transform/MetaTContext.cxx b/xmloff/source/transform/MetaTContext.cxx index e22b51d57f90..0e4969ccbfec 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().startFastElement( aKeywordsQName, + GetTransformer().GetDocHandler()->startElement( aKeywordsQName, xAttrList ); } @@ -115,12 +115,12 @@ void XMLMetaTransformerContext::EndElement() } if( XML_KEYWORD == *pToken ) - GetTransformer().endFastElement( aKeywordsQName ); + GetTransformer().GetDocHandler()->endElement( aKeywordsQName ); } pToken++; } - GetTransformer().endFastElement( GetQName() ); + GetTransformer().GetDocHandler()->endElement( GetQName() ); } void XMLMetaTransformerContext::Characters( const OUString& ) diff --git a/xmloff/source/transform/NotesTContext.cxx b/xmloff/source/transform/NotesTContext.cxx index b28115f01acf..bef8abcd8e40 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().startFastElement( GetExportQName(), + GetTransformer().GetDocHandler()->startElement( GetExportQName(), xAttrList ); } @@ -149,7 +149,7 @@ void XMLNotesTransformerContext::EndElement() } else { - GetTransformer().endFastElement( GetExportQName() ); + GetTransformer().GetDocHandler()->endElement( GetExportQName() ); } } diff --git a/xmloff/source/transform/OOo2Oasis.cxx b/xmloff/source/transform/OOo2Oasis.cxx index 9d2dcf492283..30cba7f0a00c 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().startFastElement( m_aElemQName, xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); } void XMLDocumentTransformerContext_Impl::EndElement() { - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); GetTransformer().SetClass( m_aOldClass ); } @@ -1267,13 +1267,13 @@ void XMLBodyTransformerContext_Impl::StartElement( m_aClassQName = GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, aClass ); - GetTransformer().startFastElement( m_aClassQName, + GetTransformer().GetDocHandler()->startElement( m_aClassQName, xAttrList ); } void XMLBodyTransformerContext_Impl::EndElement() { - GetTransformer().endFastElement( m_aClassQName ); + GetTransformer().GetDocHandler()->endElement( m_aClassQName ); XMLTransformerContext::EndElement(); } @@ -1483,12 +1483,12 @@ void XMLTableOOoTransformerContext_Impl::StartElement( } } - GetTransformer().startFastElement( m_aElemQName, xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); } void XMLTableOOoTransformerContext_Impl::EndElement() { - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } XMLTransformerContext *OOo2OasisTransformer::CreateUserDefinedContext( diff --git a/xmloff/source/transform/Oasis2OOo.cxx b/xmloff/source/transform/Oasis2OOo.cxx index 6363735e27c2..388761389806 100644 --- a/xmloff/source/transform/Oasis2OOo.cxx +++ b/xmloff/source/transform/Oasis2OOo.cxx @@ -1226,12 +1226,12 @@ void XMLTableTransformerContext_Impl::StartElement( } } - GetTransformer().startFastElement( m_aElemQName, xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); } void XMLTableTransformerContext_Impl::EndElement() { - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } class XMLBodyOASISTransformerContext_Impl : public XMLTransformerContext diff --git a/xmloff/source/transform/PersAttrListTContext.cxx b/xmloff/source/transform/PersAttrListTContext.cxx index f021af64ed95..c604a095cc21 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().startFastElement( m_aElemQName, m_xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList ); ExportContent(); - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } void XMLPersAttrListTContext::ExportContent() diff --git a/xmloff/source/transform/ProcAddAttrTContext.cxx b/xmloff/source/transform/ProcAddAttrTContext.cxx index 821ccd9db63c..2adf278b1bec 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().startFastElement( GetElemQName(), xAttrList ); + GetTransformer().GetDocHandler()->startElement( GetElemQName(), xAttrList ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/ProcAttrTContext.cxx b/xmloff/source/transform/ProcAttrTContext.cxx index 0af4e4c63dad..4f142b3dadf1 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().startFastElement( m_aElemQName, xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); } void XMLProcAttrTransformerContext::EndElement() { - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/RenameElemTContext.cxx b/xmloff/source/transform/RenameElemTContext.cxx index 81ea2daa4096..6816d66d6a50 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().startFastElement( m_aElemQName, xAttrList ); + GetTransformer().GetDocHandler()->startElement( m_aElemQName, xAttrList ); } void XMLRenameElemTransformerContext::EndElement() { - GetTransformer().endFastElement( m_aElemQName ); + GetTransformer().GetDocHandler()->endElement( m_aElemQName ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/transform/StyleOASISTContext.cxx b/xmloff/source/transform/StyleOASISTContext.cxx index 771d55e49909..21cc404ccd26 100644 --- a/xmloff/source/transform/StyleOASISTContext.cxx +++ b/xmloff/source/transform/StyleOASISTContext.cxx @@ -595,9 +595,9 @@ void XMLPropertiesTContext_Impl::StartElement( void XMLPropertiesTContext_Impl::Export() { - GetTransformer().startFastElement( GetExportQName(), m_xAttrList ); + GetTransformer().GetDocHandler()->startElement( GetExportQName(), m_xAttrList ); ExportContent(); - GetTransformer().endFastElement( GetExportQName() ); + GetTransformer().GetDocHandler()->endElement( GetExportQName() ); } XMLPropType XMLPropertiesTContext_Impl::GetPropType( const OUString& rLocalName ) @@ -879,7 +879,7 @@ void XMLStyleOASISTContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().startFastElement( GetExportQName(), xAttrList ); + GetTransformer().GetDocHandler()->startElement( GetExportQName(), xAttrList ); } void XMLStyleOASISTContext::EndElement() @@ -896,7 +896,7 @@ void XMLStyleOASISTContext::EndElement() m_xPropContext->Export(); m_xPropContext = nullptr; } - GetTransformer().endFastElement( GetExportQName() ); + GetTransformer().GetDocHandler()->endElement( GetExportQName() ); } } diff --git a/xmloff/source/transform/StyleOOoTContext.cxx b/xmloff/source/transform/StyleOOoTContext.cxx index 1a8c9ce1e3f4..82941b446753 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().startFastElement( GetQName(), m_xAttrList ); + GetTransformer().GetDocHandler()->startElement( GetQName(), m_xAttrList ); ExportContent(); - GetTransformer().endFastElement( GetQName() ); + GetTransformer().GetDocHandler()->endElement( GetQName() ); } } @@ -1252,7 +1252,7 @@ void XMLStyleOOoTContext::StartElement( if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else - GetTransformer().startFastElement( GetExportQName(), xAttrList ); + GetTransformer().GetDocHandler()->startElement( GetExportQName(), xAttrList ); } void XMLStyleOOoTContext::EndElement() @@ -1260,7 +1260,7 @@ void XMLStyleOOoTContext::EndElement() if( m_bPersistent ) XMLPersElemContentTContext::EndElement(); else - GetTransformer().endFastElement( GetExportQName() ); + GetTransformer().GetDocHandler()->endElement( GetExportQName() ); } void XMLStyleOOoTContext::Characters( const OUString& ) diff --git a/xmloff/source/transform/TransformerBase.cxx b/xmloff/source/transform/TransformerBase.cxx index cafbc9ac265a..5707f9ddd338 100644 --- a/xmloff/source/transform/TransformerBase.cxx +++ b/xmloff/source/transform/TransformerBase.cxx @@ -174,14 +174,10 @@ 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_nElement(0), - m_xFastAttributes( new sax_fastparser::FastAttributeList( m_xTokenHandler.get(), - dynamic_cast< sax_fastparser::FastTokenHandlerBase *>( m_xTokenHandler.get() ) ) ) + m_pTokenMap( new XMLTransformerTokenMap( pTKMapInit ) ) { 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 ); @@ -413,9 +409,10 @@ void SAL_CALL XMLTransformerBase::initialize( const Sequence< Any >& aArguments if( cppu::UnoType::get().isAssignableFrom( pAny->getValueType() ) ) { m_xHandler.set( *pAny, UNO_QUERY ); - m_xFastHandler.set( m_xHandler.get(), UNO_QUERY ); - if (SvXMLImport *pFastHandler = dynamic_cast(m_xFastHandler.get())) - m_xNamespaceHandler = pFastHandler->getNamespaceHandler(); + // Type change to avoid crashing of dynamic_cast + if (SvXMLImport *pFastHandler = dynamic_cast( + uno::Reference< XFastDocumentHandler >( m_xHandler, uno::UNO_QUERY ).get() ) ) + m_xHandler.set( new SvXMLLegacyToFastDocHandler( pFastHandler ) ); } // property set to transport data across @@ -1442,50 +1439,4 @@ 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 ); - m_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( m_nElement, m_xFastAttributes.get() ); - } - else - m_xHandler->startElement( rName, xAttrList ); -} - -void XMLTransformerBase::endFastElement( const OUString& rName ) -{ - if( m_xFastHandler.is() ) - m_xFastHandler->endFastElement( m_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 e34427c8e23d..fed048b84de4 100644 --- a/xmloff/source/transform/TransformerBase.hxx +++ b/xmloff/source/transform/TransformerBase.hxx @@ -27,17 +27,13 @@ #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; } @@ -60,11 +56,8 @@ 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; @@ -75,10 +68,6 @@ class XMLTransformerBase : public XMLTransformer XMLTransformerActions *m_pElemActions; XMLTransformerTokenMap *m_pTokenMap; - //for feeding FastDocumentHandler - sal_Int32 m_nElement; - rtl::Reference< sax_fastparser::FastAttributeList > m_xFastAttributes; - protected: css::uno::Reference< css::frame::XModel > mxModel; @@ -187,10 +176,6 @@ 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 5ff0d94f4fc1..fd4005d73274 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.startFastElement( m_aQName, rAttrList ); + m_rTransformer.GetDocHandler()->startElement( m_aQName, rAttrList ); } void XMLTransformerContext::EndElement() { - GetTransformer().endFastElement( m_aQName ); + GetTransformer().GetDocHandler()->endElement( m_aQName ); } void XMLTransformerContext::Characters( const OUString& rChars ) -- cgit