xref: /aoo41x/main/cppu/source/uno/copy.hxx (revision c6ed87c9)
1*c6ed87c9SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c6ed87c9SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c6ed87c9SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c6ed87c9SAndrew Rist  * distributed with this work for additional information
6*c6ed87c9SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c6ed87c9SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c6ed87c9SAndrew Rist  * "License"); you may not use this file except in compliance
9*c6ed87c9SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*c6ed87c9SAndrew Rist  *
11*c6ed87c9SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*c6ed87c9SAndrew Rist  *
13*c6ed87c9SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c6ed87c9SAndrew Rist  * software distributed under the License is distributed on an
15*c6ed87c9SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c6ed87c9SAndrew Rist  * KIND, either express or implied.  See the License for the
17*c6ed87c9SAndrew Rist  * specific language governing permissions and limitations
18*c6ed87c9SAndrew Rist  * under the License.
19*c6ed87c9SAndrew Rist  *
20*c6ed87c9SAndrew Rist  *************************************************************/
21*c6ed87c9SAndrew Rist 
22*c6ed87c9SAndrew Rist 
23cdf0e10cSrcweir #ifndef COPY_HXX
24cdf0e10cSrcweir #define COPY_HXX
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "prim.hxx"
27cdf0e10cSrcweir #include "constr.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir 
30cdf0e10cSrcweir namespace cppu
31cdf0e10cSrcweir {
32cdf0e10cSrcweir 
33cdf0e10cSrcweir //##################################################################################################
34cdf0e10cSrcweir //#### copy construction ###########################################################################
35cdf0e10cSrcweir //##################################################################################################
36cdf0e10cSrcweir 
37cdf0e10cSrcweir //------------------------------------------------------------------------------
allocSeq(sal_Int32 nElementSize,sal_Int32 nElements)38cdf0e10cSrcweir inline uno_Sequence * allocSeq(
39cdf0e10cSrcweir     sal_Int32 nElementSize, sal_Int32 nElements )
40cdf0e10cSrcweir {
41cdf0e10cSrcweir     OSL_ASSERT( nElements >= 0 && nElementSize >= 0 );
42cdf0e10cSrcweir     uno_Sequence * pSeq = 0;
43cdf0e10cSrcweir     sal_uInt32 nSize = calcSeqMemSize( nElementSize, nElements );
44cdf0e10cSrcweir     if (nSize > 0)
45cdf0e10cSrcweir     {
46cdf0e10cSrcweir         pSeq = (uno_Sequence *) rtl_allocateMemory( nSize );
47cdf0e10cSrcweir         if (pSeq != 0)
48cdf0e10cSrcweir         {
49cdf0e10cSrcweir             // header init
50cdf0e10cSrcweir             pSeq->nRefCount = 1;
51cdf0e10cSrcweir             pSeq->nElements = nElements;
52cdf0e10cSrcweir         }
53cdf0e10cSrcweir     }
54cdf0e10cSrcweir     return pSeq;
55cdf0e10cSrcweir }
56cdf0e10cSrcweir 
57cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
58cdf0e10cSrcweir void copyConstructStruct(
59cdf0e10cSrcweir 	void * pDest, void * pSource,
60cdf0e10cSrcweir 	typelib_CompoundTypeDescription * pTypeDescr,
61cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
62cdf0e10cSrcweir 	SAL_THROW ( () );
63cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_copyConstructStruct(void * pDest,void * pSource,typelib_CompoundTypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)64cdf0e10cSrcweir inline void _copyConstructStruct(
65cdf0e10cSrcweir 	void * pDest, void * pSource,
66cdf0e10cSrcweir 	typelib_CompoundTypeDescription * pTypeDescr,
67cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
68cdf0e10cSrcweir 	SAL_THROW ( () )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir 	if (pTypeDescr->pBaseTypeDescription)
71cdf0e10cSrcweir 	{
72cdf0e10cSrcweir 		// copy base value
73cdf0e10cSrcweir 		copyConstructStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription, acquire, mapping );
74cdf0e10cSrcweir 	}
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 	// then copy members
77cdf0e10cSrcweir 	typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
78cdf0e10cSrcweir 	sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
79cdf0e10cSrcweir 	sal_Int32 nDescr = pTypeDescr->nMembers;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 	if (mapping)
82cdf0e10cSrcweir 	{
83cdf0e10cSrcweir 		while (nDescr--)
84cdf0e10cSrcweir 		{
85cdf0e10cSrcweir 			::uno_type_copyAndConvertData(
86cdf0e10cSrcweir                 (char *)pDest + pMemberOffsets[nDescr],
87cdf0e10cSrcweir                 (char *)pSource + pMemberOffsets[nDescr],
88cdf0e10cSrcweir                 ppTypeRefs[nDescr], mapping );
89cdf0e10cSrcweir 		}
90cdf0e10cSrcweir 	}
91cdf0e10cSrcweir 	else
92cdf0e10cSrcweir 	{
93cdf0e10cSrcweir 		while (nDescr--)
94cdf0e10cSrcweir 		{
95cdf0e10cSrcweir 			::uno_type_copyData(
96cdf0e10cSrcweir                 (char *)pDest + pMemberOffsets[nDescr],
97cdf0e10cSrcweir                 (char *)pSource + pMemberOffsets[nDescr],
98cdf0e10cSrcweir                 ppTypeRefs[nDescr], acquire );
99cdf0e10cSrcweir 		}
100cdf0e10cSrcweir 	}
101cdf0e10cSrcweir }
102cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_copyConstructArray(void * pDest,void * pSource,typelib_ArrayTypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)103cdf0e10cSrcweir inline void _copyConstructArray(
104cdf0e10cSrcweir 	void * pDest, void * pSource,
105cdf0e10cSrcweir 	typelib_ArrayTypeDescription * pTypeDescr,
106cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
107cdf0e10cSrcweir {
108cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pElementTypeRef = ((typelib_IndirectTypeDescription *)pTypeDescr)->pType;
109cdf0e10cSrcweir 	typelib_TypeDescription * pElementTypeDescr = NULL;
110cdf0e10cSrcweir 	TYPELIB_DANGER_GET( &pElementTypeDescr, pElementTypeRef );
111cdf0e10cSrcweir 	sal_Int32 nElementSize = ((typelib_TypeDescription*)pElementTypeDescr)->nSize;
112cdf0e10cSrcweir 	TYPELIB_DANGER_RELEASE( pElementTypeDescr );
113cdf0e10cSrcweir 	sal_Int32 nTotalElements = pTypeDescr->nTotalElements;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 	if (mapping)
116cdf0e10cSrcweir 	{
117cdf0e10cSrcweir 		for(sal_Int32 i = 0; i < nTotalElements; i++)
118cdf0e10cSrcweir 		{
119cdf0e10cSrcweir 			::uno_type_copyAndConvertData(
120cdf0e10cSrcweir                 (sal_Char *)pDest + i * nElementSize,
121cdf0e10cSrcweir                 (sal_Char *)pSource + i * nElementSize,
122cdf0e10cSrcweir                 pElementTypeRef, mapping );
123cdf0e10cSrcweir 		}
124cdf0e10cSrcweir 	}
125cdf0e10cSrcweir 	else
126cdf0e10cSrcweir 	{
127cdf0e10cSrcweir 		for(sal_Int32 i = 0; i < nTotalElements; i++)
128cdf0e10cSrcweir 		{
129cdf0e10cSrcweir 			::uno_type_copyData(
130cdf0e10cSrcweir                 (sal_Char *)pDest + (i * nElementSize),
131cdf0e10cSrcweir                 (sal_Char *)pSource + (i * nElementSize),
132cdf0e10cSrcweir                 pElementTypeRef, acquire );
133cdf0e10cSrcweir 		}
134cdf0e10cSrcweir 	}
135cdf0e10cSrcweir }
136cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_copyConstructUnion(void * pDest,void * pSource,typelib_TypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)137cdf0e10cSrcweir inline void _copyConstructUnion(
138cdf0e10cSrcweir 	void * pDest, void * pSource,
139cdf0e10cSrcweir 	typelib_TypeDescription * pTypeDescr,
140cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
141cdf0e10cSrcweir 	SAL_THROW ( () )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pSetType = _unionGetSetType( pSource, pTypeDescr );
144cdf0e10cSrcweir 	if (mapping)
145cdf0e10cSrcweir 	{
146cdf0e10cSrcweir 		::uno_type_copyAndConvertData(
147cdf0e10cSrcweir 			(char *)pDest + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
148cdf0e10cSrcweir 			(char *)pSource + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
149cdf0e10cSrcweir 			pSetType, mapping );
150cdf0e10cSrcweir 	}
151cdf0e10cSrcweir 	else
152cdf0e10cSrcweir 	{
153cdf0e10cSrcweir 		::uno_type_copyData(
154cdf0e10cSrcweir 			(char *)pDest + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
155cdf0e10cSrcweir 			(char *)pSource + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
156cdf0e10cSrcweir 			pSetType, acquire );
157cdf0e10cSrcweir 	}
158cdf0e10cSrcweir 	*(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
159cdf0e10cSrcweir 	typelib_typedescriptionreference_release( pSetType );
160cdf0e10cSrcweir }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir //------------------------------------------------------------------------------
163cdf0e10cSrcweir uno_Sequence * copyConstructSequence(
164cdf0e10cSrcweir 	uno_Sequence * pSource,
165cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pElementType,
166cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping );
167cdf0e10cSrcweir 
168cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_copyConstructAnyFromData(uno_Any * pDestAny,void * pSource,typelib_TypeDescriptionReference * pType,typelib_TypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)169cdf0e10cSrcweir inline void _copyConstructAnyFromData(
170cdf0e10cSrcweir 	uno_Any * pDestAny, void * pSource,
171cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr,
172cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
173cdf0e10cSrcweir 	SAL_THROW ( () )
174cdf0e10cSrcweir {
175cdf0e10cSrcweir 	TYPE_ACQUIRE( pType );
176cdf0e10cSrcweir 	pDestAny->pType = pType;
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 	switch (pType->eTypeClass)
179cdf0e10cSrcweir 	{
180cdf0e10cSrcweir 	case typelib_TypeClass_CHAR:
181cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
182cdf0e10cSrcweir 		*(sal_Unicode *)&pDestAny->pReserved = *(sal_Unicode *)pSource;
183cdf0e10cSrcweir 		break;
184cdf0e10cSrcweir 	case typelib_TypeClass_BOOLEAN:
185cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
186cdf0e10cSrcweir 		*(sal_Bool *)&pDestAny->pReserved = (*(sal_Bool *)pSource != sal_False);
187cdf0e10cSrcweir 		break;
188cdf0e10cSrcweir 	case typelib_TypeClass_BYTE:
189cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
190cdf0e10cSrcweir 		*(sal_Int8 *)&pDestAny->pReserved = *(sal_Int8 *)pSource;
191cdf0e10cSrcweir 		break;
192cdf0e10cSrcweir 	case typelib_TypeClass_SHORT:
193cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_SHORT:
194cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
195cdf0e10cSrcweir 		*(sal_Int16 *)&pDestAny->pReserved = *(sal_Int16 *)pSource;
196cdf0e10cSrcweir 		break;
197cdf0e10cSrcweir 	case typelib_TypeClass_LONG:
198cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_LONG:
199cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
200cdf0e10cSrcweir 		*(sal_Int32 *)&pDestAny->pReserved = *(sal_Int32 *)pSource;
201cdf0e10cSrcweir 		break;
202cdf0e10cSrcweir 	case typelib_TypeClass_HYPER:
203cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_HYPER:
204cdf0e10cSrcweir         if (sizeof(void *) >= sizeof(sal_Int64))
205cdf0e10cSrcweir         {
206cdf0e10cSrcweir             pDestAny->pData = &pDestAny->pReserved;
207cdf0e10cSrcweir             *(sal_Int64 *)&pDestAny->pReserved = *(sal_Int64 *)pSource;
208cdf0e10cSrcweir         }
209cdf0e10cSrcweir         else
210cdf0e10cSrcweir         {
211cdf0e10cSrcweir             pDestAny->pData = ::rtl_allocateMemory( sizeof(sal_Int64) );
212cdf0e10cSrcweir             *(sal_Int64 *)pDestAny->pData = *(sal_Int64 *)pSource;
213cdf0e10cSrcweir         }
214cdf0e10cSrcweir 		break;
215cdf0e10cSrcweir 	case typelib_TypeClass_FLOAT:
216cdf0e10cSrcweir         if (sizeof(void *) >= sizeof(float))
217cdf0e10cSrcweir         {
218cdf0e10cSrcweir             pDestAny->pData = &pDestAny->pReserved;
219cdf0e10cSrcweir             *(float *)&pDestAny->pReserved = *(float *)pSource;
220cdf0e10cSrcweir         }
221cdf0e10cSrcweir         else
222cdf0e10cSrcweir         {
223cdf0e10cSrcweir             pDestAny->pData = ::rtl_allocateMemory( sizeof(float) );
224cdf0e10cSrcweir             *(float *)pDestAny->pData = *(float *)pSource;
225cdf0e10cSrcweir         }
226cdf0e10cSrcweir 		break;
227cdf0e10cSrcweir 	case typelib_TypeClass_DOUBLE:
228cdf0e10cSrcweir         if (sizeof(void *) >= sizeof(double))
229cdf0e10cSrcweir         {
230cdf0e10cSrcweir             pDestAny->pData = &pDestAny->pReserved;
231cdf0e10cSrcweir             *(double *)&pDestAny->pReserved = *(double *)pSource;
232cdf0e10cSrcweir         }
233cdf0e10cSrcweir         else
234cdf0e10cSrcweir         {
235cdf0e10cSrcweir             pDestAny->pData = ::rtl_allocateMemory( sizeof(double) );
236cdf0e10cSrcweir             *(double *)pDestAny->pData = *(double *)pSource;
237cdf0e10cSrcweir         }
238cdf0e10cSrcweir 		break;
239cdf0e10cSrcweir 	case typelib_TypeClass_STRING:
240cdf0e10cSrcweir 		::rtl_uString_acquire( *(rtl_uString **)pSource );
241cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
242cdf0e10cSrcweir 		*(rtl_uString **)&pDestAny->pReserved = *(rtl_uString **)pSource;
243cdf0e10cSrcweir 		break;
244cdf0e10cSrcweir 	case typelib_TypeClass_TYPE:
245cdf0e10cSrcweir 		TYPE_ACQUIRE( *(typelib_TypeDescriptionReference **)pSource );
246cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
247cdf0e10cSrcweir 		*(typelib_TypeDescriptionReference **)&pDestAny->pReserved = *(typelib_TypeDescriptionReference **)pSource;
248cdf0e10cSrcweir 		break;
249cdf0e10cSrcweir 	case typelib_TypeClass_ANY:
250cdf0e10cSrcweir 		OSL_ENSURE( 0, "### unexpected nested any!" );
251cdf0e10cSrcweir 		break;
252cdf0e10cSrcweir 	case typelib_TypeClass_ENUM:
253cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
254cdf0e10cSrcweir         // enum is forced to 32bit long
255cdf0e10cSrcweir 		*(sal_Int32 *)&pDestAny->pReserved = *(sal_Int32 *)pSource;
256cdf0e10cSrcweir 		break;
257cdf0e10cSrcweir 	case typelib_TypeClass_STRUCT:
258cdf0e10cSrcweir 	case typelib_TypeClass_EXCEPTION:
259cdf0e10cSrcweir 		if (pTypeDescr)
260cdf0e10cSrcweir 		{
261cdf0e10cSrcweir 			pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
262cdf0e10cSrcweir 			_copyConstructStruct(
263cdf0e10cSrcweir 				pDestAny->pData, pSource,
264cdf0e10cSrcweir 				(typelib_CompoundTypeDescription *)pTypeDescr,
265cdf0e10cSrcweir 				acquire, mapping );
266cdf0e10cSrcweir 		}
267cdf0e10cSrcweir 		else
268cdf0e10cSrcweir 		{
269cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
270cdf0e10cSrcweir 			pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
271cdf0e10cSrcweir 			_copyConstructStruct(
272cdf0e10cSrcweir 				pDestAny->pData, pSource,
273cdf0e10cSrcweir 				(typelib_CompoundTypeDescription *)pTypeDescr,
274cdf0e10cSrcweir 				acquire, mapping );
275cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
276cdf0e10cSrcweir 		}
277cdf0e10cSrcweir 		break;
278cdf0e10cSrcweir 	case typelib_TypeClass_ARRAY:
279cdf0e10cSrcweir 		if (pTypeDescr)
280cdf0e10cSrcweir 		{
281cdf0e10cSrcweir 			pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
282cdf0e10cSrcweir 			_copyConstructArray(
283cdf0e10cSrcweir 				pDestAny->pData, pSource,
284cdf0e10cSrcweir 				(typelib_ArrayTypeDescription *)pTypeDescr,
285cdf0e10cSrcweir 				acquire, mapping );
286cdf0e10cSrcweir 		}
287cdf0e10cSrcweir 		else
288cdf0e10cSrcweir 		{
289cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
290cdf0e10cSrcweir 			pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
291cdf0e10cSrcweir 			_copyConstructArray(
292cdf0e10cSrcweir 				pDestAny->pData, pSource,
293cdf0e10cSrcweir 				(typelib_ArrayTypeDescription *)pTypeDescr,
294cdf0e10cSrcweir 				acquire, mapping );
295cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
296cdf0e10cSrcweir 		}
297cdf0e10cSrcweir 		break;
298cdf0e10cSrcweir 	case typelib_TypeClass_UNION:
299cdf0e10cSrcweir 		if (pTypeDescr)
300cdf0e10cSrcweir 		{
301cdf0e10cSrcweir 			pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
302cdf0e10cSrcweir 			_copyConstructUnion( pDestAny->pData, pSource, pTypeDescr, acquire, mapping );
303cdf0e10cSrcweir 		}
304cdf0e10cSrcweir 		else
305cdf0e10cSrcweir 		{
306cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
307cdf0e10cSrcweir 			pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
308cdf0e10cSrcweir 			_copyConstructUnion( pDestAny->pData, pSource, pTypeDescr, acquire, mapping );
309cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
310cdf0e10cSrcweir 		}
311cdf0e10cSrcweir 		break;
312cdf0e10cSrcweir 	case typelib_TypeClass_SEQUENCE:
313cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
314cdf0e10cSrcweir 		if (pTypeDescr)
315cdf0e10cSrcweir 		{
316cdf0e10cSrcweir 			*(uno_Sequence **)&pDestAny->pReserved = copyConstructSequence(
317cdf0e10cSrcweir 				*(uno_Sequence **)pSource,
318cdf0e10cSrcweir 				((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
319cdf0e10cSrcweir 				acquire, mapping );
320cdf0e10cSrcweir 		}
321cdf0e10cSrcweir 		else
322cdf0e10cSrcweir 		{
323cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
324cdf0e10cSrcweir 			*(uno_Sequence **)&pDestAny->pReserved = copyConstructSequence(
325cdf0e10cSrcweir 				*(uno_Sequence **)pSource,
326cdf0e10cSrcweir 				((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
327cdf0e10cSrcweir 				acquire, mapping );
328cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
329cdf0e10cSrcweir 		}
330cdf0e10cSrcweir 		break;
331cdf0e10cSrcweir 	case typelib_TypeClass_INTERFACE:
332cdf0e10cSrcweir 		pDestAny->pData = &pDestAny->pReserved;
333cdf0e10cSrcweir 		if (mapping)
334cdf0e10cSrcweir 		{
335cdf0e10cSrcweir 			pDestAny->pReserved = _map( *(void **)pSource, pType, pTypeDescr, mapping );
336cdf0e10cSrcweir 		}
337cdf0e10cSrcweir 		else
338cdf0e10cSrcweir 		{
339cdf0e10cSrcweir 			_acquire( pDestAny->pReserved = *(void **)pSource, acquire );
340cdf0e10cSrcweir 		}
341cdf0e10cSrcweir 		break;
342cdf0e10cSrcweir     default:
343cdf0e10cSrcweir         OSL_ASSERT(false);
344cdf0e10cSrcweir         break;
345cdf0e10cSrcweir 	}
346cdf0e10cSrcweir }
347cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_copyConstructAny(uno_Any * pDestAny,void * pSource,typelib_TypeDescriptionReference * pType,typelib_TypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)348cdf0e10cSrcweir inline void _copyConstructAny(
349cdf0e10cSrcweir 	uno_Any * pDestAny, void * pSource,
350cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr,
351cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
352cdf0e10cSrcweir 	SAL_THROW ( () )
353cdf0e10cSrcweir {
354cdf0e10cSrcweir 	if (typelib_TypeClass_VOID == pType->eTypeClass)
355cdf0e10cSrcweir 	{
356cdf0e10cSrcweir 		CONSTRUCT_EMPTY_ANY( pDestAny );
357cdf0e10cSrcweir 	}
358cdf0e10cSrcweir 	else
359cdf0e10cSrcweir 	{
360cdf0e10cSrcweir 		if (typelib_TypeClass_ANY == pType->eTypeClass)
361cdf0e10cSrcweir 		{
362cdf0e10cSrcweir 			if (pSource)
363cdf0e10cSrcweir 			{
364cdf0e10cSrcweir 				pType = ((uno_Any *)pSource)->pType;
365cdf0e10cSrcweir 				if (typelib_TypeClass_VOID == pType->eTypeClass)
366cdf0e10cSrcweir 				{
367cdf0e10cSrcweir 					CONSTRUCT_EMPTY_ANY( pDestAny );
368cdf0e10cSrcweir 					return;
369cdf0e10cSrcweir 				}
370cdf0e10cSrcweir 				pTypeDescr = 0;
371cdf0e10cSrcweir 				pSource = ((uno_Any *)pSource)->pData;
372cdf0e10cSrcweir 			}
373cdf0e10cSrcweir 			else
374cdf0e10cSrcweir 			{
375cdf0e10cSrcweir 				CONSTRUCT_EMPTY_ANY( pDestAny );
376cdf0e10cSrcweir 				return;
377cdf0e10cSrcweir 			}
378cdf0e10cSrcweir 		}
379cdf0e10cSrcweir 		if (pSource)
380cdf0e10cSrcweir 		{
381cdf0e10cSrcweir 			_copyConstructAnyFromData( pDestAny, pSource, pType, pTypeDescr, acquire, mapping );
382cdf0e10cSrcweir 		}
383cdf0e10cSrcweir 		else // default construct
384cdf0e10cSrcweir 		{
385cdf0e10cSrcweir 			TYPE_ACQUIRE( pType );
386cdf0e10cSrcweir 			pDestAny->pType = pType;
387cdf0e10cSrcweir 			switch (pType->eTypeClass)
388cdf0e10cSrcweir 			{
389cdf0e10cSrcweir 			case typelib_TypeClass_CHAR:
390cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
391cdf0e10cSrcweir 				*(sal_Unicode *)&pDestAny->pReserved = '\0';
392cdf0e10cSrcweir 				break;
393cdf0e10cSrcweir 			case typelib_TypeClass_BOOLEAN:
394cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
395cdf0e10cSrcweir 				*(sal_Bool *)&pDestAny->pReserved = sal_False;
396cdf0e10cSrcweir 				break;
397cdf0e10cSrcweir 			case typelib_TypeClass_BYTE:
398cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
399cdf0e10cSrcweir 				*(sal_Int8 *)&pDestAny->pReserved = 0;
400cdf0e10cSrcweir 				break;
401cdf0e10cSrcweir 			case typelib_TypeClass_SHORT:
402cdf0e10cSrcweir 			case typelib_TypeClass_UNSIGNED_SHORT:
403cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
404cdf0e10cSrcweir 				*(sal_Int16 *)&pDestAny->pReserved = 0;
405cdf0e10cSrcweir 				break;
406cdf0e10cSrcweir 			case typelib_TypeClass_LONG:
407cdf0e10cSrcweir 			case typelib_TypeClass_UNSIGNED_LONG:
408cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
409cdf0e10cSrcweir 				*(sal_Int32 *)&pDestAny->pReserved = 0;
410cdf0e10cSrcweir 				break;
411cdf0e10cSrcweir 			case typelib_TypeClass_HYPER:
412cdf0e10cSrcweir 			case typelib_TypeClass_UNSIGNED_HYPER:
413cdf0e10cSrcweir                 if (sizeof(void *) >= sizeof(sal_Int64))
414cdf0e10cSrcweir                 {
415cdf0e10cSrcweir                     pDestAny->pData = &pDestAny->pReserved;
416cdf0e10cSrcweir                     *(sal_Int64 *)&pDestAny->pReserved = 0;
417cdf0e10cSrcweir                 }
418cdf0e10cSrcweir                 else
419cdf0e10cSrcweir                 {
420cdf0e10cSrcweir                     pDestAny->pData = ::rtl_allocateMemory( sizeof(sal_Int64) );
421cdf0e10cSrcweir                     *(sal_Int64 *)pDestAny->pData = 0;
422cdf0e10cSrcweir                 }
423cdf0e10cSrcweir 				break;
424cdf0e10cSrcweir 			case typelib_TypeClass_FLOAT:
425cdf0e10cSrcweir                 if (sizeof(void *) >= sizeof(float))
426cdf0e10cSrcweir                 {
427cdf0e10cSrcweir                     pDestAny->pData = &pDestAny->pReserved;
428cdf0e10cSrcweir                     *(float *)&pDestAny->pReserved = 0.0;
429cdf0e10cSrcweir                 }
430cdf0e10cSrcweir                 else
431cdf0e10cSrcweir                 {
432cdf0e10cSrcweir                     pDestAny->pData = ::rtl_allocateMemory( sizeof(float) );
433cdf0e10cSrcweir                     *(float *)pDestAny->pData = 0.0;
434cdf0e10cSrcweir                 }
435cdf0e10cSrcweir 				break;
436cdf0e10cSrcweir 			case typelib_TypeClass_DOUBLE:
437cdf0e10cSrcweir                 if (sizeof(void *) >= sizeof(double))
438cdf0e10cSrcweir                 {
439cdf0e10cSrcweir                     pDestAny->pData = &pDestAny->pReserved;
440cdf0e10cSrcweir                     *(double *)&pDestAny->pReserved = 0.0;
441cdf0e10cSrcweir                 }
442cdf0e10cSrcweir                 else
443cdf0e10cSrcweir                 {
444cdf0e10cSrcweir                     pDestAny->pData = ::rtl_allocateMemory( sizeof(double) );
445cdf0e10cSrcweir                     *(double *)pDestAny->pData = 0.0;
446cdf0e10cSrcweir                 }
447cdf0e10cSrcweir 				break;
448cdf0e10cSrcweir 			case typelib_TypeClass_STRING:
449cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
450cdf0e10cSrcweir 				*(rtl_uString **)&pDestAny->pReserved = 0;
451cdf0e10cSrcweir 				::rtl_uString_new( (rtl_uString **)&pDestAny->pReserved );
452cdf0e10cSrcweir 				break;
453cdf0e10cSrcweir 			case typelib_TypeClass_TYPE:
454cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
455cdf0e10cSrcweir 				*(typelib_TypeDescriptionReference **)&pDestAny->pReserved = _getVoidType();
456cdf0e10cSrcweir 				break;
457cdf0e10cSrcweir 			case typelib_TypeClass_ENUM:
458cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
459cdf0e10cSrcweir 				if (pTypeDescr)
460cdf0e10cSrcweir 				{
461cdf0e10cSrcweir 					*(sal_Int32 *)&pDestAny->pReserved = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue;
462cdf0e10cSrcweir 				}
463cdf0e10cSrcweir 				else
464cdf0e10cSrcweir 				{
465cdf0e10cSrcweir 					TYPELIB_DANGER_GET( &pTypeDescr, pType );
466cdf0e10cSrcweir 					*(sal_Int32 *)&pDestAny->pReserved = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue;
467cdf0e10cSrcweir 					TYPELIB_DANGER_RELEASE( pTypeDescr );
468cdf0e10cSrcweir 				}
469cdf0e10cSrcweir 				break;
470cdf0e10cSrcweir 			case typelib_TypeClass_STRUCT:
471cdf0e10cSrcweir 			case typelib_TypeClass_EXCEPTION:
472cdf0e10cSrcweir 				if (pTypeDescr)
473cdf0e10cSrcweir 				{
474cdf0e10cSrcweir 					pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
475cdf0e10cSrcweir 					_defaultConstructStruct(
476cdf0e10cSrcweir 						pDestAny->pData, (typelib_CompoundTypeDescription *)pTypeDescr );
477cdf0e10cSrcweir 				}
478cdf0e10cSrcweir 				else
479cdf0e10cSrcweir 				{
480cdf0e10cSrcweir 					TYPELIB_DANGER_GET( &pTypeDescr, pType );
481cdf0e10cSrcweir 					pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
482cdf0e10cSrcweir 					_defaultConstructStruct(
483cdf0e10cSrcweir 						pDestAny->pData, (typelib_CompoundTypeDescription *)pTypeDescr );
484cdf0e10cSrcweir 					TYPELIB_DANGER_RELEASE( pTypeDescr );
485cdf0e10cSrcweir 				}
486cdf0e10cSrcweir 				break;
487cdf0e10cSrcweir 			case typelib_TypeClass_ARRAY:
488cdf0e10cSrcweir 				if (pTypeDescr)
489cdf0e10cSrcweir 				{
490cdf0e10cSrcweir 					pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
491cdf0e10cSrcweir 					_defaultConstructArray(
492cdf0e10cSrcweir 						pDestAny->pData, (typelib_ArrayTypeDescription *)pTypeDescr );
493cdf0e10cSrcweir 				}
494cdf0e10cSrcweir 				else
495cdf0e10cSrcweir 				{
496cdf0e10cSrcweir 					TYPELIB_DANGER_GET( &pTypeDescr, pType );
497cdf0e10cSrcweir 					pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
498cdf0e10cSrcweir 					_defaultConstructArray(
499cdf0e10cSrcweir 						pDestAny->pData, (typelib_ArrayTypeDescription *)pTypeDescr );
500cdf0e10cSrcweir 					TYPELIB_DANGER_RELEASE( pTypeDescr );
501cdf0e10cSrcweir 				}
502cdf0e10cSrcweir 				break;
503cdf0e10cSrcweir 			case typelib_TypeClass_UNION:
504cdf0e10cSrcweir 				if (pTypeDescr)
505cdf0e10cSrcweir 				{
506cdf0e10cSrcweir 					pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
507cdf0e10cSrcweir 					_defaultConstructUnion( pDestAny->pData, pTypeDescr );
508cdf0e10cSrcweir 				}
509cdf0e10cSrcweir 				else
510cdf0e10cSrcweir 				{
511cdf0e10cSrcweir 					TYPELIB_DANGER_GET( &pTypeDescr, pType );
512cdf0e10cSrcweir 					pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
513cdf0e10cSrcweir 					_defaultConstructUnion( pDestAny->pData, pTypeDescr );
514cdf0e10cSrcweir 					TYPELIB_DANGER_RELEASE( pTypeDescr );
515cdf0e10cSrcweir 				}
516cdf0e10cSrcweir 				break;
517cdf0e10cSrcweir 			case typelib_TypeClass_SEQUENCE:
518cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
519cdf0e10cSrcweir 				*(uno_Sequence **)&pDestAny->pReserved = createEmptySequence();
520cdf0e10cSrcweir 				break;
521cdf0e10cSrcweir 			case typelib_TypeClass_INTERFACE:
522cdf0e10cSrcweir 				pDestAny->pData = &pDestAny->pReserved;
523cdf0e10cSrcweir 				pDestAny->pReserved = 0; // either cpp or c-uno interface
524cdf0e10cSrcweir 				break;
525cdf0e10cSrcweir             default:
526cdf0e10cSrcweir                 OSL_ASSERT(false);
527cdf0e10cSrcweir                 break;
528cdf0e10cSrcweir 			}
529cdf0e10cSrcweir 		}
530cdf0e10cSrcweir 	}
531cdf0e10cSrcweir }
532cdf0e10cSrcweir //------------------------------------------------------------------------------
icopyConstructSequence(uno_Sequence * pSource,typelib_TypeDescriptionReference * pElementType,uno_AcquireFunc acquire,uno_Mapping * mapping)533cdf0e10cSrcweir inline uno_Sequence * icopyConstructSequence(
534cdf0e10cSrcweir 	uno_Sequence * pSource,
535cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pElementType,
536cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir 	typelib_TypeClass eTypeClass = pElementType->eTypeClass;
539cdf0e10cSrcweir 	if (!mapping ||
540cdf0e10cSrcweir         (eTypeClass <= typelib_TypeClass_ENUM &&
541cdf0e10cSrcweir          eTypeClass != typelib_TypeClass_ANY))
542cdf0e10cSrcweir 	{
543cdf0e10cSrcweir 		::osl_incrementInterlockedCount( &pSource->nRefCount );
544cdf0e10cSrcweir 		return pSource;
545cdf0e10cSrcweir 	}
546cdf0e10cSrcweir 	else // create new sequence
547cdf0e10cSrcweir 	{
548cdf0e10cSrcweir 		uno_Sequence * pDest;
549cdf0e10cSrcweir 		sal_Int32 nElements = pSource->nElements;
550cdf0e10cSrcweir 		if (nElements)
551cdf0e10cSrcweir 		{
552cdf0e10cSrcweir 			switch (eTypeClass)
553cdf0e10cSrcweir 			{
554cdf0e10cSrcweir 			case typelib_TypeClass_ANY:
555cdf0e10cSrcweir 			{
556cdf0e10cSrcweir 				pDest = allocSeq( sizeof (uno_Any), nElements );
557cdf0e10cSrcweir                 if (pDest != 0)
558cdf0e10cSrcweir                 {
559cdf0e10cSrcweir                     uno_Any * pDestElements = (uno_Any *)pDest->elements;
560cdf0e10cSrcweir                     uno_Any * pSourceElements = (uno_Any *)pSource->elements;
561cdf0e10cSrcweir                     for ( sal_Int32 nPos = nElements; nPos--; )
562cdf0e10cSrcweir                     {
563cdf0e10cSrcweir                         typelib_TypeDescriptionReference * pType =
564cdf0e10cSrcweir                             pSourceElements[nPos].pType;
565cdf0e10cSrcweir                         if (typelib_TypeClass_VOID == pType->eTypeClass)
566cdf0e10cSrcweir                         {
567cdf0e10cSrcweir                             CONSTRUCT_EMPTY_ANY( &pDestElements[nPos] );
568cdf0e10cSrcweir                         }
569cdf0e10cSrcweir                         else
570cdf0e10cSrcweir                         {
571cdf0e10cSrcweir                             _copyConstructAnyFromData(
572cdf0e10cSrcweir                                 &pDestElements[nPos],
573cdf0e10cSrcweir                                 pSourceElements[nPos].pData,
574cdf0e10cSrcweir                                 pType, 0,
575cdf0e10cSrcweir                                 acquire, mapping );
576cdf0e10cSrcweir                         }
577cdf0e10cSrcweir                     }
578cdf0e10cSrcweir 				}
579cdf0e10cSrcweir 				break;
580cdf0e10cSrcweir 			}
581cdf0e10cSrcweir 			case typelib_TypeClass_STRUCT:
582cdf0e10cSrcweir 			case typelib_TypeClass_EXCEPTION:
583cdf0e10cSrcweir 			{
584cdf0e10cSrcweir 				typelib_TypeDescription * pElementTypeDescr = 0;
585cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
586cdf0e10cSrcweir 				sal_Int32 nElementSize = pElementTypeDescr->nSize;
587cdf0e10cSrcweir 				char * pSourceElements = pSource->elements;
588cdf0e10cSrcweir 				pDest = allocSeq( nElementSize, nElements );
589cdf0e10cSrcweir                 if (pDest != 0)
590cdf0e10cSrcweir                 {
591cdf0e10cSrcweir                     char * pElements = pDest->elements;
592cdf0e10cSrcweir                     for ( sal_Int32 nPos = nElements; nPos--; )
593cdf0e10cSrcweir                     {
594cdf0e10cSrcweir                         _copyConstructStruct(
595cdf0e10cSrcweir                             pElements + (nPos * nElementSize),
596cdf0e10cSrcweir                             pSourceElements + (nPos * nElementSize),
597cdf0e10cSrcweir                             (typelib_CompoundTypeDescription *)
598cdf0e10cSrcweir                             pElementTypeDescr,
599cdf0e10cSrcweir                             acquire, mapping );
600cdf0e10cSrcweir                     }
601cdf0e10cSrcweir                 }
602cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pElementTypeDescr );
603cdf0e10cSrcweir 				break;
604cdf0e10cSrcweir 			}
605cdf0e10cSrcweir 			case typelib_TypeClass_ARRAY:
606cdf0e10cSrcweir 			{
607cdf0e10cSrcweir 				typelib_TypeDescription * pElementTypeDescr = 0;
608cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
609cdf0e10cSrcweir 				sal_Int32 nElementSize = pElementTypeDescr->nSize;
610cdf0e10cSrcweir 				char * pSourceElements = pSource->elements;
611cdf0e10cSrcweir 				pDest = allocSeq( nElementSize, nElements );
612cdf0e10cSrcweir                 if (pDest != 0)
613cdf0e10cSrcweir                 {
614cdf0e10cSrcweir                     char * pElements = pDest->elements;
615cdf0e10cSrcweir                     for ( sal_Int32 nPos = nElements; nPos--; )
616cdf0e10cSrcweir                     {
617cdf0e10cSrcweir                         _copyConstructArray(
618cdf0e10cSrcweir                             pElements + (nPos * nElementSize),
619cdf0e10cSrcweir                             pSourceElements + (nPos * nElementSize),
620cdf0e10cSrcweir                             (typelib_ArrayTypeDescription *)pElementTypeDescr,
621cdf0e10cSrcweir                             acquire, mapping );
622cdf0e10cSrcweir                     }
623cdf0e10cSrcweir                 }
624cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pElementTypeDescr );
625cdf0e10cSrcweir 				break;
626cdf0e10cSrcweir 			}
627cdf0e10cSrcweir 			case typelib_TypeClass_UNION:
628cdf0e10cSrcweir 			{
629cdf0e10cSrcweir 				typelib_TypeDescription * pElementTypeDescr = 0;
630cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
631cdf0e10cSrcweir 				sal_Int32 nElementSize = pElementTypeDescr->nSize;
632cdf0e10cSrcweir 				sal_Int32 nValueOffset =
633cdf0e10cSrcweir                     ((typelib_UnionTypeDescription *)
634cdf0e10cSrcweir                      pElementTypeDescr)->nValueOffset;
635cdf0e10cSrcweir 				pDest = allocSeq( nElementSize, nElements );
636cdf0e10cSrcweir                 if (pDest != 0)
637cdf0e10cSrcweir                 {
638cdf0e10cSrcweir                     char * pElements = pDest->elements;
639cdf0e10cSrcweir                     char * pSourceElements = pSource->elements;
640cdf0e10cSrcweir                     for ( sal_Int32 nPos = nElements; nPos--; )
641cdf0e10cSrcweir                     {
642cdf0e10cSrcweir                         char * pDest2 =
643cdf0e10cSrcweir                             pElements + (nPos * nElementSize);
644cdf0e10cSrcweir                         char * pSource2 =
645cdf0e10cSrcweir                             pSourceElements + (nPos * nElementSize);
646cdf0e10cSrcweir 
647cdf0e10cSrcweir                         typelib_TypeDescriptionReference * pSetType =
648cdf0e10cSrcweir                             _unionGetSetType( pSource2, pElementTypeDescr );
649cdf0e10cSrcweir                         ::uno_type_copyAndConvertData(
650cdf0e10cSrcweir                             pDest2 + nValueOffset, pSource2 + nValueOffset,
651cdf0e10cSrcweir                             pSetType, mapping );
652cdf0e10cSrcweir                         *(sal_Int64 *)pDest2 = *(sal_Int64 *)pSource2;
653cdf0e10cSrcweir                         ::typelib_typedescriptionreference_release( pSetType );
654cdf0e10cSrcweir                     }
655cdf0e10cSrcweir                 }
656cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pElementTypeDescr );
657cdf0e10cSrcweir 				break;
658cdf0e10cSrcweir 			}
659cdf0e10cSrcweir 			case typelib_TypeClass_SEQUENCE: // sequence of sequence
660cdf0e10cSrcweir 			{
661cdf0e10cSrcweir 				pDest = allocSeq( sizeof (uno_Sequence *), nElements );
662cdf0e10cSrcweir                 if (pDest != 0)
663cdf0e10cSrcweir                 {
664cdf0e10cSrcweir                     typelib_TypeDescription * pElementTypeDescr = 0;
665cdf0e10cSrcweir                     TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
666cdf0e10cSrcweir                     typelib_TypeDescriptionReference * pSeqElementType =
667cdf0e10cSrcweir                         ((typelib_IndirectTypeDescription *)
668cdf0e10cSrcweir                          pElementTypeDescr)->pType;
669cdf0e10cSrcweir 
670cdf0e10cSrcweir                     uno_Sequence ** pDestElements =
671cdf0e10cSrcweir                         (uno_Sequence **) pDest->elements;
672cdf0e10cSrcweir                     uno_Sequence ** pSourceElements =
673cdf0e10cSrcweir                         (uno_Sequence **) pSource->elements;
674cdf0e10cSrcweir                     for ( sal_Int32 nPos = nElements; nPos--; )
675cdf0e10cSrcweir                     {
676cdf0e10cSrcweir                         uno_Sequence * pNew = copyConstructSequence(
677cdf0e10cSrcweir                             pSourceElements[nPos],
678cdf0e10cSrcweir                             pSeqElementType,
679cdf0e10cSrcweir                             acquire, mapping );
680cdf0e10cSrcweir                         OSL_ASSERT( pNew != 0 );
681cdf0e10cSrcweir                         // ought never be a memory allocation problem,
682cdf0e10cSrcweir                         // because of reference counted sequence handles
683cdf0e10cSrcweir                         pDestElements[ nPos ] = pNew;
684cdf0e10cSrcweir                     }
685cdf0e10cSrcweir 
686cdf0e10cSrcweir                     TYPELIB_DANGER_RELEASE( pElementTypeDescr );
687cdf0e10cSrcweir                 }
688cdf0e10cSrcweir 				break;
689cdf0e10cSrcweir 			}
690cdf0e10cSrcweir 			case typelib_TypeClass_INTERFACE:
691cdf0e10cSrcweir 			{
692cdf0e10cSrcweir 				pDest = allocSeq( sizeof (void *), nElements );
693cdf0e10cSrcweir                 if (pDest != 0)
694cdf0e10cSrcweir                 {
695cdf0e10cSrcweir                     char * pElements = pDest->elements;
696cdf0e10cSrcweir                     void ** pSourceElements = (void **)pSource->elements;
697cdf0e10cSrcweir                     if (mapping)
698cdf0e10cSrcweir                     {
699cdf0e10cSrcweir                         typelib_TypeDescription * pElementTypeDescr = 0;
700cdf0e10cSrcweir                         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
701cdf0e10cSrcweir                         for ( sal_Int32 nPos = nElements; nPos--; )
702cdf0e10cSrcweir                         {
703cdf0e10cSrcweir                             ((void **)pElements)[nPos] = 0;
704cdf0e10cSrcweir                             if (((void **)pSourceElements)[nPos])
705cdf0e10cSrcweir                             {
706cdf0e10cSrcweir                                 (*mapping->mapInterface)(
707cdf0e10cSrcweir                                     mapping, (void **)pElements + nPos,
708cdf0e10cSrcweir                                     pSourceElements[nPos],
709cdf0e10cSrcweir                                     (typelib_InterfaceTypeDescription *)
710cdf0e10cSrcweir                                     pElementTypeDescr );
711cdf0e10cSrcweir                             }
712cdf0e10cSrcweir                         }
713cdf0e10cSrcweir                         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
714cdf0e10cSrcweir                     }
715cdf0e10cSrcweir                     else
716cdf0e10cSrcweir                     {
717cdf0e10cSrcweir                         for ( sal_Int32 nPos = nElements; nPos--; )
718cdf0e10cSrcweir                         {
719cdf0e10cSrcweir                             ((void **)pElements)[nPos] = pSourceElements[nPos];
720cdf0e10cSrcweir                             _acquire( ((void **)pElements)[nPos], acquire );
721cdf0e10cSrcweir                         }
722cdf0e10cSrcweir                     }
723cdf0e10cSrcweir 				}
724cdf0e10cSrcweir 				break;
725cdf0e10cSrcweir 			}
726cdf0e10cSrcweir 			default:
727cdf0e10cSrcweir                 OSL_ENSURE( 0, "### unexepcted sequence element type!" );
728cdf0e10cSrcweir                 pDest = 0;
729cdf0e10cSrcweir 				break;
730cdf0e10cSrcweir 			}
731cdf0e10cSrcweir 		}
732cdf0e10cSrcweir 		else // empty sequence
733cdf0e10cSrcweir 		{
734cdf0e10cSrcweir             pDest = allocSeq( 0, 0 );
735cdf0e10cSrcweir 		}
736cdf0e10cSrcweir 
737cdf0e10cSrcweir 		return pDest;
738cdf0e10cSrcweir 	}
739cdf0e10cSrcweir }
740cdf0e10cSrcweir 
741cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_copyConstructData(void * pDest,void * pSource,typelib_TypeDescriptionReference * pType,typelib_TypeDescription * pTypeDescr,uno_AcquireFunc acquire,uno_Mapping * mapping)742cdf0e10cSrcweir inline void _copyConstructData(
743cdf0e10cSrcweir 	void * pDest, void * pSource,
744cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr,
745cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_Mapping * mapping )
746cdf0e10cSrcweir 	SAL_THROW ( () )
747cdf0e10cSrcweir {
748cdf0e10cSrcweir 	switch (pType->eTypeClass)
749cdf0e10cSrcweir 	{
750cdf0e10cSrcweir 	case typelib_TypeClass_CHAR:
751cdf0e10cSrcweir 		*(sal_Unicode *)pDest = *(sal_Unicode *)pSource;
752cdf0e10cSrcweir 		break;
753cdf0e10cSrcweir 	case typelib_TypeClass_BOOLEAN:
754cdf0e10cSrcweir 		*(sal_Bool *)pDest = (*(sal_Bool *)pSource != sal_False);
755cdf0e10cSrcweir 		break;
756cdf0e10cSrcweir 	case typelib_TypeClass_BYTE:
757cdf0e10cSrcweir 		*(sal_Int8 *)pDest = *(sal_Int8 *)pSource;
758cdf0e10cSrcweir 		break;
759cdf0e10cSrcweir 	case typelib_TypeClass_SHORT:
760cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_SHORT:
761cdf0e10cSrcweir 		*(sal_Int16 *)pDest = *(sal_Int16 *)pSource;
762cdf0e10cSrcweir 		break;
763cdf0e10cSrcweir 	case typelib_TypeClass_LONG:
764cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_LONG:
765cdf0e10cSrcweir 		*(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
766cdf0e10cSrcweir 		break;
767cdf0e10cSrcweir 	case typelib_TypeClass_HYPER:
768cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_HYPER:
769cdf0e10cSrcweir 		*(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
770cdf0e10cSrcweir 		break;
771cdf0e10cSrcweir 	case typelib_TypeClass_FLOAT:
772cdf0e10cSrcweir 		*(float *)pDest = *(float *)pSource;
773cdf0e10cSrcweir 		break;
774cdf0e10cSrcweir 	case typelib_TypeClass_DOUBLE:
775cdf0e10cSrcweir 		*(double *)pDest = *(double *)pSource;
776cdf0e10cSrcweir 		break;
777cdf0e10cSrcweir 	case typelib_TypeClass_STRING:
778cdf0e10cSrcweir 		::rtl_uString_acquire( *(rtl_uString **)pSource );
779cdf0e10cSrcweir 		*(rtl_uString **)pDest = *(rtl_uString **)pSource;
780cdf0e10cSrcweir 		break;
781cdf0e10cSrcweir 	case typelib_TypeClass_TYPE:
782cdf0e10cSrcweir 		TYPE_ACQUIRE( *(typelib_TypeDescriptionReference **)pSource );
783cdf0e10cSrcweir 		*(typelib_TypeDescriptionReference **)pDest = *(typelib_TypeDescriptionReference **)pSource;
784cdf0e10cSrcweir 		break;
785cdf0e10cSrcweir 	case typelib_TypeClass_ANY:
786cdf0e10cSrcweir 		_copyConstructAny(
787cdf0e10cSrcweir 			(uno_Any *)pDest, ((uno_Any *)pSource)->pData,
788cdf0e10cSrcweir 			((uno_Any *)pSource)->pType, 0,
789cdf0e10cSrcweir 			acquire, mapping );
790cdf0e10cSrcweir 		break;
791cdf0e10cSrcweir 	case typelib_TypeClass_ENUM:
792cdf0e10cSrcweir 		*(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
793cdf0e10cSrcweir 		break;
794cdf0e10cSrcweir 	case typelib_TypeClass_STRUCT:
795cdf0e10cSrcweir 	case typelib_TypeClass_EXCEPTION:
796cdf0e10cSrcweir 		if (pTypeDescr)
797cdf0e10cSrcweir 		{
798cdf0e10cSrcweir 			_copyConstructStruct(
799cdf0e10cSrcweir 				pDest, pSource,
800cdf0e10cSrcweir 				(typelib_CompoundTypeDescription *)pTypeDescr,
801cdf0e10cSrcweir 				acquire, mapping );
802cdf0e10cSrcweir 		}
803cdf0e10cSrcweir 		else
804cdf0e10cSrcweir 		{
805cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
806cdf0e10cSrcweir 			_copyConstructStruct(
807cdf0e10cSrcweir 				pDest, pSource,
808cdf0e10cSrcweir 				(typelib_CompoundTypeDescription *)pTypeDescr,
809cdf0e10cSrcweir 				acquire, mapping );
810cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
811cdf0e10cSrcweir 		}
812cdf0e10cSrcweir 		break;
813cdf0e10cSrcweir 	case typelib_TypeClass_ARRAY:
814cdf0e10cSrcweir 		if (pTypeDescr)
815cdf0e10cSrcweir 		{
816cdf0e10cSrcweir 			_copyConstructArray(
817cdf0e10cSrcweir 				pDest, pSource,
818cdf0e10cSrcweir 				(typelib_ArrayTypeDescription *)pTypeDescr,
819cdf0e10cSrcweir 				acquire, mapping );
820cdf0e10cSrcweir 		}
821cdf0e10cSrcweir 		else
822cdf0e10cSrcweir 		{
823cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
824cdf0e10cSrcweir 			_copyConstructArray(
825cdf0e10cSrcweir 				pDest, pSource,
826cdf0e10cSrcweir 				(typelib_ArrayTypeDescription *)pTypeDescr,
827cdf0e10cSrcweir 				acquire, mapping );
828cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
829cdf0e10cSrcweir 		}
830cdf0e10cSrcweir 		break;
831cdf0e10cSrcweir 	case typelib_TypeClass_UNION:
832cdf0e10cSrcweir 		if (pTypeDescr)
833cdf0e10cSrcweir 		{
834cdf0e10cSrcweir 			_copyConstructUnion( pDest, pSource, pTypeDescr, acquire, mapping );
835cdf0e10cSrcweir 		}
836cdf0e10cSrcweir 		else
837cdf0e10cSrcweir 		{
838cdf0e10cSrcweir 			TYPELIB_DANGER_GET( &pTypeDescr, pType );
839cdf0e10cSrcweir 			_copyConstructUnion( pDest, pSource, pTypeDescr, acquire, mapping );
840cdf0e10cSrcweir 			TYPELIB_DANGER_RELEASE( pTypeDescr );
841cdf0e10cSrcweir 		}
842cdf0e10cSrcweir 		break;
843cdf0e10cSrcweir 	case typelib_TypeClass_SEQUENCE:
844cdf0e10cSrcweir 		if (mapping)
845cdf0e10cSrcweir 		{
846cdf0e10cSrcweir 			if (pTypeDescr)
847cdf0e10cSrcweir 			{
848cdf0e10cSrcweir 				*(uno_Sequence **)pDest = icopyConstructSequence(
849cdf0e10cSrcweir 					*(uno_Sequence **)pSource,
850cdf0e10cSrcweir 					((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
851cdf0e10cSrcweir 					acquire, mapping );
852cdf0e10cSrcweir 			}
853cdf0e10cSrcweir 			else
854cdf0e10cSrcweir 			{
855cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pTypeDescr, pType );
856cdf0e10cSrcweir 				*(uno_Sequence **)pDest = icopyConstructSequence(
857cdf0e10cSrcweir 					*(uno_Sequence **)pSource,
858cdf0e10cSrcweir 					((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
859cdf0e10cSrcweir 					acquire, mapping );
860cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pTypeDescr );
861cdf0e10cSrcweir 			}
862cdf0e10cSrcweir 		}
863cdf0e10cSrcweir 		else
864cdf0e10cSrcweir 		{
865cdf0e10cSrcweir 			::osl_incrementInterlockedCount( &(*(uno_Sequence **)pSource)->nRefCount );
866cdf0e10cSrcweir 			*(uno_Sequence **)pDest = *(uno_Sequence **)pSource;
867cdf0e10cSrcweir 		}
868cdf0e10cSrcweir 		break;
869cdf0e10cSrcweir 	case typelib_TypeClass_INTERFACE:
870cdf0e10cSrcweir 		if (mapping)
871cdf0e10cSrcweir 			*(void **)pDest = _map( *(void **)pSource, pType, pTypeDescr, mapping );
872cdf0e10cSrcweir 		else
873cdf0e10cSrcweir 			_acquire( *(void **)pDest = *(void **)pSource, acquire );
874cdf0e10cSrcweir 		break;
875cdf0e10cSrcweir     default:
876cdf0e10cSrcweir         break;
877cdf0e10cSrcweir 	}
878cdf0e10cSrcweir }
879cdf0e10cSrcweir 
880cdf0e10cSrcweir }
881cdf0e10cSrcweir 
882cdf0e10cSrcweir #endif
883