/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_scripting.hxx" #include #include #ifdef _DEBUG #include #endif //Local headers #include "ScriptURI.hxx" #include using namespace ::rtl; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; namespace scripting_impl { static const OUString schema(RTL_CONSTASCII_USTRINGPARAM("vnd.sun.star.script://")); /** * Constructor * * @param scriptURI the string script URI */ ScriptURI::ScriptURI( const ::rtl::OUString& scriptURI ) throw ( IllegalArgumentException ) : m_uri( scriptURI ) { OSL_TRACE( "received uri: %s\n",::rtl::OUStringToOString( m_uri, RTL_TEXTENCODING_ASCII_US).pData->buffer ); set_values( parseIt() ); if( !isValid() ) { OSL_TRACE( "ScriptURI ctor: throwing IllegalArgException" ); throw IllegalArgumentException( OUSTR( "Failed to parse invalid URI: " ).concat( scriptURI ), Reference < XInterface > (), 1 ); } } /** * Destuctor * */ // dtor should never throw exceptions, so ensure this by specifying it ScriptURI::~ScriptURI() SAL_THROW( () ) { OSL_TRACE( "< ScriptURI dtor called >\n" ); } /** * This function is used to determine if this object represents a valid URI * */ bool ScriptURI::isValid( ) { return ( m_valid == sal_True ); } /** * This function returns the location of the script * */ ::rtl::OUString ScriptURI::getLocation( ) { return m_location; } /** * This function returns the language of the script, eg. java, StarBasic,... * */ ::rtl::OUString ScriptURI::getLanguage( ) { return m_language; } /** * This function returns the language dependent function name of the script * */ ::rtl::OUString ScriptURI::getFunctionName( ) { return m_functionName; } /** * This function returns the language independent logical name of the script * */ ::rtl::OUString ScriptURI::getLogicalName( ) { return m_logicalName; } /** * This function returns the full URI * */ ::rtl::OUString ScriptURI::getURI( ) { return m_uri; } //Private mutex guarded method for setting the members void ScriptURI::set_values( scripting_impl::Uri values ) { osl::Guard< ::osl::Mutex > aGuard( m_mutex ); m_valid = values.valid; m_location = values.location; m_language = values.language; // format is vnd.sun.star.script://[function_name]?language=[languge]&location=[location] // LogicalName is now not used anymore, further more the ScriptURI class // will be retired also and a new UNO service will be used. Additionally the // parcel-description will also need to be modified to remove logical name // In order to temporarly support the existing code functionname is // set to the logica name parsed by this class. So getLogicalName() and // getFunctionName() return identical string. m_functionName = values.logicalName; m_logicalName = values.logicalName; } /** * This is a private method used for parsing the URI received by the * initialization. * */ // rather naive parsing? Uri ScriptURI::parseIt() { sal_Int32 schemaLen = schema.getLength(); scripting_impl::Uri results; results.valid = sal_True; //attempt to parse // check that it starts vnd.sun.star.script // better check for OBO errors here if( m_uri.indexOf( schema ) != 0 ) { OSL_TRACE( "wrong schema" ); results.valid=sal_False; return results; } // substr from here to the '?' and set the logical name sal_Int32 len = m_uri.indexOf( '?' ); if( len == -1 ) { // no queries so just set the logical name results.logicalName = m_uri.copy( schemaLen ); return results; } results.logicalName = m_uri.copy( schemaLen, len-schemaLen ); OSL_TRACE( "log name: %s\n", ::rtl::OUStringToOString( results.logicalName, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); len++; // now get the attributes OUString attr; do { attr = m_uri.getToken( 0, '&', len ); OSL_TRACE( "chunk: %s\n", ::rtl::OUStringToOString( attr, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); if( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "language" ) ) == sal_True ) { sal_Int32 len2 = attr.indexOf('='); results.language = attr.copy( len2 + 1 ); continue; } else if ( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "location" ) ) == sal_True ) { sal_Int32 len2 = attr.indexOf( '=' ); results.location = attr.copy( len2 + 1 ); continue; } else if ( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "function" ) ) == sal_True ) { sal_Int32 len2 = attr.indexOf( '=' ); results.functionName = attr.copy( len2 + 1 ); continue; } else { OSL_TRACE( "Unknown attribute?\n" ); } } while ( len >= 0 ); // parse is good return results; } } // namespace script_uri /* vim:set shiftwidth=4 softtabstop=4 expandtab: */