include/xmloff/xmlictxt.hxx | 34 +++++++++++++++++ include/xmloff/xmlimp.hxx | 38 ++++++++++++++++++- xmloff/source/core/xmlictxt.cxx | 47 ++++++++++++++++++++++++ xmloff/source/core/xmlimp.cxx | 77 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+), 4 deletions(-)
New commits: commit c0a5d390e519603dbc19a38c610d0a114b80cfa1 Author: Daniel Sikeler <d.sikele...@gmail.com> Date: Fri Oct 24 07:22:31 2014 +0000 fdo#80403: Import baseclasses implement FastParser interfaces SvXMLImportContext implements XFastContextHandler SvXMLImport implements XFastDocumentHandler Change-Id: Id400260af112f4a448fe469c9580f0ebacec4ab6 diff --git a/include/xmloff/xmlictxt.hxx b/include/xmloff/xmlictxt.hxx index bd21e95..35f693d 100644 --- a/include/xmloff/xmlictxt.hxx +++ b/include/xmloff/xmlictxt.hxx @@ -24,14 +24,17 @@ #include <xmloff/dllapi.h> #include <sal/types.h> #include <com/sun/star/xml/sax/XAttributeList.hpp> +#include <com/sun/star/xml/sax/XFastContextHandler.hpp> #include <tools/ref.hxx> #include <rtl/ustring.hxx> #include <tools/rtti.hxx> +#include <cppuhelper/implbase1.hxx> class SvXMLNamespaceMap; class SvXMLImport; -class XMLOFF_DLLPUBLIC SvXMLImportContext : public SvRefBase +class XMLOFF_DLLPUBLIC SvXMLImportContext : public SvRefBase, + public ::cppu::WeakImplHelper1< ::css::xml::sax::XFastContextHandler > { friend class SvXMLImport; @@ -64,6 +67,8 @@ public: SvXMLImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName ); + SvXMLImportContext( SvXMLImport& rImport ); + /** A contexts destructor does anything that is required if an element * ends. By default, nothing is done. * Note that virtual methods cannot be used inside destructors. Use @@ -90,6 +95,33 @@ public: * current element. The default is to ignore them. */ virtual void Characters( const OUString& rChars ); + // ::com::sun::star::xml::sax::XFastContextHandler: + virtual void SAL_CALL startFastElement (sal_Int32 Element, + const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + + virtual void SAL_CALL startUnknownElement(const OUString & Namespace, const OUString & Name, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + + virtual void SAL_CALL endFastElement(sal_Int32 Element) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + + virtual void SAL_CALL endUnknownElement(const OUString & Namespace, const OUString & Name) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + + virtual css::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 Element, + const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createUnknownChildContext( + const OUString & Namespace, const OUString & Name, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + + virtual void SAL_CALL characters(const OUString & aChars) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + // #i124143# allow to copy evtl. useful data from another temporary import context, e.g. used to // support multiple images and to rescue evtl. GluePoints imported with one of the // to be deprecated contents diff --git a/include/xmloff/xmlimp.hxx b/include/xmloff/xmlimp.hxx index 43afbea..4c3e35f 100644 --- a/include/xmloff/xmlimp.hxx +++ b/include/xmloff/xmlimp.hxx @@ -48,11 +48,15 @@ #include <xmloff/shapeimport.hxx> #include <xmloff/SchXMLImportHelper.hxx> #include <xmloff/ProgressBarHelper.hxx> -#include <cppuhelper/implbase6.hxx> +#include <cppuhelper/implbase7.hxx> #include <xmloff/formlayerimport.hxx> #include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp> +#include <com/sun/star/xml/sax/XFastContextHandler.hpp> +#include <com/sun/star/xml/sax/XFastAttributeList.hpp> + namespace com { namespace sun { namespace star { namespace frame { class XModel; } namespace io { class XOutputStream; } @@ -71,6 +75,8 @@ class XMLErrors; class StyleMap; typedef std::vector<SvXMLImportContext *> SvXMLImportContexts_Impl; +typedef std::vector< ::css::uno::Reference< ::css::xml::sax::XFastContextHandler>> + FastSvXMLImportContexts_Impl; namespace xmloff { class RDFaImportHelper; @@ -90,8 +96,9 @@ namespace xmloff { -class XMLOFF_DLLPUBLIC SvXMLImport : public ::cppu::WeakImplHelper6< +class XMLOFF_DLLPUBLIC SvXMLImport : public ::cppu::WeakImplHelper7< ::com::sun::star::xml::sax::XExtendedDocumentHandler, + ::com::sun::star::xml::sax::XFastDocumentHandler, ::com::sun::star::lang::XServiceInfo, ::com::sun::star::lang::XInitialization, ::com::sun::star::document::XImporter, @@ -131,6 +138,7 @@ class XMLOFF_DLLPUBLIC SvXMLImport : public ::cppu::WeakImplHelper6< SvXMLNamespaceMap *mpNamespaceMap; SvXMLUnitConverter *mpUnitConv; SvXMLImportContexts_Impl *mpContexts; + FastSvXMLImportContexts_Impl *mpFastContexts; SvXMLNumFmtHelper *mpNumImport; ProgressBarHelper *mpProgressBarHelper; XMLEventImportHelper *mpEventImportHelper; @@ -156,6 +164,8 @@ protected: virtual SvXMLImportContext *CreateContext( sal_uInt16 nPrefix, const OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ); + virtual SvXMLImportContext *CreateFastContext( sal_Int32 Element, + const ::css::uno::Reference< ::css::xml::sax::XFastAttributeList >& xAttrList ); virtual XMLTextImportHelper* CreateTextImport(); inline void ClearTextImport() { mxTextImport = 0; } @@ -205,7 +215,7 @@ public: ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL startElement(const OUString& aName, - const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttribs) + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttribs) throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE; virtual void SAL_CALL endElement(const OUString& aName) throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE; @@ -219,6 +229,28 @@ public: virtual void SAL_CALL setDocumentLocator(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator > & xLocator) throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE; + // ::css::xml::sax::XFastContextHandler + virtual void SAL_CALL startFastElement(sal_Int32 Element, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + virtual void SAL_CALL startUnknownElement(const OUString & Namespace, + const OUString & Name, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + virtual void SAL_CALL endFastElement(sal_Int32 Element) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + virtual void SAL_CALL endUnknownElement(const OUString & Namespace, + const OUString & Name) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL + createFastChildContext(sal_Int32 Element, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL + createUnknownChildContext(const OUString & Namespace, const OUString & Name, + const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) + throw (css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE; + // ::com::sun::star::xml::sax::XExtendedDocumentHandler virtual void SAL_CALL startCDATA(void) throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE; virtual void SAL_CALL endCDATA(void) throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE; diff --git a/xmloff/source/core/xmlictxt.cxx b/xmloff/source/core/xmlictxt.cxx index 6b7f257..8340a07 100644 --- a/xmloff/source/core/xmlictxt.cxx +++ b/xmloff/source/core/xmlictxt.cxx @@ -39,6 +39,12 @@ SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp, sal_uInt16 nPrfx, { } +SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp ) : + mrImport( rImp ), + mpRewindMap( 0 ) +{ +} + SvXMLImportContext::~SvXMLImportContext() { } @@ -62,6 +68,47 @@ void SvXMLImportContext::Characters( const OUString& ) { } +// ::com::sun::star::xml::sax::XFastContextHandler: +void SAL_CALL SvXMLImportContext::startFastElement(sal_Int32, const uno::Reference< xml::sax::XFastAttributeList > &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + +void SAL_CALL SvXMLImportContext::startUnknownElement(const OUString &, const OUString &, + const uno::Reference< xml::sax::XFastAttributeList > &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + +void SAL_CALL SvXMLImportContext::endFastElement(sal_Int32) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + +void SAL_CALL SvXMLImportContext::endUnknownElement (const OUString & , const OUString & ) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + +uno::Reference< xml::sax::XFastContextHandler > SAL_CALL SvXMLImportContext::createFastChildContext + (sal_Int32 Element, const uno::Reference< xml::sax::XFastAttributeList > & Attribs) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ + return mrImport.CreateFastContext( Element, Attribs ); +} + +uno::Reference< xml::sax::XFastContextHandler > SAL_CALL SvXMLImportContext::createUnknownChildContext + (const OUString &, const OUString &, const uno::Reference< xml::sax::XFastAttributeList > &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ + return 0; +} + +void SAL_CALL SvXMLImportContext::characters(const OUString &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + void SvXMLImportContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& ) { } diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index 97df9ab..d688e8f 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -346,6 +346,12 @@ SvXMLImportContext *SvXMLImport::CreateContext( sal_uInt16 nPrefix, return new SvXMLImportContext( *this, nPrefix, rLocalName ); } +SvXMLImportContext *SvXMLImport::CreateFastContext( sal_Int32 /*Element*/, + const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ ) +{ + return new SvXMLImportContext( *this ); +} + void SvXMLImport::_InitCtor() { if( mnImportFlags != 0 ) @@ -415,6 +421,7 @@ SvXMLImport::SvXMLImport( util::MeasureUnit::MM_100TH, util::MeasureUnit::MM_100TH) ), mpContexts( new SvXMLImportContexts_Impl ), + mpFastContexts( new FastSvXMLImportContexts_Impl ), mpNumImport( NULL ), mpProgressBarHelper( NULL ), mpEventImportHelper( NULL ), @@ -780,6 +787,10 @@ void SAL_CALL SvXMLImport::characters( const OUString& rChars ) { mpContexts->back()->Characters( rChars ); } + else if ( !mpFastContexts->empty() ) + { + mpFastContexts->back()->characters( rChars ); + } } void SAL_CALL SvXMLImport::ignorableWhitespace( const OUString& ) @@ -799,6 +810,72 @@ void SAL_CALL SvXMLImport::setDocumentLocator( const uno::Reference< xml::sax::X mxLocator = rLocator; } +// XFastContextHandler +void SAL_CALL SvXMLImport::startFastElement (sal_Int32 Element, + const uno::Reference< xml::sax::XFastAttributeList > & Attribs) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ + //Namespace handling is unnecessary. It is done by the fastparser itself. + uno::Reference<XFastContextHandler> xContext; + sal_uInt16 nCount = mpFastContexts->size(); + if( nCount > 0 ) + { + uno::Reference< XFastContextHandler > pHandler = (*mpFastContexts)[nCount - 1]; + xContext = pHandler->createFastChildContext( Element, Attribs ); + } + else + xContext.set( CreateFastContext( Element, Attribs ) ); + + if ( !xContext.is() ) + xContext.set( new SvXMLImportContext( *this ) ); + + // Call a startElement at the new context. + xContext->startFastElement( Element, Attribs ); + + // Push context on stack. + mpFastContexts->push_back( xContext ); +} + +void SAL_CALL SvXMLImport::startUnknownElement (const OUString &, const OUString &, + const uno::Reference< xml::sax::XFastAttributeList > &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + +void SAL_CALL SvXMLImport::endFastElement (sal_Int32 Element) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ + sal_uInt16 nCount = mpFastContexts->size(); + if( nCount > 0 ) + { + uno::Reference< XFastContextHandler > xContext = mpFastContexts->back(); + mpFastContexts->pop_back(); + xContext->endFastElement( Element ); + xContext = 0; + } +} + +void SAL_CALL SvXMLImport::endUnknownElement (const OUString &, const OUString &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ +} + +uno::Reference< xml::sax::XFastContextHandler > SAL_CALL + SvXMLImport::createFastChildContext (sal_Int32, + const uno::Reference< xml::sax::XFastAttributeList > &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ + return this; +} + +uno::Reference< xml::sax::XFastContextHandler > SAL_CALL + SvXMLImport::createUnknownChildContext (const OUString &, const OUString &, + const uno::Reference< xml::sax::XFastAttributeList > &) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) +{ + return this; +} + // XExtendedDocumentHandler void SAL_CALL SvXMLImport::startCDATA( void ) throw(xml::sax::SAXException, uno::RuntimeException, std::exception) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits