/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_xmlscript.hxx" #include "xmlbas_export.hxx" #include "xmlscript/xmlns.h" #include "xmlscript/xml_helper.hxx" #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; //......................................................................... namespace xmlscript { //......................................................................... // ============================================================================= // component operations // ============================================================================= ::rtl::OUString getImplementationName_XMLBasicExporter() { static ::rtl::OUString* pImplName = 0; if ( !pImplName ) { ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); if ( !pImplName ) { static ::rtl::OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.xmlscript.XMLBasicExporter" ) ); pImplName = &aImplName; } } return *pImplName; } // ----------------------------------------------------------------------------- Sequence< ::rtl::OUString > getSupportedServiceNames_XMLBasicExporter() { static Sequence< ::rtl::OUString >* pNames = 0; if ( !pNames ) { ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); if ( !pNames ) { static Sequence< ::rtl::OUString > aNames(1); aNames.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.XMLBasicExporter" ) ); pNames = &aNames; } } return *pNames; } // ----------------------------------------------------------------------------- ::rtl::OUString getImplementationName_XMLOasisBasicExporter() { static ::rtl::OUString* pImplName = 0; if ( !pImplName ) { ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); if ( !pImplName ) { static ::rtl::OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.xmlscript.XMLOasisBasicExporter" ) ); pImplName = &aImplName; } } return *pImplName; } // ----------------------------------------------------------------------------- Sequence< ::rtl::OUString > getSupportedServiceNames_XMLOasisBasicExporter() { static Sequence< ::rtl::OUString >* pNames = 0; if ( !pNames ) { ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); if ( !pNames ) { static Sequence< ::rtl::OUString > aNames(1); aNames.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.XMLOasisBasicExporter" ) ); pNames = &aNames; } } return *pNames; } // ============================================================================= // XMLBasicExporterBase // ============================================================================= XMLBasicExporterBase::XMLBasicExporterBase( const Reference< XComponentContext >& rxContext, sal_Bool bOasis ) :m_xContext( rxContext ) ,m_bOasis( bOasis ) { } // ----------------------------------------------------------------------------- XMLBasicExporterBase::~XMLBasicExporterBase() { } // ----------------------------------------------------------------------------- // XServiceInfo // ----------------------------------------------------------------------------- sal_Bool XMLBasicExporterBase::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException) { Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() ); const ::rtl::OUString* pNames = aNames.getConstArray(); const ::rtl::OUString* pEnd = pNames + aNames.getLength(); for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames ) ; return pNames != pEnd; } // ----------------------------------------------------------------------------- // XInitialization // ----------------------------------------------------------------------------- void XMLBasicExporterBase::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); if ( aArguments.getLength() == 1 ) { aArguments[0] >>= m_xHandler; if ( !m_xHandler.is() ) { throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLBasicExporterBase::initialize: invalid argument format!" ) ), Reference< XInterface >() ); } } else { throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLBasicExporterBase::initialize: invalid number of arguments!" ) ), Reference< XInterface >() ); } } // ----------------------------------------------------------------------------- // XExporter // ----------------------------------------------------------------------------- void XMLBasicExporterBase::setSourceDocument( const Reference< XComponent >& rxDoc ) throw (IllegalArgumentException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); m_xModel.set( rxDoc, UNO_QUERY ); if ( !m_xModel.is() ) { throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLBasicExporter::setSourceDocument: no document model!" ) ), Reference< XInterface >(), 1 ); } } // ----------------------------------------------------------------------------- // XFilter // ----------------------------------------------------------------------------- sal_Bool XMLBasicExporterBase::filter( const Sequence< beans::PropertyValue >& /*aDescriptor*/ ) throw (RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); sal_Bool bReturn = sal_True; try { if ( m_xHandler.is() ) { m_xHandler->startDocument(); // ooo/script prefix and URI ::rtl::OUString aPrefix; ::rtl::OUString aURI; if ( m_bOasis ) { aPrefix = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_OOO_PREFIX ) ); aURI = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_OOO_URI ) ); } else { aPrefix = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_SCRIPT_PREFIX ) ); aURI = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_SCRIPT_URI ) ); } // ooo/script:libraries element ::rtl::OUString aLibContElementName( aPrefix ); aLibContElementName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":libraries" ) ); XMLElement* pLibContElement = new XMLElement( aLibContElementName ); Reference< xml::sax::XAttributeList > xLibContAttribs( pLibContElement ); // ooo/script namespace attribute pLibContElement->addAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "xmlns:" ) ) + aPrefix, aURI ); // xlink namespace attribute pLibContElement->addAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "xmlns:" XMLNS_XLINK_PREFIX ) ), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_URI ) ) ); // ignorableWhitespace( ::rtl::OUString() ); m_xHandler->startElement( aLibContElementName, xLibContAttribs ); Reference< script::XLibraryContainer2 > xLibContainer; // try the XEmbeddedScripts interface Reference< document::XEmbeddedScripts > xDocumentScripts( m_xModel, UNO_QUERY ); if ( xDocumentScripts.is() ) xLibContainer.set( xDocumentScripts->getBasicLibraries().get() ); if ( !xLibContainer.is() ) { // try the "BasicLibraries" property (old-style, for compatibility) Reference< beans::XPropertySet > xPSet( m_xModel, UNO_QUERY ); if ( xPSet.is() ) xPSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BasicLibraries" ) ) ) >>= xLibContainer; } OSL_ENSURE( xLibContainer.is(), "XMLBasicExporterBase::filter: nowhere to export to!" ); if ( xLibContainer.is() ) { Sequence< ::rtl::OUString > aLibNames = xLibContainer->getElementNames(); sal_Int32 nLibCount = aLibNames.getLength(); const ::rtl::OUString* pLibNames = aLibNames.getConstArray(); for ( sal_Int32 i = 0 ; i < nLibCount ; ++i ) { ::rtl::OUString aLibName( pLibNames[i] ); if ( xLibContainer->hasByName( aLibName ) ) { ::rtl::OUString aTrueStr( RTL_CONSTASCII_USTRINGPARAM( "true" ) ); if ( xLibContainer->isLibraryLink( aLibName ) ) { // ooo/script:library-linked element ::rtl::OUString aLibElementName( aPrefix ); aLibElementName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":library-linked" ) ); XMLElement* pLibElement = new XMLElement( aLibElementName ); Reference< xml::sax::XAttributeList > xLibAttribs; xLibAttribs = static_cast< xml::sax::XAttributeList* >( pLibElement ); // ooo/script:name attribute pLibElement->addAttribute( aPrefix + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":name" ) ), aLibName ); ::rtl::OUString aLinkURL( xLibContainer->getLibraryLinkURL( aLibName ) ); if ( aLinkURL.getLength() ) { // xlink:href attribute pLibElement->addAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX ":href" ) ), aLinkURL ); // xlink:type attribute pLibElement->addAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX ":type" ) ), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "simple" ) ) ); } if ( xLibContainer->isLibraryReadOnly( aLibName ) ) { // ooo/script:readonly attribute pLibElement->addAttribute( aPrefix + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":readonly" ) ), aTrueStr ); } // ignorableWhitespace( ::rtl::OUString() ); m_xHandler->startElement( aLibElementName, xLibAttribs ); // ...ooo/script:library-linked> m_xHandler->ignorableWhitespace( ::rtl::OUString() ); m_xHandler->endElement( aLibElementName ); } else { // ooo/script:library-embedded element ::rtl::OUString aLibElementName( aPrefix ); aLibElementName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":library-embedded" ) ); XMLElement* pLibElement = new XMLElement( aLibElementName ); Reference< xml::sax::XAttributeList > xLibAttribs; xLibAttribs = static_cast< xml::sax::XAttributeList* >( pLibElement ); // ooo/script:name attribute pLibElement->addAttribute( aPrefix + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":name" ) ), aLibName ); if ( xLibContainer->isLibraryReadOnly( aLibName ) ) { // ooo/script:readonly attribute pLibElement->addAttribute( aPrefix + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":readonly" ) ), aTrueStr ); } // TODO: password protected libraries Reference< script::XLibraryContainerPassword > xPasswd( xLibContainer, UNO_QUERY ); if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) ) continue; // ignorableWhitespace( ::rtl::OUString() ); m_xHandler->startElement( aLibElementName, xLibAttribs ); if ( !xLibContainer->isLibraryLoaded( aLibName ) ) xLibContainer->loadLibrary( aLibName ); Reference< container::XNameContainer > xLib; xLibContainer->getByName( aLibName ) >>= xLib; if ( xLib.is() ) { Sequence< ::rtl::OUString > aModNames = xLib->getElementNames(); sal_Int32 nModCount = aModNames.getLength(); const ::rtl::OUString* pModNames = aModNames.getConstArray(); for ( sal_Int32 j = 0 ; j < nModCount ; ++j ) { ::rtl::OUString aModName( pModNames[j] ); if ( xLib->hasByName( aModName ) ) { // ooo/script:module element ::rtl::OUString aModElementName( aPrefix ); aModElementName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":module" ) ); XMLElement* pModElement = new XMLElement( aModElementName ); Reference< xml::sax::XAttributeList > xModAttribs; xModAttribs = static_cast< xml::sax::XAttributeList* >( pModElement ); // ooo/script:name attribute pModElement->addAttribute( aPrefix + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":name" ) ), aModName ); // ignorableWhitespace( ::rtl::OUString() ); m_xHandler->startElement( aModElementName, xModAttribs ); // ooo/script:source-code element ::rtl::OUString aSourceElementName( aPrefix ); aSourceElementName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":source-code" ) ); XMLElement* pSourceElement = new XMLElement( aSourceElementName ); Reference< xml::sax::XAttributeList > xSourceAttribs; xSourceAttribs = static_cast< xml::sax::XAttributeList* >( pSourceElement ); // ignorableWhitespace( ::rtl::OUString() ); m_xHandler->startElement( aSourceElementName, xSourceAttribs ); // module data // TODO: write encrypted data for password protected libraries ::rtl::OUString aSource; xLib->getByName( aModName ) >>= aSource; m_xHandler->characters( aSource ); // TODO: // ...ooo/script:source-code> m_xHandler->ignorableWhitespace( ::rtl::OUString() ); m_xHandler->endElement( aSourceElementName ); // ...ooo/script:module> m_xHandler->ignorableWhitespace( ::rtl::OUString() ); m_xHandler->endElement( aModElementName ); } } } // ...ooo/script:library-embedded> m_xHandler->ignorableWhitespace( ::rtl::OUString() ); m_xHandler->endElement( aLibElementName ); } } } } // ...ooo/script:libraries> m_xHandler->ignorableWhitespace( ::rtl::OUString() ); m_xHandler->endElement( aLibContElementName ); m_xHandler->endDocument(); } } catch ( container::NoSuchElementException& e ) { OSL_TRACE( "XMLBasicExporterBase::filter: caught NoSuchElementException reason %s", ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); bReturn = sal_False; } catch ( lang::IllegalArgumentException& e ) { OSL_TRACE( "XMLBasicExporterBase::filter: caught IllegalArgumentException reason %s", ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); bReturn = sal_False; } catch ( lang::WrappedTargetException& e ) { OSL_TRACE( "XMLBasicExporterBase::filter: caught WrappedTargetException reason %s", ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); bReturn = sal_False; } catch ( xml::sax::SAXException& e ) { OSL_TRACE( "XMLBasicExporterBase::filter: caught SAXException reason %s", ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); bReturn = sal_False; } return bReturn; } // ----------------------------------------------------------------------------- void XMLBasicExporterBase::cancel() throw (RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); // cancel export } // ============================================================================= // XMLBasicExporter // ============================================================================= XMLBasicExporter::XMLBasicExporter( const Reference< XComponentContext >& rxContext ) :XMLBasicExporterBase( rxContext, sal_False ) { } // ----------------------------------------------------------------------------- XMLBasicExporter::~XMLBasicExporter() { } // ----------------------------------------------------------------------------- // XServiceInfo // ----------------------------------------------------------------------------- ::rtl::OUString XMLBasicExporter::getImplementationName( ) throw (RuntimeException) { return getImplementationName_XMLBasicExporter(); } // ----------------------------------------------------------------------------- Sequence< ::rtl::OUString > XMLBasicExporter::getSupportedServiceNames( ) throw (RuntimeException) { return getSupportedServiceNames_XMLBasicExporter(); } // ============================================================================= // XMLOasisBasicExporter // ============================================================================= XMLOasisBasicExporter::XMLOasisBasicExporter( const Reference< XComponentContext >& rxContext ) :XMLBasicExporterBase( rxContext, sal_True ) { } // ----------------------------------------------------------------------------- XMLOasisBasicExporter::~XMLOasisBasicExporter() { } // ----------------------------------------------------------------------------- // XServiceInfo // ----------------------------------------------------------------------------- ::rtl::OUString XMLOasisBasicExporter::getImplementationName( ) throw (RuntimeException) { return getImplementationName_XMLOasisBasicExporter(); } // ----------------------------------------------------------------------------- Sequence< ::rtl::OUString > XMLOasisBasicExporter::getSupportedServiceNames( ) throw (RuntimeException) { return getSupportedServiceNames_XMLOasisBasicExporter(); } // ============================================================================= // component operations // ============================================================================= Reference< XInterface > SAL_CALL create_XMLBasicExporter( Reference< XComponentContext > const & xContext ) SAL_THROW( () ) { return static_cast< lang::XTypeProvider * >( new XMLBasicExporter( xContext ) ); } // ----------------------------------------------------------------------------- Reference< XInterface > SAL_CALL create_XMLOasisBasicExporter( Reference< XComponentContext > const & xContext ) SAL_THROW( () ) { return static_cast< lang::XTypeProvider * >( new XMLOasisBasicExporter( xContext ) ); } // ----------------------------------------------------------------------------- //......................................................................... } // namespace xmlscript //.........................................................................