diff options
author | Mohammed Abdul Azeem <azeemmysore@gmail.com> | 2016-07-06 20:44:39 +0530 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2016-07-09 20:12:28 +0000 |
commit | fdd1c64821a81d653ddc911e35149ff969e2f198 (patch) | |
tree | d03c8cca7bc594d61b29a92b2cd1d2fc595f0b88 /sax/source/fastparser/legacyfastparser.cxx | |
parent | 563dd59cdf84be980f4e0e2fb12566dd7e4a1633 (diff) |
GSOC: Adapt XLegacyFastParser to function like XParser.
Made XFastParser to pass namespace prefix instead of URI for
Unknown attributes and elements, Namespace handler is provided
to resolve those. Test for XFastParser unknown elements is removed,
since testing XLegacyFastParser indirectly tests that also.
Change-Id: Ia41ff5d3d4c07cef0ca23ba858bfb2a94b91b1f5
Reviewed-on: https://gerrit.libreoffice.org/26982
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'sax/source/fastparser/legacyfastparser.cxx')
-rw-r--r-- | sax/source/fastparser/legacyfastparser.cxx | 88 |
1 files changed, 83 insertions, 5 deletions
diff --git a/sax/source/fastparser/legacyfastparser.cxx b/sax/source/fastparser/legacyfastparser.cxx index 94929a67d344..ab673441f914 100644 --- a/sax/source/fastparser/legacyfastparser.cxx +++ b/sax/source/fastparser/legacyfastparser.cxx @@ -21,11 +21,14 @@ #include <com/sun/star/xml/sax/XParser.hpp> #include <com/sun/star/xml/sax/FastParser.hpp> #include <com/sun/star/xml/sax/FastToken.hpp> +#include <com/sun/star/lang/XInitialization.hpp> #include <comphelper/attributelist.hxx> #include <cppuhelper/supportsservice.hxx> #include <comphelper/processfactory.hxx> #include <rtl/ref.hxx> #include <sax/fastparser.hxx> +#include <vector> +#include <o3tl/make_unique.hxx> using namespace std; using namespace ::cppu; @@ -37,11 +40,73 @@ using namespace io; namespace { +class NamespaceHandler : public WeakImplHelper< XFastNamespaceHandler > +{ +private: + struct NamespaceDefine + { + OUString m_aPrefix; + OUString m_aNamespaceURI; + + NamespaceDefine( const OUString& rPrefix, const OUString& rNamespaceURI ) : m_aPrefix( rPrefix ), m_aNamespaceURI( rNamespaceURI ) {} + }; + vector< unique_ptr< NamespaceDefine > > m_aNamespaceDefines; + +public: + NamespaceHandler(); + void addNSDeclAttributes( rtl::Reference < comphelper::AttributeList >& rAttrList ); + + //XFastNamespaceHandler + virtual void SAL_CALL registerNamespace( const OUString& rNamespacePrefix, const OUString& rNamespaceURI ) + throw (RuntimeException, exception) override; + virtual OUString SAL_CALL getNamespaceURI( const OUString& rNamespacePrefix ) + throw (RuntimeException, exception) override; +}; + +NamespaceHandler::NamespaceHandler() +{ +} + +void NamespaceHandler::addNSDeclAttributes( rtl::Reference < comphelper::AttributeList >& rAttrList ) +{ + for(const auto& aNamespaceDefine : m_aNamespaceDefines) + { + OUString& rPrefix = aNamespaceDefine.get()->m_aPrefix; + OUString& rNamespaceURI = aNamespaceDefine.get()->m_aNamespaceURI; + OUString sDecl; + if ( rPrefix.isEmpty() ) + sDecl = "xmlns"; + else + sDecl = "xmlns:" + rPrefix; + rAttrList->AddAttribute( sDecl, "CDATA", rNamespaceURI ); + } + m_aNamespaceDefines.clear(); +} -class SaxLegacyFastParser : public WeakImplHelper< XServiceInfo, XParser > +void NamespaceHandler::registerNamespace( const OUString& rNamespacePrefix, const OUString& rNamespaceURI ) + throw (RuntimeException, exception) { + m_aNamespaceDefines.push_back( o3tl::make_unique<NamespaceDefine>( + rNamespacePrefix, rNamespaceURI) ); +} + +OUString NamespaceHandler::getNamespaceURI( const OUString&/* rNamespacePrefix */ ) + throw (RuntimeException, exception) +{ + return OUString(); +} + +class SaxLegacyFastParser : public WeakImplHelper< XInitialization, XServiceInfo, XParser > +{ +private: + rtl::Reference< NamespaceHandler > m_aNamespaceHandler; public: SaxLegacyFastParser(); + +// css::lang::XInitialization: + virtual void SAL_CALL initialize(css::uno::Sequence<css::uno::Any> const& rArguments) + throw (RuntimeException, Exception, exception) override; + // The SAX-Parser-Interface virtual void SAL_CALL parseStream( const InputSource& structSource) throw ( SAXException, IOException, RuntimeException, exception) override; @@ -86,9 +151,9 @@ class CallbackDocumentHandler : public WeakImplHelper< XFastDocumentHandler > { private: Reference< XDocumentHandler > m_xDocumentHandler; + rtl::Reference< NamespaceHandler > m_aNamespaceHandler; public: - CallbackDocumentHandler( Reference< XDocumentHandler > const & xDocumentHandler ) - { m_xDocumentHandler.set( xDocumentHandler ); } + CallbackDocumentHandler( Reference< XDocumentHandler > const & xDocumentHandler, rtl::Reference< NamespaceHandler > const & rNamespaceHandler ); // XFastDocumentHandler virtual void SAL_CALL startDocument() throw (SAXException, RuntimeException, exception) override; @@ -106,6 +171,12 @@ public: }; +CallbackDocumentHandler::CallbackDocumentHandler( Reference< XDocumentHandler > const & xDocumentHandler, rtl::Reference< NamespaceHandler > const & rNamespaceHandler ) +{ + m_xDocumentHandler.set( xDocumentHandler ); + m_aNamespaceHandler.set( rNamespaceHandler.get() ); +} + void SAL_CALL CallbackDocumentHandler::startDocument() throw (SAXException, RuntimeException, exception) { @@ -139,6 +210,7 @@ void SAL_CALL CallbackDocumentHandler::startUnknownElement( const OUString& Name { OUString elementName; rtl::Reference < comphelper::AttributeList > rAttrList = new comphelper::AttributeList; + m_aNamespaceHandler->addNSDeclAttributes( rAttrList ); if ( !Namespace.isEmpty() ) elementName = Namespace + ":" + Name; else @@ -200,11 +272,17 @@ void SAL_CALL CallbackDocumentHandler::characters( const OUString& aChars ) m_xDocumentHandler->characters( aChars ); } -SaxLegacyFastParser::SaxLegacyFastParser( ) +SaxLegacyFastParser::SaxLegacyFastParser( ) : m_aNamespaceHandler( new NamespaceHandler ) { m_xParser = FastParser::create( ::comphelper::getProcessComponentContext() ); m_xParser->setTokenHandler( new CallbackTokenHandler() ); + m_xParser->setNamespaceHandler( m_aNamespaceHandler.get() ); +} + +void SAL_CALL SaxLegacyFastParser::initialize(Sequence< Any > const&/* rArguments */) + throw (RuntimeException, Exception, exception) +{ } void SaxLegacyFastParser::parseStream( const InputSource& structSource ) @@ -212,7 +290,7 @@ void SaxLegacyFastParser::parseStream( const InputSource& structSource ) IOException, RuntimeException, exception) { - m_xParser->setFastDocumentHandler( new CallbackDocumentHandler( m_xDocumentHandler.get() ) ); + m_xParser->setFastDocumentHandler( new CallbackDocumentHandler( m_xDocumentHandler.get(), m_aNamespaceHandler.get() ) ); m_xParser->parseStream( structSource ); } |