diff options
author | osnola <alonso@loria.fr> | 2014-10-17 09:29:45 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2014-10-20 14:47:57 +0200 |
commit | 3a6e9fb87355f72b7bedc07b2da9bda9433af38e (patch) | |
tree | d325f2dbc7f19f04b332198b8a36707111cdd873 /writerperfect | |
parent | 9df18fd92c0eb3153576f60b4b95a8cf96469eef (diff) |
Add a filter for AppleWork's presentation file...
Change-Id: I9f03ecc6d67ad77ccb0d5240fe0b5968c8063bd3
Diffstat (limited to 'writerperfect')
-rw-r--r-- | writerperfect/Library_wpftimpress.mk | 3 | ||||
-rw-r--r-- | writerperfect/source/impress/ImportFilterBase.cxx | 248 | ||||
-rw-r--r-- | writerperfect/source/impress/ImportFilterBase.hxx | 113 | ||||
-rw-r--r-- | writerperfect/source/impress/KeynoteImportFilter.cxx | 156 | ||||
-rw-r--r-- | writerperfect/source/impress/KeynoteImportFilter.hxx | 41 | ||||
-rw-r--r-- | writerperfect/source/impress/MWAWPresentationImportFilter.cxx | 181 | ||||
-rw-r--r-- | writerperfect/source/impress/MWAWPresentationImportFilter.hxx | 53 | ||||
-rw-r--r-- | writerperfect/source/impress/wpftimpress.component | 4 | ||||
-rw-r--r-- | writerperfect/source/impress/wpftimpress_genericfilter.cxx | 7 |
9 files changed, 626 insertions, 180 deletions
diff --git a/writerperfect/Library_wpftimpress.mk b/writerperfect/Library_wpftimpress.mk index 39ef718d1e74..2d82d70c4689 100644 --- a/writerperfect/Library_wpftimpress.mk +++ b/writerperfect/Library_wpftimpress.mk @@ -40,6 +40,7 @@ $(eval $(call gb_Library_use_libraries,wpftimpress,\ $(eval $(call gb_Library_use_externals,wpftimpress,\ boost_headers \ etonyek \ + mwaw \ odfgen \ revenge \ zlib \ @@ -47,7 +48,9 @@ $(eval $(call gb_Library_use_externals,wpftimpress,\ )) $(eval $(call gb_Library_add_exception_objects,wpftimpress,\ + writerperfect/source/impress/ImportFilterBase \ writerperfect/source/impress/KeynoteImportFilter \ + writerperfect/source/impress/MWAWPresentationImportFilter \ writerperfect/source/impress/wpftimpress_genericfilter \ )) diff --git a/writerperfect/source/impress/ImportFilterBase.cxx b/writerperfect/source/impress/ImportFilterBase.cxx new file mode 100644 index 000000000000..f16c201377cd --- /dev/null +++ b/writerperfect/source/impress/ImportFilterBase.cxx @@ -0,0 +1,248 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <boost/shared_ptr.hpp> + +#include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/io/XSeekable.hpp> +#include <com/sun/star/ucb/XCommandEnvironment.hpp> +#include <com/sun/star/ucb/XContent.hpp> +#include <com/sun/star/uno/Reference.h> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/xml/sax/XAttributeList.hpp> +#include <com/sun/star/xml/sax/XDocumentHandler.hpp> +#include <com/sun/star/xml/sax/InputSource.hpp> +#include <com/sun/star/xml/sax/XParser.hpp> + +#include <writerperfect/DirectoryStream.hxx> +#include <writerperfect/DocumentHandler.hxx> +#include <writerperfect/WPXSvInputStream.hxx> + +#include <xmloff/attrlist.hxx> + +#include <libodfgen/libodfgen.hxx> + +#include "ImportFilterBase.hxx" + +using boost::shared_ptr; + +namespace writerperfect +{ +namespace presentation +{ + +using com::sun::star::uno::Reference; +using com::sun::star::io::XInputStream; +using com::sun::star::io::XSeekable; +using com::sun::star::uno::Sequence; +using com::sun::star::uno::Any; +using com::sun::star::uno::UNO_QUERY; +using com::sun::star::uno::XInterface; +using com::sun::star::uno::Exception; +using com::sun::star::uno::RuntimeException; +using com::sun::star::beans::PropertyValue; +using com::sun::star::document::XFilter; +using com::sun::star::document::XExtendedFilterDetection; +using com::sun::star::document::XImporter; +using com::sun::star::xml::sax::InputSource; +using com::sun::star::xml::sax::XAttributeList; +using com::sun::star::xml::sax::XDocumentHandler; +using com::sun::star::xml::sax::XParser; + +using writerperfect::DocumentHandler; +using writerperfect::WPXSvInputStream; + +namespace +{ + +template<class T> +bool lcl_queryIsPackage(const Sequence<T> &lComponentData) +{ + bool bIsPackage = false; + + const sal_Int32 nLength = lComponentData.getLength(); + const T *pValue = lComponentData.getConstArray(); + for (sal_Int32 i = 0; i < nLength; ++i) + { + if (pValue[i].Name == "IsPackage") + { + pValue[i].Value >>= bIsPackage; + break; + } + } + + return bIsPackage; +} + +bool lcl_isPackage(const Any &rComponentData) +{ + Sequence < ::com::sun::star::beans::NamedValue > lComponentDataNV; + Sequence < ::com::sun::star::beans::PropertyValue > lComponentDataPV; + + if (rComponentData >>= lComponentDataNV) + return lcl_queryIsPackage(lComponentDataNV); + else if (rComponentData >>= lComponentDataPV) + return lcl_queryIsPackage(lComponentDataPV); + + return false; +} +} + +ImportFilterImpl::ImportFilterImpl(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > &rxContext) + : mxContext(rxContext) +{ +} + +ImportFilterImpl::~ImportFilterImpl() +{ +} + +sal_Bool SAL_CALL ImportFilterImpl::filter(const Sequence< ::com::sun::star::beans::PropertyValue > &aDescriptor) +throw (RuntimeException, std::exception) +{ + sal_Int32 nLength = aDescriptor.getLength(); + const PropertyValue *pValue = aDescriptor.getConstArray(); + Reference < XInputStream > xInputStream; + Reference < ::com::sun::star::ucb::XContent > xContent; + bool bIsPackage = false; + for (sal_Int32 i = 0 ; i < nLength; i++) + { + if (pValue[i].Name == "ComponentData") + bIsPackage = lcl_isPackage(pValue[i].Value); + else if (pValue[i].Name == "InputStream") + pValue[i].Value >>= xInputStream; + else if (pValue[i].Name == "UCBContent") + pValue[i].Value >>= xContent; + } + + if (!xInputStream.is()) + { + OSL_ASSERT(false); + return sal_False; + } + + if (bIsPackage && !xContent.is()) + { + SAL_WARN("writerperfect", "presentation::ImportFilterImpl::filter: the input claims to be a package, but does not have UCBContent"); + bIsPackage = false; + } + + // An XML import service: what we push sax messages to.. + Reference < XDocumentHandler > xInternalHandler( + mxContext->getServiceManager()->createInstanceWithContext( + "com.sun.star.comp.Impress.XMLOasisImporter", mxContext), + css::uno::UNO_QUERY_THROW); + + // The XImporter sets up an empty target document for XDocumentHandler to write to.. + Reference < XImporter > xImporter(xInternalHandler, UNO_QUERY); + xImporter->setTargetDocument(mxDoc); + + // OO Graphics Handler: abstract class to handle document SAX messages, concrete implementation here + // writes to in-memory target doc + DocumentHandler xHandler(xInternalHandler); + + shared_ptr< librevenge::RVNGInputStream > input; + if (bIsPackage) + input.reset(new writerperfect::DirectoryStream(xContent)); + else + input.reset(new WPXSvInputStream(xInputStream)); + + OdpGenerator exporter; + exporter.addDocumentHandler(&xHandler, ODF_FLAT_XML); + + doRegisterHandlers(exporter); + + bool result=doImportDocument(*input, exporter); + return result; +} + +void SAL_CALL ImportFilterImpl::cancel() +throw (RuntimeException, std::exception) +{ +} + +// XImporter +void SAL_CALL ImportFilterImpl::setTargetDocument(const Reference< ::com::sun::star::lang::XComponent > &xDoc) +throw (::com::sun::star::lang::IllegalArgumentException, RuntimeException, std::exception) +{ + mxDoc = xDoc; +} + +// XExtendedFilterDetection +OUString SAL_CALL ImportFilterImpl::detect(com::sun::star::uno::Sequence< PropertyValue > &Descriptor) +throw(com::sun::star::uno::RuntimeException, std::exception) +{ + OUString sTypeName; + sal_Int32 nLength = Descriptor.getLength(); + sal_Int32 location = nLength; + const PropertyValue *pValue = Descriptor.getConstArray(); + Reference < XInputStream > xInputStream; + for (sal_Int32 i = 0 ; i < nLength; i++) + { + if (pValue[i].Name == "TypeName") + location=i; + else if (pValue[i].Name == "InputStream") + pValue[i].Value >>= xInputStream; + } + + if (!xInputStream.is()) + return OUString(); + + WPXSvInputStream input(xInputStream); + + if (doDetectFormat(input, sTypeName)) + { + assert(!sTypeName.isEmpty()); + + if (location == nLength) + { + Descriptor.realloc(nLength+1); + Descriptor[location].Name = "TypeName"; + } + + Descriptor[location].Value <<=sTypeName; + } + return sTypeName; +} + + +// XInitialization +void SAL_CALL ImportFilterImpl::initialize(const Sequence< Any > &aArguments) +throw (Exception, RuntimeException, std::exception) +{ + Sequence < PropertyValue > aAnySeq; + sal_Int32 nLength = aArguments.getLength(); + if (nLength && (aArguments[0] >>= aAnySeq)) + { + const PropertyValue *pValue = aAnySeq.getConstArray(); + nLength = aAnySeq.getLength(); + for (sal_Int32 i = 0 ; i < nLength; i++) + { + if (pValue[i].Name == "Type") + { + pValue[i].Value >>= msFilterName; + break; + } + } + } +} + +bool ImportFilterImpl::doDetectFormat(librevenge::RVNGInputStream &, OUString &) +{ + SAL_WARN("writerperfect", "presentation::ImportFilterImpl::doDetectFormat must not be called"); + return false; +} +void ImportFilterImpl::doRegisterHandlers(OdpGenerator &) +{ +} + +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/impress/ImportFilterBase.hxx b/writerperfect/source/impress/ImportFilterBase.hxx new file mode 100644 index 000000000000..e3ca4a861084 --- /dev/null +++ b/writerperfect/source/impress/ImportFilterBase.hxx @@ -0,0 +1,113 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_IMPORTFILTERBASE_HXX +#define INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_IMPORTFILTERBASE_HXX + +#include <librevenge/librevenge.h> + +#include <librevenge-stream/librevenge-stream.h> + +#include <com/sun/star/document/XFilter.hpp> +#include <com/sun/star/document/XImporter.hpp> +#include <com/sun/star/document/XExtendedFilterDetection.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/implbase4.hxx> + +namespace com +{ +namespace sun +{ +namespace star +{ +namespace beans +{ +struct PropertyValue; +} +namespace lang +{ +class XComponent; +} +namespace uno +{ +class XComponentContext; +} +namespace xml +{ +namespace sax +{ +class XDocumentHandler; +} +} +} +} +} + +class OdpGenerator; + +namespace writerperfect +{ +namespace presentation +{ + +/* This component will be instantiated for both import or export. Whether it calls + * setSourceDocument or setTargetDocument determines which Impl function the filter + * member calls */ +class ImportFilterImpl : public cppu::WeakImplHelper4 + < + com::sun::star::document::XFilter, + com::sun::star::document::XImporter, + com::sun::star::document::XExtendedFilterDetection, + com::sun::star::lang::XInitialization + > +{ +public: + ImportFilterImpl(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > &rxContext); + virtual ~ImportFilterImpl(); + + // XFilter + virtual sal_Bool SAL_CALL filter(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > &aDescriptor) + throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual void SAL_CALL cancel() + throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + + // XImporter + virtual void SAL_CALL setTargetDocument(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > &xDoc) + throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + + //XExtendedFilterDetection + virtual OUString SAL_CALL detect(com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > &Descriptor) + throw(com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + + // XInitialization + virtual void SAL_CALL initialize(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > &aArguments) + throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + +private: + virtual bool doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName); + virtual bool doImportDocument(librevenge::RVNGInputStream &rInput, librevenge::RVNGPresentationInterface &rGenerator) = 0; + virtual void doRegisterHandlers(OdpGenerator &rGenerator); + +private: + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mxContext; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > mxDoc; + OUString msFilterName; + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > mxHandler; +}; + +/** A base class for import filters. + */ +typedef cppu::ImplInheritanceHelper1<ImportFilterImpl, com::sun::star::lang::XServiceInfo> ImportFilterBase; + +} +} + +#endif // INCLUDED_WRITERPERFECT_SOURCE_DRAW_IMPORTFILTERBASE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/impress/KeynoteImportFilter.cxx b/writerperfect/source/impress/KeynoteImportFilter.cxx index 15c08d0e13ec..efd5ee2ed510 100644 --- a/writerperfect/source/impress/KeynoteImportFilter.cxx +++ b/writerperfect/source/impress/KeynoteImportFilter.cxx @@ -9,19 +9,15 @@ #include <boost/shared_ptr.hpp> #include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/container/XChild.hpp> #include <com/sun/star/io/XInputStream.hpp> -#include <com/sun/star/ucb/XCommandEnvironment.hpp> -#include <com/sun/star/ucb/XContent.hpp> -#include <com/sun/star/xml/sax/XAttributeList.hpp> -#include <com/sun/star/xml/sax/XDocumentHandler.hpp> -#include <com/sun/star/xml/sax/InputSource.hpp> -#include <com/sun/star/xml/sax/XParser.hpp> -#include <com/sun/star/io/XSeekable.hpp> #include <com/sun/star/uno/Reference.h> +#include <com/sun/star/ucb/XContent.hpp> #include <comphelper/processfactory.hxx> #include <comphelper/types.hxx> #include <cppuhelper/supportsservice.hxx> + #include <iostream> #include <libetonyek/libetonyek.h> #include <libodfgen/libodfgen.hxx> @@ -39,24 +35,15 @@ using boost::shared_ptr; -using namespace ::com::sun::star::uno; -using com::sun::star::uno::Reference; using com::sun::star::io::XInputStream; -using com::sun::star::io::XSeekable; -using com::sun::star::uno::Sequence; using com::sun::star::uno::Any; -using com::sun::star::uno::UNO_QUERY; -using com::sun::star::uno::XInterface; using com::sun::star::uno::Exception; +using com::sun::star::uno::Reference; using com::sun::star::uno::RuntimeException; -using com::sun::star::beans::PropertyValue; -using com::sun::star::document::XFilter; -using com::sun::star::document::XExtendedFilterDetection; -using com::sun::star::document::XImporter; -using com::sun::star::xml::sax::InputSource; -using com::sun::star::xml::sax::XAttributeList; -using com::sun::star::xml::sax::XDocumentHandler; -using com::sun::star::xml::sax::XParser; +using com::sun::star::uno::Sequence; +using com::sun::star::uno::UNO_QUERY; +using com::sun::star::uno::XComponentContext; +using com::sun::star::uno::XInterface; using writerperfect::DocumentHandler; using writerperfect::WPXSvInputStream; @@ -65,111 +52,13 @@ namespace beans = com::sun::star::beans; namespace container = com::sun::star::container; namespace ucb = com::sun::star::ucb; -namespace -{ - -template<class T> -bool lcl_queryIsPackage(const Sequence<T> &lComponentData) -{ - bool bIsPackage = false; - - const sal_Int32 nLength = lComponentData.getLength(); - const T *pValue = lComponentData.getConstArray(); - for (sal_Int32 i = 0; i < nLength; ++i) - { - if (pValue[i].Name == "IsPackage") - { - pValue[i].Value >>= bIsPackage; - break; - } - } - - return bIsPackage; -} - -bool lcl_isPackage(const Any &rComponentData) -{ - Sequence < beans::NamedValue > lComponentDataNV; - Sequence < beans::PropertyValue > lComponentDataPV; - - if (rComponentData >>= lComponentDataNV) - return lcl_queryIsPackage(lComponentDataNV); - else if (rComponentData >>= lComponentDataPV) - return lcl_queryIsPackage(lComponentDataPV); - - return false; -} -} - -sal_Bool SAL_CALL KeynoteImportFilter::filter(const Sequence< ::com::sun::star::beans::PropertyValue > &aDescriptor) -throw (RuntimeException, std::exception) -{ - sal_Int32 nLength = aDescriptor.getLength(); - const PropertyValue *pValue = aDescriptor.getConstArray(); - Reference < XInputStream > xInputStream; - Reference < ucb::XContent > xContent; - bool bIsPackage = false; - for (sal_Int32 i = 0 ; i < nLength; i++) - { - if (pValue[i].Name == "ComponentData") - bIsPackage = lcl_isPackage(pValue[i].Value); - else if (pValue[i].Name == "InputStream") - pValue[i].Value >>= xInputStream; - else if (pValue[i].Name == "UCBContent") - pValue[i].Value >>= xContent; - } - if (!xInputStream.is()) - { - OSL_ASSERT(false); - return sal_False; - } - - if (bIsPackage && !xContent.is()) - { - SAL_WARN("writerperfect", "the input claims to be a package, but does not have UCBContent"); - bIsPackage = false; - } - - // An XML import service: what we push sax messages to.. - Reference < XDocumentHandler > xInternalHandler( - mxContext->getServiceManager()->createInstanceWithContext( - "com.sun.star.comp.Impress.XMLOasisImporter", mxContext), - css::uno::UNO_QUERY_THROW); - - // The XImporter sets up an empty target document for XDocumentHandler to write to.. - Reference < XImporter > xImporter(xInternalHandler, UNO_QUERY); - xImporter->setTargetDocument(mxDoc); - - // OO Graphics Handler: abstract class to handle document SAX messages, concrete implementation here - // writes to in-memory target doc - DocumentHandler xHandler(xInternalHandler); - - shared_ptr< librevenge::RVNGInputStream > input; - if (bIsPackage) - input.reset(new writerperfect::DirectoryStream(xContent)); - else - input.reset(new WPXSvInputStream(xInputStream)); - - OdpGenerator exporter; - exporter.addDocumentHandler(&xHandler, ODF_FLAT_XML); - bool tmpParseResult = libetonyek::EtonyekDocument::parse(input.get(), &exporter); - return tmpParseResult; -} - -void SAL_CALL KeynoteImportFilter::cancel() -throw (RuntimeException, std::exception) +bool KeynoteImportFilter::doImportDocument(librevenge::RVNGInputStream &rInput, librevenge::RVNGPresentationInterface &rGenerator) { -} - -// XImporter -void SAL_CALL KeynoteImportFilter::setTargetDocument(const Reference< ::com::sun::star::lang::XComponent > &xDoc) -throw (::com::sun::star::lang::IllegalArgumentException, RuntimeException, std::exception) -{ - mxDoc = xDoc; + return libetonyek::EtonyekDocument::parse(&rInput, &rGenerator); } // XExtendedFilterDetection -OUString SAL_CALL KeynoteImportFilter::detect(com::sun::star::uno::Sequence< PropertyValue > &Descriptor) +OUString SAL_CALL KeynoteImportFilter::detect(com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > &Descriptor) throw(com::sun::star::uno::RuntimeException, std::exception) { sal_Int32 nLength = Descriptor.getLength(); @@ -179,7 +68,7 @@ throw(com::sun::star::uno::RuntimeException, std::exception) sal_Int32 nUCBContentLocation = -1; bool bIsPackage = false; bool bUCBContentChanged = false; - const PropertyValue *pValue = Descriptor.getConstArray(); + const beans::PropertyValue *pValue = Descriptor.getConstArray(); Reference < XInputStream > xInputStream; Reference < ucb::XContent > xContent; Sequence < beans::NamedValue > lComponentDataNV; @@ -338,27 +227,6 @@ throw(com::sun::star::uno::RuntimeException, std::exception) return sTypeName; } -// XInitialization -void SAL_CALL KeynoteImportFilter::initialize(const Sequence< Any > &aArguments) -throw (Exception, RuntimeException, std::exception) -{ - Sequence < PropertyValue > aAnySeq; - sal_Int32 nLength = aArguments.getLength(); - if (nLength && (aArguments[0] >>= aAnySeq)) - { - const PropertyValue *pValue = aAnySeq.getConstArray(); - nLength = aAnySeq.getLength(); - for (sal_Int32 i = 0 ; i < nLength; i++) - { - if (pValue[i].Name == "Type") - { - pValue[i].Value >>= msFilterName; - break; - } - } - } -} - OUString KeynoteImportFilter_getImplementationName() throw (RuntimeException) { diff --git a/writerperfect/source/impress/KeynoteImportFilter.hxx b/writerperfect/source/impress/KeynoteImportFilter.hxx index 2bfec5e56443..912b0763b726 100644 --- a/writerperfect/source/impress/KeynoteImportFilter.hxx +++ b/writerperfect/source/impress/KeynoteImportFilter.hxx @@ -8,59 +8,26 @@ #ifndef INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_KEYNOTEIMPORTFILTER_HXX #define INCLUDED_WRITERPERFECT_SOURCE_IMPRESS_KEYNOTEIMPORTFILTER_HXX -#include <com/sun/star/document/XFilter.hpp> -#include <com/sun/star/document/XImporter.hpp> -#include <com/sun/star/document/XExtendedFilterDetection.hpp> -#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/uno/XComponentContext.hpp> -#include <com/sun/star/xml/sax/XDocumentHandler.hpp> -#include <cppuhelper/implbase5.hxx> +#include "ImportFilterBase.hxx" #include <stdio.h> /* This component will be instantiated for both import or export. Whether it calls * setSourceDocument or setTargetDocument determines which Impl function the filter * member calls */ -class KeynoteImportFilter : public cppu::WeakImplHelper5 - < - com::sun::star::document::XFilter, - com::sun::star::document::XImporter, - com::sun::star::document::XExtendedFilterDetection, - com::sun::star::lang::XInitialization, - com::sun::star::lang::XServiceInfo - > +class KeynoteImportFilter : public writerperfect::presentation::ImportFilterBase { -protected: - // oo.org declares - ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mxContext; - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > mxDoc; - OUString msFilterName; - ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > mxHandler; - public: KeynoteImportFilter(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > &rxContext) - : mxContext(rxContext) {} + : writerperfect::presentation::ImportFilterBase(rxContext) {} virtual ~KeynoteImportFilter() {} - // XFilter - virtual sal_Bool SAL_CALL filter(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > &aDescriptor) - throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; - virtual void SAL_CALL cancel() - throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; - - // XImporter - virtual void SAL_CALL setTargetDocument(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > &xDoc) - throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; - //XExtendedFilterDetection virtual OUString SAL_CALL detect(com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > &Descriptor) throw(com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; - // XInitialization - virtual void SAL_CALL initialize(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > &aArguments) - throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; - // XServiceInfo virtual OUString SAL_CALL getImplementationName() throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; @@ -69,6 +36,8 @@ public: virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; +private: + virtual bool doImportDocument(librevenge::RVNGInputStream &rInput, librevenge::RVNGPresentationInterface &rGenerator) SAL_OVERRIDE; }; OUString KeynoteImportFilter_getImplementationName() diff --git a/writerperfect/source/impress/MWAWPresentationImportFilter.cxx b/writerperfect/source/impress/MWAWPresentationImportFilter.cxx new file mode 100644 index 000000000000..cdbfaa0f09a8 --- /dev/null +++ b/writerperfect/source/impress/MWAWPresentationImportFilter.cxx @@ -0,0 +1,181 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* MWAWPresentationImportFilter: Sets up the filter, and calls DocumentCollector + * to do the actual filtering + * + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <com/sun/star/uno/Reference.h> +#include <cppuhelper/supportsservice.hxx> + +#include <libmwaw/libmwaw.hxx> +#include <libodfgen/libodfgen.hxx> + +#include "MWAWPresentationImportFilter.hxx" + +using com::sun::star::uno::Sequence; +using com::sun::star::uno::Reference; +using com::sun::star::uno::Any; +using com::sun::star::uno::XInterface; +using com::sun::star::uno::Exception; +using com::sun::star::uno::RuntimeException; +using com::sun::star::uno::XComponentContext; + +static bool handleEmbeddedMWAWGraphicObject(const librevenge::RVNGBinaryData &data, OdfDocumentHandler *pHandler, const OdfStreamType streamType) +{ + OdgGenerator exporter; + exporter.addDocumentHandler(pHandler, streamType); + return MWAWDocument::decodeGraphic(data, &exporter); +} + +static bool handleEmbeddedMWAWSpreadsheetObject(const librevenge::RVNGBinaryData &data, OdfDocumentHandler *pHandler, const OdfStreamType streamType) +{ + OdsGenerator exporter; + exporter.addDocumentHandler(pHandler, streamType); + return MWAWDocument::decodeSpreadsheet(data, &exporter); +} + +bool MWAWPresentationImportFilter::doImportDocument(librevenge::RVNGInputStream &rInput, librevenge::RVNGPresentationInterface &rGenerator) +{ + return MWAWDocument::MWAW_R_OK == MWAWDocument::parse(&rInput, &rGenerator); +} + +bool MWAWPresentationImportFilter::doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName) +{ + rTypeName = ""; + + MWAWDocument::Type docType = MWAWDocument::MWAW_T_UNKNOWN; + MWAWDocument::Kind docKind = MWAWDocument::MWAW_K_UNKNOWN; + const MWAWDocument::Confidence confidence = MWAWDocument::isFileFormatSupported(&rInput, docType, docKind); + + if (confidence == MWAWDocument::MWAW_C_EXCELLENT) + { + if (docKind == MWAWDocument::MWAW_K_PRESENTATION) + { + switch (docType) + { + case MWAWDocument::MWAW_T_CLARISWORKS: + rTypeName = "impress_ClarisWorks"; + break; + + case MWAWDocument::MWAW_T_ACTA: + case MWAWDocument::MWAW_T_BEAGLEWORKS: + case MWAWDocument::MWAW_T_ADOBEILLUSTRATOR: + case MWAWDocument::MWAW_T_CLARISRESOLVE: + case MWAWDocument::MWAW_T_DBASE: + case MWAWDocument::MWAW_T_DOCMAKER: + case MWAWDocument::MWAW_T_EDOC: + case MWAWDocument::MWAW_T_FAMILYTREEMAKER: + case MWAWDocument::MWAW_T_FILEMAKER: + case MWAWDocument::MWAW_T_FOXBASE: + case MWAWDocument::MWAW_T_FRAMEMAKER: + case MWAWDocument::MWAW_T_FULLIMPACT: + case MWAWDocument::MWAW_T_FULLPAINT: + case MWAWDocument::MWAW_T_FULLWRITE: + case MWAWDocument::MWAW_T_GREATWORKS: + case MWAWDocument::MWAW_T_INFOGENIE: + case MWAWDocument::MWAW_T_KALEIDAGRAPH: + case MWAWDocument::MWAW_T_HANMACWORDJ: + case MWAWDocument::MWAW_T_HANMACWORDK: + case MWAWDocument::MWAW_T_LIGHTWAYTEXT: + case MWAWDocument::MWAW_T_MACDOC: + case MWAWDocument::MWAW_T_MACDRAFT: + case MWAWDocument::MWAW_T_MACDRAW: + case MWAWDocument::MWAW_T_MACDRAWPRO: + case MWAWDocument::MWAW_T_MACPAINT: + case MWAWDocument::MWAW_T_MACWRITE: + case MWAWDocument::MWAW_T_MACWRITEPRO: + case MWAWDocument::MWAW_T_MARINERWRITE: + case MWAWDocument::MWAW_T_MINDWRITE: + case MWAWDocument::MWAW_T_MICROSOFTFILE: + case MWAWDocument::MWAW_T_MICROSOFTMULTIPLAN: + case MWAWDocument::MWAW_T_MICROSOFTWORD: + case MWAWDocument::MWAW_T_MICROSOFTWORKS: + case MWAWDocument::MWAW_T_MORE: + case MWAWDocument::MWAW_T_NISUSWRITER: + case MWAWDocument::MWAW_T_OVERVUE: + case MWAWDocument::MWAW_T_PAGEMAKER: + case MWAWDocument::MWAW_T_PIXELPAINT: + case MWAWDocument::MWAW_T_RAGTIME: + case MWAWDocument::MWAW_T_READYSETGO: + case MWAWDocument::MWAW_T_SUPERPAINT: + case MWAWDocument::MWAW_T_SYMPOSIUM: + case MWAWDocument::MWAW_T_TEACHTEXT: + case MWAWDocument::MWAW_T_TEXEDIT: + case MWAWDocument::MWAW_T_TRAPEZE: + case MWAWDocument::MWAW_T_WINGZ: + case MWAWDocument::MWAW_T_WRITENOW: + case MWAWDocument::MWAW_T_WRITERPLUS: + case MWAWDocument::MWAW_T_XPRESS: + case MWAWDocument::MWAW_T_ZWRITE: + case MWAWDocument::MWAW_T_4DIMENSION: + + case MWAWDocument::MWAW_T_RESERVED1: + case MWAWDocument::MWAW_T_RESERVED2: + case MWAWDocument::MWAW_T_RESERVED3: + case MWAWDocument::MWAW_T_RESERVED4: + case MWAWDocument::MWAW_T_RESERVED5: + case MWAWDocument::MWAW_T_RESERVED6: + case MWAWDocument::MWAW_T_RESERVED7: + case MWAWDocument::MWAW_T_RESERVED8: + case MWAWDocument::MWAW_T_RESERVED9: + case MWAWDocument::MWAW_T_UNKNOWN: + default: + break; + } + } + } + + return !rTypeName.isEmpty(); +} + +void MWAWPresentationImportFilter::doRegisterHandlers(OdpGenerator &rGenerator) +{ + rGenerator.registerEmbeddedObjectHandler("image/mwaw-odg", &handleEmbeddedMWAWGraphicObject); + rGenerator.registerEmbeddedObjectHandler("image/mwaw-ods", &handleEmbeddedMWAWSpreadsheetObject); +} + +OUString MWAWPresentationImportFilter_getImplementationName() +throw (RuntimeException) +{ + return OUString("com.sun.star.comp.Impress.MWAWPresentationImportFilter"); +} + +Sequence< OUString > SAL_CALL MWAWPresentationImportFilter_getSupportedServiceNames() +throw (RuntimeException) +{ + Sequence < OUString > aRet(2); + OUString *pArray = aRet.getArray(); + pArray[0] = "com.sun.star.document.ImportFilter"; + pArray[1] = "com.sun.star.document.ExtendedTypeDetection"; + return aRet; +} + +Reference< XInterface > SAL_CALL MWAWPresentationImportFilter_createInstance(const Reference< XComponentContext > &rContext) +throw(Exception) +{ + return (cppu::OWeakObject *) new MWAWPresentationImportFilter(rContext); +} + +// XServiceInfo +OUString SAL_CALL MWAWPresentationImportFilter::getImplementationName() +throw (RuntimeException, std::exception) +{ + return MWAWPresentationImportFilter_getImplementationName(); +} +sal_Bool SAL_CALL MWAWPresentationImportFilter::supportsService(const OUString &rServiceName) +throw (RuntimeException, std::exception) +{ + return cppu::supportsService(this, rServiceName); +} +Sequence< OUString > SAL_CALL MWAWPresentationImportFilter::getSupportedServiceNames() +throw (RuntimeException, std::exception) +{ + return MWAWPresentationImportFilter_getSupportedServiceNames(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/impress/MWAWPresentationImportFilter.hxx b/writerperfect/source/impress/MWAWPresentationImportFilter.hxx new file mode 100644 index 000000000000..576f9d165532 --- /dev/null +++ b/writerperfect/source/impress/MWAWPresentationImportFilter.hxx @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef _MWAWPRESENTATIONIMPORTFILTER_HXX +#define _MWAWPRESENTATIONIMPORTFILTER_HXX + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> + +#include "ImportFilterBase.hxx" + +/* This component will be instantiated for both import or export. Whether it calls + * setSourceDocument or setTargetDocument determines which Impl function the filter + * member calls */ +class MWAWPresentationImportFilter : public writerperfect::presentation::ImportFilterBase +{ +public: + MWAWPresentationImportFilter(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > &rxContext) + : writerperfect::presentation::ImportFilterBase(rxContext) {} + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() + throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) + throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() + throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; + +private: + virtual bool doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName) SAL_OVERRIDE; + virtual bool doImportDocument(librevenge::RVNGInputStream &rInput, librevenge::RVNGPresentationInterface &rGenerator) SAL_OVERRIDE; + virtual void doRegisterHandlers(OdpGenerator &rGenerator) SAL_OVERRIDE; +}; + +OUString MWAWPresentationImportFilter_getImplementationName() +throw (::com::sun::star::uno::RuntimeException); + +::com::sun::star::uno::Sequence< OUString > SAL_CALL MWAWPresentationImportFilter_getSupportedServiceNames() +throw (::com::sun::star::uno::RuntimeException); + +::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > +SAL_CALL MWAWPresentationImportFilter_createInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > &rContext) +throw (::com::sun::star::uno::Exception); + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerperfect/source/impress/wpftimpress.component b/writerperfect/source/impress/wpftimpress.component index 66424ab35849..58d00cc279b0 100644 --- a/writerperfect/source/impress/wpftimpress.component +++ b/writerperfect/source/impress/wpftimpress.component @@ -13,4 +13,8 @@ <service name="com.sun.star.document.ImportFilter"/> <service name="com.sun.star.document.ExtendedTypeDetection"/> </implementation> + <implementation name="com.sun.star.comp.Impress.MWAWPresentationImportFilter"> + <service name="com.sun.star.document.ImportFilter"/> + <service name="com.sun.star.document.ExtendedTypeDetection"/> + </implementation> </component> diff --git a/writerperfect/source/impress/wpftimpress_genericfilter.cxx b/writerperfect/source/impress/wpftimpress_genericfilter.cxx index 49b0f74d7c4c..3a1129d9b9a9 100644 --- a/writerperfect/source/impress/wpftimpress_genericfilter.cxx +++ b/writerperfect/source/impress/wpftimpress_genericfilter.cxx @@ -26,6 +26,7 @@ #include "sal/types.h" #include "KeynoteImportFilter.hxx" +#include "MWAWPresentationImportFilter.hxx" namespace { @@ -37,6 +38,12 @@ static cppu::ImplementationEntry const services[] = &KeynoteImportFilter_getSupportedServiceNames, &cppu::createSingleComponentFactory, 0, 0 }, + { + &MWAWPresentationImportFilter_createInstance, + &MWAWPresentationImportFilter_getImplementationName, + &MWAWPresentationImportFilter_getSupportedServiceNames, + &cppu::createSingleComponentFactory, 0, 0 + }, { 0, 0, 0, 0, 0, 0 } }; |