1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_scripting.hxx" 26 #include <osl/diagnose.h> 27 #include <osl/file.h> 28 29 #ifdef _DEBUG 30 #include <stdio.h> 31 #endif 32 33 //Local headers 34 #include "ScriptURI.hxx" 35 #include <util/util.hxx> 36 37 using namespace ::rtl; 38 using namespace ::com::sun::star; 39 using namespace ::com::sun::star::uno; 40 using namespace ::com::sun::star::lang; 41 42 43 namespace scripting_impl { 44 45 static const OUString schema = OUString::createFromAscii( "vnd.sun.star.script://" ); 46 47 /** 48 * Constructor 49 * 50 * @param scriptURI the string script URI 51 */ 52 ScriptURI::ScriptURI( const ::rtl::OUString& scriptURI ) 53 throw ( IllegalArgumentException ) : m_uri( scriptURI ) 54 { 55 OSL_TRACE( "received uri: %s\n",::rtl::OUStringToOString( m_uri, RTL_TEXTENCODING_ASCII_US).pData->buffer ); 56 set_values( parseIt() ); 57 if( !isValid() ) 58 { 59 OSL_TRACE( "ScriptURI ctor: throwing IllegalArgException" ); 60 throw IllegalArgumentException( 61 OUSTR( "Failed to parse invalid URI: " ).concat( scriptURI ), 62 Reference < XInterface > (), 1 ); 63 } 64 } 65 66 /** 67 * Destuctor 68 * 69 */ 70 // dtor should never throw exceptions, so ensure this by specifying it 71 ScriptURI::~ScriptURI() SAL_THROW( () ) 72 { 73 OSL_TRACE( "< ScriptURI dtor called >\n" ); 74 } 75 76 /** 77 * This function is used to determine if this object represents a valid URI 78 * 79 */ 80 bool ScriptURI::isValid( ) { 81 return ( m_valid == sal_True ); 82 } 83 84 /** 85 * This function returns the location of the script 86 * 87 */ 88 ::rtl::OUString ScriptURI::getLocation( ) 89 { 90 return m_location; 91 } 92 93 /** 94 * This function returns the language of the script, eg. java, StarBasic,... 95 * 96 */ 97 ::rtl::OUString ScriptURI::getLanguage( ) 98 { 99 return m_language; 100 } 101 102 /** 103 * This function returns the language dependent function name of the script 104 * 105 */ 106 ::rtl::OUString ScriptURI::getFunctionName( ) 107 { 108 return m_functionName; 109 } 110 111 /** 112 * This function returns the language independent logical name of the script 113 * 114 */ 115 ::rtl::OUString ScriptURI::getLogicalName( ) 116 { 117 return m_logicalName; 118 } 119 120 /** 121 * This function returns the full URI 122 * 123 */ 124 ::rtl::OUString ScriptURI::getURI( ) 125 { 126 return m_uri; 127 } 128 129 //Private mutex guarded method for setting the members 130 void ScriptURI::set_values( scripting_impl::Uri values ) 131 { 132 osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 133 m_valid = values.valid; 134 m_location = values.location; 135 m_language = values.language; 136 // format is vnd.sun.star.script://[function_name]?language=[languge]&location=[location] 137 // LogicalName is now not used anymore, further more the ScriptURI class 138 // will be retired also and a new UNO service will be used. Additionally the 139 // parcel-description will also need to be modified to remove logical name 140 // In order to temporarly support the existing code functionname is 141 // set to the logica name parsed by this class. So getLogicalName() and 142 // getFunctionName() return identical string. 143 // 144 145 m_functionName = values.logicalName; 146 m_logicalName = values.logicalName; 147 148 } 149 /** 150 * This is a private method used for parsing the URI received by the 151 * initialization. 152 * 153 */ 154 // rather naive parsing? 155 Uri ScriptURI::parseIt() 156 { 157 sal_Int32 schemaLen = schema.getLength(); 158 scripting_impl::Uri results; 159 results.valid = sal_True; 160 //attempt to parse 161 // check that it starts vnd.sun.star.script 162 // better check for OBO errors here 163 if( m_uri.indexOf( schema ) != 0 ) 164 { 165 OSL_TRACE( "wrong schema" ); 166 results.valid=sal_False; 167 return results; 168 } 169 170 // substr from here to the '?' and set the logical name 171 sal_Int32 len = m_uri.indexOf( '?' ); 172 if( len == -1 ) 173 { 174 // no queries so just set the logical name 175 results.logicalName = m_uri.copy( schemaLen ); 176 return results; 177 } 178 results.logicalName = m_uri.copy( schemaLen, len-schemaLen ); 179 OSL_TRACE( "log name: %s\n", ::rtl::OUStringToOString( results.logicalName, 180 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 181 182 len++; 183 // now get the attributes 184 OUString attr; 185 do 186 { 187 attr = m_uri.getToken( 0, '&', len ); 188 OSL_TRACE( "chunk: %s\n", ::rtl::OUStringToOString( attr, 189 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 190 191 if( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "language" ) ) 192 == sal_True ) 193 { 194 sal_Int32 len2 = attr.indexOf('='); 195 results.language = attr.copy( len2 + 1 ); 196 continue; 197 } 198 else if ( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "location" ) ) 199 == sal_True ) 200 { 201 sal_Int32 len2 = attr.indexOf( '=' ); 202 results.location = attr.copy( len2 + 1 ); 203 continue; 204 } 205 else if ( attr.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "function" ) ) 206 == sal_True ) 207 { 208 sal_Int32 len2 = attr.indexOf( '=' ); 209 results.functionName = attr.copy( len2 + 1 ); 210 continue; 211 } 212 else 213 { 214 OSL_TRACE( "Unknown attribute?\n" ); 215 } 216 } 217 while ( len >= 0 ); 218 219 // parse is good 220 return results; 221 } 222 223 } // namespace script_uri 224