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 27 #ifdef _DEBUG 28 #include <stdio.h> 29 #endif 30 31 #include "ScriptMetadataImporter.hxx" 32 33 #include <osl/mutex.hxx> 34 35 #include <com/sun/star/xml/sax/XParser.hpp> 36 #include <rtl/string.h> 37 #include <tools/diagnose_ex.h> 38 39 #include <util/util.hxx> 40 41 using namespace ::rtl; 42 using namespace ::com::sun::star; 43 using namespace ::com::sun::star::uno; 44 45 namespace scripting_impl 46 { 47 //************************************************************************* 48 ScriptMetadataImporter::ScriptMetadataImporter( 49 const Reference< XComponentContext > & xContext ) 50 : m_xContext( xContext ) 51 { 52 OSL_TRACE( "< ScriptMetadataImporter ctor called >\n" ); 53 ms_localeDesc = new OUStringBuffer(); 54 } 55 56 //************************************************************************* 57 ScriptMetadataImporter::~ScriptMetadataImporter() SAL_THROW( () ) 58 { 59 OSL_TRACE( "< ScriptMetadataImporter dtor called >\n" ); 60 delete ms_localeDesc; 61 } 62 63 64 //************************************************************************* 65 void ScriptMetadataImporter::parseMetaData( 66 Reference< io::XInputStream > const & xInput, 67 const ::rtl::OUString & parcelURI, 68 InfoImpls_vec & io_ScriptDatas ) 69 { 70 71 ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 72 73 mpv_ScriptDatas = &io_ScriptDatas; 74 mpv_ScriptDatas->clear(); 75 76 //Set the placeholder for the parcel URI 77 ms_parcelURI = parcelURI; 78 79 //Get the parser service 80 ENSURE_OR_THROW( m_xContext.is(), 81 "ScriptMetadataImporter::parseMetaData: No context available" ); 82 83 Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); 84 85 Reference< xml::sax::XParser > xParser( 86 xMgr->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ), 87 UNO_QUERY_THROW ); 88 89 // xxx todo: error handler, entity resolver omitted 90 // This class is the document handler for the parser 91 Reference< xml::sax::XDocumentHandler > t_smI( this ); 92 xParser->setDocumentHandler( t_smI ); 93 94 //Set up the input for the parser, the XInputStream 95 xml::sax::InputSource source; 96 source.aInputStream = xInput; 97 source.sSystemId = OUSTR( "virtual file" ); 98 99 OSL_TRACE( "ScriptMetadataImporter: Start the parser\n" ); 100 101 try 102 { 103 xParser->parseStream( source ); 104 } 105 catch ( xml::sax::SAXException & saxe ) 106 { 107 OUString msg = OUString::createFromAscii( 108 "ScriptMetadata:Importer::parserMetaData SAXException" ); 109 msg.concat( saxe.Message ); 110 throw xml::sax::SAXException( msg, Reference< XInterface > (), 111 saxe.WrappedException ); 112 } 113 catch ( io::IOException & ioe ) 114 { 115 throw io::IOException( OUString::createFromAscii( 116 "ScriptMetadataImporter::parseMetaData IOException: " ) + ioe.Message, 117 Reference< XInterface > () ); 118 } 119 120 #ifdef _DEBUG 121 catch ( ... ) 122 { 123 throw RuntimeException( OUString::createFromAscii( 124 "ScriptMetadataImporter::parseMetadata UnknownException: " ), 125 Reference< XInterface > () ); 126 } 127 #endif 128 129 OSL_TRACE( "ScriptMetadataImporter: Parser finished\n "); 130 131 OSL_TRACE( "ScriptMetadataImporter: vector size is %d\n", 132 mpv_ScriptDatas->size() ); 133 } 134 135 //************************************************************************* 136 // XExtendedDocumentHandler impl 137 void ScriptMetadataImporter::startCDATA() 138 { 139 OSL_TRACE( "ScriptMetadataImporter: startCDATA()\n" ); 140 } 141 142 //************************************************************************* 143 void ScriptMetadataImporter::endCDATA() 144 { 145 OSL_TRACE( "ScriptMetadataImporter: endDATA()\n" ); 146 } 147 148 //************************************************************************* 149 void ScriptMetadataImporter::comment( const ::rtl::OUString & sComment ) 150 { 151 OSL_TRACE( "ScriptMetadataImporter: comment()\n" ); 152 } 153 154 //************************************************************************* 155 void ScriptMetadataImporter::allowLineBreak() 156 { 157 OSL_TRACE( "ScriptMetadataImporter: allowLineBreak()\n" ); 158 } 159 160 //************************************************************************* 161 void ScriptMetadataImporter::unknown( const ::rtl::OUString & sString ) 162 { 163 OSL_TRACE( "ScriptMetadataImporter: unknown()\n" ); 164 } 165 166 //************************************************************************* 167 // XDocumentHandler impl 168 void ScriptMetadataImporter::startDocument() 169 { 170 // Ignore for now 171 OSL_TRACE( "ScriptMetadataImporter: startDocument()\n" ); 172 } 173 174 //************************************************************************* 175 void ScriptMetadataImporter::endDocument() 176 { 177 // Ignore for now 178 OSL_TRACE( "ScriptMetadataImporter: endDocument()\n" ); 179 } 180 181 //************************************************************************* 182 void ScriptMetadataImporter::startElement( 183 const ::rtl::OUString& tagName, 184 const Reference< xml::sax::XAttributeList >& xAttribs ) 185 { 186 187 OSL_TRACE( "Trace Message : ScriptMetadataImporter: startElement() %s\n", 188 ::rtl::OUStringToOString( tagName, 189 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 190 191 ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 192 193 //Set the state of the state machine 194 setState( tagName ); 195 196 //Processing the elements 197 switch( m_state ) 198 { 199 case SCRIPT: 200 m_ScriptData.parcelURI = ms_parcelURI; 201 m_ScriptData.language = xAttribs->getValueByName( 202 ::rtl::OUString::createFromAscii( "language" )); 203 OSL_TRACE( "Trace Message: language is %s\n", 204 ::rtl::OUStringToOString( m_ScriptData.language, 205 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 206 break; 207 case LOCALE: 208 ms_localeLang = xAttribs->getValueByName( 209 ::rtl::OUString::createFromAscii( "lang" ) ); 210 OSL_TRACE( "Trace Message: Locale is %s\n", 211 ::rtl::OUStringToOString( ms_localeLang, 212 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 213 break; 214 case DISPLAYNAME: 215 ms_localeDisName = xAttribs->getValueByName( 216 ::rtl::OUString::createFromAscii( "value" )); 217 OSL_TRACE( "Trace Message: Displyaname is %s\n", 218 ::rtl::OUStringToOString( ms_localeDisName, 219 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 220 break; 221 case FUNCTIONNAME: 222 m_ScriptData.functionname = xAttribs->getValueByName( 223 ::rtl::OUString::createFromAscii( "value" ) ); 224 OSL_TRACE( "Trace Message: Functionname is %s\n", 225 ::rtl::OUStringToOString( m_ScriptData.functionname, 226 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 227 break; 228 case LOGICALNAME: 229 m_ScriptData.logicalname = xAttribs->getValueByName( 230 ::rtl::OUString::createFromAscii( "value" )); 231 #ifdef _DEBUG 232 fprintf(stderr, "Trace Message: logicalname is %s\n", 233 ::rtl::OUStringToOString( m_ScriptData.logicalname, 234 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 235 #endif 236 break; 237 case LANGDEPPROPS: 238 m_ScriptData.languagedepprops.push_back( 239 ::std::make_pair( xAttribs->getValueByName( 240 ::rtl::OUString::createFromAscii( "name" ) ), 241 xAttribs->getValueByName( 242 ::rtl::OUString::createFromAscii( "value" ) ) 243 )); 244 OSL_TRACE( "Trace Message: Langdepprops is %s\t%s\n", 245 ::rtl::OUStringToOString( xAttribs->getValueByName( 246 ::rtl::OUString::createFromAscii( "name" ) ), 247 RTL_TEXTENCODING_ASCII_US ).pData->buffer, 248 ::rtl::OUStringToOString( xAttribs->getValueByName( 249 ::rtl::OUString::createFromAscii( "value" ) ), 250 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 251 break; 252 case FILESET: 253 ms_filesetname = xAttribs->getValueByName( 254 ::rtl::OUString::createFromAscii( "name" ) ); 255 OSL_TRACE( "Trace Message: filesetname is %s\n", 256 ::rtl::OUStringToOString(ms_filesetname, 257 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 258 break; 259 case FILESETPROPS: 260 mv_filesetprops.push_back( ::std::make_pair( 261 xAttribs->getValueByName( 262 ::rtl::OUString::createFromAscii( "name" ) ), 263 xAttribs->getValueByName( 264 ::rtl::OUString::createFromAscii( "value" ) ) 265 )); 266 OSL_TRACE( "Trace Message: filesetprops is %s\t%s\n", 267 ::rtl::OUStringToOString( xAttribs->getValueByName( 268 ::rtl::OUString::createFromAscii( "name" ) ), 269 RTL_TEXTENCODING_ASCII_US ).pData->buffer, 270 ::rtl::OUStringToOString( xAttribs->getValueByName( 271 ::rtl::OUString::createFromAscii( "value" ) ), 272 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 273 break; 274 case FILES: 275 ms_filename = xAttribs->getValueByName( 276 ::rtl::OUString::createFromAscii( "name" ) ); 277 OSL_TRACE( "Trace Message: filename is %s\n", 278 ::rtl::OUStringToOString( ms_filename, 279 RTL_TEXTENCODING_ASCII_US).pData->buffer ); 280 break; 281 case FILEPROPS: 282 /** 283 mm_files.insert( strpair_pair( ms_filename, 284 str_pair( xAttribs->getValueByName( 285 ::rtl::OUString::createFromAscii( "name" ) ), 286 xAttribs->getValueByName( 287 ::rtl::OUString::createFromAscii( "value") ) ) 288 ) 289 ); 290 */ 291 mv_fileprops.push_back(str_pair( xAttribs->getValueByName( 292 ::rtl::OUString::createFromAscii( "name" ) ), 293 xAttribs->getValueByName( 294 ::rtl::OUString::createFromAscii( "value") ) ) ); 295 OSL_TRACE( "Trace Message: fileprops is %s\t%s\n", 296 ::rtl::OUStringToOString( xAttribs->getValueByName( 297 ::rtl::OUString::createFromAscii( "name" ) ), 298 RTL_TEXTENCODING_ASCII_US ).pData->buffer, 299 ::rtl::OUStringToOString( xAttribs->getValueByName( 300 ::rtl::OUString::createFromAscii( "value" ) ), 301 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 302 break; 303 304 // to prevent compiler warnings 305 case PARCEL: 306 case DESCRIPTION: 307 case LANGUAGEDEPPROPS: 308 break; 309 } 310 } 311 312 //************************************************************************* 313 void ScriptMetadataImporter::endElement( const ::rtl::OUString & aName ) 314 { 315 316 //The end tag of an element 317 OSL_TRACE( "ScriptMetadataImporter: endElement() %s\n", 318 ::rtl::OUStringToOString( aName, 319 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 320 321 ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 322 323 //Set the state 324 setState( aName ); 325 326 327 switch ( m_state ) 328 { 329 case PARCEL: 330 break; 331 case SCRIPT: 332 // np adjust logicalName to be equal to function name 333 // as logical name concept has been removed 334 m_ScriptData.logicalname = m_ScriptData.functionname; 335 mpv_ScriptDatas->push_back( m_ScriptData ); 336 m_ScriptData = ScriptData(); 337 break; 338 case LOCALE: 339 m_ScriptData.locales[ ms_localeLang ] = ::std::make_pair( 340 ms_localeDisName, ms_localeDesc->makeStringAndClear().trim() ); 341 break; 342 case FILESET: 343 OSL_TRACE("adding fileset %s to filesets map", 344 ::rtl::OUStringToOString( ms_filesetname, 345 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 346 m_ScriptData.filesets[ ms_filesetname ] = ::std::make_pair( 347 mv_filesetprops, mm_files ); 348 mm_files.clear(); 349 mv_filesetprops.clear(); 350 break; 351 case FILES: 352 OSL_TRACE("adding files %s to files map", 353 ::rtl::OUStringToOString( ms_filename, 354 RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 355 mm_files[ ms_filename ] = mv_fileprops; 356 mv_fileprops.clear(); 357 break; 358 // 359 // to prevent compiler warnings 360 case DISPLAYNAME: 361 case DESCRIPTION: 362 case FUNCTIONNAME: 363 case LOGICALNAME: 364 case LANGUAGEDEPPROPS: 365 case LANGDEPPROPS: 366 case FILESETPROPS: 367 case FILEPROPS: 368 break; 369 } 370 } 371 372 //************************************************************************* 373 void ScriptMetadataImporter::characters( const ::rtl::OUString & aChars ) 374 { 375 OSL_TRACE( "ScriptMetadataImporter: characters()\n"); 376 377 ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 378 379 switch ( m_state ) 380 { 381 case DESCRIPTION: 382 //Put description into the struct 383 ms_localeDesc->append(aChars); 384 break; 385 case PARCEL: 386 case SCRIPT: 387 case LOCALE: 388 case DISPLAYNAME: 389 case FUNCTIONNAME: 390 case LOGICALNAME: 391 case LANGUAGEDEPPROPS: 392 case LANGDEPPROPS: 393 case FILESETPROPS: 394 case FILEPROPS: 395 break; 396 } 397 } 398 399 //************************************************************************* 400 void ScriptMetadataImporter::ignorableWhitespace( 401 const ::rtl::OUString & aWhitespaces ) 402 { 403 OSL_TRACE( "ScriptMetadataImporter: ignorableWhiteSpace()\n" ); 404 } 405 406 //************************************************************************* 407 void ScriptMetadataImporter::processingInstruction( 408 const ::rtl::OUString & aTarget, const ::rtl::OUString & aData ) 409 { 410 OSL_TRACE( "ScriptMetadataImporter: processingInstruction()\n" ); 411 } 412 413 //************************************************************************* 414 void ScriptMetadataImporter::setDocumentLocator( 415 const Reference< xml::sax::XLocator >& xLocator ) 416 { 417 OSL_TRACE( "ScriptMetadataImporter: setDocumentLocator()\n" ); 418 } 419 420 //************************************************************************* 421 void ScriptMetadataImporter::setState( const ::rtl::OUString & tagName ) 422 { 423 //Set the state depending on the tag name of the current 424 //element the parser has arrived at 425 ::osl::Guard< ::osl::Mutex > aGuard( m_mutex ); 426 427 if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "parcel" ) ) ) 428 { 429 //Parcel tag 430 m_state = PARCEL; 431 } 432 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "script" ) ) ) 433 { 434 m_state = SCRIPT; 435 } 436 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "locale" ) ) ) 437 { 438 m_state = LOCALE; 439 } 440 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "displayname" ) ) ) 441 { 442 m_state = DISPLAYNAME; 443 } 444 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "description" ) ) ) 445 { 446 m_state = DESCRIPTION; 447 } 448 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "functionname" ) ) ) 449 { 450 m_state = FUNCTIONNAME; 451 } 452 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "logicalname" ) ) ) 453 { 454 m_state = LOGICALNAME; 455 } 456 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "languagedepprops" ) ) ) 457 { 458 m_state = LANGUAGEDEPPROPS; 459 } 460 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "prop" ) ) ) 461 { 462 if( m_state == LANGUAGEDEPPROPS ) 463 { 464 m_state = LANGDEPPROPS; 465 } 466 else if( m_state == FILESET ) 467 { 468 m_state = FILESETPROPS; 469 } 470 else if( m_state == FILES ) 471 { 472 m_state = FILEPROPS; 473 } 474 } 475 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "fileset" ) ) ) 476 { 477 m_state = FILESET; 478 } 479 else if( tagName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "file" ) ) ) 480 { 481 m_state = FILES; 482 } 483 else 484 { 485 //If there is a tag we don't know about, throw a exception (wobbler) :) 486 ::rtl::OUString str_sax = ::rtl::OUString::createFromAscii( "No Such Tag" ); 487 488 OSL_TRACE( "ScriptMetadataImporter: No Such Tag: %s\n", 489 ::rtl::OUStringToOString( 490 tagName, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); 491 492 throw xml::sax::SAXException( 493 str_sax, Reference< XInterface >(), Any() ); 494 } 495 } 496 497 } 498