diff options
Diffstat (limited to 'writerfilter/source/ooxml/OOXMLDocumentImpl.cxx')
-rw-r--r-- | writerfilter/source/ooxml/OOXMLDocumentImpl.cxx | 389 |
1 files changed, 389 insertions, 0 deletions
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx new file mode 100644 index 000000000000..fef00e4cef43 --- /dev/null +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx @@ -0,0 +1,389 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OOXMLDocumentImpl.cxx,v $ + * $Revision: 1.19 $ + * + * 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 + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <com/sun/star/xml/sax/XParser.hpp> + +#include <doctok/resourceids.hxx> +#include <ooxml/resourceids.hxx> +#include "OOXMLDocumentImpl.hxx" +#include "OOXMLBinaryObjectReference.hxx" +#include "OOXMLFastDocumentHandler.hxx" +#include "OOXMLPropertySetImpl.hxx" +#include "ooxmlLoggers.hxx" + +#include <iostream> + +namespace writerfilter { +namespace ooxml +{ +TagLogger::Pointer_t debug_logger(TagLogger::getInstance("DEBUG")); +using namespace ::std; + +OOXMLDocumentImpl::OOXMLDocumentImpl +(OOXMLStream::Pointer_t pStream) +: mpStream(pStream), mXNoteType(0) +{ +} + +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<uno::XComponentContext> 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<io::XInputStream> 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<Stream>::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<Stream>::Pointer_t +OOXMLDocumentImpl::getSubStream(const rtl::OUString & rId) +{ + OOXMLStream::Pointer_t pStream + (OOXMLDocumentFactory::createStream(mpStream, rId)); + + OOXMLDocumentImpl * pTemp; + writerfilter::Reference<Stream>::Pointer_t pRet( pTemp = new OOXMLDocumentImpl(pStream) ); + pTemp->setModel(mxModel); + pTemp->setDrawPage(mxDrawPage); + return pRet; +} + +writerfilter::Reference<Stream>::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<Stream>::Pointer_t(pDocument); +} + +void OOXMLDocumentImpl::resolveFootnote(Stream & rStream, + const Id & rType, + const rtl::OUString & rNoteId) +{ + writerfilter::Reference<Stream>::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<Stream>::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<Stream>::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<BinaryObj>::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<Properties>::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<Stream>::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<Stream>::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) +{ + uno::Reference< xml::sax::XFastParser > xParser + (mpStream->getFastParser()); + + if (xParser.is()) + { + uno::Reference<uno::XComponentContext> xContext(mpStream->getContext()); + + OOXMLFastDocumentHandler * pDocHandler = + new OOXMLFastDocumentHandler(xContext); + pDocHandler->setStream(&rStream); + pDocHandler->setDocument(this); + pDocHandler->setXNoteId(msXNoteId); + 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::NUMBERING); + resolveFastSubStream(rStream, OOXMLStream::FONTTABLE); + resolveFastSubStream(rStream, OOXMLStream::STYLES); + + xParser->setFastDocumentHandler( xDocumentHandler ); + xParser->setTokenHandler( xTokenHandler ); + + xml::sax::InputSource aParserInput; + aParserInput.aInputStream = mpStream->getDocumentStream(); + xParser->parseStream(aParserInput); + } +} + +uno::Reference<io::XInputStream> 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<frame::XModel> xModel) +{ + mxModel.set(xModel); +} + +uno::Reference<frame::XModel> OOXMLDocumentImpl::getModel() +{ + return mxModel; +} + +void OOXMLDocumentImpl::setDrawPage(uno::Reference<drawing::XDrawPage> xDrawPage) +{ + mxDrawPage.set(xDrawPage); +} + +uno::Reference<drawing::XDrawPage> OOXMLDocumentImpl::getDrawPage() +{ + return mxDrawPage; +} + +uno::Reference<io::XInputStream> OOXMLDocumentImpl::getInputStream() +{ + return mpStream->getDocumentStream(); +} + +uno::Reference<io::XInputStream> OOXMLDocumentImpl::getStorageStream() +{ + return mpStream->getStorageStream(); +} + +OOXMLDocument * +OOXMLDocumentFactory::createDocument +(OOXMLStream::Pointer_t pStream) +{ + return new OOXMLDocumentImpl(pStream); +} + +}} |