summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver-Rainer Wittmann <orw@apache.org>2013-06-10 16:51:54 +0100
committerPetr Mladek <pmladek@suse.cz>2014-08-28 16:21:48 +0200
commit12e1f920882ecc84635e7b4bc8fdbdacf30a1c83 (patch)
tree78fa7ce5c9613fd0bc7f472cb6b75781cc3216a5
parentf07f4c751e938d5a1e705e97aa1455f0ec45bb7e (diff)
Correct the XML document handler...
which is used to parse Microsoft Word OOXML documents in case of unknown XML elements (cherry picked from commit 22e334845346f4e3189c72e706d744385953af19) Conflicts: writerfilter/source/ooxml/OOXMLDocumentImpl.cxx writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx Change-Id: Ibcd3e808abfb35291bb04aa10190a7800f0837fa
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.cxx12
-rw-r--r--writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx62
-rw-r--r--writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx11
3 files changed, 43 insertions, 42 deletions
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
index 29c64ade8028..09ded156e1b5 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
@@ -66,10 +66,8 @@ void OOXMLDocumentImpl::resolveFastSubStream(Stream & rStreamHandler,
{
uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
OOXMLFastDocumentHandler * pDocHandler =
- new OOXMLFastDocumentHandler(xContext);
- pDocHandler->setStream(&rStreamHandler);
- pDocHandler->setDocument(this);
- pDocHandler->setXNoteId(mnXNoteId);
+ new OOXMLFastDocumentHandler(
+ xContext, &rStreamHandler, this, mnXNoteId );
uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler
(pDocHandler);
@@ -317,10 +315,8 @@ void OOXMLDocumentImpl::resolve(Stream & rStream)
uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
OOXMLFastDocumentHandler * pDocHandler =
- new OOXMLFastDocumentHandler(xContext);
- pDocHandler->setStream(&rStream);
- pDocHandler->setDocument(this);
- pDocHandler->setXNoteId(mnXNoteId);
+ new OOXMLFastDocumentHandler(
+ xContext, &rStream, this, mnXNoteId );
pDocHandler->setIsSubstream( mbIsSubstream );
uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler
(pDocHandler);
diff --git a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
index f6f6b60d27d0..893ed7486844 100644
--- a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
@@ -35,10 +35,28 @@ using namespace ::com::sun::star;
using namespace ::std;
-OOXMLFastDocumentHandler::OOXMLFastDocumentHandler
-(uno::Reference< uno::XComponentContext > const & context)
-: m_xContext(context), mpStream(0), mpDocument(0)
-{}
+OOXMLFastDocumentHandler::OOXMLFastDocumentHandler(
+ uno::Reference< uno::XComponentContext > const & context,
+ Stream* pStream,
+ OOXMLDocument* pDocument,
+ sal_Int32 nXNoteId )
+ : m_xContext(context)
+ , mpStream( pStream )
+#ifdef DEBUG_ELEMENT
+ , mpTmpStream()
+#endif
+ , mpDocument( pDocument )
+ , mnXNoteId( nXNoteId )
+ , mpContextHandler()
+{
+#ifdef DEBUG_PROTOCOL
+ if ( pStream )
+ {
+ mpTmpStream.reset( new StreamProtocol( pStream, debug_logger ) );
+ mpStream = mpTmpStream.get();
+ }
+#endif
+}
// ::com::sun::star::xml::sax::XFastContextHandler:
void SAL_CALL OOXMLFastDocumentHandler::startFastElement
@@ -141,6 +159,13 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
<< endl;
#endif
+ if ( mpStream == 0 && mpDocument == 0 )
+ {
+ // document handler has been created as unknown child - see <OOXMLFastDocumentHandler::createUnknownChildContext(..)>
+ // --> do not provide a child context
+ return NULL;
+ }
+
return OOXMLFactory::getInstance()->createFastChildContextFromStart(getContextHandler().get(), Element);
}
@@ -167,13 +192,12 @@ Name
#endif
return uno::Reference< xml::sax::XFastContextHandler >
- (new OOXMLFastDocumentHandler(m_xContext));
+ ( new OOXMLFastDocumentHandler( m_xContext, 0, 0, 0 ) );
}
void SAL_CALL OOXMLFastDocumentHandler::characters(const OUString & /*aChars*/)
throw (uno::RuntimeException, xml::sax::SAXException)
{
- // TODO: Insert your implementation for "characters" here.
}
// ::com::sun::star::xml::sax::XFastDocumentHandler:
@@ -191,32 +215,14 @@ void SAL_CALL OOXMLFastDocumentHandler::setDocumentLocator
(const uno::Reference< xml::sax::XLocator > & /*xLocator*/)
throw (uno::RuntimeException, xml::sax::SAXException)
{
- // TODO: Insert your implementation for "setDocumentLocator" here.
-}
-
-void OOXMLFastDocumentHandler::setStream(Stream * pStream)
-{
-#ifdef DEBUG_PROTOCOL
- mpTmpStream.reset(new StreamProtocol(pStream, debug_logger));
- mpStream = mpTmpStream.get();
-#else
- mpStream = pStream;
-#endif
-}
-
-void OOXMLFastDocumentHandler::setDocument(OOXMLDocument * pDocument)
-{
- mpDocument = pDocument;
-}
-
-void OOXMLFastDocumentHandler::setXNoteId(const sal_Int32 nXNoteId)
-{
- mnXNoteId = nXNoteId;
}
void OOXMLFastDocumentHandler::setIsSubstream( bool bSubstream )
{
- getContextHandler( )->getParserState( )->setInSectionGroup( bSubstream );
+ if ( mpStream != 0 && mpDocument != 0 )
+ {
+ getContextHandler( )->getParserState( )->setInSectionGroup( bSubstream );
+ }
}
}}
diff --git a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx
index 50f06321f02a..92723181ce3d 100644
--- a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx
+++ b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx
@@ -40,8 +40,11 @@ class OOXMLFastDocumentHandler:
xml::sax::XFastDocumentHandler>
{
public:
- OOXMLFastDocumentHandler
- (uno::Reference< uno::XComponentContext > const & context);
+ OOXMLFastDocumentHandler(
+ uno::Reference< uno::XComponentContext > const & context,
+ Stream* pStream,
+ OOXMLDocument* pDocument,
+ sal_Int32 nXNoteId );
virtual ~OOXMLFastDocumentHandler() {}
// ::com::sun::star::xml::sax::XFastDocumentHandler:
@@ -83,10 +86,6 @@ public:
virtual void SAL_CALL characters(const OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException);
- void setStream(Stream * pStream);
- void setDocument(OOXMLDocument * pDocument);
- void setXNoteId(const sal_Int32 nXNoteId);
-
void setIsSubstream( bool bSubstream );
private: