16#include <osl/diagnose.h>
21#include <com/sun/star/lang/XServiceInfo.hpp>
23#include <com/sun/star/beans/PropertyValue.hpp>
25#include <com/sun/star/xml/XImportFilter.hpp>
26#include <com/sun/star/xml/XImportFilter2.hpp>
27#include <com/sun/star/xml/XExportFilter.hpp>
28#include <com/sun/star/xml/sax/Parser.hpp>
29#include <com/sun/star/xml/sax/InputSource.hpp>
30#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
31#include <com/sun/star/xml/sax/Writer.hpp>
32#include <com/sun/star/xml/sax/XFastParser.hpp>
34#include <com/sun/star/io/XInputStream.hpp>
35#include <com/sun/star/io/XOutputStream.hpp>
36#include <com/sun/star/io/XActiveDataSource.hpp>
37#include <com/sun/star/io/XSeekable.hpp>
40using namespace ::
cppu;
58 class OdfFlatXml :
public WeakImplHelper<XImportFilter, XImportFilter2,
59 XExportFilter, DocumentHandlerAdapter, css::lang::XServiceInfo>
66 explicit OdfFlatXml(
const Reference<XComponentContext> &r) :
73 importer(
const Sequence< PropertyValue >& sourceData,
74 const Reference< XDocumentHandler >& docHandler,
75 const Sequence< OUString >& userData)
override;
79 importer(
const Sequence< PropertyValue >& sourceData,
80 const Reference< XFastParser >& fastParser,
81 const Sequence< OUString >& userData)
override;
86 const Sequence< PropertyValue >& sourceData,
87 const Sequence< OUString >& userData)
override;
90 {
return "com.sun.star.comp.filter.OdfFlatXml"; }
97 return css::uno::Sequence<OUString>{
98 "com.sun.star.document.ImportFilter",
99 "com.sun.star.document.ExportFilter"};
111 const Sequence< PropertyValue >& sourceData,
112 const Reference< XDocumentHandler >& docHandler,
113 const Sequence< OUString >& )
117 Reference<XInputStream> inputStream;
121 sal_Int32 paramCount = sourceData.getLength();
122 for (sal_Int32 paramIdx = 0; paramIdx < paramCount; paramIdx++)
124 paramName = sourceData[paramIdx].Name;
125 if ( paramName ==
"InputStream" )
126 sourceData[paramIdx].Value >>= inputStream;
127 else if ( paramName ==
"URL" )
128 sourceData[paramIdx].Value >>= url;
131 OSL_ASSERT(inputStream.is());
132 if (!inputStream.is())
135 InputSource inputSource;
136 inputSource.sSystemId = url;
137 inputSource.sPublicId = url;
138 inputSource.aInputStream = inputStream;
141 css::uno::Reference< css::io::XSeekable > xSeekable( inputStream, css::uno::UNO_QUERY );
142 if ( xSeekable.is() )
143 xSeekable->seek( 0 );
145 css::uno::Reference< css::xml::sax::XFastParser > xFastParser (docHandler, UNO_QUERY );
146 if( xFastParser.is() )
147 xFastParser->parseStream( inputSource );
150 Reference<XParser> saxParser = Parser::create(
m_xContext);
151 saxParser->setDocumentHandler(docHandler);
152 saxParser->parseStream(inputSource);
155 catch (
const Exception &)
160 catch (
const std::exception &exc)
162 SAL_WARN(
"filter.odfflatxml", exc.what());
170 const Sequence< PropertyValue >& sourceData,
171 const Reference< XFastParser >& xFastParser,
172 const Sequence< OUString >& )
176 Reference<XInputStream> inputStream;
180 sal_Int32 paramCount = sourceData.getLength();
181 for (sal_Int32 paramIdx = 0; paramIdx < paramCount; paramIdx++)
183 paramName = sourceData[paramIdx].Name;
184 if ( paramName ==
"InputStream" )
185 sourceData[paramIdx].Value >>= inputStream;
186 else if ( paramName ==
"URL" )
187 sourceData[paramIdx].Value >>= url;
190 OSL_ASSERT(inputStream.is());
191 if (!inputStream.is())
194 InputSource inputSource;
195 inputSource.sSystemId = url;
196 inputSource.sPublicId = url;
197 inputSource.aInputStream = inputStream;
200 css::uno::Reference< css::io::XSeekable > xSeekable( inputStream, css::uno::UNO_QUERY );
201 if ( xSeekable.is() )
202 xSeekable->seek( 0 );
204 xFastParser->parseStream( inputSource );
206 catch (
const Exception &)
211 catch (
const std::exception &exc)
213 SAL_WARN(
"filter.odfflatxml", exc.what());
220OdfFlatXml::exporter(
const Sequence< PropertyValue >& sourceData,
221 const Sequence< OUString >& )
224 Reference<XOutputStream> outputStream;
227 sal_Int32 paramCount = sourceData.getLength();
228 for (sal_Int32 paramIdx = 0; paramIdx < paramCount; paramIdx++)
230 paramName = sourceData[paramIdx].Name;
231 if ( paramName ==
"OutputStream" )
232 sourceData[paramIdx].Value >>= outputStream;
235 if (!getDelegate().is())
237 Reference< XDocumentHandler > saxWriter = Writer::create(
m_xContext);
238 setDelegate(saxWriter);
241 Reference<XActiveDataSource> dataSource(getDelegate(), UNO_QUERY);
242 OSL_ASSERT(dataSource.is());
243 if (!dataSource.is())
245 OSL_ASSERT(outputStream.is());
246 if (!outputStream.is())
248 dataSource->setOutputStream(outputStream);
253extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
255 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
257 return cppu::acquire(
new OdfFlatXml(context));
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * filter_OdfFlatXml_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
Reference< XComponentContext > m_xContext
#define TOOLS_WARN_EXCEPTION(area, stream)
#define SAL_WARN(area, stream)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)