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