summaryrefslogtreecommitdiff
path: root/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/ooxml/OOXMLDocumentImpl.cxx')
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.cxx389
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);
+}
+
+}}