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 //*************************************************************************
ScriptMetadataImporter(const Reference<XComponentContext> & xContext)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 //*************************************************************************
~ScriptMetadataImporter()57 ScriptMetadataImporter::~ScriptMetadataImporter() SAL_THROW( () )
58 {
59 OSL_TRACE( "< ScriptMetadataImporter dtor called >\n" );
60 delete ms_localeDesc;
61 }
62
63
64 //*************************************************************************
parseMetaData(Reference<io::XInputStream> const & xInput,const::rtl::OUString & parcelURI,InfoImpls_vec & io_ScriptDatas)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
startCDATA()137 void ScriptMetadataImporter::startCDATA()
138 {
139 OSL_TRACE( "ScriptMetadataImporter: startCDATA()\n" );
140 }
141
142 //*************************************************************************
endCDATA()143 void ScriptMetadataImporter::endCDATA()
144 {
145 OSL_TRACE( "ScriptMetadataImporter: endDATA()\n" );
146 }
147
148 //*************************************************************************
comment(const::rtl::OUString & sComment)149 void ScriptMetadataImporter::comment( const ::rtl::OUString & sComment )
150 {
151 OSL_TRACE( "ScriptMetadataImporter: comment()\n" );
152 }
153
154 //*************************************************************************
allowLineBreak()155 void ScriptMetadataImporter::allowLineBreak()
156 {
157 OSL_TRACE( "ScriptMetadataImporter: allowLineBreak()\n" );
158 }
159
160 //*************************************************************************
unknown(const::rtl::OUString & sString)161 void ScriptMetadataImporter::unknown( const ::rtl::OUString & sString )
162 {
163 OSL_TRACE( "ScriptMetadataImporter: unknown()\n" );
164 }
165
166 //*************************************************************************
167 // XDocumentHandler impl
startDocument()168 void ScriptMetadataImporter::startDocument()
169 {
170 // Ignore for now
171 OSL_TRACE( "ScriptMetadataImporter: startDocument()\n" );
172 }
173
174 //*************************************************************************
endDocument()175 void ScriptMetadataImporter::endDocument()
176 {
177 // Ignore for now
178 OSL_TRACE( "ScriptMetadataImporter: endDocument()\n" );
179 }
180
181 //*************************************************************************
startElement(const::rtl::OUString & tagName,const Reference<xml::sax::XAttributeList> & xAttribs)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 //*************************************************************************
endElement(const::rtl::OUString & aName)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 //*************************************************************************
characters(const::rtl::OUString & aChars)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 //*************************************************************************
ignorableWhitespace(const::rtl::OUString & aWhitespaces)400 void ScriptMetadataImporter::ignorableWhitespace(
401 const ::rtl::OUString & aWhitespaces )
402 {
403 OSL_TRACE( "ScriptMetadataImporter: ignorableWhiteSpace()\n" );
404 }
405
406 //*************************************************************************
processingInstruction(const::rtl::OUString & aTarget,const::rtl::OUString & aData)407 void ScriptMetadataImporter::processingInstruction(
408 const ::rtl::OUString & aTarget, const ::rtl::OUString & aData )
409 {
410 OSL_TRACE( "ScriptMetadataImporter: processingInstruction()\n" );
411 }
412
413 //*************************************************************************
setDocumentLocator(const Reference<xml::sax::XLocator> & xLocator)414 void ScriptMetadataImporter::setDocumentLocator(
415 const Reference< xml::sax::XLocator >& xLocator )
416 {
417 OSL_TRACE( "ScriptMetadataImporter: setDocumentLocator()\n" );
418 }
419
420 //*************************************************************************
setState(const::rtl::OUString & tagName)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