[Libreoffice-commits] core.git: include/sax sax/qa sax/source

Mohammed Abdul Azeem azeemmysore at gmail.com
Tue Jul 19 14:17:41 UTC 2016


 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 <azeemmysore at 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 <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at 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 )


More information about the Libreoffice-commits mailing list