diff options
Diffstat (limited to 'scripting/source/storage/ScriptMetadataImporter.cxx')
-rw-r--r-- | scripting/source/storage/ScriptMetadataImporter.cxx | 532 |
1 files changed, 532 insertions, 0 deletions
diff --git a/scripting/source/storage/ScriptMetadataImporter.cxx b/scripting/source/storage/ScriptMetadataImporter.cxx new file mode 100644 index 000000000000..64dd87b2546b --- /dev/null +++ b/scripting/source/storage/ScriptMetadataImporter.cxx @@ -0,0 +1,532 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" + +#ifdef _DEBUG +#include <stdio.h> +#endif + +#include "ScriptMetadataImporter.hxx" + +#include <osl/mutex.hxx> + +#include <com/sun/star/xml/sax/XParser.hpp> +#include <rtl/string.h> + + +#include <util/util.hxx> + +using namespace ::rtl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace scripting_impl +{ +//************************************************************************* +ScriptMetadataImporter::ScriptMetadataImporter( + const Reference< XComponentContext > & xContext ) + : m_xContext( xContext ) +{ + OSL_TRACE( "< ScriptMetadataImporter ctor called >\n" ); + ms_localeDesc = new OUStringBuffer(); +} + +//************************************************************************* +ScriptMetadataImporter::~ScriptMetadataImporter() SAL_THROW( () ) +{ + OSL_TRACE( "< ScriptMetadataImporter dtor called >\n" ); + delete ms_localeDesc; +} + + +//************************************************************************* +void ScriptMetadataImporter::parseMetaData( + Reference< io::XInputStream > const & xInput, + const ::rtl::OUString & parcelURI, + InfoImpls_vec & io_ScriptDatas ) + throw ( xml::sax::SAXException, io::IOException, RuntimeException ) +{ + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + mpv_ScriptDatas = &io_ScriptDatas; + mpv_ScriptDatas->clear(); + + //Set the placeholder for the parcel URI + ms_parcelURI = parcelURI; + + //Get the parser service + validateXRef( m_xContext, + "ScriptMetadataImporter::parseMetaData: No context available" ); + + Reference< lang::XMultiComponentFactory > xMgr = + m_xContext->getServiceManager(); + + validateXRef( xMgr, + "ScriptMetadataImporter::parseMetaData: No service manager available" ); + + Reference< XInterface > xInterface = xMgr->createInstanceWithContext( + OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ); + + validateXRef( xInterface, "ScriptMetadataImporter::parseMetaData: cannot get SAX Parser" ); + Reference< xml::sax::XParser > xParser; + try + { + xParser.set( xInterface ,UNO_QUERY_THROW ); + } + catch (RuntimeException & re ) + { + OUString msg = OUString::createFromAscii( + "ScriptMetadata:Importer::parserMetaData cannot get XParser" ); + msg.concat( re.Message ); + throw RuntimeException( msg, Reference< XInterface > () ); + } + + // xxx todo: error handler, entity resolver omitted + // This class is the document handler for the parser + Reference< xml::sax::XDocumentHandler > t_smI( this ); + xParser->setDocumentHandler( t_smI ); + + //Set up the input for the parser, the XInputStream + xml::sax::InputSource source; + source.aInputStream = xInput; + source.sSystemId = OUSTR( "virtual file" ); + + OSL_TRACE( "ScriptMetadataImporter: Start the parser\n" ); + + try + { + xParser->parseStream( source ); + } + catch ( xml::sax::SAXException & saxe ) + { + OUString msg = OUString::createFromAscii( + "ScriptMetadata:Importer::parserMetaData SAXException" ); + msg.concat( saxe.Message ); + throw xml::sax::SAXException( msg, Reference< XInterface > (), + saxe.WrappedException ); + } + catch ( io::IOException & ioe ) + { + throw io::IOException( OUString::createFromAscii( + "ScriptMetadataImporter::parseMetaData IOException: " ) + ioe.Message, + Reference< XInterface > () ); + } + +#ifdef _DEBUG + catch ( ... ) + { + throw RuntimeException( OUString::createFromAscii( + "ScriptMetadataImporter::parseMetadata UnknownException: " ), + Reference< XInterface > () ); + } +#endif + + OSL_TRACE( "ScriptMetadataImporter: Parser finished\n "); + + OSL_TRACE( "ScriptMetadataImporter: vector size is %d\n", + mpv_ScriptDatas->size() ); +} + +//************************************************************************* +// XExtendedDocumentHandler impl +void ScriptMetadataImporter::startCDATA() + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: startCDATA()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::endCDATA() + throw ( RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: endDATA()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::comment( const ::rtl::OUString & sComment ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: comment()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::allowLineBreak() + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: allowLineBreak()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::unknown( const ::rtl::OUString & sString ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: unknown()\n" ); +} + +//************************************************************************* +// XDocumentHandler impl +void ScriptMetadataImporter::startDocument() + throw ( xml::sax::SAXException, RuntimeException ) +{ + // Ignore for now + OSL_TRACE( "ScriptMetadataImporter: startDocument()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::endDocument() + throw ( xml::sax::SAXException, RuntimeException ) +{ + // Ignore for now + OSL_TRACE( "ScriptMetadataImporter: endDocument()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::startElement( + const ::rtl::OUString& tagName, + const Reference< xml::sax::XAttributeList >& xAttribs ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + + OSL_TRACE( "Trace Message : ScriptMetadataImporter: startElement() %s\n", + ::rtl::OUStringToOString( tagName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + //Set the state of the state machine + setState( tagName ); + + //Processing the elements + switch( m_state ) + { + case SCRIPT: + m_ScriptData.parcelURI = ms_parcelURI; + m_ScriptData.language = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "language" )); + OSL_TRACE( "Trace Message: language is %s\n", + ::rtl::OUStringToOString( m_ScriptData.language, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case LOCALE: + ms_localeLang = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "lang" ) ); + OSL_TRACE( "Trace Message: Locale is %s\n", + ::rtl::OUStringToOString( ms_localeLang, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case DISPLAYNAME: + ms_localeDisName = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" )); + OSL_TRACE( "Trace Message: Displyaname is %s\n", + ::rtl::OUStringToOString( ms_localeDisName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FUNCTIONNAME: + m_ScriptData.functionname = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ); + OSL_TRACE( "Trace Message: Functionname is %s\n", + ::rtl::OUStringToOString( m_ScriptData.functionname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case LOGICALNAME: + m_ScriptData.logicalname = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" )); +#ifdef _DEBUG + fprintf(stderr, "Trace Message: logicalname is %s\n", + ::rtl::OUStringToOString( m_ScriptData.logicalname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); +#endif + break; + case LANGDEPPROPS: + m_ScriptData.languagedepprops.push_back( + ::std::make_pair( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ) + )); + OSL_TRACE( "Trace Message: Langdepprops is %s\t%s\n", + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FILESET: + ms_filesetname = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ); + OSL_TRACE( "Trace Message: filesetname is %s\n", + ::rtl::OUStringToOString(ms_filesetname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FILESETPROPS: + mv_filesetprops.push_back( ::std::make_pair( + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ) + )); + OSL_TRACE( "Trace Message: filesetprops is %s\t%s\n", + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + case FILES: + ms_filename = xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ); + OSL_TRACE( "Trace Message: filename is %s\n", + ::rtl::OUStringToOString( ms_filename, + RTL_TEXTENCODING_ASCII_US).pData->buffer ); + break; + case FILEPROPS: + /** + mm_files.insert( strpair_pair( ms_filename, + str_pair( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value") ) ) + ) + ); + */ + mv_fileprops.push_back(str_pair( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value") ) ) ); + OSL_TRACE( "Trace Message: fileprops is %s\t%s\n", + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "name" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( xAttribs->getValueByName( + ::rtl::OUString::createFromAscii( "value" ) ), + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + break; + + // to prevent compiler warnings + case PARCEL: + case DESCRIPTION: + case LANGUAGEDEPPROPS: + break; + } +} + +//************************************************************************* +void ScriptMetadataImporter::endElement( const ::rtl::OUString & aName ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + + //The end tag of an element + OSL_TRACE( "ScriptMetadataImporter: endElement() %s\n", + ::rtl::OUStringToOString( aName, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + //Set the state + setState( aName ); + + + switch ( m_state ) + { + case PARCEL: + break; + case SCRIPT: + // np adjust logicalName to be equal to function name + // as logical name concept has been removed + m_ScriptData.logicalname = m_ScriptData.functionname; + mpv_ScriptDatas->push_back( m_ScriptData ); + m_ScriptData = ScriptData(); + break; + case LOCALE: + m_ScriptData.locales[ ms_localeLang ] = ::std::make_pair( + ms_localeDisName, ms_localeDesc->makeStringAndClear().trim() ); + break; + case FILESET: + OSL_TRACE("adding fileset %s to filesets map", + ::rtl::OUStringToOString( ms_filesetname, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + m_ScriptData.filesets[ ms_filesetname ] = ::std::make_pair( + mv_filesetprops, mm_files ); + mm_files.clear(); + mv_filesetprops.clear(); + break; + case FILES: + OSL_TRACE("adding files %s to files map", + ::rtl::OUStringToOString( ms_filename, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + mm_files[ ms_filename ] = mv_fileprops; + mv_fileprops.clear(); + break; + // + // to prevent compiler warnings + case DISPLAYNAME: + case DESCRIPTION: + case FUNCTIONNAME: + case LOGICALNAME: + case LANGUAGEDEPPROPS: + case LANGDEPPROPS: + case FILESETPROPS: + case FILEPROPS: + break; + } +} + +//************************************************************************* +void ScriptMetadataImporter::characters( const ::rtl::OUString & aChars ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: characters()\n"); + + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + switch ( m_state ) + { + case DESCRIPTION: + //Put description into the struct + ms_localeDesc->append(aChars); + break; + case PARCEL: + case SCRIPT: + case LOCALE: + case DISPLAYNAME: + case FUNCTIONNAME: + case LOGICALNAME: + case LANGUAGEDEPPROPS: + case LANGDEPPROPS: + case FILESETPROPS: + case FILEPROPS: + break; + } +} + +//************************************************************************* +void ScriptMetadataImporter::ignorableWhitespace( + const ::rtl::OUString & aWhitespaces ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: ignorableWhiteSpace()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::processingInstruction( + const ::rtl::OUString & aTarget, const ::rtl::OUString & aData ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: processingInstruction()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::setDocumentLocator( + const Reference< xml::sax::XLocator >& xLocator ) + throw ( xml::sax::SAXException, RuntimeException ) +{ + OSL_TRACE( "ScriptMetadataImporter: setDocumentLocator()\n" ); +} + +//************************************************************************* +void ScriptMetadataImporter::setState( const ::rtl::OUString & tagName ) +{ + //Set the state depending on the tag name of the current + //element the parser has arrived at + ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); + + if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "parcel" ) ) ) + { + //Parcel tag + m_state = PARCEL; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "script" ) ) ) + { + m_state = SCRIPT; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "locale" ) ) ) + { + m_state = LOCALE; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "displayname" ) ) ) + { + m_state = DISPLAYNAME; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "description" ) ) ) + { + m_state = DESCRIPTION; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "functionname" ) ) ) + { + m_state = FUNCTIONNAME; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "logicalname" ) ) ) + { + m_state = LOGICALNAME; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "languagedepprops" ) ) ) + { + m_state = LANGUAGEDEPPROPS; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "prop" ) ) ) + { + if( m_state == LANGUAGEDEPPROPS ) + { + m_state = LANGDEPPROPS; + } + else if( m_state == FILESET ) + { + m_state = FILESETPROPS; + } + else if( m_state == FILES ) + { + m_state = FILEPROPS; + } + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "fileset" ) ) ) + { + m_state = FILESET; + } + else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "file" ) ) ) + { + m_state = FILES; + } + else + { + //If there is a tag we don't know about, throw a exception (wobbler) :) + ::rtl::OUString str_sax = ::rtl::OUString::createFromAscii( "No Such Tag" ); + + OSL_TRACE( "ScriptMetadataImporter: No Such Tag: %s\n", + ::rtl::OUStringToOString( + tagName, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + + throw xml::sax::SAXException( + str_sax, Reference< XInterface >(), Any() ); + } +} + +} |