LibreOffice Module writerperfect (master) 1
ImportFilter.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 */
7
8#pragma once
9
10#include <com/sun/star/awt/XWindow.hpp>
11#include <com/sun/star/beans/PropertyValue.hpp>
12#include <com/sun/star/document/XExtendedFilterDetection.hpp>
13#include <com/sun/star/document/XFilter.hpp>
14#include <com/sun/star/document/XImporter.hpp>
15#include <com/sun/star/io/XInputStream.hpp>
16#include <com/sun/star/lang/XInitialization.hpp>
17#include <com/sun/star/lang/XServiceInfo.hpp>
18#include <com/sun/star/uno/Reference.h>
19#include <com/sun/star/uno/XComponentContext.hpp>
20#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
21
22#include <osl/diagnose.h>
24
26#include <utility>
27#include <vcl/svapp.hxx>
28#include <vcl/weld.hxx>
29#include <xmloff/xmlimp.hxx>
30
31#include "DocumentHandler.hxx"
32#include "WPXSvInputStream.hxx"
33
35
36namespace writerperfect
37{
38namespace detail
39{
40template <class Generator>
42 : public cppu::WeakImplHelper<css::document::XFilter, css::document::XImporter,
43 css::document::XExtendedFilterDetection,
44 css::lang::XInitialization>
45{
46public:
47 ImportFilterImpl(css::uno::Reference<css::uno::XComponentContext> xContext)
48 : mxContext(std::move(xContext))
49 {
50 }
51
52 const css::uno::Reference<css::uno::XComponentContext>& getXContext() const
53 {
54 return mxContext;
55 }
56
57 // XFilter
58 virtual sal_Bool SAL_CALL
59 filter(const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor) override
60 {
61 utl::MediaDescriptor aDescriptor(rDescriptor);
62 css::uno::Reference<css::io::XInputStream> xInputStream;
63 aDescriptor[utl::MediaDescriptor::PROP_INPUTSTREAM] >>= xInputStream;
64 if (!xInputStream.is())
65 {
66 OSL_ASSERT(false);
67 return false;
68 }
69
70 css::uno::Reference<css::awt::XWindow> xDialogParent;
71 aDescriptor["ParentWindow"] >>= xDialogParent;
72
73 // An XML import service: what we push sax messages to...
74 css::uno::Reference<XInterface> xInternalFilter
75 = mxContext->getServiceManager()->createInstanceWithContext(
77 assert(xInternalFilter);
78 css::uno::Reference<css::xml::sax::XFastDocumentHandler> xInternalHandler(
79 xInternalFilter, css::uno::UNO_QUERY);
80 assert(xInternalHandler);
81
82 // The XImporter sets up an empty target document for XDocumentHandler to write to...
83 css::uno::Reference<css::document::XImporter> xImporter(xInternalHandler,
84 css::uno::UNO_QUERY);
85 assert(xImporter);
86 xImporter->setTargetDocument(mxDoc);
87
88 // OO Graphics Handler: abstract class to handle document SAX messages, concrete implementation here
89 // writes to in-memory target doc
90 DocumentHandler aHandler(
91 new SvXMLLegacyToFastDocHandler(static_cast<SvXMLImport*>(xInternalHandler.get())));
92
93 WPXSvInputStream input(xInputStream);
94
95 Generator exporter;
96 exporter.addDocumentHandler(&aHandler, ODF_FLAT_XML);
97
98 doRegisterHandlers(exporter);
99
100 return doImportDocument(Application::GetFrameWeld(xDialogParent), input, exporter,
101 aDescriptor);
102 }
103
104 virtual void SAL_CALL cancel() override {}
105
106 // XImporter
107 const css::uno::Reference<css::lang::XComponent>& getTargetDocument() const { return mxDoc; }
108 virtual void SAL_CALL
109 setTargetDocument(const css::uno::Reference<css::lang::XComponent>& xDoc) override
110 {
111 mxDoc = xDoc;
112 }
113
114 //XExtendedFilterDetection
115 virtual OUString SAL_CALL
116 detect(css::uno::Sequence<css::beans::PropertyValue>& Descriptor) override
117 {
118 OUString sTypeName;
119 sal_Int32 nLength = Descriptor.getLength();
120 sal_Int32 location = nLength;
121 const css::beans::PropertyValue* pValue = Descriptor.getConstArray();
122 css::uno::Reference<css::io::XInputStream> xInputStream;
123 for (sal_Int32 i = 0; i < nLength; i++)
124 {
125 if (pValue[i].Name == "TypeName")
126 location = i;
127 else if (pValue[i].Name == "InputStream")
128 pValue[i].Value >>= xInputStream;
129 }
130
131 if (!xInputStream.is())
132 return OUString();
133
134 WPXSvInputStream input(xInputStream);
135
136 if (doDetectFormat(input, sTypeName))
137 {
138 assert(!sTypeName.isEmpty());
139
140 if (location == nLength)
141 {
142 Descriptor.realloc(nLength + 1);
143 Descriptor.getArray()[location].Name = "TypeName";
144 }
145
146 Descriptor.getArray()[location].Value <<= sTypeName;
147 }
148
149 return sTypeName;
150 }
151
152 // XInitialization
153 virtual void SAL_CALL
154 initialize(const css::uno::Sequence<css::uno::Any>& /*aArguments*/) override
155 {
156 }
157
158private:
159 virtual bool doDetectFormat(librevenge::RVNGInputStream& rInput, OUString& rTypeName) = 0;
160 virtual bool doImportDocument(weld::Window* pParent, librevenge::RVNGInputStream& rInput,
161 Generator& rGenerator, utl::MediaDescriptor& rDescriptor)
162 = 0;
163 virtual void doRegisterHandlers(Generator&){};
164
165 css::uno::Reference<css::uno::XComponentContext> mxContext;
166 css::uno::Reference<css::lang::XComponent> mxDoc;
167};
168}
169
172template <class Generator>
173struct ImportFilter : public cppu::ImplInheritanceHelper<detail::ImportFilterImpl<Generator>,
174 css::lang::XServiceInfo>
175{
176 ImportFilter(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
177 : cppu::ImplInheritanceHelper<detail::ImportFilterImpl<Generator>, css::lang::XServiceInfo>(
178 rxContext)
179 {
180 }
181};
182}
183
184/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
static weld::Window * GetFrameWeld(const css::uno::Reference< css::awt::XWindow > &rWindow)
static constexpr OUStringLiteral PROP_INPUTSTREAM
virtual bool doImportDocument(weld::Window *pParent, librevenge::RVNGInputStream &rInput, Generator &rGenerator, utl::MediaDescriptor &rDescriptor)=0
css::uno::Reference< css::lang::XComponent > mxDoc
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &) override
virtual sal_Bool SAL_CALL filter(const css::uno::Sequence< css::beans::PropertyValue > &rDescriptor) override
virtual bool doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName)=0
virtual void SAL_CALL setTargetDocument(const css::uno::Reference< css::lang::XComponent > &xDoc) override
virtual void SAL_CALL cancel() override
virtual OUString SAL_CALL detect(css::uno::Sequence< css::beans::PropertyValue > &Descriptor) override
css::uno::Reference< css::uno::XComponentContext > mxContext
const css::uno::Reference< css::uno::XComponentContext > & getXContext() const
ImportFilterImpl(css::uno::Reference< css::uno::XComponentContext > xContext)
virtual void doRegisterHandlers(Generator &)
const css::uno::Reference< css::lang::XComponent > & getTargetDocument() const
int i
Definition of XML import service used with a Generator.
A base class for import filters.
ImportFilter(const css::uno::Reference< css::uno::XComponentContext > &rxContext)
OUString Name
unsigned char sal_Bool
sal_Int32 nLength