/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include #include #include #include #include "OOXMLDocumentImpl.hxx" #include "OOXMLBinaryObjectReference.hxx" #include "OOXMLFastDocumentHandler.hxx" #include "OOXMLPropertySetImpl.hxx" #include "ooxmlLoggers.hxx" #include using ::com::sun::star::xml::sax::SAXException; namespace writerfilter { namespace ooxml { #ifdef DEBUG TagLogger::Pointer_t debug_logger(TagLogger::getInstance("DEBUG")); #endif using namespace ::std; OOXMLDocumentImpl::OOXMLDocumentImpl (OOXMLStream::Pointer_t pStream) : mpStream(pStream), mXNoteType(0), mbIsSubstream( false ) { } OOXMLDocumentImpl::~OOXMLDocumentImpl() { } void OOXMLDocumentImpl::resolveFastSubStream(Stream & rStreamHandler, OOXMLStream::StreamType_t nType) { OOXMLStream::Pointer_t pStream (OOXMLDocumentFactory::createStream(mpStream, nType)); uno::Reference< xml::sax::XFastParser > xParser (mpStream->getFastParser()); if (xParser.is()) { uno::Reference xContext(mpStream->getContext()); OOXMLFastDocumentHandler * pDocHandler = new OOXMLFastDocumentHandler(xContext); pDocHandler->setStream(&rStreamHandler); pDocHandler->setDocument(this); pDocHandler->setXNoteId(msXNoteId); uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler (pDocHandler); uno::Reference < xml::sax::XFastTokenHandler > xTokenHandler (mpStream->getFastTokenHandler(xContext)); xParser->setFastDocumentHandler(xDocumentHandler); xParser->setTokenHandler(xTokenHandler); uno::Reference xInputStream = pStream->getDocumentStream(); if (xInputStream.is()) { struct xml::sax::InputSource oInputSource; oInputSource.aInputStream = xInputStream; xParser->parseStream(oInputSource); xInputStream->closeInput(); } } } void OOXMLDocumentImpl::resolveFastSubStreamWithId(Stream & rStream, writerfilter::Reference::Pointer_t pStream, sal_uInt32 nId) { rStream.substream(nId, pStream); } void OOXMLDocumentImpl::setXNoteId(const rtl::OUString & rId) { msXNoteId = rId; } const rtl::OUString & OOXMLDocumentImpl::getXNoteId() const { return msXNoteId; } void OOXMLDocumentImpl::setXNoteType(const Id & nId) { mXNoteType = nId; } const Id & OOXMLDocumentImpl::getXNoteType() const { return mXNoteType; } const ::rtl::OUString & OOXMLDocumentImpl::getTarget() const { return mpStream->getTarget(); } writerfilter::Reference::Pointer_t OOXMLDocumentImpl::getSubStream(const rtl::OUString & rId) { OOXMLStream::Pointer_t pStream (OOXMLDocumentFactory::createStream(mpStream, rId)); OOXMLDocumentImpl * pTemp; writerfilter::Reference::Pointer_t pRet( pTemp = new OOXMLDocumentImpl(pStream) ); pTemp->setModel(mxModel); pTemp->setDrawPage(mxDrawPage); pTemp->setIsSubstream( true ); return pRet; } writerfilter::Reference::Pointer_t OOXMLDocumentImpl::getXNoteStream(OOXMLStream::StreamType_t nType, const Id & rType, const rtl::OUString & rId) { #ifdef DEBUG_ELEMENT debug_logger->startElement("getXNoteStream"); debug_logger->attribute("id", rId); debug_logger->endElement("getXNoteStream"); #endif OOXMLStream::Pointer_t pStream = (OOXMLDocumentFactory::createStream(mpStream, nType)); OOXMLDocumentImpl * pDocument = new OOXMLDocumentImpl(pStream); pDocument->setXNoteId(rId); pDocument->setXNoteType(rType); return writerfilter::Reference::Pointer_t(pDocument); } void OOXMLDocumentImpl::resolveFootnote(Stream & rStream, const Id & rType, const rtl::OUString & rNoteId) { writerfilter::Reference::Pointer_t pStream = getXNoteStream(OOXMLStream::FOOTNOTES, rType, rNoteId); Id nId; switch (rType) { case NS_ooxml::LN_Value_wordprocessingml_ST_FtnEdn_separator: case NS_ooxml::LN_Value_wordprocessingml_ST_FtnEdn_continuationSeparator: nId = rType; break; default: nId = NS_rtf::LN_footnote; break; } resolveFastSubStreamWithId(rStream, pStream, nId); } void OOXMLDocumentImpl::resolveEndnote(Stream & rStream, const Id & rType, const rtl::OUString & rNoteId) { writerfilter::Reference::Pointer_t pStream = getXNoteStream(OOXMLStream::ENDNOTES, rType, rNoteId); Id nId; switch (rType) { case NS_ooxml::LN_Value_wordprocessingml_ST_FtnEdn_separator: case NS_ooxml::LN_Value_wordprocessingml_ST_FtnEdn_continuationSeparator: nId = rType; break; default: nId = NS_rtf::LN_endnote; break; } resolveFastSubStreamWithId(rStream, pStream, nId); } void OOXMLDocumentImpl::resolveComment(Stream & rStream, const rtl::OUString & rId) { writerfilter::Reference::Pointer_t pStream = getXNoteStream(OOXMLStream::COMMENTS, 0, rId); resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_annotation); } OOXMLPropertySet * OOXMLDocumentImpl::getPicturePropSet (const ::rtl::OUString & rId) { OOXMLStream::Pointer_t pStream (OOXMLDocumentFactory::createStream(mpStream, rId)); writerfilter::Reference::Pointer_t pPicture (new OOXMLBinaryObjectReference(pStream)); OOXMLValue::Pointer_t pPayloadValue(new OOXMLBinaryValue(pPicture)); OOXMLProperty::Pointer_t pPayloadProperty (new OOXMLPropertyImpl(NS_rtf::LN_payload, pPayloadValue, OOXMLPropertyImpl::ATTRIBUTE)); OOXMLPropertySet::Pointer_t pBlipSet(new OOXMLPropertySetImpl()); pBlipSet->add(pPayloadProperty); OOXMLValue::Pointer_t pBlipValue(new OOXMLPropertySetValue(pBlipSet)); OOXMLProperty::Pointer_t pBlipProperty (new OOXMLPropertyImpl(NS_rtf::LN_blip, pBlipValue, OOXMLPropertyImpl::ATTRIBUTE)); OOXMLPropertySet * pProps = new OOXMLPropertySetImpl(); pProps->add(pBlipProperty); return pProps; } void OOXMLDocumentImpl::resolvePicture(Stream & rStream, const rtl::OUString & rId) { OOXMLPropertySet * pProps = getPicturePropSet(rId); rStream.props(writerfilter::Reference::Pointer_t(pProps)); } ::rtl::OUString OOXMLDocumentImpl::getTargetForId(const ::rtl::OUString & rId) { return mpStream->getTargetForId(rId); } void OOXMLDocumentImpl::resolveHeader(Stream & rStream, const sal_Int32 type, const rtl::OUString & rId) { writerfilter::Reference::Pointer_t pStream = getSubStream(rId); switch (type) { case NS_ooxml::LN_Value_ST_HrdFtr_even: resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_headerl); break; case NS_ooxml::LN_Value_ST_HrdFtr_default: // here we assume that default is right, but not necessarily true :-( resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_headerr); break; case NS_ooxml::LN_Value_ST_HrdFtr_first: resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_headerf); break; default: break; } } void OOXMLDocumentImpl::resolveFooter(Stream & rStream, const sal_Int32 type, const rtl::OUString & rId) { writerfilter::Reference::Pointer_t pStream = getSubStream(rId); switch (type) { case NS_ooxml::LN_Value_ST_HrdFtr_even: resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_footerl); break; case NS_ooxml::LN_Value_ST_HrdFtr_default: // here we assume that default is right, but not necessarily true :-( resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_footerr); break; case NS_ooxml::LN_Value_ST_HrdFtr_first: resolveFastSubStreamWithId(rStream, pStream, NS_rtf::LN_footerf); break; default: break; } } void OOXMLDocumentImpl::resolve(Stream & rStream) { #ifdef DEBUG_RESOLVE debug_logger->startElement("OOXMLDocumentImpl.resolve"); #endif uno::Reference< xml::sax::XFastParser > xParser (mpStream->getFastParser()); if (xParser.is()) { uno::Reference xContext(mpStream->getContext()); OOXMLFastDocumentHandler * pDocHandler = new OOXMLFastDocumentHandler(xContext); pDocHandler->setStream(&rStream); pDocHandler->setDocument(this); pDocHandler->setXNoteId(msXNoteId); pDocHandler->setIsSubstream( mbIsSubstream ); uno::Reference < xml::sax::XFastDocumentHandler > xDocumentHandler (pDocHandler); uno::Reference < xml::sax::XFastTokenHandler > xTokenHandler (mpStream->getFastTokenHandler(xContext)); resolveFastSubStream(rStream, OOXMLStream::SETTINGS); resolveFastSubStream(rStream, OOXMLStream::THEME); resolveFastSubStream(rStream, OOXMLStream::FONTTABLE); resolveFastSubStream(rStream, OOXMLStream::STYLES); resolveFastSubStream(rStream, OOXMLStream::NUMBERING); xParser->setFastDocumentHandler( xDocumentHandler ); xParser->setTokenHandler( xTokenHandler ); xml::sax::InputSource aParserInput; aParserInput.aInputStream = mpStream->getDocumentStream(); try { xParser->parseStream(aParserInput); } catch (...) { #ifdef DEBUG_ELEMENT debug_logger->element("exception"); #endif } } #ifdef DEBUG_RESOLVE debug_logger->endElement("OOXMLDocumentImpl.resolve"); #endif } uno::Reference OOXMLDocumentImpl::getInputStreamForId(const ::rtl::OUString & rId) { OOXMLStream::Pointer_t pStream(OOXMLDocumentFactory::createStream(mpStream, rId)); return pStream->getDocumentStream(); } string OOXMLDocumentImpl::getType() const { return "OOXMLDocumentImpl"; } void OOXMLDocumentImpl::setModel(uno::Reference xModel) { mxModel.set(xModel); } uno::Reference OOXMLDocumentImpl::getModel() { return mxModel; } void OOXMLDocumentImpl::setDrawPage(uno::Reference xDrawPage) { mxDrawPage.set(xDrawPage); } uno::Reference OOXMLDocumentImpl::getDrawPage() { return mxDrawPage; } uno::Reference OOXMLDocumentImpl::getInputStream() { return mpStream->getDocumentStream(); } uno::Reference OOXMLDocumentImpl::getStorageStream() { return mpStream->getStorageStream(); } void OOXMLDocumentImpl::setShapeContext( uno::Reference xContext ) { mxShapeContext = xContext; } uno::Reference OOXMLDocumentImpl::getShapeContext( ) { return mxShapeContext; } OOXMLDocument * OOXMLDocumentFactory::createDocument (OOXMLStream::Pointer_t pStream) { return new OOXMLDocumentImpl(pStream); } }}