include/sax/fastparser.hxx | 10 +++++++- sax/qa/cppunit/xmlimport.cxx | 33 +++++++++++++++++++++++++++-- sax/qa/data/manifestwithnsdecl.xml | 12 ++++++++++ sax/qa/data/manifestwithoutnsdecl.xml | 12 ++++++++++ sax/source/fastparser/fastparser.cxx | 25 ++++++++++++++++++++- sax/source/fastparser/legacyfastparser.cxx | 5 +++- 6 files changed, 90 insertions(+), 7 deletions(-)
New commits: commit 3aa52d36824d11b8774de15708fdfcbb93cd9dc3 Author: Mohammed Abdul Azeem <azeemmys...@gmail.com> Date: Mon Jul 18 13:17:19 2016 +0530 GSOC - Handling namespace declaration missing case: initialization parameter to FastParser will turn off the namespace declaration missing exception. Test cases have also been given to verify the same. Change-Id: I4c3e02c7ad92d50e279f895ced53c78fc8f49b91 Reviewed-on: https://gerrit.libreoffice.org/27278 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Michael Meeks <michael.me...@collabora.com> Tested-by: Michael Meeks <michael.me...@collabora.com> diff --git a/include/sax/fastparser.hxx b/include/sax/fastparser.hxx index 3ddba58..85eaf30 100644 --- a/include/sax/fastparser.hxx +++ b/include/sax/fastparser.hxx @@ -22,7 +22,9 @@ #include <com/sun/star/xml/sax/XFastParser.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> -#include <cppuhelper/implbase2.hxx> +#include <cppuhelper/weak.hxx> +#include <cppuhelper/implbase.hxx> +#include <com/sun/star/lang/XInitialization.hpp> #include <sax/fastsaxdllapi.h> #include <memory> @@ -42,7 +44,8 @@ class FastSaxParserImpl; // This class implements the external Parser interface class FASTSAX_DLLPUBLIC FastSaxParser - : public ::cppu::WeakImplHelper2< + : public ::cppu::WeakImplHelper< + css::lang::XInitialization, css::xml::sax::XFastParser, css::lang::XServiceInfo > { @@ -52,6 +55,9 @@ public: FastSaxParser(); virtual ~FastSaxParser(); + // css::lang::XInitialization: + virtual void SAL_CALL initialize(css::uno::Sequence<css::uno::Any> const& rArguments) throw (css::uno::RuntimeException, css::uno::Exception, std::exception) override; + // XFastParser virtual void SAL_CALL parseStream( const css::xml::sax::InputSource& aInputSource ) throw (css::xml::sax::SAXException, css::io::IOException, css::uno::RuntimeException, std::exception) override; virtual void SAL_CALL setFastDocumentHandler( const css::uno::Reference< css::xml::sax::XFastDocumentHandler >& Handler ) throw (css::uno::RuntimeException, std::exception) override; diff --git a/sax/qa/cppunit/xmlimport.cxx b/sax/qa/cppunit/xmlimport.cxx index c0320fc..f7fcd73 100644 --- a/sax/qa/cppunit/xmlimport.cxx +++ b/sax/qa/cppunit/xmlimport.cxx @@ -278,10 +278,12 @@ public: XMLImportTest() : BootstrapFixture(true, false) {} void parse(); + void testMissingNamespaceDeclaration(); void testIllegalNamespaceUse(); CPPUNIT_TEST_SUITE( XMLImportTest ); CPPUNIT_TEST( parse ); + CPPUNIT_TEST( testMissingNamespaceDeclaration ); CPPUNIT_TEST( testIllegalNamespaceUse ); CPPUNIT_TEST_SUITE_END(); }; @@ -317,11 +319,11 @@ void XMLImportTest::parse() source.aInputStream = createStreamFromFile( m_sDirPath + fileNames[i] ); m_xParser->parseStream(source); - const OUString& rParserStr = m_xDocumentHandler->getString(); + const OUString rParserStr = m_xDocumentHandler->getString(); source.aInputStream = createStreamFromFile( m_sDirPath + fileNames[i] ); m_xLegacyFastParser->parseStream(source); - const OUString& rLegacyFastParserStr = m_xDocumentHandler->getString(); + const OUString rLegacyFastParserStr = m_xDocumentHandler->getString(); CPPUNIT_ASSERT_EQUAL( rParserStr, rLegacyFastParserStr ); // OString o = OUStringToOString( Str, RTL_TEXTENCODING_ASCII_US ); @@ -329,6 +331,33 @@ void XMLImportTest::parse() } } +void XMLImportTest::testMissingNamespaceDeclaration() +{ + OUString fileNames[] = { "manifestwithnsdecl.xml", "manifestwithoutnsdecl.xml" }; + + uno::Reference<lang::XInitialization> const xInit(m_xLegacyFastParser, + uno::UNO_QUERY_THROW); + uno::Sequence<uno::Any> args(1); + args[0] <<= OUString("IgnoreMissingNSDecl"); + xInit->initialize( args ); + + for (sal_uInt16 i = 0; i < sizeof( fileNames ) / sizeof( OUString ); i++) + { + InputSource source; + source.sSystemId = "internal"; + + source.aInputStream = createStreamFromFile( m_sDirPath + fileNames[i] ); + m_xParser->parseStream(source); + const OUString rParserStr = m_xDocumentHandler->getString(); + + source.aInputStream = createStreamFromFile( m_sDirPath + fileNames[i] ); + m_xLegacyFastParser->parseStream(source); + const OUString rLegacyFastParserStr = m_xDocumentHandler->getString(); + + CPPUNIT_ASSERT_EQUAL( rParserStr, rLegacyFastParserStr ); + } +} + void XMLImportTest::testIllegalNamespaceUse() { rtl::Reference< NSDocumentHandler > m_xNSDocumentHandler; diff --git a/sax/qa/data/manifestwithnsdecl.xml b/sax/qa/data/manifestwithnsdecl.xml new file mode 100644 index 0000000..ac61c3e --- /dev/null +++ b/sax/qa/data/manifestwithnsdecl.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2"> + <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.text"/> + <manifest:file-entry manifest:full-path="Thumbnails/thumbnail.png" manifest:media-type="image/png"/> + <manifest:file-entry manifest:full-path="content.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="styles.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="meta.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="settings.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="Configurations2/accelerator/current.xml" manifest:media-type=""/> + <manifest:file-entry manifest:full-path="Configurations2/" manifest:media-type="application/vnd.sun.xml.ui.configuration"/> + <manifest:file-entry manifest:full-path="manifest.rdf" manifest:media-type="application/rdf+xml"/> +</manifest:manifest> diff --git a/sax/qa/data/manifestwithoutnsdecl.xml b/sax/qa/data/manifestwithoutnsdecl.xml new file mode 100644 index 0000000..1c8f535 --- /dev/null +++ b/sax/qa/data/manifestwithoutnsdecl.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<manifest:manifest> + <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.text"/> + <manifest:file-entry manifest:full-path="Thumbnails/thumbnail.png" manifest:media-type="image/png"/> + <manifest:file-entry manifest:full-path="content.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="styles.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="meta.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="settings.xml" manifest:media-type="text/xml"/> + <manifest:file-entry manifest:full-path="Configurations2/accelerator/current.xml" manifest:media-type=""/> + <manifest:file-entry manifest:full-path="Configurations2/" manifest:media-type="application/vnd.sun.xml.ui.configuration"/> + <manifest:file-entry manifest:full-path="manifest.rdf" manifest:media-type="application/rdf+xml"/> +</manifest:manifest> diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx index 0b4137b..49038b8 100644 --- a/sax/source/fastparser/fastparser.cxx +++ b/sax/source/fastparser/fastparser.cxx @@ -233,6 +233,7 @@ public: Entity& getEntity() { return *mpTop; } void parse(); void produce( bool bForceFlush = false ); + bool m_bIgnoreMissingNSDecl; private: bool consume(EventList *); @@ -619,6 +620,7 @@ FastSaxParserImpl::FastSaxParserImpl( FastSaxParser* ) : #if 0 mpFront(pFront), #endif + m_bIgnoreMissingNSDecl(false), mpTop(nullptr) { mxDocumentLocator.set( new FastLocatorImpl( this ) ); @@ -668,7 +670,7 @@ sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( const xmlChar* pPrefix, int nPr break; } - if( !nNamespace ) + if( !nNamespace && !m_bIgnoreMissingNSDecl ) throw SAXException("No namespace defined for " + OUString(XML_CAST(pPrefix), nPrefixLen, RTL_TEXTENCODING_UTF8), Reference< XInterface >(), Any()); } @@ -1129,7 +1131,8 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm { if( prefix != nullptr ) { - sNamespace = OUString( XML_CAST( URI ), strlen( XML_CAST( URI )), RTL_TEXTENCODING_UTF8 ); + if ( !m_bIgnoreMissingNSDecl || URI != nullptr ) + sNamespace = OUString( XML_CAST( URI ), strlen( XML_CAST( URI )), RTL_TEXTENCODING_UTF8 ); nNamespaceToken = GetNamespaceToken( sNamespace ); rEvent.msNamespace = OUString( XML_CAST( prefix ), strlen( XML_CAST( prefix )), RTL_TEXTENCODING_UTF8 ); } @@ -1300,6 +1303,24 @@ FastSaxParser::~FastSaxParser() { } +void SAL_CALL +FastSaxParser::initialize(css::uno::Sequence< css::uno::Any > const& rArguments) + throw (css::uno::RuntimeException, css::uno::Exception, std::exception) +{ + if (rArguments.getLength()) + { + OUString str; + if ( ( rArguments[0] >>= str ) && "IgnoreMissingNSDecl" == str ) + mpImpl->m_bIgnoreMissingNSDecl = true; + else if ( str == "DoSmeplease" ) + { + //just ignore as this is already immune to billon laughs + } + else + throw IllegalArgumentException(); + } +} + void FastSaxParser::parseStream( const xml::sax::InputSource& aInputSource ) throw (xml::sax::SAXException, io::IOException, uno::RuntimeException, std::exception) diff --git a/sax/source/fastparser/legacyfastparser.cxx b/sax/source/fastparser/legacyfastparser.cxx index ab67344..1c82178 100644 --- a/sax/source/fastparser/legacyfastparser.cxx +++ b/sax/source/fastparser/legacyfastparser.cxx @@ -280,9 +280,12 @@ SaxLegacyFastParser::SaxLegacyFastParser( ) : m_aNamespaceHandler( new Namespace m_xParser->setNamespaceHandler( m_aNamespaceHandler.get() ); } -void SAL_CALL SaxLegacyFastParser::initialize(Sequence< Any > const&/* rArguments */) +void SAL_CALL SaxLegacyFastParser::initialize(Sequence< Any > const& rArguments ) throw (RuntimeException, Exception, exception) { + uno::Reference<lang::XInitialization> const xInit(m_xParser, + uno::UNO_QUERY_THROW); + xInit->initialize( rArguments ); } void SaxLegacyFastParser::parseStream( const InputSource& structSource ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits