Bug Summary

File:stoc/source/registry_tdprovider/tdprovider.cxx
Location:line 452, column 12
Description:Called C++ object pointer is null

Annotated Source Code

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <osl/diagnose.h>
21#include <osl/mutex.hxx>
22#include <uno/dispatcher.h>
23#include <uno/mapping.hxx>
24#include <cppuhelper/factory.hxx>
25#include <cppuhelper/compbase4.hxx>
26#include <cppuhelper/implbase2.hxx>
27#include <cppuhelper/typeprovider.hxx>
28
29#include <cppuhelper/weakref.hxx>
30
31#include <com/sun/star/lang/XServiceInfo.hpp>
32#include <com/sun/star/lang/XComponent.hpp>
33#include <com/sun/star/lang/XTypeProvider.hpp>
34#include <com/sun/star/lang/XInitialization.hpp>
35#include <com/sun/star/registry/XSimpleRegistry.hpp>
36#include <com/sun/star/registry/XRegistryKey.hpp>
37#include <com/sun/star/beans/XPropertySet.hpp>
38#include <com/sun/star/reflection/XTypeDescriptionEnumerationAccess.hpp>
39#include "com/sun/star/uno/RuntimeException.hpp"
40
41#include "registry/reader.hxx"
42#include "registry/version.h"
43#include "base.hxx"
44#include "rdbtdp_tdenumeration.hxx"
45#include "structtypedescription.hxx"
46
47#define SERVICENAME"com.sun.star.reflection.TypeDescriptionProvider" "com.sun.star.reflection.TypeDescriptionProvider"
48#define IMPLNAME"com.sun.star.comp.stoc.RegistryTypeDescriptionProvider" "com.sun.star.comp.stoc.RegistryTypeDescriptionProvider"
49
50using namespace com::sun::star;
51using namespace com::sun::star::beans;
52using namespace com::sun::star::registry;
53
54extern rtl_StandardModuleCount g_moduleCount;
55
56namespace stoc_bootstrap
57{
58uno::Sequence< OUString > rdbtdp_getSupportedServiceNames()
59{
60 Sequence< OUString > seqNames(1);
61 seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME)(&("com.sun.star.reflection.TypeDescriptionProvider")[0])
, ((sal_Int32)((sizeof ("com.sun.star.reflection.TypeDescriptionProvider"
) / sizeof (("com.sun.star.reflection.TypeDescriptionProvider"
)[0]))-1)), (((rtl_TextEncoding) 11))
);
62 return seqNames;
63}
64
65OUString rdbtdp_getImplementationName()
66{
67 return OUString(RTL_CONSTASCII_USTRINGPARAM(IMPLNAME)(&("com.sun.star.comp.stoc.RegistryTypeDescriptionProvider"
)[0]), ((sal_Int32)((sizeof ("com.sun.star.comp.stoc.RegistryTypeDescriptionProvider"
) / sizeof (("com.sun.star.comp.stoc.RegistryTypeDescriptionProvider"
)[0]))-1)), (((rtl_TextEncoding) 11))
);
68}
69}
70
71namespace stoc_rdbtdp
72{
73struct MutexHolder
74{
75 Mutex _aComponentMutex;
76};
77//==================================================================================================
78class ProviderImpl
79 : public MutexHolder
80 , public WeakComponentImplHelper4< XServiceInfo,
81 XHierarchicalNameAccess,
82 XTypeDescriptionEnumerationAccess,
83 XInitialization >
84{
85 // XHierarchicalNameAccess + XTypeDescriptionEnumerationAccess wrapper
86 // first asking the tdmgr instance, then looking up locally
87 class TypeDescriptionManagerWrapper
88 : public ::cppu::WeakImplHelper2<
89 container::XHierarchicalNameAccess,
90 reflection::XTypeDescriptionEnumerationAccess>
91 {
92 com::sun::star::uno::Reference<container::XHierarchicalNameAccess>
93 m_xTDMgr;
94 com::sun::star::uno::Reference<container::XHierarchicalNameAccess>
95 m_xThisProvider;
96 public:
97 TypeDescriptionManagerWrapper( ProviderImpl * pProvider )
98 : m_xTDMgr( pProvider->_xContext->getValueByName(
99 OUString( RTL_CONSTASCII_USTRINGPARAM((&("/singletons/com.sun.star.reflection." "theTypeDescriptionManager"
)[0]), ((sal_Int32)((sizeof ("/singletons/com.sun.star.reflection."
"theTypeDescriptionManager") / sizeof (("/singletons/com.sun.star.reflection."
"theTypeDescriptionManager")[0]))-1)), (((rtl_TextEncoding) 11
))
100 "/singletons/com.sun.star.reflection."(&("/singletons/com.sun.star.reflection." "theTypeDescriptionManager"
)[0]), ((sal_Int32)((sizeof ("/singletons/com.sun.star.reflection."
"theTypeDescriptionManager") / sizeof (("/singletons/com.sun.star.reflection."
"theTypeDescriptionManager")[0]))-1)), (((rtl_TextEncoding) 11
))
101 "theTypeDescriptionManager")(&("/singletons/com.sun.star.reflection." "theTypeDescriptionManager"
)[0]), ((sal_Int32)((sizeof ("/singletons/com.sun.star.reflection."
"theTypeDescriptionManager") / sizeof (("/singletons/com.sun.star.reflection."
"theTypeDescriptionManager")[0]))-1)), (((rtl_TextEncoding) 11
))
) ),
102 UNO_QUERY_THROW ),
103 m_xThisProvider( pProvider )
104 {}
105 // XHierarchicalNameAccess
106 virtual Any SAL_CALL getByHierarchicalName( OUString const & name )
107 throw (container::NoSuchElementException, RuntimeException);
108 virtual sal_Bool SAL_CALL hasByHierarchicalName( OUString const & name )
109 throw (RuntimeException);
110
111 // XTypeDescriptionEnumerationAccess
112 virtual uno::Reference<
113 reflection::XTypeDescriptionEnumeration > SAL_CALL
114 createTypeDescriptionEnumeration(
115 const ::rtl::OUString& moduleName,
116 const uno::Sequence< uno::TypeClass >& types,
117 reflection::TypeDescriptionSearchDepth depth )
118 throw ( reflection::NoSuchTypeNameException,
119 reflection::InvalidTypeNameException,
120 uno::RuntimeException );
121 };
122 friend class TypeDescriptionManagerWrapper;
123
124 com::sun::star::uno::Reference< XComponentContext > _xContext;
125 com::sun::star::uno::WeakReference<XHierarchicalNameAccess> _xTDMgr;
126 com::sun::star::uno::Reference< XHierarchicalNameAccess > getTDMgr() SAL_THROW(());
127
128 RegistryKeyList _aBaseKeys;
129
130protected:
131 virtual void SAL_CALL disposing();
132
133public:
134 ProviderImpl( const com::sun::star::uno::Reference< XComponentContext > & xContext );
135 virtual ~ProviderImpl();
136
137 // XInitialization
138 virtual void SAL_CALL initialize( const Sequence< Any > & args ) throw (Exception, RuntimeException);
139
140 // XServiceInfo
141 virtual OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException);
142 virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName ) throw(::com::sun::star::uno::RuntimeException);
143 virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
144
145 // XHierarchicalNameAccess
146 Any getByHierarchicalNameImpl( const OUString & rName );
147
148 virtual Any SAL_CALL getByHierarchicalName( const OUString & rName ) throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
149 virtual sal_Bool SAL_CALL hasByHierarchicalName( const OUString & rName ) throw(::com::sun::star::uno::RuntimeException);
150
151 // XTypeDescriptionEnumerationAccess
152 virtual ::com::sun::star::uno::Reference<
153 ::com::sun::star::reflection::XTypeDescriptionEnumeration > SAL_CALL
154 createTypeDescriptionEnumeration(
155 const ::rtl::OUString& moduleName,
156 const ::com::sun::star::uno::Sequence<
157 ::com::sun::star::uno::TypeClass >& types,
158 ::com::sun::star::reflection::TypeDescriptionSearchDepth depth )
159 throw ( ::com::sun::star::reflection::NoSuchTypeNameException,
160 ::com::sun::star::reflection::InvalidTypeNameException,
161 ::com::sun::star::uno::RuntimeException );
162};
163//__________________________________________________________________________________________________
164ProviderImpl::ProviderImpl( const com::sun::star::uno::Reference< XComponentContext > & xContext )
165 : WeakComponentImplHelper4<
166 XServiceInfo, XHierarchicalNameAccess,
167 XTypeDescriptionEnumerationAccess, XInitialization >( _aComponentMutex )
168 , _xContext( xContext )
169{
170 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
171}
172//__________________________________________________________________________________________________
173ProviderImpl::~ProviderImpl()
174{
175 g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
176}
177
178//______________________________________________________________________________
179Any ProviderImpl::TypeDescriptionManagerWrapper::getByHierarchicalName(
180 OUString const & name ) throw (container::NoSuchElementException,
181 RuntimeException)
182{
183 try
184 {
185 // first try tdmgr:
186 return m_xTDMgr->getByHierarchicalName( name );
187 }
188 catch (container::NoSuchElementException &)
189 {
190 // then lookup locally:
191 return m_xThisProvider->getByHierarchicalName( name );
192 }
193}
194
195//______________________________________________________________________________
196sal_Bool ProviderImpl::TypeDescriptionManagerWrapper::hasByHierarchicalName(
197 OUString const & name ) throw (RuntimeException)
198{
199 return m_xTDMgr->hasByHierarchicalName( name ) || m_xThisProvider->hasByHierarchicalName( name );
200}
201
202//______________________________________________________________________________
203uno::Reference< reflection::XTypeDescriptionEnumeration > SAL_CALL
204ProviderImpl::TypeDescriptionManagerWrapper::createTypeDescriptionEnumeration(
205 const ::rtl::OUString& moduleName,
206 const uno::Sequence< uno::TypeClass >& types,
207 reflection::TypeDescriptionSearchDepth depth )
208 throw ( reflection::NoSuchTypeNameException,
209 reflection::InvalidTypeNameException,
210 uno::RuntimeException )
211{
212 try
213 {
214 // first try tdmgr:
215 uno::Reference< reflection::XTypeDescriptionEnumerationAccess > xTDEA(
216 m_xTDMgr, uno::UNO_QUERY_THROW );
217 return
218 xTDEA->createTypeDescriptionEnumeration( moduleName, types, depth );
219 }
220 catch (reflection::NoSuchTypeNameException &)
221 {
222 // then lookup locally:
223 uno::Reference< reflection::XTypeDescriptionEnumerationAccess > xTDEA(
224 m_xThisProvider, uno::UNO_QUERY_THROW );
225 return
226 xTDEA->createTypeDescriptionEnumeration( moduleName, types, depth );
227 }
228}
229
230//__________________________________________________________________________________________________
231com::sun::star::uno::Reference< XHierarchicalNameAccess > ProviderImpl::getTDMgr()
232 SAL_THROW(())
233{
234 // harden weak reference:
235 com::sun::star::uno::Reference<container::XHierarchicalNameAccess> xTDMgr(
236 _xTDMgr );
237 if (! xTDMgr.is())
238 {
239 xTDMgr.set( new TypeDescriptionManagerWrapper(this) );
240 {
241 MutexGuard guard( _aComponentMutex );
242 _xTDMgr = xTDMgr;
243 }
244 }
245 return xTDMgr;
246}
247
248//__________________________________________________________________________________________________
249void ProviderImpl::disposing()
250{
251 _xContext.clear();
252
253 for ( RegistryKeyList::const_iterator iPos( _aBaseKeys.begin() );
254 iPos != _aBaseKeys.end(); ++iPos )
255 {
256 (*iPos)->closeKey();
257 }
258 _aBaseKeys.clear();
259}
260
261// XInitialization
262//__________________________________________________________________________________________________
263void ProviderImpl::initialize(
264 const Sequence< Any > & args )
265 throw (Exception, RuntimeException)
266{
267 // registries to read from
268 Any const * pRegistries = args.getConstArray();
269 for ( sal_Int32 nPos = 0; nPos < args.getLength(); ++nPos )
270 {
271 com::sun::star::uno::Reference< XSimpleRegistry > xRegistry( pRegistries[ nPos ], UNO_QUERY );
272 if (xRegistry.is() && xRegistry->isValid())
273 {
274 com::sun::star::uno::Reference< XRegistryKey > xKey( xRegistry->getRootKey()->openKey(
275 OUString( RTL_CONSTASCII_USTRINGPARAM("/UCR")(&("/UCR")[0]), ((sal_Int32)((sizeof ("/UCR") / sizeof ((
"/UCR")[0]))-1)), (((rtl_TextEncoding) 11))
) ) );
276 if (xKey.is() && xKey->isValid())
277 {
278 _aBaseKeys.push_back( xKey );
279 }
280 }
281 }
282}
283
284// XServiceInfo
285//__________________________________________________________________________________________________
286OUString ProviderImpl::getImplementationName()
287 throw(::com::sun::star::uno::RuntimeException)
288{
289 return stoc_bootstrap::rdbtdp_getImplementationName();
290}
291//__________________________________________________________________________________________________
292sal_Bool ProviderImpl::supportsService( const OUString & rServiceName )
293 throw(::com::sun::star::uno::RuntimeException)
294{
295 const Sequence< OUString > & rSNL = getSupportedServiceNames();
296 const OUString * pArray = rSNL.getConstArray();
297 for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
298 {
299 if (pArray[nPos] == rServiceName)
300 return sal_True((sal_Bool)1);
301 }
302 return sal_False((sal_Bool)0);
303}
304//__________________________________________________________________________________________________
305Sequence< OUString > ProviderImpl::getSupportedServiceNames()
306 throw(::com::sun::star::uno::RuntimeException)
307{
308 return stoc_bootstrap::rdbtdp_getSupportedServiceNames();
309}
310
311// XHierarchicalNameAccess
312//__________________________________________________________________________________________________
313Any ProviderImpl::getByHierarchicalNameImpl( const OUString & rName )
314{
315 Any aRet;
316
317 // read from registry
318 OUString aKey( rName.replace( '.', '/' ) );
319 for ( RegistryKeyList::const_iterator iPos( _aBaseKeys.begin() );
320 !aRet.hasValue() && iPos != _aBaseKeys.end(); ++iPos )
321 {
322 try
323 {
324 com::sun::star::uno::Reference< XRegistryKey > xBaseKey( *iPos );
325 com::sun::star::uno::Reference< XRegistryKey > xKey( xBaseKey->openKey( aKey ) );
326 if (xKey.is())
327 {
328 // closes key in it's dtor (which is
329 // called even in case of exceptions).
330 RegistryKeyCloser aCloser( xKey );
331
332 if ( xKey->isValid() )
333 {
334 if (xKey->getValueType() == RegistryValueType_BINARY)
335 {
336 Sequence< sal_Int8 > aBytes( xKey->getBinaryValue() );
337 com::sun::star::uno::Reference< XTypeDescription > xTD(
338 createTypeDescription( aBytes,
339 getTDMgr(),
340 true ) );
341 if ( xTD.is() )
342 aRet <<= xTD;
343 }
344 }
345 }
346 else // might be a constant
347 {
348 sal_Int32 nIndex = aKey.lastIndexOf( '/' );
349 if (nIndex > 0)
350 {
351 // open module
352 com::sun::star::uno::Reference< XRegistryKey > xKey2( xBaseKey->openKey( aKey.copy( 0, nIndex ) ) );
353 if (xKey2.is())
354 {
355 // closes key in it's dtor (which is
356 // called even in case of exceptions).
357 RegistryKeyCloser aCloser( xKey2 );
358
359 if ( xKey2->isValid() )
360 {
361 if (xKey2->getValueType() == RegistryValueType_BINARY)
362 {
363 Sequence< sal_Int8 > aBytes( xKey2->getBinaryValue() );
364 typereg::Reader aReader(
365 aBytes.getConstArray(), aBytes.getLength(),
366 false, TYPEREG_VERSION_1);
367
368 if (aReader.getTypeClass() == RT_TYPE_MODULE ||
369 aReader.getTypeClass() == RT_TYPE_CONSTANTS ||
370 aReader.getTypeClass() == RT_TYPE_ENUM)
371 {
372 OUString aFieldName( aKey.copy( nIndex+1, aKey.getLength() - nIndex -1 ) );
373 sal_Int16 nPos = aReader.getFieldCount();
374 while (nPos--)
375 {
376 if (aFieldName.equals(
377 aReader.getFieldName(nPos)))
378 break;
379 }
380 if (nPos >= 0)
381 aRet = getRTValue(
382 aReader.getFieldValue(nPos));
383 }
384 }
385 }
386 }
387 }
388 }
389 }
390 catch ( InvalidRegistryException const & )
391 {
392 OSL_FAIL( "ProviderImpl::getByHierarchicalName "do { if (true && (((sal_Bool)1))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "393" ": "), "%s", "ProviderImpl::getByHierarchicalName "
"- Caught InvalidRegistryException!"); } } while (false)
393 "- Caught InvalidRegistryException!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "393" ": "), "%s", "ProviderImpl::getByHierarchicalName "
"- Caught InvalidRegistryException!"); } } while (false)
;
394
395 // openKey, closeKey, getValueType, getBinaryValue, isValid
396
397 // Don't stop iteration in this case.
398 }
399 catch ( NoSuchElementException const & )
400 {
401 }
402 }
403 return aRet;
404}
405
406Any SAL_CALL ProviderImpl::getByHierarchicalName( const OUString & rName )
407 throw(::com::sun::star::uno::RuntimeException, com::sun::star::container::NoSuchElementException)
408{
409 Any aRet( getByHierarchicalNameImpl( rName ) );
410
411 if ( !aRet.hasValue() )
412 throw NoSuchElementException(
413 rName, static_cast< cppu::OWeakObject * >( this ) );
414
415 return aRet;
416}
417
418//__________________________________________________________________________________________________
419sal_Bool ProviderImpl::hasByHierarchicalName( const OUString & rName )
420 throw(::com::sun::star::uno::RuntimeException)
421{
422 return getByHierarchicalNameImpl( rName ).hasValue();
423}
424
425// XTypeDescriptionEnumerationAccess
426//__________________________________________________________________________________________________
427// virtual
428com::sun::star::uno::Reference< XTypeDescriptionEnumeration > SAL_CALL
429ProviderImpl::createTypeDescriptionEnumeration(
430 const OUString & moduleName,
431 const Sequence< TypeClass > & types,
432 TypeDescriptionSearchDepth depth )
433 throw ( NoSuchTypeNameException,
434 InvalidTypeNameException,
435 RuntimeException )
436{
437 return com::sun::star::uno::Reference< XTypeDescriptionEnumeration >(
438 TypeDescriptionEnumerationImpl::createInstance( getTDMgr(),
439 moduleName,
440 types,
441 depth,
442 _aBaseKeys ).get() );
443}
444
445//__________________________________________________________________________________________________
446// global helper function
447
448com::sun::star::uno::Reference< XTypeDescription > resolveTypedefs(
449 com::sun::star::uno::Reference< XTypeDescription > const & type)
450{
451 com::sun::star::uno::Reference< XTypeDescription > resolved(type);
452 while (resolved->getTypeClass() == TypeClass_TYPEDEF) {
1
Loop condition is true. Entering loop body
2
Called C++ object pointer is null
453 resolved = com::sun::star::uno::Reference< XIndirectTypeDescription >(
454 resolved, UNO_QUERY_THROW)->getReferencedType();
455 }
456 return resolved;
457}
458
459com::sun::star::uno::Reference< XTypeDescription > createTypeDescription(
460 const Sequence< sal_Int8 > & rData,
461 const com::sun::star::uno::Reference< XHierarchicalNameAccess > & xNameAccess,
462 bool bReturnEmptyRefForUnknownType )
463{
464 typereg::Reader aReader(
465 rData.getConstArray(), rData.getLength(), false, TYPEREG_VERSION_1);
466
467 OUString aName( aReader.getTypeName().replace( '/', '.' ) );
468
469 switch (aReader.getTypeClass())
470 {
471 case RT_TYPE_INTERFACE:
472 {
473 sal_uInt16 n = aReader.getSuperTypeCount();
474 com::sun::star::uno::Sequence< rtl::OUString > aBaseTypeNames(n);
475 {for (sal_uInt16 i = 0; i < n; ++i) {
476 aBaseTypeNames[i] = aReader.getSuperTypeName(i).replace(
477 '/', '.');
478 }}
479 sal_uInt16 n2 = aReader.getReferenceCount();
480 com::sun::star::uno::Sequence< rtl::OUString >
481 aOptionalBaseTypeNames(n2);
482 {for (sal_uInt16 i = 0; i < n2; ++i) {
483 OSL_ASSERT(do { if (true && (!(aReader.getReferenceSort(i) == RT_REF_SUPPORTS
&& aReader.getReferenceFlags(i) == 0x0002))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "485" ": "), "OSL_ASSERT: %s", "aReader.getReferenceSort(i) == RT_REF_SUPPORTS && aReader.getReferenceFlags(i) == RT_ACCESS_OPTIONAL"
); } } while (false)
484 aReader.getReferenceSort(i) == RT_REF_SUPPORTSdo { if (true && (!(aReader.getReferenceSort(i) == RT_REF_SUPPORTS
&& aReader.getReferenceFlags(i) == 0x0002))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "485" ": "), "OSL_ASSERT: %s", "aReader.getReferenceSort(i) == RT_REF_SUPPORTS && aReader.getReferenceFlags(i) == RT_ACCESS_OPTIONAL"
); } } while (false)
485 && aReader.getReferenceFlags(i) == RT_ACCESS_OPTIONAL)do { if (true && (!(aReader.getReferenceSort(i) == RT_REF_SUPPORTS
&& aReader.getReferenceFlags(i) == 0x0002))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "485" ": "), "OSL_ASSERT: %s", "aReader.getReferenceSort(i) == RT_REF_SUPPORTS && aReader.getReferenceFlags(i) == RT_ACCESS_OPTIONAL"
); } } while (false)
;
486 aOptionalBaseTypeNames[i] = aReader.getReferenceTypeName(i);
487 }}
488 return com::sun::star::uno::Reference< XTypeDescription >(
489 new InterfaceTypeDescriptionImpl( xNameAccess,
490 aName,
491 aBaseTypeNames,
492 aOptionalBaseTypeNames,
493 rData,
494 aReader.isPublished() ) );
495 }
496
497 case RT_TYPE_MODULE:
498 {
499 com::sun::star::uno::Reference<
500 XTypeDescriptionEnumerationAccess > xTDEA(
501 xNameAccess, UNO_QUERY );
502
503 OSL_ENSURE( xTDEA.is(),do { if (true && (!(xTDEA.is()))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "504" ": "), "%s", "No XTypeDescriptionEnumerationAccess!"
); } } while (false)
504 "No XTypeDescriptionEnumerationAccess!" )do { if (true && (!(xTDEA.is()))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "504" ": "), "%s", "No XTypeDescriptionEnumerationAccess!"
); } } while (false)
;
505
506 return com::sun::star::uno::Reference< XTypeDescription >(
507 new ModuleTypeDescriptionImpl( xTDEA, aName ) );
508 }
509
510 case RT_TYPE_STRUCT:
511 {
512 rtl::OUString superTypeName;
513 if (aReader.getSuperTypeCount() == 1) {
514 superTypeName = aReader.getSuperTypeName(0).replace(
515 '/', '.');
516 }
517 return com::sun::star::uno::Reference< XTypeDescription >(
518 new stoc::registry_tdprovider::StructTypeDescription(
519 xNameAccess, aName, superTypeName, rData,
520 aReader.isPublished()));
521 }
522
523 case RT_TYPE_ENUM:
524 return com::sun::star::uno::Reference< XTypeDescription >(
525 new EnumTypeDescriptionImpl( xNameAccess,
526 aName,
527 getRTValueAsInt32(
528 aReader.getFieldValue( 0 ) ),
529 rData, aReader.isPublished() ) );
530
531 case RT_TYPE_EXCEPTION:
532 {
533 rtl::OUString superTypeName;
534 if (aReader.getSuperTypeCount() == 1) {
535 superTypeName = aReader.getSuperTypeName(0).replace(
536 '/', '.');
537 }
538 return com::sun::star::uno::Reference< XTypeDescription >(
539 new CompoundTypeDescriptionImpl(
540 xNameAccess, TypeClass_EXCEPTION, aName, superTypeName,
541 rData, aReader.isPublished()));
542 }
543
544 case RT_TYPE_TYPEDEF:
545 return com::sun::star::uno::Reference< XTypeDescription >(
546 new TypedefTypeDescriptionImpl( xNameAccess,
547 aName,
548 aReader.getSuperTypeName(0)
549 .replace( '/', '.' ),
550 aReader.isPublished() ) );
551 case RT_TYPE_SERVICE:
552 return com::sun::star::uno::Reference< XTypeDescription >(
553 new ServiceTypeDescriptionImpl(
554 xNameAccess, aName, rData, aReader.isPublished() ) );
555
556 case RT_TYPE_CONSTANTS:
557 return com::sun::star::uno::Reference< XTypeDescription >(
558 new ConstantsTypeDescriptionImpl(
559 aName, rData, aReader.isPublished() ) );
560
561 case RT_TYPE_SINGLETON:
562 return com::sun::star::uno::Reference< XTypeDescription >(
563 new SingletonTypeDescriptionImpl( xNameAccess,
564 aName,
565 aReader.getSuperTypeName(0)
566 .replace( '/', '.' ),
567 aReader.isPublished() ) );
568 case RT_TYPE_INVALID:
569 case RT_TYPE_OBJECT: // deprecated and not used
570 case RT_TYPE_UNION: // deprecated and not used
571 OSL_FAIL( "createTypeDescription - Unsupported Type!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "571" ": "), "%s", "createTypeDescription - Unsupported Type!"
); } } while (false)
;
572 break;
573
574 default:
575 OSL_FAIL( "createTypeDescription - Unknown Type!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/registry_tdprovider/tdprovider.cxx"
":" "575" ": "), "%s", "createTypeDescription - Unknown Type!"
); } } while (false)
;
576 break;
577 }
578
579 // Unknown type.
580
581 if ( bReturnEmptyRefForUnknownType )
582 return com::sun::star::uno::Reference< XTypeDescription >();
583
584 return com::sun::star::uno::Reference< XTypeDescription >(
585 new TypeDescriptionImpl( TypeClass_UNKNOWN, aName ) );
586}
587
588}
589
590namespace stoc_bootstrap
591{
592//==================================================================================================
593com::sun::star::uno::Reference< XInterface > SAL_CALL ProviderImpl_create(
594 com::sun::star::uno::Reference< XComponentContext > const & xContext )
595 throw(::com::sun::star::uno::Exception)
596{
597 return com::sun::star::uno::Reference< XInterface >( *new stoc_rdbtdp::ProviderImpl( xContext ) );
598}
599}
600
601/* vim:set shiftwidth=4 softtabstop=4 expandtab: */