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 #ifndef INCLUDED_TYPELIB_TYPEDESCRIPTION_H
20 #define INCLUDED_TYPELIB_TYPEDESCRIPTION_H
21
22 #include "cppu/cppudllapi.h"
23 #include "typelib/uik.h"
24 #include "typelib/typeclass.h"
25 #include "rtl/ustring.h"
26
27 #ifdef __cplusplus
28 extern "C"
29 {
30 #endif
31
32 struct _typelib_TypeDescription;
33
34 #if defined( _WIN32)
35 #pragma pack(push, 8)
36 #endif
37
38 /** Holds a weak reference to a type description.
39 */
40 typedef struct SAL_DLLPUBLIC_RTTI _typelib_TypeDescriptionReference
41 {
42 /** reference count of type; don't ever modify this by yourself, use
43 typelib_typedescriptionreference_acquire() and typelib_typedescriptionreference_release()
44 */
45 sal_Int32 nRefCount;
46 /** number of static references of type, because of the fact that some types are needed
47 until program termination and are commonly held static.
48 */
49 sal_Int32 nStaticRefCount;
50 /** type class of type
51 */
52 typelib_TypeClass eTypeClass;
53 /** fully qualified name of type
54 */
55 rtl_uString * pTypeName;
56 /** pointer to full typedescription; this value is only valid if the type is never swapped out
57 */
58 struct _typelib_TypeDescription * pType;
59 /** pointer to optimize the runtime; not for public use
60 */
61 void * pUniqueIdentifier;
62 /** reserved for future use; 0 if not used
63 */
64 void * pReserved;
65 } typelib_TypeDescriptionReference;
66
67 /** Full type description of a type. Memory layout of this struct is identical to the
68 typelib_TypeDescriptionReference for the first six members.
69 So a typedescription can be used as type reference.
70 */
71 typedef struct SAL_DLLPUBLIC_RTTI _typelib_TypeDescription
72 {
73 /** reference count; don't ever modify this by yourself, use
74 typelib_typedescription_acquire() and typelib_typedescription_release()
75 */
76 sal_Int32 nRefCount;
77 /** number of static references of type, because of the fact that some types are needed
78 until program termination and are commonly held static.
79 */
80 sal_Int32 nStaticRefCount;
81 /** type class of type
82 */
83 typelib_TypeClass eTypeClass;
84 /** fully qualified name of type
85 */
86 rtl_uString * pTypeName;
87 /** pointer to self to distinguish reference from description; for internal use only
88 */
89 struct _typelib_TypeDescription * pSelf;
90 /** pointer to optimize the runtime; not for public use
91 */
92 void * pUniqueIdentifier;
93 /** reserved for future use; 0 if not used
94 */
95 void * pReserved;
96
97 /** flag to determine whether the description is complete:
98 compound types lack of member names, enums lack of member types and names,
99 interfaces lack of members and table init.
100 Call typelib_typedescription_complete() if false.
101 */
102 sal_Bool bComplete;
103 /** size of type
104 */
105 sal_Int32 nSize;
106 /** alignment of type
107 */
108 sal_Int32 nAlignment;
109 /** pointer to weak reference
110 */
111 typelib_TypeDescriptionReference * pWeakRef;
112 /** determines, if type can be unloaded (and it is possible to reloaded it)
113 */
114 sal_Bool bOnDemand;
115 } typelib_TypeDescription;
116
117 /** Type description for exception types.
118 */
119 typedef struct _typelib_CompoundTypeDescription
120 {
121 /** inherits all members of typelib_TypeDescription
122 */
123 typelib_TypeDescription aBase;
124
125 /** pointer to base type description, else 0
126 */
127 struct _typelib_CompoundTypeDescription * pBaseTypeDescription;
128
129 /** number of members
130 */
131 sal_Int32 nMembers;
132 /** byte offsets of each member including the size the base type
133 */
134 sal_Int32 * pMemberOffsets;
135 /** members of the struct or exception
136 */
137 typelib_TypeDescriptionReference ** ppTypeRefs;
138 /** member names of the struct or exception
139 */
140 rtl_uString ** ppMemberNames;
141 } typelib_CompoundTypeDescription;
142
143 /**
144 Type description for struct types.
145
146 This is only used to represent plain struct types and instantiated
147 polymorphic struct types; there is no representation of polymorphic struct
148 type templates at this level.
149
150 @since UDK 3.2.0
151 */
152 typedef struct _typelib_StructTypeDescription
153 {
154 /**
155 Derived from typelib_CompoundTypeDescription.
156 */
157 typelib_CompoundTypeDescription aBase;
158
159 /**
160 Flags for direct members, specifying whether they are of parameterized
161 type (true) or explicit type (false).
162
163 For a plain struct type, this is a null pointer.
164 */
165 sal_Bool * pParameterizedTypes;
166 } typelib_StructTypeDescription;
167
168 /** Type description of a sequence.
169 */
170 typedef struct _typelib_IndirectTypeDescription
171 {
172 /** inherits all members of typelib_TypeDescription
173 */
174 typelib_TypeDescription aBase;
175
176 /** pointer to element type
177 */
178 typelib_TypeDescriptionReference * pType;
179 } typelib_IndirectTypeDescription;
180
181 /** Type description of an enum. The type class of this description is typelib_TypeClass_ENUM.
182 */
183 typedef struct _typelib_EnumTypeDescription
184 {
185 /** inherits all members of typelib_TypeDescription
186 */
187 typelib_TypeDescription aBase;
188
189 /** first value of the enum
190 */
191 sal_Int32 nDefaultEnumValue;
192 /** number of enum values
193 */
194 sal_Int32 nEnumValues;
195 /** names of enum values
196 */
197 rtl_uString ** ppEnumNames;
198 /** values of enum (corresponding to names in similar order)
199 */
200 sal_Int32 * pEnumValues;
201 } typelib_EnumTypeDescription;
202
203 /** Description of an interface method parameter.
204 */
205 typedef struct _typelib_MethodParameter
206 {
207 /** name of parameter
208 */
209 rtl_uString * pName;
210 /** type of parameter
211 */
212 typelib_TypeDescriptionReference * pTypeRef;
213 /** true: the call type of this parameter is [in] or [inout]
214 false: the call type of this parameter is [out]
215 */
216 sal_Bool bIn;
217 /** true: the call type of this parameter is [out] or [inout]
218 false: the call type of this parameter is [in]
219 */
220 sal_Bool bOut;
221 } typelib_MethodParameter;
222
223 /** Common base type description of typelib_InterfaceMethodTypeDescription and
224 typelib_InterfaceAttributeTypeDescription.
225 */
226 typedef struct _typelib_InterfaceMemberTypeDescription
227 {
228 /** inherits all members of typelib_TypeDescription
229 */
230 typelib_TypeDescription aBase;
231
232 /** position of member in the interface including the number of members of
233 any base interfaces
234 */
235 sal_Int32 nPosition;
236 /** name of member
237 */
238 rtl_uString * pMemberName;
239 } typelib_InterfaceMemberTypeDescription;
240
241 /** Type description of an interface method. The type class of this description is
242 typelib_TypeClass_INTERFACE_METHOD. The size and the alignment are 0.
243 */
244 typedef struct _typelib_InterfaceMethodTypeDescription
245 {
246 /** inherits all members of typelib_InterfaceMemberTypeDescription
247 */
248 typelib_InterfaceMemberTypeDescription aBase;
249
250 /** type of the return value
251 */
252 typelib_TypeDescriptionReference * pReturnTypeRef;
253 /** number of parameters
254 */
255 sal_Int32 nParams;
256 /** array of parameters
257 */
258 typelib_MethodParameter * pParams;
259 /** number of exceptions
260 */
261 sal_Int32 nExceptions;
262 /** array of exception types
263 */
264 typelib_TypeDescriptionReference ** ppExceptions;
265 /** determines whether method is declared oneway
266 */
267 sal_Bool bOneWay;
268
269 /** the interface description this method is a member of
270 */
271 struct _typelib_InterfaceTypeDescription * pInterface;
272 /** the inherited direct base method (null for a method that is not
273 inherited)
274
275 @since UDK 3.2.0
276 */
277 typelib_TypeDescriptionReference * pBaseRef;
278 /** if pBaseRef is null, the member position of this method within
279 pInterface, not counting members inherited from bases; if pBaseRef is
280 not null, the index of the direct base within pInterface from which this
281 method is inherited
282
283 @since UDK 3.2.0
284 */
285 sal_Int32 nIndex;
286 } typelib_InterfaceMethodTypeDescription;
287
288 /** The description of an interface attribute. The type class of this description is
289 typelib_TypeClass_INTERFACE_ATTRIBUTE. The size and the alignment are 0.
290 */
291 typedef struct _typelib_InterfaceAttributeTypeDescription
292 {
293 /** inherits all members of typelib_InterfaceMemberTypeDescription
294 */
295 typelib_InterfaceMemberTypeDescription aBase;
296
297 /** determines whether attribute is read only
298 */
299 sal_Bool bReadOnly;
300 /** type of the attribute
301 */
302 typelib_TypeDescriptionReference * pAttributeTypeRef;
303
304 /** the interface description this attribute is a member of
305 */
306 struct _typelib_InterfaceTypeDescription * pInterface;
307 /** the inherited direct base attribute (null for an attribute that is not
308 inherited)
309
310 @since UDK 3.2.0
311 */
312 typelib_TypeDescriptionReference * pBaseRef;
313 /** if pBaseRef is null, the member position of this attribute within
314 pInterface, not counting members inherited from bases; if pBaseRef is
315 not null, the index of the direct base within pInterface from which this
316 attribute is inherited
317
318 @since UDK 3.2.0
319 */
320 sal_Int32 nIndex;
321 /** number of getter exceptions
322
323 @since UDK 3.2.0
324 */
325 sal_Int32 nGetExceptions;
326 /** array of getter exception types
327
328 @since UDK 3.2.0
329 */
330 typelib_TypeDescriptionReference ** ppGetExceptions;
331 /** number of setter exceptions
332
333 @since UDK 3.2.0
334 */
335 sal_Int32 nSetExceptions;
336 /** array of setter exception types
337
338 @since UDK 3.2.0
339 */
340 typelib_TypeDescriptionReference ** ppSetExceptions;
341 } typelib_InterfaceAttributeTypeDescription;
342
343 /** Type description of an interface.
344
345 <p>Not all members are always initialized (not yet initialized members being
346 null); there are three levels:</p>
347 <ul>
348 <li>Minimally, only <code>aBase</code>,
349 <code>pBaseTypeDescription</code>, <code>aUik</code>,
350 <code>nBaseTypes</code>, and <code>ppBaseTypes</code> are initialized;
351 <code>aBase.bComplete</code> is false. This only happens when an
352 interface type description is created with
353 <code>typelib_static_mi_interface_type_init</code> or
354 <code>typelib_static_interface_type_init</code>.</li>
355
356 <li>At the next level, <code>nMembers</code>, <code>ppMembers</code>,
357 <code>nAllMembers</code>, <code>ppAllMembers</code> are also
358 initialized; <code>aBase.bComplete</code> is still false. This happens
359 when an interface type description is created with
360 <code>typelib_typedescription_newMIInterface</code> or
361 <code>typelib_typedescription_newInterface</code>.</li>
362
363 <li>At the final level, <code>pMapMemberIndexToFunctionIndex</code>,
364 <code>nMapFunctionIndexToMemberIndex</code>, and
365 <code>pMapFunctionIndexToMemberIndex</code> are also initialized;
366 <code>aBase.bComplete</code> is true. This happens after a call to
367 <code>typelib_typedescription_complete</code>.</li>
368 </ul>
369 */
370 typedef struct SAL_DLLPUBLIC_RTTI _typelib_InterfaceTypeDescription
371 {
372 /** inherits all members of typelib_TypeDescription
373 */
374 typelib_TypeDescription aBase;
375
376 /** pointer to base type description, else 0
377
378 @deprecated
379 use nBaseTypes and ppBaseTypes instead
380 */
381 struct _typelib_InterfaceTypeDescription * pBaseTypeDescription;
382 /** unique identifier of interface
383
384 @deprecated
385 should always contain all-zeros
386 */
387 typelib_Uik aUik;
388 /** number of members
389 */
390 sal_Int32 nMembers;
391 /** array of members; references attributes or methods
392 */
393 typelib_TypeDescriptionReference ** ppMembers;
394 /** number of members including members of base interface
395 */
396 sal_Int32 nAllMembers;
397 /** array of members including members of base interface; references attributes or methods
398 */
399 typelib_TypeDescriptionReference ** ppAllMembers;
400 /** array mapping index of the member description to an index doubling for read-write
401 attributes (called function index); size of array is nAllMembers
402 */
403 sal_Int32 * pMapMemberIndexToFunctionIndex;
404 /** number of members plus number of read-write attributes
405 */
406 sal_Int32 nMapFunctionIndexToMemberIndex;
407 /** array mapping function index to member index; size of array is nMapFunctionIndexToMemberIndex
408 */
409 sal_Int32 * pMapFunctionIndexToMemberIndex;
410 /** number of base types
411
412 @since UDK 3.2.0
413 */
414 sal_Int32 nBaseTypes;
415 /** array of base type descriptions
416
417 @since UDK 3.2.0
418 */
419 struct _typelib_InterfaceTypeDescription ** ppBaseTypes;
420 } typelib_InterfaceTypeDescription;
421
422 /** Init struct of compound members for typelib_typedescription_new().
423 */
424 typedef struct _typelib_CompoundMember_Init
425 {
426 /** type class of compound member
427 */
428 typelib_TypeClass eTypeClass;
429 /** name of type of compound member
430
431 For a member of an instantiated polymorphic struct type that is of
432 parameterized type, this will be a null pointer.
433 */
434 rtl_uString * pTypeName;
435 /** name of compound member
436 */
437 rtl_uString * pMemberName;
438 } typelib_CompoundMember_Init;
439
440 /**
441 Init struct of members for typelib_typedescription_newStruct().
442
443 @since UDK 3.2.0
444 */
445 typedef struct _typelib_StructMember_Init
446 {
447 /**
448 Derived from typelib_CompoundMember_Init;
449 */
450 typelib_CompoundMember_Init aBase;
451
452 /**
453 Flag specifying whether the member is of parameterized type (true) or
454 explicit type (false).
455 */
456 sal_Bool bParameterizedType;
457 } typelib_StructMember_Init;
458
459 /** Init struct of interface methods for typelib_typedescription_new().
460 */
461 typedef struct _typelib_Parameter_Init
462 {
463 /** type class of parameter
464 */
465 typelib_TypeClass eTypeClass;
466 /** name of parameter
467 */
468 rtl_uString * pTypeName;
469 /** name of parameter
470 */
471 rtl_uString * pParamName;
472 /** true, if parameter is [in] or [inout]
473 */
474 sal_Bool bIn;
475 /** true, if parameter is [out] or [inout]
476 */
477 sal_Bool bOut;
478 } typelib_Parameter_Init;
479
480 #if defined( _WIN32)
481 #pragma pack(pop)
482 #endif
483
484 /** Creates an enum type description.
485
486 @param ppRet inout enum type description
487 @param pTypeName name of enum
488 @param nDefaultValue default enum value
489 @param nEnumValues number of enum values
490 @param ppEnumNames names of enum values
491 @param pEnumValues enum values
492 */
493 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newEnum(
494 typelib_TypeDescription ** ppRet,
495 rtl_uString * pTypeName,
496 sal_Int32 nDefaultValue,
497 sal_Int32 nEnumValues,
498 rtl_uString ** ppEnumNames,
499 sal_Int32 * pEnumValues )
500 SAL_THROW_EXTERN_C();
501
502 /** Creates a new type description.
503
504 Since this function can only be used to create type descriptions for plain
505 struct types, not for instantiated polymorphic struct types, the function
506 typelib_typedescription_newStruct should be used instead for all struct
507 types.
508
509 @param ppRet inout type description
510 @param eTypeClass type class
511 @param pTypeName name of type
512 @param pType sequence: element type;
513 struct, Exception: base type;
514 @param nMembers number of members if struct, exception
515 @param pMembers array of members if struct, exception
516 */
517 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_new(
518 typelib_TypeDescription ** ppRet,
519 typelib_TypeClass eTypeClass,
520 rtl_uString * pTypeName,
521 typelib_TypeDescriptionReference * pType,
522 sal_Int32 nMembers,
523 typelib_CompoundMember_Init * pMembers )
524 SAL_THROW_EXTERN_C();
525
526 /** Creates a new struct type description.
527
528 @param ppRet inout type description
529 @param pTypeName name of type
530 @param pType base type;
531 @param nMembers number of members
532 @param pMembers array of members
533
534 @since UDK 3.2.0
535 */
536 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newStruct(
537 typelib_TypeDescription ** ppRet,
538 rtl_uString * pTypeName,
539 typelib_TypeDescriptionReference * pType,
540 sal_Int32 nMembers,
541 typelib_StructMember_Init * pMembers )
542 SAL_THROW_EXTERN_C();
543
544 /** Creates an interface type description.
545
546 @param ppRet inout interface type description
547 @param pTypeName the fully qualified name of the interface.
548 @param nUik1 uik part; deprecated and ignored, should always be 0
549 @param nUik2 uik part; deprecated and ignored, should always be 0
550 @param nUik3 uik part; deprecated and ignored, should always be 0
551 @param nUik4 uik part; deprecated and ignored, should always be 0
552 @param nUik5 uik part; deprecated and ignored, should always be 0
553 @param pBaseInterface base interface type, else 0
554 @param nMembers number of members
555 @param ppMembers members; attributes or methods
556
557 @deprecated
558 use typelib_typedescription_newMIInterface instead
559 */
560 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newInterface(
561 typelib_InterfaceTypeDescription ** ppRet,
562 rtl_uString * pTypeName,
563 sal_uInt32 nUik1, sal_uInt16 nUik2, sal_uInt16 nUik3, sal_uInt32 nUik4, sal_uInt32 nUik5,
564 typelib_TypeDescriptionReference * pBaseInterface,
565 sal_Int32 nMembers,
566 typelib_TypeDescriptionReference ** ppMembers )
567 SAL_THROW_EXTERN_C();
568
569 /** Creates a multiple-inheritance interface type description.
570
571 @param ppRet inout interface type description
572 @param pTypeName the fully qualified name of the interface.
573 @param nUik1 uik part; deprecated and ignored, should always be 0
574 @param nUik2 uik part; deprecated and ignored, should always be 0
575 @param nUik3 uik part; deprecated and ignored, should always be 0
576 @param nUik4 uik part; deprecated and ignored, should always be 0
577 @param nUik5 uik part; deprecated and ignored, should always be 0
578 @param nBaseInterfaces number of base interface types
579 @param ppBaseInterfaces base interface types
580 @param nMembers number of members
581 @param ppMembers members; attributes or methods
582
583 @since UDK 3.2.0
584 */
585 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newMIInterface(
586 typelib_InterfaceTypeDescription ** ppRet,
587 rtl_uString * pTypeName,
588 sal_uInt32 nUik1, sal_uInt16 nUik2, sal_uInt16 nUik3, sal_uInt32 nUik4, sal_uInt32 nUik5,
589 sal_Int32 nBaseInterfaces,
590 typelib_TypeDescriptionReference ** ppBaseInterfaces,
591 sal_Int32 nMembers,
592 typelib_TypeDescriptionReference ** ppMembers )
593 SAL_THROW_EXTERN_C();
594
595 /** Creates an interface method type description.
596
597 @param ppRet inout method type description
598 @param nAbsolutePosition position of member including all members of base interfaces
599 @param bOneWay determines whether method is declared oneway
600 @param pMethodName fully qualified name of method including interface name
601 @param eReturnTypeClass type class of return type
602 @param pReturnTypeName type name of the return type
603 @param nParams number of parameters
604 @param pParams parameter types
605 @param nExceptions number of exceptions
606 @param ppExceptionNames type names of exceptions
607 */
608 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newInterfaceMethod(
609 typelib_InterfaceMethodTypeDescription ** ppRet,
610 sal_Int32 nAbsolutePosition,
611 sal_Bool bOneWay,
612 rtl_uString * pMethodName,
613 typelib_TypeClass eReturnTypeClass,
614 rtl_uString * pReturnTypeName,
615 sal_Int32 nParams,
616 typelib_Parameter_Init * pParams,
617 sal_Int32 nExceptions,
618 rtl_uString ** ppExceptionNames )
619 SAL_THROW_EXTERN_C();
620
621 /** Creates an interface attribute type description.
622
623 @param ppRet inout attribute type description
624 @param nAbsolutePosition position of this attribute including all members of base interfaces
625 @param pAttributeName fully qualified name of attribute including interface
626 name
627 @param eAttributeTypeClass type class of attribute type
628 @param pAttributeTypeName type name of attribute type
629 @param bReadOnly determines whether attribute is read-only
630
631 @deprecated
632 use typelib_typedescription_newExtendedInterfaceAttribute instead
633 */
634 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newInterfaceAttribute(
635 typelib_InterfaceAttributeTypeDescription ** ppRet,
636 sal_Int32 nAbsolutePosition,
637 rtl_uString * pAttributeName,
638 typelib_TypeClass eAttributeTypeClass,
639 rtl_uString * pAttributeTypeName,
640 sal_Bool bReadOnly )
641 SAL_THROW_EXTERN_C();
642
643 /** Creates an extended interface attribute type description.
644
645 @param ppRet inout attribute type description
646 @param nAbsolutePosition position of this attribute including all members of
647 base interfaces
648 @param pAttributeName fully qualified name of attribute including interface
649 name
650 @param eAttributeTypeClass type class of attribute type
651 @param pAttributeTypeName type name of attribute type
652 @param bReadOnly determines whether attribute is read-only
653 @param nGetExceptions number of getter exceptions
654 @param ppGetExceptionNames type names of getter exceptions
655 @param nSetExceptions number of setter exceptions
656 @param ppSetExceptionNames type names of setter exceptions
657
658 @since UDK 3.2.0
659 */
660 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_newExtendedInterfaceAttribute(
661 typelib_InterfaceAttributeTypeDescription ** ppRet,
662 sal_Int32 nAbsolutePosition,
663 rtl_uString * pAttributeName,
664 typelib_TypeClass eAttributeTypeClass,
665 rtl_uString * pAttributeTypeName,
666 sal_Bool bReadOnly,
667 sal_Int32 nGetExceptions, rtl_uString ** ppGetExceptionNames,
668 sal_Int32 nSetExceptions, rtl_uString ** ppSetExceptionNames )
669 SAL_THROW_EXTERN_C();
670
671 /** Increments reference count of given type description.
672
673 @param pDesc type description
674 */
675 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_acquire(
676 typelib_TypeDescription * pDesc )
677 SAL_THROW_EXTERN_C();
678
679 /** Decrements reference count of given type. If reference count reaches 0, the type description
680 is deleted.
681
682 @param pDesc type description
683 */
684 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_release(
685 typelib_TypeDescription * pDesc )
686 SAL_THROW_EXTERN_C();
687
688 /** Registers a type description and creates a type description reference. Type descriptions
689 will be registered automatically if they are provided via the callback chain.
690
691 @param ppNewDescription inout description to be registered;
692 */
693 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_register(
694 typelib_TypeDescription ** ppNewDescription )
695 SAL_THROW_EXTERN_C();
696
697 /** Tests whether two types descriptions are equal, i.e. type class and names are equal.
698
699 @param p1 a type description
700 @param p2 another type description
701 @return true, if type descriptions are equal
702 */
703 CPPU_DLLPUBLIC sal_Bool SAL_CALL typelib_typedescription_equals(
704 const typelib_TypeDescription * p1, const typelib_TypeDescription * p2 )
705 SAL_THROW_EXTERN_C();
706
707 /** Retrieves a type description via its fully qualified name.
708
709 @param ppRet inout type description; *ppRet is 0, if type description was not found
710 @param pName name demanded type description
711 */
712 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_getByName(
713 typelib_TypeDescription ** ppRet, rtl_uString * pName )
714 SAL_THROW_EXTERN_C();
715
716 /** Sets size of type description cache.
717
718 @param nNewSize new size of cache
719 */
720 CPPU_DLLPUBLIC void SAL_CALL typelib_setCacheSize(
721 sal_Int32 nNewSize )
722 SAL_THROW_EXTERN_C();
723
724 /** Function pointer declaration of callback function get additional descriptions. Callbacks
725 must provide complete type descriptions (see typelib_typedescription_complete())!
726
727 @param pContext callback context
728 @param ppRet inout type description
729 @param pTypeName name of demanded type description
730 */
731 typedef void (SAL_CALL * typelib_typedescription_Callback)(
732 void * pContext, typelib_TypeDescription ** ppRet, rtl_uString * pTypeName );
733
734 /** Registers callback function providing additional type descriptions.
735
736 @param pContext callback context
737 @param pCallback callback function
738 */
739 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_registerCallback(
740 void * pContext, typelib_typedescription_Callback pCallback )
741 SAL_THROW_EXTERN_C();
742
743 /** Revokes a previously registered callback function.
744
745 @param pContext callback context
746 @param pCallback registered callback function
747 */
748 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescription_revokeCallback(
749 void * pContext, typelib_typedescription_Callback pCallback )
750 SAL_THROW_EXTERN_C();
751
752
753 /*----------------------------------------------------------------------------*/
754 /*----------------------------------------------------------------------------*/
755 /*----------------------------------------------------------------------------*/
756
757 /** Creates a type description reference. This is a weak reference not holding the description.
758 If the description is already registered, the previous one is returned.
759
760 @param ppTDR inout type description reference
761 @param eTypeClass type class of type
762 @param pTypeName name of type
763 */
764 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescriptionreference_new(
765 typelib_TypeDescriptionReference ** ppTDR,
766 typelib_TypeClass eTypeClass,
767 rtl_uString * pTypeName )
768 SAL_THROW_EXTERN_C();
769
770 /** Creates a type description reference. This is a weak reference not holding the description.
771 If the description is already registered, the previous one is returned.
772
773 @param ppTDR inout type description reference
774 @param eTypeClass type class of type
775 @param pTypeName ascii name of type
776 */
777 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescriptionreference_newByAsciiName(
778 typelib_TypeDescriptionReference ** ppTDR,
779 typelib_TypeClass eTypeClass,
780 const sal_Char * pTypeName )
781 SAL_THROW_EXTERN_C();
782
783 /** Increments reference count of type description reference.
784
785 @param pRef type description reference
786 */
787 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescriptionreference_acquire(
788 typelib_TypeDescriptionReference * pRef )
789 SAL_THROW_EXTERN_C();
790
791 /** Increments reference count of type description reference. If the reference count reaches 0,
792 then the reference is deleted.
793
794 @param pRef type description reference
795 */
796 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescriptionreference_release(
797 typelib_TypeDescriptionReference * pRef )
798 SAL_THROW_EXTERN_C();
799
800 /** Retrieves the type description for a given reference. If it is not possible to resolve the
801 reference, null is returned.
802
803 @param[in,out] ppRet type description
804 @param[in] pRef type description reference
805 */
806 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescriptionreference_getDescription(
807 typelib_TypeDescription ** ppRet, typelib_TypeDescriptionReference * pRef )
808 SAL_THROW_EXTERN_C();
809
810 /** Tests whether two types description references are equal, i.e. type class and names are equal.
811
812 @param p1 a type description reference
813 @param p2 another type description reference
814 @return true, if type description references are equal
815 */
816 CPPU_DLLPUBLIC sal_Bool SAL_CALL typelib_typedescriptionreference_equals(
817 const typelib_TypeDescriptionReference * p1, const typelib_TypeDescriptionReference * p2 )
818 SAL_THROW_EXTERN_C();
819
820 /** Assigns a type.
821
822 @param ppDest destination type
823 @param pSource source type
824 */
825 CPPU_DLLPUBLIC void SAL_CALL typelib_typedescriptionreference_assign(
826 typelib_TypeDescriptionReference ** ppDest,
827 typelib_TypeDescriptionReference * pSource )
828 SAL_THROW_EXTERN_C();
829
830 /** Tests if values of type pAssignable can be assigned by values of type pFrom. This includes
831 widening conversion (e.g., long assignable from short), as long as there is no data loss.
832
833 @param pAssignable type description of value to be assigned
834 @param pFrom type description of value
835 */
836 CPPU_DLLPUBLIC sal_Bool SAL_CALL typelib_typedescription_isAssignableFrom(
837 typelib_TypeDescription * pAssignable,
838 typelib_TypeDescription * pFrom )
839 SAL_THROW_EXTERN_C();
840
841 /** Tests if values of type pAssignable can be assigned by values of type pFrom. This includes
842 widening conversion (e.g., long assignable from short), as long as there is no data loss.
843
844 @param pAssignable type of value to be assigned
845 @param pFrom type of value
846 */
847 CPPU_DLLPUBLIC sal_Bool SAL_CALL typelib_typedescriptionreference_isAssignableFrom(
848 typelib_TypeDescriptionReference * pAssignable,
849 typelib_TypeDescriptionReference * pFrom )
850 SAL_THROW_EXTERN_C();
851
852 /** Gets static type reference of standard types by type class.
853 ADDITIONAL OPT: provides Type com.sun.star.uno.Exception for typelib_TypeClass_EXCEPTION
854 and com.sun.star.uno.XInterface for typelib_TypeClass_INTERFACE.
855
856 Thread synchronizes on typelib mutex.
857
858 @param eTypeClass type class of basic type
859 @return pointer to type reference pointer
860 */
861 CPPU_DLLPUBLIC typelib_TypeDescriptionReference ** SAL_CALL typelib_static_type_getByTypeClass(
862 typelib_TypeClass eTypeClass )
863 SAL_THROW_EXTERN_C();
864
865 /** Inits static type reference. Thread synchronizes on typelib init mutex.
866
867 @param ppRef pointer to type reference pointer
868 @param eTypeClass type class of type
869 @param pTypeName ascii name of type
870 */
871 CPPU_DLLPUBLIC void SAL_CALL typelib_static_type_init(
872 typelib_TypeDescriptionReference ** ppRef,
873 typelib_TypeClass eTypeClass, const sal_Char * pTypeName )
874 SAL_THROW_EXTERN_C();
875
876 /** Inits static sequence type reference. Thread synchronizes on typelib init mutex.
877
878 @param ppRef pointer to type reference pointer
879 @param pElementType element type of sequence
880 */
881 CPPU_DLLPUBLIC void SAL_CALL typelib_static_sequence_type_init(
882 typelib_TypeDescriptionReference ** ppRef,
883 typelib_TypeDescriptionReference * pElementType )
884 SAL_THROW_EXTERN_C ();
885
886 /** Inits incomplete static compound type reference. Thread synchronizes on typelib init mutex.
887
888 Since this function can only be used to create type descriptions for plain
889 struct types, not for instantiated polymorphic struct types, the function
890 typelib_static_struct_type_init should be used instead for all struct types.
891
892 @param ppRef pointer to type reference pointer
893 @param eTypeClass typelib_TypeClass_STRUCT or typelib_TypeClass_EXCEPTION
894 @param pTypeName name of type
895 @param pBaseType base type
896 @param nMembers number of members
897 @param ppMembers member types
898 */
899 CPPU_DLLPUBLIC void SAL_CALL typelib_static_compound_type_init(
900 typelib_TypeDescriptionReference ** ppRef,
901 typelib_TypeClass eTypeClass, const sal_Char * pTypeName,
902 typelib_TypeDescriptionReference * pBaseType,
903 sal_Int32 nMembers, typelib_TypeDescriptionReference ** ppMembers )
904 SAL_THROW_EXTERN_C();
905
906 /** Inits incomplete static struct type reference.
907
908 Thread synchronizes on typelib init mutex.
909
910 @param ppRef pointer to type reference pointer
911 @param pTypeName name of type
912 @param pBaseType base type
913 @param nMembers number of members
914 @param ppMembers member types
915 @param pParameterizedTypes flags for direct members, specifying whether they
916 are of parameterized type (true) or explicit type (false); must be null
917 for a plain struct type
918
919 @since UDK 3.2.0
920 */
921 CPPU_DLLPUBLIC void SAL_CALL typelib_static_struct_type_init(
922 typelib_TypeDescriptionReference ** ppRef, const sal_Char * pTypeName,
923 typelib_TypeDescriptionReference * pBaseType,
924 sal_Int32 nMembers, typelib_TypeDescriptionReference ** ppMembers,
925 sal_Bool const * pParameterizedTypes )
926 SAL_THROW_EXTERN_C();
927
928 /** Inits incomplete static interface type reference. Thread synchronizes on typelib init mutex.
929
930 @param ppRef pointer to type reference pointer
931 @param pTypeName name of interface
932 @param pBaseType base type
933 */
934 CPPU_DLLPUBLIC void SAL_CALL typelib_static_interface_type_init(
935 typelib_TypeDescriptionReference ** ppRef,
936 const sal_Char * pTypeName,
937 typelib_TypeDescriptionReference * pBaseType )
938 SAL_THROW_EXTERN_C();
939
940 /** Inits incomplete static multiple-inheritance interface type reference.
941 Thread synchronizes on typelib init mutex.
942
943 @param ppRef pointer to type reference pointer
944 @param pTypeName name of interface
945 @param nBaseTypes number of base types
946 @param ppBaseTypes base types
947
948 @since UDK 3.2.0
949 */
950 CPPU_DLLPUBLIC void SAL_CALL typelib_static_mi_interface_type_init(
951 typelib_TypeDescriptionReference ** ppRef,
952 const sal_Char * pTypeName,
953 sal_Int32 nBaseTypes,
954 typelib_TypeDescriptionReference ** ppBaseTypes )
955 SAL_THROW_EXTERN_C();
956
957 /** Inits incomplete static enum type reference. Thread synchronizes on typelib init mutex.
958
959 @param ppRef pointer to type reference pointer
960 @param pTypeName name of enum
961 @param nDefaultValue default enum value
962 */
963 CPPU_DLLPUBLIC void SAL_CALL typelib_static_enum_type_init(
964 typelib_TypeDescriptionReference ** ppRef,
965 const sal_Char * pTypeName,
966 sal_Int32 nDefaultValue )
967 SAL_THROW_EXTERN_C();
968
969 /** Completes a typedescription to be used for, e.g., marshalling values. COMPOUND,
970 INTERFACE and ENUM type descriptions may be partly initialized (see typelib_static_...(),
971 typelib_TypeDescription::bComplete). For interface type descriptions, this will also
972 init index tables.
973
974 @param ppTypeDescr [inout] type description to be completed (may be exchanged!)
975 @return true, if type description is complete
976 */
977 CPPU_DLLPUBLIC sal_Bool SAL_CALL typelib_typedescription_complete(
978 typelib_TypeDescription ** ppTypeDescr )
979 SAL_THROW_EXTERN_C();
980
981 /// @cond INTERNAL
982
983 /** Returns true, if the type description reference may lose the type description. Otherwise
984 pType is a valid pointer and cannot be discarded through the lifetime of this reference.
985 Remark: If the pWeakObj of the type is set too, you can avoid the call of
986 ...getDescription(...) and use the description directly. pWeakObj == 0 means, that the
987 description is not initialized.
988 @internal
989 */
TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK(_typelib_TypeClass eTypeClass)990 inline bool TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK( _typelib_TypeClass eTypeClass )
991 {
992 return (eTypeClass == typelib_TypeClass_INTERFACE_METHOD) ||
993 (eTypeClass == typelib_TypeClass_INTERFACE_ATTRIBUTE);
994 }
995
996 /** Gets a description from the reference. The description may not be locked by this call.
997 You must use the TYPELIB_DANGER_RELEASE macro to release the description fetched with
998 this macro.
999 @internal
1000 */
TYPELIB_DANGER_GET(typelib_TypeDescription ** ppMacroTypeDescr,typelib_TypeDescriptionReference * pMacroTypeRef)1001 inline void TYPELIB_DANGER_GET( typelib_TypeDescription** ppMacroTypeDescr,
1002 typelib_TypeDescriptionReference* pMacroTypeRef )
1003 {
1004 if (TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK( pMacroTypeRef->eTypeClass ))
1005 {
1006 typelib_typedescriptionreference_getDescription( ppMacroTypeDescr, pMacroTypeRef );
1007 }
1008 else if (!pMacroTypeRef->pType || !pMacroTypeRef->pType->pWeakRef)
1009 {
1010 typelib_typedescriptionreference_getDescription( ppMacroTypeDescr, pMacroTypeRef );
1011 if (*ppMacroTypeDescr)
1012 typelib_typedescription_release( *ppMacroTypeDescr );
1013 }
1014 else
1015 {
1016 *ppMacroTypeDescr = pMacroTypeRef->pType;
1017 }
1018 }
1019
1020 /** Releases the description previous fetched by TYPELIB_DANGER_GET.
1021 @internal
1022 */
TYPELIB_DANGER_RELEASE(typelib_TypeDescription * pDescription)1023 inline void TYPELIB_DANGER_RELEASE( typelib_TypeDescription* pDescription )
1024 {
1025 if (TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK( pDescription->eTypeClass ))
1026 typelib_typedescription_release( pDescription );
1027 }
1028
1029 /// @endcond
1030
1031 #ifdef __cplusplus
1032 }
1033 #endif
1034
1035 #endif
1036
1037 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1038