LibreOffice Module filter (master) 1
LibXSLTTransformer.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 file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#pragma once
11
12#include <deque>
13#include <map>
14#include <mutex>
15
16#include <libxml/parser.h>
17#include <libxml/tree.h>
18#include <libxml/xmlIO.h>
19#include <libxslt/transform.h>
20#include <libxml/xpathInternals.h>
21
24
25#include <rtl/ref.hxx>
26
27#include <salhelper/thread.hxx>
28
29#include <com/sun/star/lang/XServiceInfo.hpp>
30#include <com/sun/star/io/XInputStream.hpp>
31#include <com/sun/star/io/XOutputStream.hpp>
32#include <com/sun/star/io/XStreamListener.hpp>
33#include <com/sun/star/beans/NamedValue.hpp>
34#include <com/sun/star/xml/xslt/XXSLTTransformer.hpp>
35
36using namespace ::cppu;
37using namespace ::osl;
38using namespace ::com::sun::star::beans;
39using namespace ::com::sun::star::io;
40using namespace ::com::sun::star::uno;
41
42using ::std::map;
43
44#define EXT_MODULE_OLE_URI "http://libreoffice.org/2011/xslt/ole"
45
46namespace XSLT
47{
48
49 class LibXSLTTransformer;
50
51 /*
52 * Reader provides a worker thread to perform the actual transformation.
53 * It pipes the streams provided by a LibXSLTTransformer
54 * instance through libxslt.
55 */
57 {
58 public:
59 Reader(LibXSLTTransformer* transformer);
60 int read(char * buffer, int len);
61 int write(const char * buffer, int len);
62 void forceStateStopped();
63 void closeOutput();
64
65 private:
66 virtual ~Reader() override;
67
68 static const sal_Int32 OUTPUT_BUFFER_SIZE;
69 static const sal_Int32 INPUT_BUFFER_SIZE;
71 Sequence<sal_Int8> m_readBuf;
72 Sequence<sal_Int8> m_writeBuf;
73
74 std::mutex m_mutex;
75 xsltTransformContextPtr m_tcontext;
76
77 virtual void execute() override;
78 static void registerExtensionModule();
79 };
80
81 /*
82 * LibXSLTTransformer provides a transforming pipe service to XSLTFilter.
83 *
84 * It implements XActiveDataSource, XActiveDataSink and XActiveDataControl
85 * to consume data. It also notifies upstream of important events such as
86 * begin and end of the transformation and of any errors that occur during
87 * transformation.
88 *
89 * TODO: Error reporting leaves room for improvement, currently.
90 *
91 * The actual transformation is done by a worker thread.
92 *
93 * See Reader below.
94 */
95 class LibXSLTTransformer : public WeakImplHelper<css::xml::xslt::XXSLTTransformer, css::lang::XServiceInfo>
96 {
97 private:
98 static const char* const PARAM_SOURCE_URL;
99 static const char* const PARAM_SOURCE_BASE_URL;
100 static const char* const PARAM_TARGET_URL;
101 static const char* const PARAM_TARGET_BASE_URL;
102 static const char* const PARAM_DOCTYPE_PUBLIC;
103
104 // the UNO ServiceFactory
105 css::uno::Reference<css::uno::XComponentContext> m_xContext;
106
107 css::uno::Reference<XInputStream> m_rInputStream;
108
109 css::uno::Reference<XOutputStream> m_rOutputStream;
110
111 typedef ::std::deque<css::uno::Reference<XStreamListener> > ListenerList;
112
114
117
118 ::std::map<const char *, OString> m_parameters;
119
121
122 protected:
123 virtual ~LibXSLTTransformer() override {
124 if (m_Reader.is()) {
125 m_Reader->terminate();
126 m_Reader->forceStateStopped();
127 m_Reader->join();
128 }
129 }
130
131 public:
132
133 // ctor...
134 LibXSLTTransformer(css::uno::Reference<css::uno::XComponentContext> x);
135
136 // XServiceInfo
137 virtual sal_Bool SAL_CALL supportsService(const OUString& sServiceName) override;
138 virtual OUString SAL_CALL getImplementationName() override;
139 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
140
141 // XActiveDataSink
142 virtual void SAL_CALL
143 setInputStream(const css::uno::Reference<XInputStream>& inputStream) override;
144 virtual css::uno::Reference<XInputStream> SAL_CALL
145 getInputStream() override;
146 // XActiveDataSource
147 virtual void SAL_CALL
148 setOutputStream(const css::uno::Reference<XOutputStream>& outputStream) override;
149 virtual css::uno::Reference<XOutputStream> SAL_CALL
150 getOutputStream() override;
151 // XActiveDataControl
152 virtual void SAL_CALL
153 addListener(const css::uno::Reference<XStreamListener>& listener) override;
154 virtual void SAL_CALL
155 removeListener(const css::uno::Reference<XStreamListener>& listener) override;
156 virtual void SAL_CALL
157 start() override;
158 virtual void SAL_CALL
159 terminate() override;
160 virtual void SAL_CALL
161 initialize(const Sequence<Any>& params) override;
162
163 void
164 done();
165
166 void
167 error(const OUString& msg);
168
169 const OString&
171
172 const OString& getStyleSheetText() const { return m_styleSheetText; }
173
174 const ::std::map<const char*, OString>&
175 getParameters() const { return m_parameters; }
176
177 const css::uno::Reference<css::uno::XComponentContext>&
179 return m_xContext;
180 }
181
182 };
183}
184
185/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual void SAL_CALL start() override
static const char *const PARAM_SOURCE_URL
const OString & getStyleSheetURL() const
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
const css::uno::Reference< css::uno::XComponentContext > & getComponentContext() const
const ::std::map< const char *, OString > & getParameters() const
static const char *const PARAM_DOCTYPE_PUBLIC
void error(const OUString &msg)
virtual css::uno::Reference< XOutputStream > SAL_CALL getOutputStream() override
::std::map< const char *, OString > m_parameters
virtual OUString SAL_CALL getImplementationName() override
static const char *const PARAM_TARGET_BASE_URL
virtual ~LibXSLTTransformer() override
static const char *const PARAM_TARGET_URL
css::uno::Reference< XInputStream > m_rInputStream
virtual void SAL_CALL addListener(const css::uno::Reference< XStreamListener > &listener) override
virtual void SAL_CALL terminate() override
const OString & getStyleSheetText() const
virtual void SAL_CALL setInputStream(const css::uno::Reference< XInputStream > &inputStream) override
css::uno::Reference< XOutputStream > m_rOutputStream
virtual sal_Bool SAL_CALL supportsService(const OUString &sServiceName) override
LibXSLTTransformer(css::uno::Reference< css::uno::XComponentContext > x)
rtl::Reference< Reader > m_Reader
virtual void SAL_CALL removeListener(const css::uno::Reference< XStreamListener > &listener) override
static const char *const PARAM_SOURCE_BASE_URL
virtual void SAL_CALL setOutputStream(const css::uno::Reference< XOutputStream > &outputStream) override
css::uno::Reference< css::uno::XComponentContext > m_xContext
::std::deque< css::uno::Reference< XStreamListener > > ListenerList
virtual css::uno::Reference< XInputStream > SAL_CALL getInputStream() override
virtual void SAL_CALL initialize(const Sequence< Any > &params) override
int read(char *buffer, int len)
static void registerExtensionModule()
virtual void execute() override
virtual ~Reader() override
xsltTransformContextPtr m_tcontext
Sequence< sal_Int8 > m_readBuf
int write(const char *buffer, int len)
Sequence< sal_Int8 > m_writeBuf
Reader(LibXSLTTransformer *transformer)
rtl::Reference< LibXSLTTransformer > m_transformer
static const sal_Int32 OUTPUT_BUFFER_SIZE
static const sal_Int32 INPUT_BUFFER_SIZE
unsigned char sal_Bool