summaryrefslogtreecommitdiff
path: root/writerfilter/source/filter/ImportFilter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/filter/ImportFilter.cxx')
-rw-r--r--writerfilter/source/filter/ImportFilter.cxx245
1 files changed, 245 insertions, 0 deletions
diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx
new file mode 100644
index 000000000000..911689996b07
--- /dev/null
+++ b/writerfilter/source/filter/ImportFilter.cxx
@@ -0,0 +1,245 @@
+/*************************************************************************
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <osl/diagnose.h>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <comphelper/mediadescriptor.hxx>
+#include <oox/core/filterdetect.hxx>
+#include <dmapper/DomainMapper.hxx>
+#include <WriterFilter.hxx>
+#include <doctok/WW8Document.hxx>
+#include <ooxml/OOXMLDocument.hxx>
+#ifdef DEBUG_IMPORT
+#include <iostream>
+#include <osl/process.h>
+#endif
+
+#include <resourcemodel/TagLogger.hxx>
+using namespace ::rtl;
+using namespace ::com::sun::star;
+using ::comphelper::MediaDescriptor;
+
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool WriterFilter::filter( const uno::Sequence< beans::PropertyValue >& aDescriptor )
+ throw (uno::RuntimeException)
+{
+ if( m_xSrcDoc.is() )
+ {
+ uno::Reference< lang::XMultiServiceFactory > xMSF(m_xContext->getServiceManager(), uno::UNO_QUERY_THROW);
+ uno::Reference< uno::XInterface > xIfc( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.comp.Writer.DocxExport" ))), uno::UNO_QUERY_THROW);
+ if (!xIfc.is())
+ return sal_False;
+ uno::Reference< document::XExporter > xExprtr(xIfc, uno::UNO_QUERY_THROW);
+ uno::Reference< document::XFilter > xFltr(xIfc, uno::UNO_QUERY_THROW);
+ if (!xExprtr.is() || !xFltr.is())
+ return sal_False;
+ xExprtr->setSourceDocument(m_xSrcDoc);
+ return xFltr->filter(aDescriptor);
+ }
+ else if (m_xDstDoc.is())
+ {
+ MediaDescriptor aMediaDesc( aDescriptor );
+ OUString sFilterName = aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_FILTERNAME(), OUString() );
+
+ uno::Reference< io::XInputStream > xInputStream;
+ try
+ {
+ // use the oox.core.FilterDetect implementation to extract the decrypted ZIP package
+ uno::Reference< lang::XMultiServiceFactory > xFactory( m_xContext->getServiceManager(), uno::UNO_QUERY_THROW );
+ ::oox::core::FilterDetect aDetector( xFactory );
+ xInputStream = aDetector.extractUnencryptedPackage( aMediaDesc );
+ }
+ catch( uno::Exception& )
+ {
+ }
+
+ if ( !xInputStream.is() )
+ {
+ return sal_False;
+ }
+
+#ifdef DEBUG_ELEMENT
+ writerfilter::TagLogger::Pointer_t debugLogger
+ (writerfilter::TagLogger::getInstance("DEBUG"));
+ debugLogger->startDocument();
+
+ writerfilter::TagLogger::Pointer_t dmapperLogger
+ (writerfilter::TagLogger::getInstance("DOMAINMAPPER"));
+ dmapperLogger->startDocument();
+#endif
+
+ writerfilter::dmapper::SourceDocumentType eType =
+ (m_sFilterName.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "writer_MS_Word_2007" ) ) ||
+ m_sFilterName.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "writer_MS_Word_2007_Template" ) )) ?
+ writerfilter::dmapper::DOCUMENT_OOXML : writerfilter::dmapper::DOCUMENT_DOC;
+ writerfilter::Stream::Pointer_t pStream(new writerfilter::dmapper::DomainMapper(m_xContext, xInputStream, m_xDstDoc, eType));
+ //create the tokenizer and domain mapper
+ if( eType == writerfilter::dmapper::DOCUMENT_OOXML )
+ {
+ writerfilter::ooxml::OOXMLStream::Pointer_t pDocStream = writerfilter::ooxml::OOXMLDocumentFactory::createStream(m_xContext, xInputStream);
+ writerfilter::ooxml::OOXMLDocument::Pointer_t pDocument(writerfilter::ooxml::OOXMLDocumentFactory::createDocument(pDocStream));
+
+ uno::Reference<frame::XModel> xModel(m_xDstDoc, uno::UNO_QUERY_THROW);
+ pDocument->setModel(xModel);
+
+ uno::Reference<drawing::XDrawPageSupplier> xDrawings
+ (m_xDstDoc, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xDrawPage
+ (xDrawings->getDrawPage(), uno::UNO_SET_THROW);
+ pDocument->setDrawPage(xDrawPage);
+
+ pDocument->resolve(*pStream);
+ }
+ else
+ {
+ writerfilter::doctok::WW8Stream::Pointer_t pDocStream = writerfilter::doctok::WW8DocumentFactory::createStream(m_xContext, xInputStream);
+ writerfilter::doctok::WW8Document::Pointer_t pDocument(writerfilter::doctok::WW8DocumentFactory::createDocument(pDocStream));
+
+ pDocument->resolve(*pStream);
+ }
+
+#ifdef DEBUG_ELEMENT
+ writerfilter::TagLogger::dump("DOMAINMAPPER");
+ dmapperLogger->endDocument();
+ writerfilter::TagLogger::dump("DEBUG");
+ debugLogger->endDocument();
+#endif
+
+ return sal_True;
+ }
+ return sal_False;
+}
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void WriterFilter::cancel( ) throw (uno::RuntimeException)
+{
+}
+
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void WriterFilter::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc )
+ throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+ m_xDstDoc = xDoc;
+}
+
+void WriterFilter::setSourceDocument( const uno::Reference< lang::XComponent >& xDoc )
+ throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+ m_xSrcDoc = xDoc;
+}
+
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void WriterFilter::initialize( const uno::Sequence< uno::Any >& aArguments ) throw (uno::Exception, uno::RuntimeException)
+{
+ uno::Sequence < beans::PropertyValue > aAnySeq;
+ sal_Int32 nLength = aArguments.getLength();
+ if ( nLength && ( aArguments[0] >>= aAnySeq ) )
+ {
+ const beans::PropertyValue * pValue = aAnySeq.getConstArray();
+ nLength = aAnySeq.getLength();
+ for ( sal_Int32 i = 0 ; i < nLength; i++)
+ {
+ if ( pValue[i].Name.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "Type" ) ) )
+ {
+ pValue[i].Value >>= m_sFilterName;
+ break;
+ }
+ }
+ }
+}
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OUString WriterFilter_getImplementationName () throw (uno::RuntimeException)
+{
+ return OUString ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.comp.Writer.WriterFilter" ) );
+}
+
+#define SERVICE_NAME1 "com.sun.star.document.ImportFilter"
+#define SERVICE_NAME2 "com.sun.star.document.ExportFilter"
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool WriterFilter_supportsService( const OUString& ServiceName ) throw (uno::RuntimeException)
+{
+ return (ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME1 ) ) ||
+ ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME1 ) ));
+}
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > WriterFilter_getSupportedServiceNames( ) throw (uno::RuntimeException)
+{
+ uno::Sequence < OUString > aRet(2);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME1 ) );
+ pArray[1] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME2 ) );
+ return aRet;
+}
+#undef SERVICE_NAME1
+#undef SERVICE_NAME2
+
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< uno::XInterface > WriterFilter_createInstance( const uno::Reference< uno::XComponentContext >& xContext)
+ throw( uno::Exception )
+{
+ return (cppu::OWeakObject*) new WriterFilter( xContext );
+}
+
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OUString WriterFilter::getImplementationName( ) throw (uno::RuntimeException)
+{
+ return WriterFilter_getImplementationName();
+}
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool WriterFilter::supportsService( const OUString& rServiceName ) throw (uno::RuntimeException)
+{
+ return WriterFilter_supportsService( rServiceName );
+}
+/*-- 09.06.2006 10:15:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > WriterFilter::getSupportedServiceNames( ) throw (uno::RuntimeException)
+{
+ return WriterFilter_getSupportedServiceNames();
+}
+