xref: /trunk/main/scripting/source/storage/ScriptMetadataImporter.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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