xref: /aoo41x/main/cppu/source/uno/assign.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 ASSIGN_HXX
24cdf0e10cSrcweir #define ASSIGN_HXX
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "prim.hxx"
27cdf0e10cSrcweir #include "destr.hxx"
28cdf0e10cSrcweir #include "constr.hxx"
29cdf0e10cSrcweir #include "copy.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir namespace cppu
33cdf0e10cSrcweir {
34cdf0e10cSrcweir 
35cdf0e10cSrcweir //##################################################################################################
36cdf0e10cSrcweir //#### assignment ##################################################################################
37cdf0e10cSrcweir //##################################################################################################
38cdf0e10cSrcweir 
39cdf0e10cSrcweir 
40cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_assignInterface(void ** ppDest,void * pSource,uno_AcquireFunc acquire,uno_ReleaseFunc release)41cdf0e10cSrcweir inline void _assignInterface(
42cdf0e10cSrcweir 	void ** ppDest, void * pSource,
43cdf0e10cSrcweir 	uno_AcquireFunc acquire, uno_ReleaseFunc release )
44cdf0e10cSrcweir 	SAL_THROW( () )
45cdf0e10cSrcweir {
46cdf0e10cSrcweir     _acquire( pSource, acquire );
47cdf0e10cSrcweir     void * const pToBeReleased = *ppDest;
48cdf0e10cSrcweir 	*ppDest = pSource;
49cdf0e10cSrcweir     _release( pToBeReleased, release );
50cdf0e10cSrcweir }
51cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_queryInterface(void * pSource,typelib_TypeDescriptionReference * pDestType,uno_QueryInterfaceFunc queryInterface)52cdf0e10cSrcweir inline void * _queryInterface(
53cdf0e10cSrcweir 	void * pSource,
54cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pDestType,
55cdf0e10cSrcweir 	uno_QueryInterfaceFunc queryInterface )
56cdf0e10cSrcweir 	SAL_THROW( () )
57cdf0e10cSrcweir {
58cdf0e10cSrcweir 	if (pSource)
59cdf0e10cSrcweir 	{
60cdf0e10cSrcweir 		if (0 == queryInterface)
61cdf0e10cSrcweir             queryInterface = binuno_queryInterface;
62cdf0e10cSrcweir         pSource = (*queryInterface)( pSource, pDestType );
63cdf0e10cSrcweir 	}
64cdf0e10cSrcweir     return pSource;
65cdf0e10cSrcweir }
66cdf0e10cSrcweir //==================================================================================================
67cdf0e10cSrcweir sal_Bool assignStruct(
68cdf0e10cSrcweir 	void * pDest, void * pSource,
69cdf0e10cSrcweir 	typelib_CompoundTypeDescription * pTypeDescr,
70cdf0e10cSrcweir 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
71cdf0e10cSrcweir 	SAL_THROW( () );
72cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_assignStruct(void * pDest,void * pSource,typelib_CompoundTypeDescription * pTypeDescr,uno_QueryInterfaceFunc queryInterface,uno_AcquireFunc acquire,uno_ReleaseFunc release)73cdf0e10cSrcweir inline sal_Bool _assignStruct(
74cdf0e10cSrcweir 	void * pDest, void * pSource,
75cdf0e10cSrcweir 	typelib_CompoundTypeDescription * pTypeDescr,
76cdf0e10cSrcweir 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
77cdf0e10cSrcweir 	SAL_THROW( () )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir 	if (pTypeDescr->pBaseTypeDescription)
80cdf0e10cSrcweir 	{
81cdf0e10cSrcweir 		// copy base value
82cdf0e10cSrcweir 		if (! assignStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription,
83cdf0e10cSrcweir 							queryInterface, acquire, release ))
84cdf0e10cSrcweir 		{
85cdf0e10cSrcweir 			return sal_False;
86cdf0e10cSrcweir 		}
87cdf0e10cSrcweir 	}
88cdf0e10cSrcweir 	// then copy members
89cdf0e10cSrcweir 	typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
90cdf0e10cSrcweir 	sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
91cdf0e10cSrcweir 	sal_Int32 nDescr = pTypeDescr->nMembers;
92cdf0e10cSrcweir 	while (nDescr--)
93cdf0e10cSrcweir 	{
94cdf0e10cSrcweir 		if (! ::uno_type_assignData( (char *)pDest + pMemberOffsets[nDescr],
95cdf0e10cSrcweir 									 ppTypeRefs[nDescr],
96cdf0e10cSrcweir 									 (char *)pSource + pMemberOffsets[nDescr],
97cdf0e10cSrcweir 									 ppTypeRefs[nDescr],
98cdf0e10cSrcweir 									 queryInterface, acquire, release ))
99cdf0e10cSrcweir 		{
100cdf0e10cSrcweir 			return sal_False;
101cdf0e10cSrcweir 		}
102cdf0e10cSrcweir 	}
103cdf0e10cSrcweir 	return sal_True;
104cdf0e10cSrcweir }
105cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_assignArray(void * pDest,void * pSource,typelib_ArrayTypeDescription * pTypeDescr,uno_QueryInterfaceFunc queryInterface,uno_AcquireFunc acquire,uno_ReleaseFunc release)106cdf0e10cSrcweir inline sal_Bool _assignArray(
107cdf0e10cSrcweir 	void * pDest, void * pSource,
108cdf0e10cSrcweir 	typelib_ArrayTypeDescription * pTypeDescr,
109cdf0e10cSrcweir 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pElementTypeRef =
112cdf0e10cSrcweir         ((typelib_IndirectTypeDescription *)pTypeDescr)->pType;
113cdf0e10cSrcweir 	typelib_TypeDescription * pElementTypeDescr = NULL;
114cdf0e10cSrcweir 	TYPELIB_DANGER_GET( &pElementTypeDescr, pElementTypeRef );
115cdf0e10cSrcweir 	sal_Int32 nTotalElements = pTypeDescr->nTotalElements;
116cdf0e10cSrcweir 	sal_Int32 nElementSize = pElementTypeDescr->nSize;
117cdf0e10cSrcweir 	sal_Int32 i;
118cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 	switch ( pElementTypeRef->eTypeClass )
121cdf0e10cSrcweir 	{
122cdf0e10cSrcweir 	case typelib_TypeClass_CHAR:
123cdf0e10cSrcweir 	case typelib_TypeClass_BOOLEAN:
124cdf0e10cSrcweir 	case typelib_TypeClass_BYTE:
125cdf0e10cSrcweir 	case typelib_TypeClass_SHORT:
126cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_SHORT:
127cdf0e10cSrcweir 	case typelib_TypeClass_LONG:
128cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_LONG:
129cdf0e10cSrcweir 	case typelib_TypeClass_HYPER:
130cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_HYPER:
131cdf0e10cSrcweir 	case typelib_TypeClass_FLOAT:
132cdf0e10cSrcweir 	case typelib_TypeClass_DOUBLE:
133cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
134cdf0e10cSrcweir 		{
135cdf0e10cSrcweir 			::rtl_copyMemory((sal_Char *)pDest + i * nElementSize,
136cdf0e10cSrcweir 							 (sal_Char *)pSource + i * nElementSize,
137cdf0e10cSrcweir 							 nElementSize);
138cdf0e10cSrcweir 		}
139cdf0e10cSrcweir 		bRet = sal_True;
140cdf0e10cSrcweir 		break;
141cdf0e10cSrcweir 	case typelib_TypeClass_STRING:
142cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
143cdf0e10cSrcweir 		{
144cdf0e10cSrcweir 			::rtl_uString_assign( (rtl_uString **)pDest + i,
145cdf0e10cSrcweir 								  ((rtl_uString **)pSource)[i] );
146cdf0e10cSrcweir 		}
147cdf0e10cSrcweir 		bRet = sal_True;
148cdf0e10cSrcweir 		break;
149cdf0e10cSrcweir 	case typelib_TypeClass_TYPE:
150cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
151cdf0e10cSrcweir 		{
152cdf0e10cSrcweir             typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest + i;
153cdf0e10cSrcweir 			::typelib_typedescriptionreference_release( *pp );
154cdf0e10cSrcweir             *pp = *((typelib_TypeDescriptionReference **)pSource + i);
155cdf0e10cSrcweir 			TYPE_ACQUIRE( *pp );
156cdf0e10cSrcweir 		}
157cdf0e10cSrcweir 		bRet = sal_True;
158cdf0e10cSrcweir 		break;
159cdf0e10cSrcweir 	case typelib_TypeClass_ANY:
160cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
161cdf0e10cSrcweir 		{
162cdf0e10cSrcweir 			_destructAny( (uno_Any *)pDest + i, release );
163cdf0e10cSrcweir 			_copyConstructAny( (uno_Any *)pDest + i, (uno_Any *)pSource + i,
164cdf0e10cSrcweir                                pElementTypeRef, pElementTypeDescr, acquire, 0 );
165cdf0e10cSrcweir 		}
166cdf0e10cSrcweir 		bRet = sal_True;
167cdf0e10cSrcweir 		break;
168cdf0e10cSrcweir 	case typelib_TypeClass_ENUM:
169cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
170cdf0e10cSrcweir 		{
171cdf0e10cSrcweir 			*((sal_Int32 *)pDest + i) = *((sal_Int32 *)pSource + i);
172cdf0e10cSrcweir 		}
173cdf0e10cSrcweir 		bRet = sal_True;
174cdf0e10cSrcweir 		break;
175cdf0e10cSrcweir 	case typelib_TypeClass_STRUCT:
176cdf0e10cSrcweir 	case typelib_TypeClass_EXCEPTION:
177cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
178cdf0e10cSrcweir 		{
179cdf0e10cSrcweir 			bRet = _assignStruct( (sal_Char *)pDest + i * nElementSize,
180cdf0e10cSrcweir                                   (sal_Char *)pSource + i * nElementSize,
181cdf0e10cSrcweir                                   (typelib_CompoundTypeDescription *)pElementTypeDescr,
182cdf0e10cSrcweir                                   queryInterface, acquire, release );
183cdf0e10cSrcweir 			if (! bRet)
184cdf0e10cSrcweir 				break;
185cdf0e10cSrcweir 		}
186cdf0e10cSrcweir 		bRet = sal_True;
187cdf0e10cSrcweir 		break;
188cdf0e10cSrcweir 	case typelib_TypeClass_UNION:
189cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
190cdf0e10cSrcweir 		{
191cdf0e10cSrcweir 			_destructUnion( (sal_Char*)pDest + i * nElementSize, pElementTypeDescr, release );
192cdf0e10cSrcweir 			_copyConstructUnion( (sal_Char*)pDest + i * nElementSize,
193cdf0e10cSrcweir                                  (sal_Char*)pSource + i * nElementSize,
194cdf0e10cSrcweir                                  pElementTypeDescr, acquire, 0 );
195cdf0e10cSrcweir 		}
196cdf0e10cSrcweir 		bRet = sal_True;
197cdf0e10cSrcweir 		break;
198cdf0e10cSrcweir 	case typelib_TypeClass_SEQUENCE:
199cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
200cdf0e10cSrcweir 		{
201cdf0e10cSrcweir 			::osl_incrementInterlockedCount(
202cdf0e10cSrcweir                 &(*((uno_Sequence **)pSource + i))->nRefCount );
203cdf0e10cSrcweir 			idestructSequence(
204cdf0e10cSrcweir                 *((uno_Sequence **)pDest + i),
205cdf0e10cSrcweir                 pElementTypeRef, pElementTypeDescr, release );
206cdf0e10cSrcweir 			*((uno_Sequence **)pDest + i) = *((uno_Sequence **)pSource + i);
207cdf0e10cSrcweir 		}
208cdf0e10cSrcweir 		bRet = sal_True;
209cdf0e10cSrcweir 		break;
210cdf0e10cSrcweir 	case typelib_TypeClass_INTERFACE:
211cdf0e10cSrcweir 		for (i=0; i < nTotalElements; i++)
212cdf0e10cSrcweir 		{
213cdf0e10cSrcweir 			_assignInterface(
214cdf0e10cSrcweir                 (void **)((sal_Char*)pDest + i * nElementSize),
215cdf0e10cSrcweir                 *(void **)((sal_Char*)pSource + i * nElementSize),
216cdf0e10cSrcweir                 acquire, release );
217cdf0e10cSrcweir 		}
218cdf0e10cSrcweir 		bRet = sal_True;
219cdf0e10cSrcweir 		break;
220cdf0e10cSrcweir     default:
221cdf0e10cSrcweir         OSL_ASSERT(false);
222cdf0e10cSrcweir         break;
223cdf0e10cSrcweir 	}
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 	TYPELIB_DANGER_RELEASE( pElementTypeDescr );
226cdf0e10cSrcweir 	return bRet;
227cdf0e10cSrcweir }
228cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
_assignData(void * pDest,typelib_TypeDescriptionReference * pDestType,typelib_TypeDescription * pDestTypeDescr,void * pSource,typelib_TypeDescriptionReference * pSourceType,typelib_TypeDescription * pSourceTypeDescr,uno_QueryInterfaceFunc queryInterface,uno_AcquireFunc acquire,uno_ReleaseFunc release)229cdf0e10cSrcweir inline sal_Bool _assignData(
230cdf0e10cSrcweir 	void * pDest,
231cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
232cdf0e10cSrcweir 	void * pSource,
233cdf0e10cSrcweir 	typelib_TypeDescriptionReference * pSourceType, typelib_TypeDescription * pSourceTypeDescr,
234cdf0e10cSrcweir 	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
235cdf0e10cSrcweir 	SAL_THROW( () )
236cdf0e10cSrcweir {
237cdf0e10cSrcweir 	if (pDest == pSource)
238cdf0e10cSrcweir 		return _type_equals( pDestType, pSourceType );
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 	if (! pSource)
241cdf0e10cSrcweir 	{
242cdf0e10cSrcweir 		_destructData( pDest, pDestType, pDestTypeDescr, release );
243cdf0e10cSrcweir 		_defaultConstructData( pDest, pDestType, pDestTypeDescr );
244cdf0e10cSrcweir 		return sal_True;
245cdf0e10cSrcweir 	}
246cdf0e10cSrcweir 	while (typelib_TypeClass_ANY == pSourceType->eTypeClass)
247cdf0e10cSrcweir 	{
248cdf0e10cSrcweir 		pSourceTypeDescr = 0;
249cdf0e10cSrcweir 		pSourceType = ((uno_Any *)pSource)->pType;
250cdf0e10cSrcweir 		pSource = ((uno_Any *)pSource)->pData;
251cdf0e10cSrcweir 		if (pDest == pSource)
252cdf0e10cSrcweir 			return sal_True;
253cdf0e10cSrcweir 	}
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 	switch (pDestType->eTypeClass)
256cdf0e10cSrcweir 	{
257cdf0e10cSrcweir 	case typelib_TypeClass_VOID:
258cdf0e10cSrcweir 		return pSourceType->eTypeClass == typelib_TypeClass_VOID;
259cdf0e10cSrcweir 	case typelib_TypeClass_CHAR:
260cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
261cdf0e10cSrcweir 		{
262cdf0e10cSrcweir 		case typelib_TypeClass_CHAR:
263cdf0e10cSrcweir 			*(sal_Unicode *)pDest = *(sal_Unicode *)pSource;
264cdf0e10cSrcweir 			return sal_True;
265cdf0e10cSrcweir         default:
266cdf0e10cSrcweir             return sal_False;
267cdf0e10cSrcweir 		}
268cdf0e10cSrcweir 	case typelib_TypeClass_BOOLEAN:
269cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
270cdf0e10cSrcweir 		{
271cdf0e10cSrcweir 		case typelib_TypeClass_BOOLEAN:
272cdf0e10cSrcweir 			*(sal_Bool *)pDest = (*(sal_Bool *)pSource != sal_False);
273cdf0e10cSrcweir 			return sal_True;
274cdf0e10cSrcweir         default:
275cdf0e10cSrcweir             return sal_False;
276cdf0e10cSrcweir 		}
277cdf0e10cSrcweir 	case typelib_TypeClass_BYTE:
278cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
279cdf0e10cSrcweir 		{
280cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
281cdf0e10cSrcweir 			*(sal_Int8 *)pDest = *(sal_Int8 *)pSource;
282cdf0e10cSrcweir 			return sal_True;
283cdf0e10cSrcweir         default:
284cdf0e10cSrcweir             return sal_False;
285cdf0e10cSrcweir 		}
286cdf0e10cSrcweir 	case typelib_TypeClass_SHORT:
287cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
288cdf0e10cSrcweir 		{
289cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
290cdf0e10cSrcweir 			*(sal_Int16 *)pDest = *(sal_Int8 *)pSource;
291cdf0e10cSrcweir 			return sal_True;
292cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
293cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
294cdf0e10cSrcweir 			*(sal_Int16 *)pDest = *(sal_Int16 *)pSource;
295cdf0e10cSrcweir 			return sal_True;
296cdf0e10cSrcweir         default:
297cdf0e10cSrcweir             return sal_False;
298cdf0e10cSrcweir 		}
299cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_SHORT:
300cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
301cdf0e10cSrcweir 		{
302cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
303cdf0e10cSrcweir 			*(sal_uInt16 *)pDest = *(sal_Int8 *)pSource;
304cdf0e10cSrcweir 			return sal_True;
305cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
306cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
307cdf0e10cSrcweir 			*(sal_uInt16 *)pDest = *(sal_uInt16 *)pSource;
308cdf0e10cSrcweir 			return sal_True;
309cdf0e10cSrcweir         default:
310cdf0e10cSrcweir             return sal_False;
311cdf0e10cSrcweir 		}
312cdf0e10cSrcweir 	case typelib_TypeClass_LONG:
313cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
314cdf0e10cSrcweir 		{
315cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
316cdf0e10cSrcweir 			*(sal_Int32 *)pDest = *(sal_Int8 *)pSource;
317cdf0e10cSrcweir 			return sal_True;
318cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
319cdf0e10cSrcweir 			*(sal_Int32 *)pDest = *(sal_Int16 *)pSource;
320cdf0e10cSrcweir 			return sal_True;
321cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
322cdf0e10cSrcweir 			*(sal_Int32 *)pDest = *(sal_uInt16 *)pSource;
323cdf0e10cSrcweir 			return sal_True;
324cdf0e10cSrcweir 		case typelib_TypeClass_LONG:
325cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_LONG:
326cdf0e10cSrcweir 			*(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
327cdf0e10cSrcweir 			return sal_True;
328cdf0e10cSrcweir         default:
329cdf0e10cSrcweir             return sal_False;
330cdf0e10cSrcweir 		}
331cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_LONG:
332cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
333cdf0e10cSrcweir 		{
334cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
335cdf0e10cSrcweir 			*(sal_uInt32 *)pDest = *(sal_Int8 *)pSource;
336cdf0e10cSrcweir 			return sal_True;
337cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
338cdf0e10cSrcweir 			*(sal_uInt32 *)pDest = *(sal_Int16 *)pSource;
339cdf0e10cSrcweir 			return sal_True;
340cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
341cdf0e10cSrcweir 			*(sal_uInt32 *)pDest = *(sal_uInt16 *)pSource;
342cdf0e10cSrcweir 			return sal_True;
343cdf0e10cSrcweir 		case typelib_TypeClass_LONG:
344cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_LONG:
345cdf0e10cSrcweir 			*(sal_uInt32 *)pDest = *(sal_uInt32 *)pSource;
346cdf0e10cSrcweir 			return sal_True;
347cdf0e10cSrcweir         default:
348cdf0e10cSrcweir             return sal_False;
349cdf0e10cSrcweir 		}
350cdf0e10cSrcweir 	case typelib_TypeClass_HYPER:
351cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
352cdf0e10cSrcweir 		{
353cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
354cdf0e10cSrcweir 			*(sal_Int64 *)pDest = *(sal_Int8 *)pSource;
355cdf0e10cSrcweir 			return sal_True;
356cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
357cdf0e10cSrcweir 			*(sal_Int64 *)pDest = *(sal_Int16 *)pSource;
358cdf0e10cSrcweir 			return sal_True;
359cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
360cdf0e10cSrcweir 			*(sal_Int64 *)pDest = *(sal_uInt16 *)pSource;
361cdf0e10cSrcweir 			return sal_True;
362cdf0e10cSrcweir 		case typelib_TypeClass_LONG:
363cdf0e10cSrcweir 			*(sal_Int64 *)pDest = *(sal_Int32 *)pSource;
364cdf0e10cSrcweir 			return sal_True;
365cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_LONG:
366cdf0e10cSrcweir 			*(sal_Int64 *)pDest = *(sal_uInt32 *)pSource;
367cdf0e10cSrcweir 			return sal_True;
368cdf0e10cSrcweir 		case typelib_TypeClass_HYPER:
369cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_HYPER:
370cdf0e10cSrcweir 			*(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
371cdf0e10cSrcweir 			return sal_True;
372cdf0e10cSrcweir         default:
373cdf0e10cSrcweir             return sal_False;
374cdf0e10cSrcweir 		}
375cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_HYPER:
376cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
377cdf0e10cSrcweir 		{
378cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
379cdf0e10cSrcweir 			*(sal_uInt64 *)pDest = *(sal_Int8 *)pSource;
380cdf0e10cSrcweir 			return sal_True;
381cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
382cdf0e10cSrcweir 			*(sal_uInt64 *)pDest = *(sal_Int16 *)pSource;
383cdf0e10cSrcweir 			return sal_True;
384cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
385cdf0e10cSrcweir 			*(sal_uInt64 *)pDest = *(sal_uInt16 *)pSource;
386cdf0e10cSrcweir 			return sal_True;
387cdf0e10cSrcweir 		case typelib_TypeClass_LONG:
388cdf0e10cSrcweir 			*(sal_uInt64 *)pDest = *(sal_Int32 *)pSource;
389cdf0e10cSrcweir 			return sal_True;
390cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_LONG:
391cdf0e10cSrcweir 			*(sal_uInt64 *)pDest = *(sal_uInt32 *)pSource;
392cdf0e10cSrcweir 			return sal_True;
393cdf0e10cSrcweir 		case typelib_TypeClass_HYPER:
394cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_HYPER:
395cdf0e10cSrcweir 			*(sal_uInt64 *)pDest = *(sal_uInt64 *)pSource;
396cdf0e10cSrcweir 			return sal_True;
397cdf0e10cSrcweir         default:
398cdf0e10cSrcweir             return sal_False;
399cdf0e10cSrcweir 		}
400cdf0e10cSrcweir 	case typelib_TypeClass_FLOAT:
401cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
402cdf0e10cSrcweir 		{
403cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
404cdf0e10cSrcweir 			*(float *)pDest = *(sal_Int8 *)pSource;
405cdf0e10cSrcweir 			return sal_True;
406cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
407cdf0e10cSrcweir 			*(float *)pDest = *(sal_Int16 *)pSource;
408cdf0e10cSrcweir 			return sal_True;
409cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
410cdf0e10cSrcweir 			*(float *)pDest = *(sal_uInt16 *)pSource;
411cdf0e10cSrcweir 			return sal_True;
412cdf0e10cSrcweir 		case typelib_TypeClass_FLOAT:
413cdf0e10cSrcweir 			*(float *)pDest = *(float *)pSource;
414cdf0e10cSrcweir 			return sal_True;
415cdf0e10cSrcweir         default:
416cdf0e10cSrcweir             return sal_False;
417cdf0e10cSrcweir 		}
418cdf0e10cSrcweir 	case typelib_TypeClass_DOUBLE:
419cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
420cdf0e10cSrcweir 		{
421cdf0e10cSrcweir 		case typelib_TypeClass_BYTE:
422cdf0e10cSrcweir 			*(double *)pDest = *(sal_Int8 *)pSource;
423cdf0e10cSrcweir 			return sal_True;
424cdf0e10cSrcweir 		case typelib_TypeClass_SHORT:
425cdf0e10cSrcweir 			*(double *)pDest = *(sal_Int16 *)pSource;
426cdf0e10cSrcweir 			return sal_True;
427cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_SHORT:
428cdf0e10cSrcweir 			*(double *)pDest = *(sal_uInt16 *)pSource;
429cdf0e10cSrcweir 			return sal_True;
430cdf0e10cSrcweir 		case typelib_TypeClass_LONG:
431cdf0e10cSrcweir 			*(double *)pDest = *(sal_Int32 *)pSource;
432cdf0e10cSrcweir 			return sal_True;
433cdf0e10cSrcweir 		case typelib_TypeClass_UNSIGNED_LONG:
434cdf0e10cSrcweir 			*(double *)pDest = *(sal_uInt32 *)pSource;
435cdf0e10cSrcweir 			return sal_True;
436cdf0e10cSrcweir 		case typelib_TypeClass_FLOAT:
437cdf0e10cSrcweir 			*(double *)pDest = *(float *)pSource;
438cdf0e10cSrcweir 			return sal_True;
439cdf0e10cSrcweir 		case typelib_TypeClass_DOUBLE:
440cdf0e10cSrcweir 			*(double *)pDest = *(double *)pSource;
441cdf0e10cSrcweir 			return sal_True;
442cdf0e10cSrcweir         default:
443cdf0e10cSrcweir             return sal_False;
444cdf0e10cSrcweir 		}
445cdf0e10cSrcweir 	case typelib_TypeClass_STRING:
446cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
447cdf0e10cSrcweir 		{
448cdf0e10cSrcweir 		case typelib_TypeClass_STRING:
449cdf0e10cSrcweir 			::rtl_uString_assign( (rtl_uString **)pDest, *(rtl_uString **)pSource );
450cdf0e10cSrcweir 			return sal_True;
451cdf0e10cSrcweir         default:
452cdf0e10cSrcweir             return sal_False;
453cdf0e10cSrcweir 		}
454cdf0e10cSrcweir 	case typelib_TypeClass_TYPE:
455cdf0e10cSrcweir 		switch (pSourceType->eTypeClass)
456cdf0e10cSrcweir 		{
457cdf0e10cSrcweir 		case typelib_TypeClass_TYPE:
458cdf0e10cSrcweir         {
459cdf0e10cSrcweir             typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest;
460cdf0e10cSrcweir 			::typelib_typedescriptionreference_release( *pp );
461cdf0e10cSrcweir             *pp = *(typelib_TypeDescriptionReference **)pSource;
462cdf0e10cSrcweir             TYPE_ACQUIRE( *pp );
463cdf0e10cSrcweir 			return sal_True;
464cdf0e10cSrcweir         }
465cdf0e10cSrcweir         default:
466cdf0e10cSrcweir             return sal_False;
467cdf0e10cSrcweir 		}
468cdf0e10cSrcweir 	case typelib_TypeClass_ANY:
469cdf0e10cSrcweir 		_destructAny( (uno_Any *)pDest, release );
470cdf0e10cSrcweir 		_copyConstructAny( (uno_Any *)pDest, pSource, pSourceType, pSourceTypeDescr, acquire, 0 );
471cdf0e10cSrcweir 		return sal_True;
472cdf0e10cSrcweir 	case typelib_TypeClass_ENUM:
473cdf0e10cSrcweir 		if (_type_equals( pDestType, pSourceType ))
474cdf0e10cSrcweir 		{
475cdf0e10cSrcweir 			*(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
476cdf0e10cSrcweir 			return sal_True;
477cdf0e10cSrcweir 		}
478cdf0e10cSrcweir 		return sal_False;
479cdf0e10cSrcweir 	case typelib_TypeClass_STRUCT:
480cdf0e10cSrcweir 	case typelib_TypeClass_EXCEPTION:
481cdf0e10cSrcweir 		if (typelib_TypeClass_STRUCT == pSourceType->eTypeClass ||
482cdf0e10cSrcweir 			typelib_TypeClass_EXCEPTION == pSourceType->eTypeClass)
483cdf0e10cSrcweir 		{
484cdf0e10cSrcweir 			sal_Bool bRet = sal_False;
485cdf0e10cSrcweir 			if (pSourceTypeDescr)
486cdf0e10cSrcweir 			{
487cdf0e10cSrcweir 				typelib_CompoundTypeDescription * pTypeDescr =
488cdf0e10cSrcweir 					(typelib_CompoundTypeDescription *)pSourceTypeDescr;
489cdf0e10cSrcweir 				while (pTypeDescr &&
490cdf0e10cSrcweir                        !_type_equals(
491cdf0e10cSrcweir                            ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
492cdf0e10cSrcweir                 {
493cdf0e10cSrcweir 					pTypeDescr = pTypeDescr->pBaseTypeDescription;
494cdf0e10cSrcweir                 }
495cdf0e10cSrcweir 				if (pTypeDescr)
496cdf0e10cSrcweir                 {
497cdf0e10cSrcweir 					bRet = _assignStruct(
498cdf0e10cSrcweir                         pDest, pSource, pTypeDescr, queryInterface, acquire, release );
499cdf0e10cSrcweir                 }
500cdf0e10cSrcweir 			}
501cdf0e10cSrcweir 			else
502cdf0e10cSrcweir 			{
503cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
504cdf0e10cSrcweir 				typelib_CompoundTypeDescription * pTypeDescr =
505cdf0e10cSrcweir 					(typelib_CompoundTypeDescription *)pSourceTypeDescr;
506cdf0e10cSrcweir 				while (pTypeDescr &&
507cdf0e10cSrcweir                        !_type_equals(
508cdf0e10cSrcweir                            ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
509cdf0e10cSrcweir                 {
510cdf0e10cSrcweir 					pTypeDescr = pTypeDescr->pBaseTypeDescription;
511cdf0e10cSrcweir                 }
512cdf0e10cSrcweir 				if (pTypeDescr)
513cdf0e10cSrcweir                 {
514cdf0e10cSrcweir 					bRet = _assignStruct(
515cdf0e10cSrcweir                         pDest, pSource, pTypeDescr, queryInterface, acquire, release );
516cdf0e10cSrcweir                 }
517cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
518cdf0e10cSrcweir 			}
519cdf0e10cSrcweir 			return bRet;
520cdf0e10cSrcweir 		}
521cdf0e10cSrcweir 		return sal_False;
522cdf0e10cSrcweir 	case typelib_TypeClass_ARRAY:
523cdf0e10cSrcweir 		{
524cdf0e10cSrcweir 			sal_Bool bRet = sal_False;
525cdf0e10cSrcweir 			if (pSourceTypeDescr)
526cdf0e10cSrcweir 			{
527cdf0e10cSrcweir 				typelib_ArrayTypeDescription * pTypeDescr =
528cdf0e10cSrcweir                     (typelib_ArrayTypeDescription *)pSourceTypeDescr;
529cdf0e10cSrcweir 				bRet = _assignArray( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
530cdf0e10cSrcweir 			}
531cdf0e10cSrcweir 			else
532cdf0e10cSrcweir 			{
533cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
534cdf0e10cSrcweir 				typelib_ArrayTypeDescription * pTypeDescr =
535cdf0e10cSrcweir 					(typelib_ArrayTypeDescription *)pSourceTypeDescr;
536cdf0e10cSrcweir 				if ( pTypeDescr )
537cdf0e10cSrcweir                 {
538cdf0e10cSrcweir 					bRet = _assignArray(
539cdf0e10cSrcweir                         pDest, pSource, pTypeDescr, queryInterface, acquire, release );
540cdf0e10cSrcweir                 }
541cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
542cdf0e10cSrcweir 			}
543cdf0e10cSrcweir 			return bRet;
544cdf0e10cSrcweir 		}
545cdf0e10cSrcweir 	case typelib_TypeClass_UNION:
546cdf0e10cSrcweir 		if (_type_equals( pDestType, pSourceType ))
547cdf0e10cSrcweir 		{
548cdf0e10cSrcweir 			if (pDestTypeDescr)
549cdf0e10cSrcweir 			{
550cdf0e10cSrcweir 				_destructUnion( pDest, pDestTypeDescr, release );
551cdf0e10cSrcweir 				_copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
552cdf0e10cSrcweir 			}
553cdf0e10cSrcweir 			else
554cdf0e10cSrcweir 			{
555cdf0e10cSrcweir 				TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
556cdf0e10cSrcweir 				_destructUnion( pDest, pDestTypeDescr, release );
557cdf0e10cSrcweir 				_copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
558cdf0e10cSrcweir 				TYPELIB_DANGER_RELEASE( pDestTypeDescr );
559cdf0e10cSrcweir 			}
560cdf0e10cSrcweir 			return sal_True;
561cdf0e10cSrcweir 		}
562cdf0e10cSrcweir 		return sal_False;
563cdf0e10cSrcweir 	case typelib_TypeClass_SEQUENCE:
564cdf0e10cSrcweir 		if (typelib_TypeClass_SEQUENCE != pSourceType->eTypeClass)
565cdf0e10cSrcweir 			return sal_False;
566cdf0e10cSrcweir         // self assignment:
567cdf0e10cSrcweir 		if (*(uno_Sequence **)pSource == *(uno_Sequence **)pDest)
568cdf0e10cSrcweir 			return sal_True;
569cdf0e10cSrcweir 		if (_type_equals( pDestType, pSourceType ))
570cdf0e10cSrcweir 		{
571cdf0e10cSrcweir 			::osl_incrementInterlockedCount(
572cdf0e10cSrcweir                 &(*(uno_Sequence **)pSource)->nRefCount );
573cdf0e10cSrcweir 			idestructSequence(
574cdf0e10cSrcweir                 *(uno_Sequence **)pDest, pDestType, pDestTypeDescr, release );
575cdf0e10cSrcweir 			*(uno_Sequence **)pDest = *(uno_Sequence **)pSource;
576cdf0e10cSrcweir 			return sal_True;
577cdf0e10cSrcweir 		}
578cdf0e10cSrcweir 		return sal_False;
579cdf0e10cSrcweir 	case typelib_TypeClass_INTERFACE:
580cdf0e10cSrcweir 		if (typelib_TypeClass_INTERFACE != pSourceType->eTypeClass)
581cdf0e10cSrcweir 			return sal_False;
582cdf0e10cSrcweir 		if (_type_equals( pDestType, pSourceType ))
583cdf0e10cSrcweir 		{
584cdf0e10cSrcweir 			_assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
585cdf0e10cSrcweir 			return sal_True;
586cdf0e10cSrcweir 		}
587cdf0e10cSrcweir         else if (*static_cast< void ** >(pSource) == 0)
588cdf0e10cSrcweir         {
589cdf0e10cSrcweir             // A null reference of any interface type can be converted to a null
590cdf0e10cSrcweir             // reference of any other interface type:
591cdf0e10cSrcweir             void * const pToBeReleased = *static_cast< void ** >(pDest);
592cdf0e10cSrcweir             *static_cast< void ** >(pDest) = 0;
593cdf0e10cSrcweir             _release( pToBeReleased, release );
594cdf0e10cSrcweir             return true;
595cdf0e10cSrcweir         }
596cdf0e10cSrcweir 		else
597cdf0e10cSrcweir 		{
598cdf0e10cSrcweir 			if (pSourceTypeDescr)
599cdf0e10cSrcweir 			{
600cdf0e10cSrcweir 				typelib_TypeDescription * pTD = pSourceTypeDescr;
601cdf0e10cSrcweir 				while (pTD && !_type_equals( pTD->pWeakRef, pDestType ))
602cdf0e10cSrcweir                 {
603cdf0e10cSrcweir 					pTD = (typelib_TypeDescription *)
604cdf0e10cSrcweir                         ((typelib_InterfaceTypeDescription *)pTD)->pBaseTypeDescription;
605cdf0e10cSrcweir                 }
606cdf0e10cSrcweir 				if (pTD) // is base of dest
607cdf0e10cSrcweir 				{
608cdf0e10cSrcweir 					_assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
609cdf0e10cSrcweir                     return true;
610cdf0e10cSrcweir 				}
611cdf0e10cSrcweir             }
612cdf0e10cSrcweir 
613cdf0e10cSrcweir             // query for interface:
614cdf0e10cSrcweir             void * pQueried = _queryInterface( *static_cast<void **>(pSource),
615cdf0e10cSrcweir                                                pDestType, queryInterface );
616cdf0e10cSrcweir             if (pQueried != 0) {
617cdf0e10cSrcweir                 void * const pToBeReleased = *static_cast<void **>(pDest);
618cdf0e10cSrcweir                 *static_cast<void **>(pDest) = pQueried;
619cdf0e10cSrcweir                 _release( pToBeReleased, release );
620cdf0e10cSrcweir             }
621cdf0e10cSrcweir             return (pQueried != 0);
622cdf0e10cSrcweir 		}
623cdf0e10cSrcweir     default:
624cdf0e10cSrcweir         OSL_ASSERT(false);
625cdf0e10cSrcweir         return sal_False;
626cdf0e10cSrcweir 	}
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir }
630cdf0e10cSrcweir 
631cdf0e10cSrcweir #endif
632