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