Line data Source code
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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sal/config.h>
21 :
22 : #include "unoservices.hxx"
23 : #include "xmlbas_export.hxx"
24 : #include <xmlscript/xmlns.h>
25 : #include <xmlscript/xml_helper.hxx>
26 : #include <com/sun/star/beans/XPropertySet.hpp>
27 : #include <com/sun/star/lang/XMultiComponentFactory.hpp>
28 : #include <com/sun/star/script/XLibraryContainer2.hpp>
29 : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
30 : #include <com/sun/star/document/XEmbeddedScripts.hpp>
31 : #include <cppuhelper/implementationentry.hxx>
32 : #include <cppuhelper/supportsservice.hxx>
33 :
34 : using namespace ::com::sun::star;
35 : using namespace ::com::sun::star::lang;
36 : using namespace ::com::sun::star::uno;
37 :
38 : namespace xmlscript
39 : {
40 :
41 : // component operations
42 :
43 8 : OUString getImplementationName_XMLBasicExporter()
44 : {
45 : static OUString* pImplName = 0;
46 8 : if ( !pImplName )
47 : {
48 6 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
49 6 : if ( !pImplName )
50 : {
51 6 : static OUString aImplName( "com.sun.star.comp.xmlscript.XMLBasicExporter" );
52 6 : pImplName = &aImplName;
53 6 : }
54 : }
55 8 : return *pImplName;
56 : }
57 :
58 0 : Sequence< OUString > getSupportedServiceNames_XMLBasicExporter()
59 : {
60 : static Sequence< OUString >* pNames = 0;
61 0 : if ( !pNames )
62 : {
63 0 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
64 0 : if ( !pNames )
65 : {
66 0 : static Sequence< OUString > aNames(1);
67 0 : aNames.getArray()[0] = "com.sun.star.document.XMLBasicExporter";
68 0 : pNames = &aNames;
69 0 : }
70 : }
71 0 : return *pNames;
72 : }
73 :
74 8 : OUString getImplementationName_XMLOasisBasicExporter()
75 : {
76 : static OUString* pImplName = 0;
77 8 : if ( !pImplName )
78 : {
79 6 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
80 6 : if ( !pImplName )
81 : {
82 6 : static OUString aImplName( "com.sun.star.comp.xmlscript.XMLOasisBasicExporter" );
83 6 : pImplName = &aImplName;
84 6 : }
85 : }
86 8 : return *pImplName;
87 : }
88 :
89 2 : Sequence< OUString > getSupportedServiceNames_XMLOasisBasicExporter()
90 : {
91 : static Sequence< OUString >* pNames = 0;
92 2 : if ( !pNames )
93 : {
94 2 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
95 2 : if ( !pNames )
96 : {
97 2 : static Sequence< OUString > aNames(1);
98 2 : aNames.getArray()[0] = "com.sun.star.document.XMLOasisBasicExporter";
99 2 : pNames = &aNames;
100 2 : }
101 : }
102 2 : return *pNames;
103 : }
104 :
105 : // XMLBasicExporterBase
106 :
107 4 : XMLBasicExporterBase::XMLBasicExporterBase( const Reference< XComponentContext >& rxContext, bool bOasis )
108 : :m_xContext( rxContext )
109 4 : ,m_bOasis( bOasis )
110 : {
111 4 : }
112 :
113 4 : XMLBasicExporterBase::~XMLBasicExporterBase()
114 : {
115 4 : }
116 :
117 : // XServiceInfo
118 0 : sal_Bool XMLBasicExporterBase::supportsService( const OUString& rServiceName ) throw (RuntimeException, std::exception)
119 : {
120 0 : return cppu::supportsService(this, rServiceName);
121 : }
122 :
123 : // XInitialization
124 :
125 4 : void XMLBasicExporterBase::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException, std::exception)
126 : {
127 4 : ::osl::MutexGuard aGuard( m_aMutex );
128 :
129 4 : if ( aArguments.getLength() == 1 )
130 : {
131 4 : aArguments[0] >>= m_xHandler;
132 :
133 4 : if ( !m_xHandler.is() )
134 : {
135 0 : throw RuntimeException( "XMLBasicExporterBase::initialize: invalid argument format!" );
136 : }
137 : }
138 : else
139 : {
140 0 : throw RuntimeException( "XMLBasicExporterBase::initialize: invalid number of arguments!" );
141 4 : }
142 4 : }
143 :
144 : // XExporter
145 :
146 4 : void XMLBasicExporterBase::setSourceDocument( const Reference< XComponent >& rxDoc )
147 : throw (IllegalArgumentException, RuntimeException, std::exception)
148 : {
149 4 : ::osl::MutexGuard aGuard( m_aMutex );
150 :
151 4 : m_xModel.set( rxDoc, UNO_QUERY );
152 :
153 4 : if ( !m_xModel.is() )
154 : {
155 0 : throw IllegalArgumentException( "XMLBasicExporter::setSourceDocument: no document model!", Reference< XInterface >(), 1 );
156 4 : }
157 4 : }
158 :
159 : // XFilter
160 :
161 4 : sal_Bool XMLBasicExporterBase::filter( const Sequence< beans::PropertyValue >& /*aDescriptor*/ )
162 : throw (RuntimeException, std::exception)
163 : {
164 4 : ::osl::MutexGuard aGuard( m_aMutex );
165 :
166 4 : bool bReturn = true;
167 :
168 : try
169 : {
170 4 : if ( m_xHandler.is() )
171 : {
172 4 : m_xHandler->startDocument();
173 :
174 : // ooo/script prefix and URI
175 4 : OUString aPrefix;
176 8 : OUString aURI;
177 4 : if ( m_bOasis )
178 : {
179 4 : aPrefix = XMLNS_OOO_PREFIX;
180 4 : aURI = XMLNS_OOO_URI;
181 : }
182 : else
183 : {
184 0 : aPrefix = XMLNS_SCRIPT_PREFIX;
185 0 : aURI = XMLNS_SCRIPT_URI;
186 : }
187 :
188 : // ooo/script:libraries element
189 8 : OUString aLibContElementName( aPrefix );
190 4 : aLibContElementName += ":libraries";
191 4 : XMLElement* pLibContElement = new XMLElement( aLibContElementName );
192 8 : Reference< xml::sax::XAttributeList > xLibContAttribs( pLibContElement );
193 :
194 : // ooo/script namespace attribute
195 4 : pLibContElement->addAttribute( "xmlns:" + aPrefix, aURI );
196 :
197 : // xlink namespace attribute
198 4 : pLibContElement->addAttribute( "xmlns:" XMLNS_XLINK_PREFIX, XMLNS_XLINK_URI );
199 :
200 : // <ooo/script:libraries...
201 4 : m_xHandler->ignorableWhitespace( OUString() );
202 4 : m_xHandler->startElement( aLibContElementName, xLibContAttribs );
203 :
204 8 : Reference< script::XLibraryContainer2 > xLibContainer;
205 :
206 : // try the XEmbeddedScripts interface
207 8 : Reference< document::XEmbeddedScripts > xDocumentScripts( m_xModel, UNO_QUERY );
208 4 : if ( xDocumentScripts.is() )
209 4 : xLibContainer.set( xDocumentScripts->getBasicLibraries().get() );
210 :
211 4 : if ( !xLibContainer.is() )
212 : {
213 : // try the "BasicLibraries" property (old-style, for compatibility)
214 0 : Reference< beans::XPropertySet > xPSet( m_xModel, UNO_QUERY );
215 0 : if ( xPSet.is() )
216 0 : xPSet->getPropertyValue("BasicLibraries" ) >>= xLibContainer;
217 : }
218 :
219 : SAL_WARN_IF( !xLibContainer.is(), "xmlscript.xmlflat", "XMLBasicExporterBase::filter: nowhere to export to!" );
220 :
221 4 : if ( xLibContainer.is() )
222 : {
223 4 : Sequence< OUString > aLibNames = xLibContainer->getElementNames();
224 4 : sal_Int32 nLibCount = aLibNames.getLength();
225 4 : const OUString* pLibNames = aLibNames.getConstArray();
226 4 : for ( sal_Int32 i = 0 ; i < nLibCount ; ++i )
227 : {
228 0 : OUString aLibName( pLibNames[i] );
229 :
230 0 : if ( xLibContainer->hasByName( aLibName ) )
231 : {
232 0 : OUString aTrueStr( "true" );
233 :
234 0 : if ( xLibContainer->isLibraryLink( aLibName ) )
235 : {
236 : // ooo/script:library-linked element
237 0 : OUString aLibElementName( aPrefix );
238 0 : aLibElementName += ":library-linked";
239 0 : XMLElement* pLibElement = new XMLElement( aLibElementName );
240 0 : Reference< xml::sax::XAttributeList > xLibAttribs;
241 0 : xLibAttribs = static_cast< xml::sax::XAttributeList* >( pLibElement );
242 :
243 : // ooo/script:name attribute
244 0 : pLibElement->addAttribute( aPrefix + ":name", aLibName );
245 :
246 0 : OUString aLinkURL( xLibContainer->getLibraryLinkURL( aLibName ) );
247 0 : if ( !aLinkURL.isEmpty() )
248 : {
249 : // xlink:href attribute
250 0 : pLibElement->addAttribute( XMLNS_XLINK_PREFIX ":href", aLinkURL );
251 :
252 : // xlink:type attribute
253 0 : pLibElement->addAttribute( XMLNS_XLINK_PREFIX ":type", "simple" );
254 : }
255 :
256 0 : if ( xLibContainer->isLibraryReadOnly( aLibName ) )
257 : {
258 : // ooo/script:readonly attribute
259 0 : pLibElement->addAttribute( aPrefix + ":readonly", aTrueStr );
260 : }
261 :
262 : // <ooo/script:library-linked...
263 0 : m_xHandler->ignorableWhitespace( OUString() );
264 0 : m_xHandler->startElement( aLibElementName, xLibAttribs );
265 :
266 : // ...ooo/script:library-linked>
267 0 : m_xHandler->ignorableWhitespace( OUString() );
268 0 : m_xHandler->endElement( aLibElementName );
269 : }
270 : else
271 : {
272 : // ooo/script:library-embedded element
273 0 : OUString aLibElementName( aPrefix );
274 0 : aLibElementName += ":library-embedded";
275 0 : XMLElement* pLibElement = new XMLElement( aLibElementName );
276 0 : Reference< xml::sax::XAttributeList > xLibAttribs;
277 0 : xLibAttribs = static_cast< xml::sax::XAttributeList* >( pLibElement );
278 :
279 : // ooo/script:name attribute
280 0 : pLibElement->addAttribute( aPrefix + ":name", aLibName );
281 :
282 0 : if ( xLibContainer->isLibraryReadOnly( aLibName ) )
283 : {
284 : // ooo/script:readonly attribute
285 0 : pLibElement->addAttribute( aPrefix + ":readonly", aTrueStr );
286 : }
287 :
288 : // TODO: password protected libraries
289 0 : Reference< script::XLibraryContainerPassword > xPasswd( xLibContainer, UNO_QUERY );
290 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) )
291 0 : continue;
292 :
293 : // <ooo/script:library-embedded...
294 0 : m_xHandler->ignorableWhitespace( OUString() );
295 0 : m_xHandler->startElement( aLibElementName, xLibAttribs );
296 :
297 0 : if ( !xLibContainer->isLibraryLoaded( aLibName ) )
298 0 : xLibContainer->loadLibrary( aLibName );
299 :
300 0 : Reference< container::XNameContainer > xLib;
301 0 : xLibContainer->getByName( aLibName ) >>= xLib;
302 :
303 0 : if ( xLib.is() )
304 : {
305 0 : Sequence< OUString > aModNames = xLib->getElementNames();
306 0 : sal_Int32 nModCount = aModNames.getLength();
307 0 : const OUString* pModNames = aModNames.getConstArray();
308 0 : for ( sal_Int32 j = 0 ; j < nModCount ; ++j )
309 : {
310 0 : OUString aModName( pModNames[j] );
311 0 : if ( xLib->hasByName( aModName ) )
312 : {
313 : // ooo/script:module element
314 0 : OUString aModElementName( aPrefix );
315 0 : aModElementName += ":module";
316 0 : XMLElement* pModElement = new XMLElement( aModElementName );
317 0 : Reference< xml::sax::XAttributeList > xModAttribs;
318 0 : xModAttribs = static_cast< xml::sax::XAttributeList* >( pModElement );
319 :
320 : // ooo/script:name attribute
321 0 : pModElement->addAttribute( aPrefix + ":name", aModName );
322 :
323 : // <ooo/script:module...
324 0 : m_xHandler->ignorableWhitespace( OUString() );
325 0 : m_xHandler->startElement( aModElementName, xModAttribs );
326 :
327 : // ooo/script:source-code element
328 0 : OUString aSourceElementName( aPrefix );
329 0 : aSourceElementName += ":source-code";
330 0 : XMLElement* pSourceElement = new XMLElement( aSourceElementName );
331 0 : Reference< xml::sax::XAttributeList > xSourceAttribs;
332 0 : xSourceAttribs = static_cast< xml::sax::XAttributeList* >( pSourceElement );
333 :
334 : // <ooo/script:source-code...
335 0 : m_xHandler->ignorableWhitespace( OUString() );
336 0 : m_xHandler->startElement( aSourceElementName, xSourceAttribs );
337 :
338 : // module data
339 : // TODO: write encrypted data for password protected libraries
340 0 : OUString aSource;
341 0 : xLib->getByName( aModName ) >>= aSource;
342 0 : m_xHandler->characters( aSource );
343 :
344 : // TODO: <ooo/script:byte-code>
345 :
346 : // ...ooo/script:source-code>
347 0 : m_xHandler->ignorableWhitespace( OUString() );
348 0 : m_xHandler->endElement( aSourceElementName );
349 :
350 : // ...ooo/script:module>
351 0 : m_xHandler->ignorableWhitespace( OUString() );
352 0 : m_xHandler->endElement( aModElementName );
353 : }
354 0 : }
355 : }
356 :
357 : // ...ooo/script:library-embedded>
358 0 : m_xHandler->ignorableWhitespace( OUString() );
359 0 : m_xHandler->endElement( aLibElementName );
360 0 : }
361 : }
362 4 : }
363 : }
364 :
365 : // ...ooo/script:libraries>
366 4 : m_xHandler->ignorableWhitespace( OUString() );
367 4 : m_xHandler->endElement( aLibContElementName );
368 :
369 8 : m_xHandler->endDocument();
370 : }
371 : }
372 0 : catch ( const container::NoSuchElementException& e )
373 : {
374 : SAL_INFO("xmlscript.xmlflat", "XMLBasicExporterBase::filter: caught NoSuchElementException reason " << e.Message );
375 0 : bReturn = false;
376 : }
377 0 : catch ( const lang::IllegalArgumentException& e )
378 : {
379 : SAL_INFO("xmlscript.xmlflat", "XMLBasicExporterBase::filter: caught IllegalArgumentException reason " << e.Message );
380 0 : bReturn = false;
381 : }
382 0 : catch ( const lang::WrappedTargetException& e )
383 : {
384 : SAL_INFO("xmlscript.xmlflat", "XMLBasicExporterBase::filter: caught WrappedTargetException reason " << e.Message );
385 0 : bReturn = false;
386 : }
387 0 : catch ( const xml::sax::SAXException& e )
388 : {
389 : SAL_INFO("xmlscript.xmlflat", "XMLBasicExporterBase::filter: caught SAXException reason " << e.Message );
390 0 : bReturn = false;
391 : }
392 :
393 4 : return bReturn;
394 : }
395 :
396 0 : void XMLBasicExporterBase::cancel()
397 : throw (RuntimeException, std::exception)
398 : {
399 0 : ::osl::MutexGuard aGuard( m_aMutex );
400 :
401 : // cancel export
402 0 : }
403 :
404 : // XMLBasicExporter
405 :
406 0 : XMLBasicExporter::XMLBasicExporter( const Reference< XComponentContext >& rxContext )
407 0 : :XMLBasicExporterBase( rxContext, false )
408 : {
409 0 : }
410 :
411 0 : XMLBasicExporter::~XMLBasicExporter()
412 : {
413 0 : }
414 :
415 : // XServiceInfo
416 :
417 0 : OUString XMLBasicExporter::getImplementationName( ) throw (RuntimeException, std::exception)
418 : {
419 0 : return getImplementationName_XMLBasicExporter();
420 : }
421 :
422 0 : Sequence< OUString > XMLBasicExporter::getSupportedServiceNames( ) throw (RuntimeException, std::exception)
423 : {
424 0 : return getSupportedServiceNames_XMLBasicExporter();
425 : }
426 :
427 : // XMLOasisBasicExporter
428 :
429 4 : XMLOasisBasicExporter::XMLOasisBasicExporter( const Reference< XComponentContext >& rxContext )
430 4 : :XMLBasicExporterBase( rxContext, true )
431 : {
432 4 : }
433 :
434 8 : XMLOasisBasicExporter::~XMLOasisBasicExporter()
435 : {
436 8 : }
437 :
438 : // XServiceInfo
439 :
440 0 : OUString XMLOasisBasicExporter::getImplementationName( ) throw (RuntimeException, std::exception)
441 : {
442 0 : return getImplementationName_XMLOasisBasicExporter();
443 : }
444 :
445 0 : Sequence< OUString > XMLOasisBasicExporter::getSupportedServiceNames( ) throw (RuntimeException, std::exception)
446 : {
447 0 : return getSupportedServiceNames_XMLOasisBasicExporter();
448 : }
449 :
450 : // component operations
451 :
452 0 : Reference< XInterface > SAL_CALL create_XMLBasicExporter(
453 : Reference< XComponentContext > const & xContext )
454 : {
455 0 : return static_cast< lang::XTypeProvider * >( new XMLBasicExporter( xContext ) );
456 : }
457 :
458 4 : Reference< XInterface > SAL_CALL create_XMLOasisBasicExporter(
459 : Reference< XComponentContext > const & xContext )
460 : {
461 4 : return static_cast< lang::XTypeProvider * >( new XMLOasisBasicExporter( xContext ) );
462 : }
463 :
464 : } // namespace xmlscript
465 :
466 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|