xref: /AOO41X/main/stoc/source/registry_tdprovider/base.hxx (revision 1c4c525fc257ee1d0c01dbc843c3faad74aa66e9)
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