Kaydet (Commit) d94bda0c authored tarafından Oliver-Rainer Wittmann's avatar Oliver-Rainer Wittmann Kaydeden (comit) Caolán McNamara

Correct the XML document handler...

which is used to parse Microsoft Word OOXML documents in case of unknown XML
elements

(cherry picked from commit 22e33484)

Conflicts:
	writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
	writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
	writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx

Change-Id: Ibcd3e808abfb35291bb04aa10190a7800f0837fa
üst 7a878f9c
...@@ -66,10 +66,8 @@ void OOXMLDocumentImpl::resolveFastSubStream(Stream & rStreamHandler, ...@@ -66,10 +66,8 @@ void OOXMLDocumentImpl::resolveFastSubStream(Stream & rStreamHandler,
{ {
uno::Reference<uno::XComponentContext> xContext(mpStream->getContext()); uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
OOXMLFastDocumentHandler * pDocHandler = OOXMLFastDocumentHandler * pDocHandler =
new OOXMLFastDocumentHandler(xContext); new OOXMLFastDocumentHandler(
pDocHandler->setStream(&rStreamHandler); xContext, &rStreamHandler, this, mnXNoteId );
pDocHandler->setDocument(this);
pDocHandler->setXNoteId(mnXNoteId);
uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler
(pDocHandler); (pDocHandler);
...@@ -317,10 +315,8 @@ void OOXMLDocumentImpl::resolve(Stream & rStream) ...@@ -317,10 +315,8 @@ void OOXMLDocumentImpl::resolve(Stream & rStream)
uno::Reference<uno::XComponentContext> xContext(mpStream->getContext()); uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
OOXMLFastDocumentHandler * pDocHandler = OOXMLFastDocumentHandler * pDocHandler =
new OOXMLFastDocumentHandler(xContext); new OOXMLFastDocumentHandler(
pDocHandler->setStream(&rStream); xContext, &rStream, this, mnXNoteId );
pDocHandler->setDocument(this);
pDocHandler->setXNoteId(mnXNoteId);
pDocHandler->setIsSubstream( mbIsSubstream ); pDocHandler->setIsSubstream( mbIsSubstream );
uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler
(pDocHandler); (pDocHandler);
......
...@@ -1340,9 +1340,6 @@ void OOXMLFastContextHandlerProperties::lcl_endFastElement ...@@ -1340,9 +1340,6 @@ void OOXMLFastContextHandlerProperties::lcl_endFastElement
{ {
if (isForwardEvents()) if (isForwardEvents())
{ {
SAL_WARN_IF(!mpStream, "writerfilter", "no stream to set properties on");
if (!mpStream)
return;
mpStream->props(mpPropertySet); mpStream->props(mpPropertySet);
} }
} }
......
...@@ -35,10 +35,28 @@ using namespace ::com::sun::star; ...@@ -35,10 +35,28 @@ using namespace ::com::sun::star;
using namespace ::std; using namespace ::std;
OOXMLFastDocumentHandler::OOXMLFastDocumentHandler OOXMLFastDocumentHandler::OOXMLFastDocumentHandler(
(uno::Reference< uno::XComponentContext > const & context) uno::Reference< uno::XComponentContext > const & context,
: m_xContext(context), mpStream(0), mpDocument(0) 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: // ::com::sun::star::xml::sax::XFastContextHandler:
void SAL_CALL OOXMLFastDocumentHandler::startFastElement void SAL_CALL OOXMLFastDocumentHandler::startFastElement
...@@ -141,6 +159,13 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ...@@ -141,6 +159,13 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
<< endl; << endl;
#endif #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); return OOXMLFactory::getInstance()->createFastChildContextFromStart(getContextHandler().get(), Element);
} }
...@@ -167,13 +192,12 @@ Name ...@@ -167,13 +192,12 @@ Name
#endif #endif
return uno::Reference< xml::sax::XFastContextHandler > 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*/) void SAL_CALL OOXMLFastDocumentHandler::characters(const OUString & /*aChars*/)
throw (uno::RuntimeException, xml::sax::SAXException) throw (uno::RuntimeException, xml::sax::SAXException)
{ {
// TODO: Insert your implementation for "characters" here.
} }
// ::com::sun::star::xml::sax::XFastDocumentHandler: // ::com::sun::star::xml::sax::XFastDocumentHandler:
...@@ -191,32 +215,14 @@ void SAL_CALL OOXMLFastDocumentHandler::setDocumentLocator ...@@ -191,32 +215,14 @@ void SAL_CALL OOXMLFastDocumentHandler::setDocumentLocator
(const uno::Reference< xml::sax::XLocator > & /*xLocator*/) (const uno::Reference< xml::sax::XLocator > & /*xLocator*/)
throw (uno::RuntimeException, xml::sax::SAXException) 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 ) void OOXMLFastDocumentHandler::setIsSubstream( bool bSubstream )
{ {
getContextHandler( )->getParserState( )->setInSectionGroup( bSubstream ); if ( mpStream != 0 && mpDocument != 0 )
{
getContextHandler( )->getParserState( )->setInSectionGroup( bSubstream );
}
} }
}} }}
......
...@@ -40,8 +40,11 @@ class OOXMLFastDocumentHandler: ...@@ -40,8 +40,11 @@ class OOXMLFastDocumentHandler:
xml::sax::XFastDocumentHandler> xml::sax::XFastDocumentHandler>
{ {
public: public:
OOXMLFastDocumentHandler OOXMLFastDocumentHandler(
(uno::Reference< uno::XComponentContext > const & context); uno::Reference< uno::XComponentContext > const & context,
Stream* pStream,
OOXMLDocument* pDocument,
sal_Int32 nXNoteId );
virtual ~OOXMLFastDocumentHandler() {} virtual ~OOXMLFastDocumentHandler() {}
// ::com::sun::star::xml::sax::XFastDocumentHandler: // ::com::sun::star::xml::sax::XFastDocumentHandler:
...@@ -83,10 +86,6 @@ public: ...@@ -83,10 +86,6 @@ public:
virtual void SAL_CALL characters(const OUString & aChars) virtual void SAL_CALL characters(const OUString & aChars)
throw (uno::RuntimeException, xml::sax::SAXException); throw (uno::RuntimeException, xml::sax::SAXException);
void setStream(Stream * pStream);
void setDocument(OOXMLDocument * pDocument);
void setXNoteId(const sal_Int32 nXNoteId);
void setIsSubstream( bool bSubstream ); void setIsSubstream( bool bSubstream );
private: private:
......
...@@ -125,9 +125,6 @@ OOXMLDocument * OOXMLParserState::getDocument() const ...@@ -125,9 +125,6 @@ OOXMLDocument * OOXMLParserState::getDocument() const
void OOXMLParserState::setXNoteId(const sal_Int32 nId) void OOXMLParserState::setXNoteId(const sal_Int32 nId)
{ {
SAL_WARN_IF(!mpDocument, "writerfilter", "no document to set note id on");
if (!mpDocument)
return;
mpDocument->setXNoteId(nId); mpDocument->setXNoteId(nId);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment