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 #ifndef _STOC_RDBTDP_BASE_HXX
25 #define _STOC_RDBTDP_BASE_HXX
26
27 #include <osl/diagnose.h>
28 #include <osl/mutex.hxx>
29 #include <cppuhelper/weak.hxx>
30 #include <cppuhelper/implbase1.hxx>
31 #include <cppuhelper/implbase2.hxx>
32 #ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX_
33 #include <cppuhelper/implementationentry.hxx>
34 #endif
35
36 #include "registry/refltype.hxx"
37
38 #include <list>
39 #include <memory>
40 #include <vector>
41
42 #include <com/sun/star/reflection/XTypeDescription.hpp>
43 #include <com/sun/star/reflection/XTypeDescriptionEnumerationAccess.hpp>
44 #include <com/sun/star/reflection/XInterfaceTypeDescription.hpp>
45 #include <com/sun/star/reflection/XInterfaceTypeDescription2.hpp>
46 #include <com/sun/star/reflection/XCompoundTypeDescription.hpp>
47 #include <com/sun/star/reflection/XConstantTypeDescription.hpp>
48 #include <com/sun/star/reflection/XConstantsTypeDescription.hpp>
49 #include <com/sun/star/reflection/XEnumTypeDescription.hpp>
50 #include <com/sun/star/reflection/XIndirectTypeDescription.hpp>
51 #include <com/sun/star/reflection/XServiceConstructorDescription.hpp>
52 #include <com/sun/star/reflection/XServiceTypeDescription.hpp>
53 #include <com/sun/star/reflection/XServiceTypeDescription2.hpp>
54 #include <com/sun/star/reflection/XSingletonTypeDescription2.hpp>
55 #include <com/sun/star/reflection/XModuleTypeDescription.hpp>
56 #include <com/sun/star/reflection/XPublished.hpp>
57 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
58 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
59 #include <com/sun/star/registry/XRegistryKey.hpp>
60
61 using namespace std;
62 using namespace rtl;
63 using namespace osl;
64 using namespace cppu;
65 using namespace com::sun::star::uno;
66 using namespace com::sun::star::lang;
67 using namespace com::sun::star::container;
68 using namespace com::sun::star::reflection;
69
70 //--------------------------------------------------------------------------------------------------
71
72 extern rtl_StandardModuleCount g_moduleCount;
73
74 namespace stoc_rdbtdp
75 {
76
77 com::sun::star::uno::Reference< XTypeDescription > resolveTypedefs(
78 com::sun::star::uno::Reference< XTypeDescription > const & type);
79
80
81 ::osl::Mutex & getMutex();
82
83 //--------------------------------------------------------------------------------------------------
84
85 typedef ::std::list< ::com::sun::star::uno::Reference<
86 ::com::sun::star::registry::XRegistryKey > > RegistryKeyList;
87
88 //--------------------------------------------------------------------------------------------------
89
90 class RegistryKeyCloser
91 {
92 public:
RegistryKeyCloser(const::com::sun::star::uno::Reference<::com::sun::star::registry::XRegistryKey> & xKey)93 RegistryKeyCloser( const ::com::sun::star::uno::Reference<
94 ::com::sun::star::registry::XRegistryKey > & xKey )
95 : m_xKey( xKey ) {}
~RegistryKeyCloser()96 ~RegistryKeyCloser()
97 { if ( m_xKey.is() ) { try { if ( m_xKey->isValid() ) m_xKey->closeKey(); } catch (...) {} } }
98
reset()99 void reset() { m_xKey.clear(); }
100 private:
101 ::com::sun::star::uno::Reference<
102 ::com::sun::star::registry::XRegistryKey > m_xKey;
103 };
104
105 //--------------------------------------------------------------------------------------------------
106
107 // helper to create XTypeDescription instances using typereg::Reader
108 // (used from Type Provider and Type Description Enumeration implementation)
109 ::com::sun::star::uno::Reference<
110 ::com::sun::star::reflection::XTypeDescription >
111 createTypeDescription(
112 const ::com::sun::star::uno::Sequence< sal_Int8 > & rData,
113 const ::com::sun::star::uno::Reference<
114 ::com::sun::star::container::XHierarchicalNameAccess > & xNameAccess,
115 bool bReturnEmptyRefForUnknownType );
116
117
118 //--------------------------------------------------------------------------------------------------
getRTValueAsInt32(const RTConstValue & rVal)119 inline sal_Int32 getRTValueAsInt32( const RTConstValue & rVal )
120 {
121 switch (rVal.m_type)
122 {
123 case RT_TYPE_BYTE:
124 return rVal.m_value.aByte;
125 case RT_TYPE_INT16:
126 return rVal.m_value.aShort;
127 case RT_TYPE_UINT16:
128 return rVal.m_value.aUShort;
129 case RT_TYPE_INT32:
130 return rVal.m_value.aLong;
131 case RT_TYPE_UINT32:
132 return rVal.m_value.aULong;
133 default:
134 OSL_ENSURE( sal_False, "### unexpected value type!" );
135 return 0;
136 }
137 }
138 //--------------------------------------------------------------------------------------------------
getRTValue(const RTConstValue & rVal)139 inline Any getRTValue( const RTConstValue & rVal )
140 {
141 switch (rVal.m_type)
142 {
143 case RT_TYPE_BOOL:
144 return Any( &rVal.m_value.aBool, ::getCppuBooleanType() );
145 case RT_TYPE_BYTE:
146 return Any( &rVal.m_value.aByte, ::getCppuType( (const sal_Int8 *)0 ) );
147 case RT_TYPE_INT16:
148 return Any( &rVal.m_value.aShort, ::getCppuType( (const sal_Int16 *)0 ) );
149 case RT_TYPE_UINT16:
150 return Any( &rVal.m_value.aUShort, ::getCppuType( (const sal_uInt16 *)0 ) );
151 case RT_TYPE_INT32:
152 return Any( &rVal.m_value.aLong, ::getCppuType( (const sal_Int32 *)0 ) );
153 case RT_TYPE_UINT32:
154 return Any( &rVal.m_value.aULong, ::getCppuType( (const sal_uInt32 *)0 ) );
155 case RT_TYPE_INT64:
156 return Any( &rVal.m_value.aHyper, ::getCppuType( (const sal_Int64 *)0 ) );
157 case RT_TYPE_UINT64:
158 return Any( &rVal.m_value.aUHyper, ::getCppuType( (const sal_uInt64 *)0 ) );
159 case RT_TYPE_FLOAT:
160 return Any( &rVal.m_value.aFloat, ::getCppuType( (const float *)0 ) );
161 case RT_TYPE_DOUBLE:
162 return Any( &rVal.m_value.aDouble, ::getCppuType( (const double *)0 ) );
163 case RT_TYPE_STRING:
164 {
165 OUString aStr( rVal.m_value.aString );
166 return Any( &aStr, ::getCppuType( (const OUString *)0 ) );
167 }
168 default:
169 OSL_ENSURE( sal_False, "### unexpected RTValue!" );
170 return Any();
171 }
172 }
173
174 //==================================================================================================
175 class TypeDescriptionImpl : public WeakImplHelper1< XTypeDescription >
176 {
177 TypeClass _eTypeClass;
178 OUString _aName;
179
180 public:
TypeDescriptionImpl(TypeClass eTypeClass,const OUString & rName)181 TypeDescriptionImpl( TypeClass eTypeClass, const OUString & rName )
182 : _eTypeClass( eTypeClass )
183 , _aName( rName )
184 {
185 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
186 }
187 virtual ~TypeDescriptionImpl();
188
189 // XTypeDescription
190 virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException);
191 virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
192 };
193
194 //==================================================================================================
195 class InterfaceTypeDescriptionImpl:
196 public WeakImplHelper2< XInterfaceTypeDescription2, XPublished >
197 {
198 com::sun::star::uno::Reference< XHierarchicalNameAccess > _xTDMgr;
199 Sequence< sal_Int8 > _aBytes;
200
201 OUString _aName;
202
203 Sequence< OUString > _aBaseTypes;
204 Sequence< com::sun::star::uno::Reference< XTypeDescription > > _xBaseTDs;
205 Sequence< OUString > _aOptionalBaseTypes;
206 Sequence< com::sun::star::uno::Reference< XTypeDescription > >
207 _xOptionalBaseTDs;
208
209 sal_Int32 _nBaseOffset;
210 Sequence<
211 com::sun::star::uno::Reference< XInterfaceMemberTypeDescription > >
212 _members;
213 bool _membersInit;
214
215 bool _published;
216
217 void checkInterfaceType(
218 com::sun::star::uno::Reference< XTypeDescription > const & type);
219
220 public:
221 InterfaceTypeDescriptionImpl(
222 const com::sun::star::uno::Reference< XHierarchicalNameAccess > &
223 xTDMgr,
224 const OUString & rName, const Sequence< OUString > & rBaseTypes,
225 const Sequence< OUString > & rOptionalBaseTypes,
226 const Sequence< sal_Int8 > & rBytes, bool published );
227 virtual ~InterfaceTypeDescriptionImpl();
228
229 // XTypeDescription
230 virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException);
231 virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
232
233 // XInterfaceTypeDescription2
234 virtual Uik SAL_CALL getUik() throw(::com::sun::star::uno::RuntimeException);
235 virtual com::sun::star::uno::Reference< XTypeDescription > SAL_CALL
236 getBaseType() throw(::com::sun::star::uno::RuntimeException);
237 virtual
238 Sequence<
239 com::sun::star::uno::Reference< XInterfaceMemberTypeDescription > >
240 SAL_CALL getMembers() throw(::com::sun::star::uno::RuntimeException);
241
242 virtual Sequence< com::sun::star::uno::Reference< XTypeDescription > >
243 SAL_CALL getBaseTypes() throw (RuntimeException);
244
245 virtual Sequence< com::sun::star::uno::Reference< XTypeDescription > >
246 SAL_CALL getOptionalBaseTypes() throw (RuntimeException);
247
isPublished()248 virtual sal_Bool SAL_CALL isPublished()
249 throw (::com::sun::star::uno::RuntimeException)
250 { return _published; }
251 };
252
253 //==================================================================================================
254 class CompoundTypeDescriptionImpl:
255 public WeakImplHelper2< XCompoundTypeDescription, XPublished >
256 {
257 com::sun::star::uno::Reference< XHierarchicalNameAccess > _xTDMgr;
258 TypeClass _eTypeClass;
259 Sequence< sal_Int8 > _aBytes;
260 OUString _aName;
261
262 OUString _aBaseType;
263 com::sun::star::uno::Reference< XTypeDescription > _xBaseTD;
264
265 Sequence< com::sun::star::uno::Reference< XTypeDescription > > * _pMembers;
266 Sequence< OUString > * _pMemberNames;
267
268 bool _published;
269
270 public:
CompoundTypeDescriptionImpl(const com::sun::star::uno::Reference<XHierarchicalNameAccess> & xTDMgr,TypeClass eTypeClass,const OUString & rName,const OUString & rBaseName,const Sequence<sal_Int8> & rBytes,bool published)271 CompoundTypeDescriptionImpl(
272 const com::sun::star::uno::Reference< XHierarchicalNameAccess > &
273 xTDMgr,
274 TypeClass eTypeClass,
275 const OUString & rName, const OUString & rBaseName,
276 const Sequence< sal_Int8 > & rBytes,
277 bool published )
278 : _xTDMgr( xTDMgr )
279 , _eTypeClass( eTypeClass )
280 , _aBytes( rBytes )
281 , _aName( rName )
282 , _aBaseType( rBaseName )
283 , _pMembers( 0 )
284 , _pMemberNames( 0 )
285 , _published( published )
286 {
287 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
288 }
289 virtual ~CompoundTypeDescriptionImpl();
290
291 // XTypeDescription
292 virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException);
293 virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
294
295 // XCompoundTypeDescription
296 virtual com::sun::star::uno::Reference< XTypeDescription > SAL_CALL
297 getBaseType() throw(::com::sun::star::uno::RuntimeException);
298 virtual Sequence< com::sun::star::uno::Reference< XTypeDescription > >
299 SAL_CALL getMemberTypes() throw(::com::sun::star::uno::RuntimeException);
300 virtual Sequence< OUString > SAL_CALL getMemberNames() throw(::com::sun::star::uno::RuntimeException);
301
isPublished()302 virtual sal_Bool SAL_CALL isPublished()
303 throw (::com::sun::star::uno::RuntimeException)
304 { return _published; }
305 };
306
307 //==================================================================================================
308 class EnumTypeDescriptionImpl:
309 public WeakImplHelper2< XEnumTypeDescription, XPublished >
310 {
311 com::sun::star::uno::Reference< XHierarchicalNameAccess > _xTDMgr;
312 Sequence< sal_Int8 > _aBytes;
313
314 OUString _aName;
315 sal_Int32 _nDefaultValue;
316
317 Sequence< OUString > * _pEnumNames;
318 Sequence< sal_Int32 > * _pEnumValues;
319
320 bool _published;
321
322 public:
EnumTypeDescriptionImpl(const com::sun::star::uno::Reference<XHierarchicalNameAccess> & xTDMgr,const OUString & rName,sal_Int32 nDefaultValue,const Sequence<sal_Int8> & rBytes,bool published)323 EnumTypeDescriptionImpl(
324 const com::sun::star::uno::Reference< XHierarchicalNameAccess > &
325 xTDMgr,
326 const OUString & rName, sal_Int32 nDefaultValue,
327 const Sequence< sal_Int8 > & rBytes, bool published )
328 : _xTDMgr( xTDMgr )
329 , _aBytes( rBytes )
330 , _aName( rName )
331 , _nDefaultValue( nDefaultValue )
332 , _pEnumNames( 0 )
333 , _pEnumValues( 0 )
334 , _published( published )
335 {
336 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
337 }
338 virtual ~EnumTypeDescriptionImpl();
339
340 // XTypeDescription
341 virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException);
342 virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
343
344 // XEnumTypeDescription
345 virtual sal_Int32 SAL_CALL getDefaultEnumValue() throw(::com::sun::star::uno::RuntimeException);
346 virtual Sequence< OUString > SAL_CALL getEnumNames() throw(::com::sun::star::uno::RuntimeException);
347 virtual Sequence< sal_Int32 > SAL_CALL getEnumValues() throw(::com::sun::star::uno::RuntimeException);
348
isPublished()349 virtual sal_Bool SAL_CALL isPublished()
350 throw (::com::sun::star::uno::RuntimeException)
351 { return _published; }
352 };
353
354 //==================================================================================================
355 class TypedefTypeDescriptionImpl:
356 public WeakImplHelper2< XIndirectTypeDescription, XPublished >
357 {
358 com::sun::star::uno::Reference< XHierarchicalNameAccess > _xTDMgr;
359 OUString _aName;
360
361 OUString _aRefName;
362 com::sun::star::uno::Reference< XTypeDescription > _xRefTD;
363
364 bool _published;
365
366 public:
TypedefTypeDescriptionImpl(const com::sun::star::uno::Reference<XHierarchicalNameAccess> & xTDMgr,const OUString & rName,const OUString & rRefName,bool published)367 TypedefTypeDescriptionImpl(
368 const com::sun::star::uno::Reference< XHierarchicalNameAccess > &
369 xTDMgr,
370 const OUString & rName, const OUString & rRefName, bool published )
371 : _xTDMgr( xTDMgr )
372 , _aName( rName )
373 , _aRefName( rRefName )
374 , _published( published )
375 {
376 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
377 }
378 virtual ~TypedefTypeDescriptionImpl();
379
380 // XTypeDescription
381 virtual TypeClass SAL_CALL getTypeClass() throw(::com::sun::star::uno::RuntimeException);
382 virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
383
384 // XIndirectTypeDescription
385 virtual com::sun::star::uno::Reference< XTypeDescription > SAL_CALL
386 getReferencedType() throw(::com::sun::star::uno::RuntimeException);
387
isPublished()388 virtual sal_Bool SAL_CALL isPublished()
389 throw (::com::sun::star::uno::RuntimeException)
390 { return _published; }
391 };
392
393 //==================================================================================================
394 class ServiceTypeDescriptionImpl:
395 public WeakImplHelper2< XServiceTypeDescription2, XPublished >
396 {
397 OUString _aName;
398 Sequence< sal_Int8 > _aBytes;
399 com::sun::star::uno::Reference< XHierarchicalNameAccess > _xTDMgr;
400 bool _bInitReferences;
401
402 com::sun::star::uno::Reference< XTypeDescription > _xInterfaceTD;
403 std::auto_ptr<
404 Sequence<
405 com::sun::star::uno::Reference< XServiceConstructorDescription > > >
406 _pCtors;
407 Sequence< com::sun::star::uno::Reference< XServiceTypeDescription > >
408 _aMandatoryServices;
409 Sequence< com::sun::star::uno::Reference< XServiceTypeDescription > >
410 _aOptionalServices;
411 Sequence< com::sun::star::uno::Reference< XInterfaceTypeDescription > >
412 _aMandatoryInterfaces;
413 Sequence< com::sun::star::uno::Reference< XInterfaceTypeDescription > >
414 _aOptionalInterfaces;
415 std::auto_ptr<
416 Sequence< com::sun::star::uno::Reference< XPropertyTypeDescription > > >
417 _pProps;
418
419 bool _published;
420
421 public:
ServiceTypeDescriptionImpl(const com::sun::star::uno::Reference<XHierarchicalNameAccess> & xTDMgr,const OUString & rName,const Sequence<sal_Int8> & rBytes,bool published)422 ServiceTypeDescriptionImpl(
423 const com::sun::star::uno::Reference< XHierarchicalNameAccess > &
424 xTDMgr,
425 const OUString & rName, const Sequence< sal_Int8 > & rBytes,
426 bool published)
427 : _aName( rName ), _aBytes( rBytes ), _xTDMgr( xTDMgr ),
428 _bInitReferences( false ), _published( published )
429 {
430 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
431 }
432 virtual ~ServiceTypeDescriptionImpl();
433
434 // XTypeDescription
435 virtual TypeClass SAL_CALL
436 getTypeClass()
437 throw(::com::sun::star::uno::RuntimeException);
438 virtual OUString SAL_CALL
439 getName()
440 throw(::com::sun::star::uno::RuntimeException);
441
442 // XServiceTypeDescription
443 virtual ::com::sun::star::uno::Sequence<
444 ::com::sun::star::uno::Reference<
445 ::com::sun::star::reflection::XServiceTypeDescription > > SAL_CALL
446 getMandatoryServices()
447 throw (::com::sun::star::uno::RuntimeException);
448 virtual ::com::sun::star::uno::Sequence<
449 ::com::sun::star::uno::Reference<
450 ::com::sun::star::reflection::XServiceTypeDescription > > SAL_CALL
451 getOptionalServices()
452 throw (::com::sun::star::uno::RuntimeException);
453 virtual ::com::sun::star::uno::Sequence<
454 ::com::sun::star::uno::Reference<
455 ::com::sun::star::reflection::XInterfaceTypeDescription > > SAL_CALL
456 getMandatoryInterfaces()
457 throw (::com::sun::star::uno::RuntimeException);
458 virtual ::com::sun::star::uno::Sequence<
459 ::com::sun::star::uno::Reference<
460 ::com::sun::star::reflection::XInterfaceTypeDescription > > SAL_CALL
461 getOptionalInterfaces()
462 throw (::com::sun::star::uno::RuntimeException);
463 virtual ::com::sun::star::uno::Sequence<
464 ::com::sun::star::uno::Reference<
465 ::com::sun::star::reflection::XPropertyTypeDescription > > SAL_CALL
466 getProperties()
467 throw (::com::sun::star::uno::RuntimeException);
468
469 // XServiceTypeDescription2
470 virtual sal_Bool SAL_CALL isSingleInterfaceBased()
471 throw (::com::sun::star::uno::RuntimeException);
472 virtual ::com::sun::star::uno::Reference< XTypeDescription > SAL_CALL
473 getInterface() throw (::com::sun::star::uno::RuntimeException);
474 virtual ::com::sun::star::uno::Sequence<
475 ::com::sun::star::uno::Reference<
476 ::com::sun::star::reflection::XServiceConstructorDescription > >
477 SAL_CALL getConstructors()
478 throw (::com::sun::star::uno::RuntimeException);
479
isPublished()480 virtual sal_Bool SAL_CALL isPublished()
481 throw (::com::sun::star::uno::RuntimeException)
482 { return _published; }
483
484 private:
485 void getReferences()
486 throw (::com::sun::star::uno::RuntimeException);
487 };
488
489 //==================================================================================================
490 class ModuleTypeDescriptionImpl : public WeakImplHelper1< XModuleTypeDescription >
491 {
492 OUString _aName;
493 com::sun::star::uno::Reference< XTypeDescriptionEnumerationAccess > _xTDMgr;
494
495 Sequence< com::sun::star::uno::Reference< XTypeDescription > > * _pMembers;
496
497 public:
ModuleTypeDescriptionImpl(const com::sun::star::uno::Reference<XTypeDescriptionEnumerationAccess> & xTDMgr,const OUString & rName)498 ModuleTypeDescriptionImpl(
499 const com::sun::star::uno::Reference<
500 XTypeDescriptionEnumerationAccess > & xTDMgr,
501 const OUString & rName )
502 : _aName( rName ), _xTDMgr( xTDMgr ), _pMembers( 0 )
503 {
504 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
505 }
506 virtual ~ModuleTypeDescriptionImpl();
507
508 // XTypeDescription
509 virtual TypeClass SAL_CALL
510 getTypeClass()
511 throw( ::com::sun::star::uno::RuntimeException );
512 virtual OUString SAL_CALL
513 getName()
514 throw( ::com::sun::star::uno::RuntimeException );
515
516 // XModuleTypeDescription
517 virtual ::com::sun::star::uno::Sequence<
518 ::com::sun::star::uno::Reference<
519 ::com::sun::star::reflection::XTypeDescription > > SAL_CALL
520 getMembers()
521 throw ( ::com::sun::star::uno::RuntimeException );
522 };
523
524 //==================================================================================================
525 class ConstantTypeDescriptionImpl : public WeakImplHelper1< XConstantTypeDescription >
526 {
527 OUString _aName;
528 Any _aValue;
529
530 public:
ConstantTypeDescriptionImpl(const OUString & rName,const Any & rValue)531 ConstantTypeDescriptionImpl( const OUString & rName,
532 const Any & rValue )
533 : _aName( rName ), _aValue( rValue )
534 {
535 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
536 }
537 virtual ~ConstantTypeDescriptionImpl();
538
539 // XTypeDescription
540 virtual TypeClass SAL_CALL
541 getTypeClass()
542 throw( ::com::sun::star::uno::RuntimeException );
543 virtual OUString SAL_CALL
544 getName()
545 throw( ::com::sun::star::uno::RuntimeException );
546
547 // XConstantTypeDescription
548 virtual ::com::sun::star::uno::Any SAL_CALL
549 getConstantValue()
550 throw ( ::com::sun::star::uno::RuntimeException );
551 };
552
553 //==================================================================================================
554 class ConstantsTypeDescriptionImpl:
555 public WeakImplHelper2< XConstantsTypeDescription, XPublished >
556 {
557 OUString _aName;
558 Sequence< sal_Int8 > _aBytes;
559 Sequence< com::sun::star::uno::Reference< XConstantTypeDescription > > *
560 _pMembers;
561
562 bool _published;
563
564 public:
ConstantsTypeDescriptionImpl(const OUString & rName,const Sequence<sal_Int8> & rBytes,bool published)565 ConstantsTypeDescriptionImpl( const OUString & rName,
566 const Sequence< sal_Int8 > & rBytes,
567 bool published )
568 : _aName( rName ), _aBytes( rBytes), _pMembers( 0 ), _published( published )
569 {
570 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
571 }
572 virtual ~ConstantsTypeDescriptionImpl();
573
574 // XTypeDescription
575 virtual TypeClass SAL_CALL
576 getTypeClass()
577 throw( ::com::sun::star::uno::RuntimeException );
578 virtual OUString SAL_CALL
579 getName()
580 throw( ::com::sun::star::uno::RuntimeException );
581
582 // XConstantsTypeDescription
583 virtual
584 Sequence< com::sun::star::uno::Reference< XConstantTypeDescription > >
585 SAL_CALL getConstants() throw ( RuntimeException );
586
isPublished()587 virtual sal_Bool SAL_CALL isPublished()
588 throw (::com::sun::star::uno::RuntimeException)
589 { return _published; }
590 };
591
592 //==================================================================================================
593 class SingletonTypeDescriptionImpl:
594 public WeakImplHelper2< XSingletonTypeDescription2, XPublished >
595 {
596 OUString _aName;
597 OUString _aBaseName;
598 com::sun::star::uno::Reference< XHierarchicalNameAccess > _xTDMgr;
599 com::sun::star::uno::Reference< XTypeDescription > _xInterfaceTD;
600 com::sun::star::uno::Reference< XServiceTypeDescription > _xServiceTD;
601
602 bool _published;
603
604 void init();
605
606 public:
SingletonTypeDescriptionImpl(const com::sun::star::uno::Reference<XHierarchicalNameAccess> & xTDMgr,const OUString & rName,const OUString & rBaseName,bool published)607 SingletonTypeDescriptionImpl(
608 const com::sun::star::uno::Reference< XHierarchicalNameAccess > &
609 xTDMgr,
610 const OUString & rName, const OUString & rBaseName, bool published )
611 : _aName( rName ), _aBaseName( rBaseName), _xTDMgr( xTDMgr ),
612 _published( published )
613 {
614 g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
615 }
616 virtual ~SingletonTypeDescriptionImpl();
617
618 // XTypeDescription
619 virtual TypeClass SAL_CALL
620 getTypeClass()
621 throw( ::com::sun::star::uno::RuntimeException );
622 virtual OUString SAL_CALL
623 getName()
624 throw( ::com::sun::star::uno::RuntimeException );
625
626 // XSingletonTypeDescription
627 virtual com::sun::star::uno::Reference< XServiceTypeDescription > SAL_CALL
628 getService() throw ( ::com::sun::star::uno::RuntimeException );
629
630 // XSingletonTypeDescription2
631 virtual sal_Bool SAL_CALL isInterfaceBased()
632 throw (::com::sun::star::uno::RuntimeException);
633 virtual com::sun::star::uno::Reference< XTypeDescription > SAL_CALL
634 getInterface() throw (::com::sun::star::uno::RuntimeException);
635
isPublished()636 virtual sal_Bool SAL_CALL isPublished()
637 throw (::com::sun::star::uno::RuntimeException)
638 { return _published; }
639 };
640
641 }
642
643 #endif /* _STOC_RDBTDP_BASE_HXX */
644