xref: /trunk/main/bridges/source/jni_uno/jni_data.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_bridges.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "jni_bridge.h"
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include "rtl/strbuf.hxx"
34*cdf0e10cSrcweir #include "rtl/ustrbuf.hxx"
35*cdf0e10cSrcweir #include "uno/sequence2.h"
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir using namespace ::std;
39*cdf0e10cSrcweir using namespace ::rtl;
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir namespace jni_uno
42*cdf0e10cSrcweir {
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir //------------------------------------------------------------------------------
45*cdf0e10cSrcweir inline rtl_mem * seq_allocate( sal_Int32 nElements, sal_Int32 nSize )
46*cdf0e10cSrcweir {
47*cdf0e10cSrcweir     auto_ptr< rtl_mem > seq(
48*cdf0e10cSrcweir         rtl_mem::allocate( SAL_SEQUENCE_HEADER_SIZE + (nElements * nSize) ) );
49*cdf0e10cSrcweir     uno_Sequence * p = (uno_Sequence *)seq.get();
50*cdf0e10cSrcweir     p->nRefCount = 1;
51*cdf0e10cSrcweir     p->nElements = nElements;
52*cdf0e10cSrcweir     return seq.release();
53*cdf0e10cSrcweir }
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir //______________________________________________________________________________
56*cdf0e10cSrcweir namespace {
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir void createDefaultUnoValue(
59*cdf0e10cSrcweir     JNI_context const & jni, void * uno_data,
60*cdf0e10cSrcweir     typelib_TypeDescriptionReference * type,
61*cdf0e10cSrcweir     JNI_type_info const * info /* maybe 0 */, bool assign)
62*cdf0e10cSrcweir {
63*cdf0e10cSrcweir     switch (type->eTypeClass) {
64*cdf0e10cSrcweir     case typelib_TypeClass_BOOLEAN:
65*cdf0e10cSrcweir         *static_cast< sal_Bool * >(uno_data) = false;
66*cdf0e10cSrcweir         break;
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir     case typelib_TypeClass_BYTE:
69*cdf0e10cSrcweir         *static_cast< sal_Int8 * >(uno_data) = 0;
70*cdf0e10cSrcweir         break;
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir     case typelib_TypeClass_SHORT:
73*cdf0e10cSrcweir         *static_cast< sal_Int16 * >(uno_data) = 0;
74*cdf0e10cSrcweir         break;
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir     case typelib_TypeClass_UNSIGNED_SHORT:
77*cdf0e10cSrcweir         *static_cast< sal_uInt16 * >(uno_data) = 0;
78*cdf0e10cSrcweir         break;
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir     case typelib_TypeClass_LONG:
81*cdf0e10cSrcweir         *static_cast< sal_Int32 * >(uno_data) = 0;
82*cdf0e10cSrcweir         break;
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir     case typelib_TypeClass_UNSIGNED_LONG:
85*cdf0e10cSrcweir         *static_cast< sal_uInt32 * >(uno_data) = 0;
86*cdf0e10cSrcweir         break;
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir     case typelib_TypeClass_HYPER:
89*cdf0e10cSrcweir         *static_cast< sal_Int64 * >(uno_data) = 0;
90*cdf0e10cSrcweir         break;
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir     case typelib_TypeClass_UNSIGNED_HYPER:
93*cdf0e10cSrcweir         *static_cast< sal_uInt64 * >(uno_data) = 0;
94*cdf0e10cSrcweir         break;
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir     case typelib_TypeClass_FLOAT:
97*cdf0e10cSrcweir         *static_cast< float * >(uno_data) = 0;
98*cdf0e10cSrcweir         break;
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir     case typelib_TypeClass_DOUBLE:
101*cdf0e10cSrcweir         *static_cast< double * >(uno_data) = 0;
102*cdf0e10cSrcweir         break;
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir     case typelib_TypeClass_CHAR:
105*cdf0e10cSrcweir         *static_cast< sal_Unicode * >(uno_data) = 0;
106*cdf0e10cSrcweir         break;
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir     case typelib_TypeClass_STRING:
109*cdf0e10cSrcweir         if (!assign) {
110*cdf0e10cSrcweir             *static_cast< rtl_uString ** >(uno_data) = 0;
111*cdf0e10cSrcweir         }
112*cdf0e10cSrcweir         rtl_uString_new(static_cast< rtl_uString ** >(uno_data));
113*cdf0e10cSrcweir         break;
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir     case typelib_TypeClass_TYPE:
116*cdf0e10cSrcweir         if (assign) {
117*cdf0e10cSrcweir             typelib_typedescriptionreference_release(
118*cdf0e10cSrcweir                 *static_cast< typelib_TypeDescriptionReference ** >(uno_data));
119*cdf0e10cSrcweir         }
120*cdf0e10cSrcweir         *static_cast< typelib_TypeDescriptionReference ** >(uno_data)
121*cdf0e10cSrcweir             = *typelib_static_type_getByTypeClass(typelib_TypeClass_VOID);
122*cdf0e10cSrcweir         OSL_ASSERT(
123*cdf0e10cSrcweir             *static_cast< typelib_TypeDescriptionReference ** >(uno_data) != 0);
124*cdf0e10cSrcweir         typelib_typedescriptionreference_acquire(
125*cdf0e10cSrcweir             *static_cast< typelib_TypeDescriptionReference ** >(uno_data));
126*cdf0e10cSrcweir         break;
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir     case typelib_TypeClass_ANY:
129*cdf0e10cSrcweir         if (assign) {
130*cdf0e10cSrcweir             uno_any_destruct(static_cast< uno_Any * >(uno_data), 0);
131*cdf0e10cSrcweir         }
132*cdf0e10cSrcweir         uno_any_construct(
133*cdf0e10cSrcweir             static_cast< uno_Any * >(uno_data), 0,
134*cdf0e10cSrcweir             jni.get_info()->m_XInterface_type_info->m_td.get(), 0);
135*cdf0e10cSrcweir         break;
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir     case typelib_TypeClass_SEQUENCE:
138*cdf0e10cSrcweir         {
139*cdf0e10cSrcweir             auto_ptr< rtl_mem > seq(seq_allocate(0, 0));
140*cdf0e10cSrcweir             if (assign) {
141*cdf0e10cSrcweir                 uno_type_destructData(uno_data, type, 0);
142*cdf0e10cSrcweir             }
143*cdf0e10cSrcweir             *static_cast< uno_Sequence ** >(uno_data)
144*cdf0e10cSrcweir                 = reinterpret_cast< uno_Sequence * >(seq.release());
145*cdf0e10cSrcweir             break;
146*cdf0e10cSrcweir         }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir     case typelib_TypeClass_ENUM:
149*cdf0e10cSrcweir         {
150*cdf0e10cSrcweir             typelib_TypeDescription * td = 0;
151*cdf0e10cSrcweir             TYPELIB_DANGER_GET(&td, type);
152*cdf0e10cSrcweir             *static_cast< sal_Int32 * >(uno_data)
153*cdf0e10cSrcweir                 = (reinterpret_cast< typelib_EnumTypeDescription * >(td)->
154*cdf0e10cSrcweir                    nDefaultEnumValue);
155*cdf0e10cSrcweir             TYPELIB_DANGER_RELEASE(td);
156*cdf0e10cSrcweir             break;
157*cdf0e10cSrcweir         }
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir     case typelib_TypeClass_STRUCT:
160*cdf0e10cSrcweir         {
161*cdf0e10cSrcweir             if (info == 0) {
162*cdf0e10cSrcweir                 info = jni.get_info()->get_type_info(jni, type);
163*cdf0e10cSrcweir             }
164*cdf0e10cSrcweir             JNI_compound_type_info const * comp_info
165*cdf0e10cSrcweir                 = static_cast< JNI_compound_type_info const * >(info);
166*cdf0e10cSrcweir             typelib_CompoundTypeDescription * comp_td
167*cdf0e10cSrcweir                 = reinterpret_cast< typelib_CompoundTypeDescription * >(
168*cdf0e10cSrcweir                     comp_info->m_td.get());
169*cdf0e10cSrcweir             sal_Int32 nPos = 0;
170*cdf0e10cSrcweir             sal_Int32 nMembers = comp_td->nMembers;
171*cdf0e10cSrcweir             try {
172*cdf0e10cSrcweir                 if (comp_td->pBaseTypeDescription != 0) {
173*cdf0e10cSrcweir                     createDefaultUnoValue(
174*cdf0e10cSrcweir                         jni, uno_data,
175*cdf0e10cSrcweir                         comp_td->pBaseTypeDescription->aBase.pWeakRef,
176*cdf0e10cSrcweir                         comp_info->m_base, assign);
177*cdf0e10cSrcweir                 }
178*cdf0e10cSrcweir                 for (; nPos < nMembers; ++nPos) {
179*cdf0e10cSrcweir                     createDefaultUnoValue(
180*cdf0e10cSrcweir                         jni,
181*cdf0e10cSrcweir                         (static_cast< char * >(uno_data)
182*cdf0e10cSrcweir                          + comp_td->pMemberOffsets[nPos]),
183*cdf0e10cSrcweir                         comp_td->ppTypeRefs[nPos], 0, assign);
184*cdf0e10cSrcweir                 }
185*cdf0e10cSrcweir             } catch (...) {
186*cdf0e10cSrcweir                 if (!assign) {
187*cdf0e10cSrcweir                     for (sal_Int32 i = 0; i < nPos; ++i) {
188*cdf0e10cSrcweir                         uno_type_destructData(
189*cdf0e10cSrcweir                             (static_cast< char * >(uno_data)
190*cdf0e10cSrcweir                              + comp_td->pMemberOffsets[i]),
191*cdf0e10cSrcweir                             comp_td->ppTypeRefs[i], 0);
192*cdf0e10cSrcweir                     }
193*cdf0e10cSrcweir                     if (comp_td->pBaseTypeDescription != 0) {
194*cdf0e10cSrcweir                         uno_destructData(
195*cdf0e10cSrcweir                             uno_data, &comp_td->pBaseTypeDescription->aBase, 0);
196*cdf0e10cSrcweir                     }
197*cdf0e10cSrcweir                 }
198*cdf0e10cSrcweir                 throw;
199*cdf0e10cSrcweir             }
200*cdf0e10cSrcweir         }
201*cdf0e10cSrcweir         break;
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir     case typelib_TypeClass_INTERFACE:
204*cdf0e10cSrcweir         if (assign) {
205*cdf0e10cSrcweir             uno_Interface * p = *static_cast< uno_Interface ** >(uno_data);
206*cdf0e10cSrcweir             if (p != 0) {
207*cdf0e10cSrcweir                 (*p->release)(p);
208*cdf0e10cSrcweir             }
209*cdf0e10cSrcweir         }
210*cdf0e10cSrcweir         *static_cast< uno_Interface ** >(uno_data) = 0;
211*cdf0e10cSrcweir         break;
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir     default:
214*cdf0e10cSrcweir         OSL_ASSERT(false);
215*cdf0e10cSrcweir         break;
216*cdf0e10cSrcweir     }
217*cdf0e10cSrcweir }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir }
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir void Bridge::map_to_uno(
222*cdf0e10cSrcweir     JNI_context const & jni,
223*cdf0e10cSrcweir     void * uno_data, jvalue java_data,
224*cdf0e10cSrcweir     typelib_TypeDescriptionReference * type,
225*cdf0e10cSrcweir     JNI_type_info const * info /* maybe 0 */,
226*cdf0e10cSrcweir     bool assign, bool out_param,
227*cdf0e10cSrcweir     bool special_wrapped_integral_types ) const
228*cdf0e10cSrcweir {
229*cdf0e10cSrcweir     OSL_ASSERT(
230*cdf0e10cSrcweir         !out_param ||
231*cdf0e10cSrcweir         (1 == jni->GetArrayLength( (jarray) java_data.l )) );
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir     switch (type->eTypeClass)
234*cdf0e10cSrcweir     {
235*cdf0e10cSrcweir 	case typelib_TypeClass_CHAR:
236*cdf0e10cSrcweir         if (out_param)
237*cdf0e10cSrcweir         {
238*cdf0e10cSrcweir             jni->GetCharArrayRegion(
239*cdf0e10cSrcweir                 (jcharArray) java_data.l, 0, 1, (jchar *) uno_data );
240*cdf0e10cSrcweir             jni.ensure_no_exception();
241*cdf0e10cSrcweir         }
242*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
243*cdf0e10cSrcweir         {
244*cdf0e10cSrcweir             *(jchar *) uno_data = jni->CallCharMethodA(
245*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Character_charValue, 0 );
246*cdf0e10cSrcweir             jni.ensure_no_exception();
247*cdf0e10cSrcweir         }
248*cdf0e10cSrcweir         else
249*cdf0e10cSrcweir         {
250*cdf0e10cSrcweir             *(jchar *) uno_data = java_data.c;
251*cdf0e10cSrcweir         }
252*cdf0e10cSrcweir         break;
253*cdf0e10cSrcweir 	case typelib_TypeClass_BOOLEAN:
254*cdf0e10cSrcweir         if (out_param)
255*cdf0e10cSrcweir         {
256*cdf0e10cSrcweir             jni->GetBooleanArrayRegion(
257*cdf0e10cSrcweir                 (jbooleanArray) java_data.l, 0, 1, (jboolean *) uno_data );
258*cdf0e10cSrcweir             jni.ensure_no_exception();
259*cdf0e10cSrcweir         }
260*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
261*cdf0e10cSrcweir         {
262*cdf0e10cSrcweir             *(jboolean *) uno_data = jni->CallBooleanMethodA(
263*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Boolean_booleanValue, 0 );
264*cdf0e10cSrcweir             jni.ensure_no_exception();
265*cdf0e10cSrcweir         }
266*cdf0e10cSrcweir         else
267*cdf0e10cSrcweir         {
268*cdf0e10cSrcweir             *(jboolean *) uno_data = java_data.z;
269*cdf0e10cSrcweir         }
270*cdf0e10cSrcweir         break;
271*cdf0e10cSrcweir 	case typelib_TypeClass_BYTE:
272*cdf0e10cSrcweir         if (out_param)
273*cdf0e10cSrcweir         {
274*cdf0e10cSrcweir             jni->GetByteArrayRegion(
275*cdf0e10cSrcweir                 (jbyteArray) java_data.l, 0, 1, (jbyte *) uno_data );
276*cdf0e10cSrcweir             jni.ensure_no_exception();
277*cdf0e10cSrcweir         }
278*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
279*cdf0e10cSrcweir         {
280*cdf0e10cSrcweir             *(jbyte *) uno_data = jni->CallByteMethodA(
281*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Byte_byteValue, 0 );
282*cdf0e10cSrcweir             jni.ensure_no_exception();
283*cdf0e10cSrcweir         }
284*cdf0e10cSrcweir         else
285*cdf0e10cSrcweir         {
286*cdf0e10cSrcweir             *(jbyte *) uno_data = java_data.b;
287*cdf0e10cSrcweir         }
288*cdf0e10cSrcweir         break;
289*cdf0e10cSrcweir 	case typelib_TypeClass_SHORT:
290*cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_SHORT:
291*cdf0e10cSrcweir         if (out_param)
292*cdf0e10cSrcweir         {
293*cdf0e10cSrcweir             jni->GetShortArrayRegion(
294*cdf0e10cSrcweir                 (jshortArray) java_data.l, 0, 1, (jshort *) uno_data );
295*cdf0e10cSrcweir             jni.ensure_no_exception();
296*cdf0e10cSrcweir         }
297*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
298*cdf0e10cSrcweir         {
299*cdf0e10cSrcweir             *(jshort *) uno_data = jni->CallShortMethodA(
300*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Short_shortValue, 0 );
301*cdf0e10cSrcweir             jni.ensure_no_exception();
302*cdf0e10cSrcweir         }
303*cdf0e10cSrcweir         else
304*cdf0e10cSrcweir         {
305*cdf0e10cSrcweir             *(jshort *) uno_data = java_data.s;
306*cdf0e10cSrcweir         }
307*cdf0e10cSrcweir         break;
308*cdf0e10cSrcweir 	case typelib_TypeClass_LONG:
309*cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_LONG:
310*cdf0e10cSrcweir         if (out_param)
311*cdf0e10cSrcweir         {
312*cdf0e10cSrcweir             jni->GetIntArrayRegion(
313*cdf0e10cSrcweir                 (jintArray) java_data.l, 0, 1, (jint *) uno_data );
314*cdf0e10cSrcweir             jni.ensure_no_exception();
315*cdf0e10cSrcweir         }
316*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
317*cdf0e10cSrcweir         {
318*cdf0e10cSrcweir             *(jint *) uno_data = jni->CallIntMethodA(
319*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Integer_intValue, 0 );
320*cdf0e10cSrcweir             jni.ensure_no_exception();
321*cdf0e10cSrcweir         }
322*cdf0e10cSrcweir         else
323*cdf0e10cSrcweir         {
324*cdf0e10cSrcweir             *(jint *) uno_data = java_data.i;
325*cdf0e10cSrcweir         }
326*cdf0e10cSrcweir         break;
327*cdf0e10cSrcweir 	case typelib_TypeClass_HYPER:
328*cdf0e10cSrcweir 	case typelib_TypeClass_UNSIGNED_HYPER:
329*cdf0e10cSrcweir         if (out_param)
330*cdf0e10cSrcweir         {
331*cdf0e10cSrcweir             jni->GetLongArrayRegion(
332*cdf0e10cSrcweir                 (jlongArray) java_data.l, 0, 1, (jlong *) uno_data );
333*cdf0e10cSrcweir             jni.ensure_no_exception();
334*cdf0e10cSrcweir         }
335*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
336*cdf0e10cSrcweir         {
337*cdf0e10cSrcweir             *(jlong *) uno_data = jni->CallLongMethodA(
338*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Long_longValue, 0 );
339*cdf0e10cSrcweir             jni.ensure_no_exception();
340*cdf0e10cSrcweir         }
341*cdf0e10cSrcweir         else
342*cdf0e10cSrcweir         {
343*cdf0e10cSrcweir             *(jlong *) uno_data = java_data.j;
344*cdf0e10cSrcweir         }
345*cdf0e10cSrcweir         break;
346*cdf0e10cSrcweir 	case typelib_TypeClass_FLOAT:
347*cdf0e10cSrcweir         if (out_param)
348*cdf0e10cSrcweir         {
349*cdf0e10cSrcweir             jni->GetFloatArrayRegion(
350*cdf0e10cSrcweir                 (jfloatArray) java_data.l, 0, 1, (jfloat *) uno_data );
351*cdf0e10cSrcweir             jni.ensure_no_exception();
352*cdf0e10cSrcweir         }
353*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
354*cdf0e10cSrcweir         {
355*cdf0e10cSrcweir             *(jfloat *) uno_data = jni->CallFloatMethodA(
356*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Float_floatValue, 0 );
357*cdf0e10cSrcweir             jni.ensure_no_exception();
358*cdf0e10cSrcweir         }
359*cdf0e10cSrcweir         else
360*cdf0e10cSrcweir         {
361*cdf0e10cSrcweir             *(jfloat *) uno_data = java_data.f;
362*cdf0e10cSrcweir         }
363*cdf0e10cSrcweir         break;
364*cdf0e10cSrcweir 	case typelib_TypeClass_DOUBLE:
365*cdf0e10cSrcweir         if (out_param)
366*cdf0e10cSrcweir         {
367*cdf0e10cSrcweir             jni->GetDoubleArrayRegion(
368*cdf0e10cSrcweir                 (jdoubleArray) java_data.l, 0, 1, (jdouble *) uno_data );
369*cdf0e10cSrcweir             jni.ensure_no_exception();
370*cdf0e10cSrcweir         }
371*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
372*cdf0e10cSrcweir         {
373*cdf0e10cSrcweir             *(jdouble *) uno_data = jni->CallDoubleMethodA(
374*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_method_Double_doubleValue, 0 );
375*cdf0e10cSrcweir             jni.ensure_no_exception();
376*cdf0e10cSrcweir         }
377*cdf0e10cSrcweir         else
378*cdf0e10cSrcweir         {
379*cdf0e10cSrcweir             *(jdouble *) uno_data = java_data.d;
380*cdf0e10cSrcweir         }
381*cdf0e10cSrcweir         break;
382*cdf0e10cSrcweir 	case typelib_TypeClass_STRING:
383*cdf0e10cSrcweir     {
384*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
385*cdf0e10cSrcweir         if (out_param)
386*cdf0e10cSrcweir         {
387*cdf0e10cSrcweir             jo_out_holder.reset(
388*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
389*cdf0e10cSrcweir             jni.ensure_no_exception();
390*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
391*cdf0e10cSrcweir         }
392*cdf0e10cSrcweir         if (0 == java_data.l)
393*cdf0e10cSrcweir         {
394*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
395*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
396*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
397*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] null-ref given!") );
398*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
399*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
400*cdf0e10cSrcweir         }
401*cdf0e10cSrcweir         if (! assign)
402*cdf0e10cSrcweir             *(rtl_uString **)uno_data = 0;
403*cdf0e10cSrcweir         jstring_to_ustring(
404*cdf0e10cSrcweir             jni, (rtl_uString **)uno_data, (jstring) java_data.l );
405*cdf0e10cSrcweir         break;
406*cdf0e10cSrcweir     }
407*cdf0e10cSrcweir 	case typelib_TypeClass_TYPE:
408*cdf0e10cSrcweir     {
409*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
410*cdf0e10cSrcweir         if (out_param)
411*cdf0e10cSrcweir         {
412*cdf0e10cSrcweir             jo_out_holder.reset(
413*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
414*cdf0e10cSrcweir             jni.ensure_no_exception();
415*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
416*cdf0e10cSrcweir         }
417*cdf0e10cSrcweir         if (0 == java_data.l)
418*cdf0e10cSrcweir         {
419*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
420*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
421*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
422*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] null-ref given!") );
423*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
424*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
425*cdf0e10cSrcweir         }
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir         // type name
428*cdf0e10cSrcweir         JLocalAutoRef jo_type_name(
429*cdf0e10cSrcweir             jni, jni->GetObjectField(
430*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_field_Type__typeName ) );
431*cdf0e10cSrcweir         if (! jo_type_name.is())
432*cdf0e10cSrcweir         {
433*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
434*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
435*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
436*cdf0e10cSrcweir             buf.appendAscii(
437*cdf0e10cSrcweir                 RTL_CONSTASCII_STRINGPARAM("] incomplete type object: "
438*cdf0e10cSrcweir                                            "no type name!") );
439*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
440*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
441*cdf0e10cSrcweir         }
442*cdf0e10cSrcweir         OUString type_name(
443*cdf0e10cSrcweir             jstring_to_oustring( jni, (jstring) jo_type_name.get() ) );
444*cdf0e10cSrcweir         ::com::sun::star::uno::TypeDescription td( type_name );
445*cdf0e10cSrcweir         if (! td.is())
446*cdf0e10cSrcweir         {
447*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
448*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
449*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
450*cdf0e10cSrcweir             buf.appendAscii(
451*cdf0e10cSrcweir                 RTL_CONSTASCII_STRINGPARAM("] UNO type not found: ") );
452*cdf0e10cSrcweir             buf.append( type_name );
453*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
454*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
455*cdf0e10cSrcweir         }
456*cdf0e10cSrcweir         typelib_typedescriptionreference_acquire( td.get()->pWeakRef );
457*cdf0e10cSrcweir         if (assign)
458*cdf0e10cSrcweir         {
459*cdf0e10cSrcweir             typelib_typedescriptionreference_release(
460*cdf0e10cSrcweir                 *(typelib_TypeDescriptionReference **)uno_data );
461*cdf0e10cSrcweir         }
462*cdf0e10cSrcweir         *(typelib_TypeDescriptionReference **)uno_data = td.get()->pWeakRef;
463*cdf0e10cSrcweir         break;
464*cdf0e10cSrcweir     }
465*cdf0e10cSrcweir 	case typelib_TypeClass_ANY:
466*cdf0e10cSrcweir     {
467*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
468*cdf0e10cSrcweir         if (out_param)
469*cdf0e10cSrcweir         {
470*cdf0e10cSrcweir             jo_out_holder.reset(
471*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
472*cdf0e10cSrcweir             jni.ensure_no_exception();
473*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
474*cdf0e10cSrcweir         }
475*cdf0e10cSrcweir 
476*cdf0e10cSrcweir         uno_Any * pAny = (uno_Any *)uno_data;
477*cdf0e10cSrcweir         if (0 == java_data.l) // null-ref maps to XInterface null-ref
478*cdf0e10cSrcweir         {
479*cdf0e10cSrcweir             if (assign)
480*cdf0e10cSrcweir                 uno_any_destruct( pAny, 0 );
481*cdf0e10cSrcweir             uno_any_construct(
482*cdf0e10cSrcweir                 pAny, 0, m_jni_info->m_XInterface_type_info->m_td.get(), 0 );
483*cdf0e10cSrcweir             break;
484*cdf0e10cSrcweir         }
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir         JLocalAutoRef jo_type( jni );
487*cdf0e10cSrcweir         JLocalAutoRef jo_wrapped_holder( jni );
488*cdf0e10cSrcweir 
489*cdf0e10cSrcweir         if (JNI_FALSE != jni->IsInstanceOf(
490*cdf0e10cSrcweir                 java_data.l, m_jni_info->m_class_Any ))
491*cdf0e10cSrcweir         {
492*cdf0e10cSrcweir             // boxed any
493*cdf0e10cSrcweir             jo_type.reset( jni->GetObjectField(
494*cdf0e10cSrcweir                                java_data.l, m_jni_info->m_field_Any__type ) );
495*cdf0e10cSrcweir             if (! jo_type.is())
496*cdf0e10cSrcweir             {
497*cdf0e10cSrcweir                 OUStringBuffer buf( 128 );
498*cdf0e10cSrcweir                 buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
499*cdf0e10cSrcweir                 buf.append( OUString::unacquired( &type->pTypeName ) );
500*cdf0e10cSrcweir                 buf.appendAscii(
501*cdf0e10cSrcweir                     RTL_CONSTASCII_STRINGPARAM("] no type set at "
502*cdf0e10cSrcweir                                                "com.sun.star.uno.Any!") );
503*cdf0e10cSrcweir                 buf.append( jni.get_stack_trace() );
504*cdf0e10cSrcweir                 throw BridgeRuntimeError( buf.makeStringAndClear() );
505*cdf0e10cSrcweir             }
506*cdf0e10cSrcweir             // wrapped value
507*cdf0e10cSrcweir             jo_wrapped_holder.reset(
508*cdf0e10cSrcweir                 jni->GetObjectField(
509*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_field_Any__object ) );
510*cdf0e10cSrcweir             java_data.l = jo_wrapped_holder.get();
511*cdf0e10cSrcweir         }
512*cdf0e10cSrcweir         else
513*cdf0e10cSrcweir         {
514*cdf0e10cSrcweir             // create type out of class
515*cdf0e10cSrcweir             JLocalAutoRef jo_class( jni, jni->GetObjectClass( java_data.l ) );
516*cdf0e10cSrcweir             jo_type.reset( create_type( jni, (jclass) jo_class.get() ) );
517*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
518*cdf0e10cSrcweir             {
519*cdf0e10cSrcweir             JLocalAutoRef jo_toString(
520*cdf0e10cSrcweir                 jni, jni->CallObjectMethodA(
521*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_method_Object_toString, 0 ) );
522*cdf0e10cSrcweir             jni.ensure_no_exception();
523*cdf0e10cSrcweir             OUString toString(
524*cdf0e10cSrcweir                 jstring_to_oustring( jni, (jstring) jo_toString.get() ) );
525*cdf0e10cSrcweir             }
526*cdf0e10cSrcweir #endif
527*cdf0e10cSrcweir         }
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir         // get type name
530*cdf0e10cSrcweir         JLocalAutoRef jo_type_name(
531*cdf0e10cSrcweir             jni, jni->GetObjectField(
532*cdf0e10cSrcweir                 jo_type.get(), m_jni_info->m_field_Type__typeName ) );
533*cdf0e10cSrcweir         jni.ensure_no_exception();
534*cdf0e10cSrcweir         OUString type_name(
535*cdf0e10cSrcweir             jstring_to_oustring( jni, (jstring) jo_type_name.get() ) );
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir         ::com::sun::star::uno::TypeDescription value_td( type_name );
538*cdf0e10cSrcweir         if (! value_td.is())
539*cdf0e10cSrcweir         {
540*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
541*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
542*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
543*cdf0e10cSrcweir             buf.appendAscii(
544*cdf0e10cSrcweir                 RTL_CONSTASCII_STRINGPARAM("] UNO type not found: ") );
545*cdf0e10cSrcweir             buf.append( type_name );
546*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
547*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
548*cdf0e10cSrcweir         }
549*cdf0e10cSrcweir         typelib_TypeClass type_class = value_td.get()->eTypeClass;
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir         if (assign)
552*cdf0e10cSrcweir         {
553*cdf0e10cSrcweir             uno_any_destruct( pAny, 0 );
554*cdf0e10cSrcweir         }
555*cdf0e10cSrcweir         try
556*cdf0e10cSrcweir         {
557*cdf0e10cSrcweir             switch (type_class)
558*cdf0e10cSrcweir             {
559*cdf0e10cSrcweir             case typelib_TypeClass_VOID:
560*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
561*cdf0e10cSrcweir                 break;
562*cdf0e10cSrcweir             case typelib_TypeClass_CHAR:
563*cdf0e10cSrcweir                 *(jchar *) &pAny->pReserved = jni->CallCharMethodA(
564*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_method_Character_charValue, 0 );
565*cdf0e10cSrcweir                 jni.ensure_no_exception();
566*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
567*cdf0e10cSrcweir                 break;
568*cdf0e10cSrcweir             case typelib_TypeClass_BOOLEAN:
569*cdf0e10cSrcweir                 *(jboolean *) &pAny->pReserved = jni->CallBooleanMethodA(
570*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_method_Boolean_booleanValue, 0 );
571*cdf0e10cSrcweir                 jni.ensure_no_exception();
572*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
573*cdf0e10cSrcweir                 break;
574*cdf0e10cSrcweir             case typelib_TypeClass_BYTE:
575*cdf0e10cSrcweir                 *(jbyte *) &pAny->pReserved = jni->CallByteMethodA(
576*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_method_Byte_byteValue, 0 );
577*cdf0e10cSrcweir                 jni.ensure_no_exception();
578*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
579*cdf0e10cSrcweir                 break;
580*cdf0e10cSrcweir             case typelib_TypeClass_SHORT:
581*cdf0e10cSrcweir             case typelib_TypeClass_UNSIGNED_SHORT:
582*cdf0e10cSrcweir                 *(jshort *) &pAny->pReserved = jni->CallShortMethodA(
583*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_method_Short_shortValue, 0 );
584*cdf0e10cSrcweir                 jni.ensure_no_exception();
585*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
586*cdf0e10cSrcweir                 break;
587*cdf0e10cSrcweir             case typelib_TypeClass_LONG:
588*cdf0e10cSrcweir             case typelib_TypeClass_UNSIGNED_LONG:
589*cdf0e10cSrcweir                 *(jint *) &pAny->pReserved = jni->CallIntMethodA(
590*cdf0e10cSrcweir                     java_data.l, m_jni_info->m_method_Integer_intValue, 0 );
591*cdf0e10cSrcweir                 jni.ensure_no_exception();
592*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
593*cdf0e10cSrcweir                 break;
594*cdf0e10cSrcweir             case typelib_TypeClass_HYPER:
595*cdf0e10cSrcweir             case typelib_TypeClass_UNSIGNED_HYPER:
596*cdf0e10cSrcweir                 if (sizeof (sal_Int64) <= sizeof (void *))
597*cdf0e10cSrcweir                 {
598*cdf0e10cSrcweir                     *(jlong *) &pAny->pReserved = jni->CallLongMethodA(
599*cdf0e10cSrcweir                         java_data.l, m_jni_info->m_method_Long_longValue, 0 );
600*cdf0e10cSrcweir                     jni.ensure_no_exception();
601*cdf0e10cSrcweir                     pAny->pData = &pAny->pReserved;
602*cdf0e10cSrcweir                 }
603*cdf0e10cSrcweir                 else
604*cdf0e10cSrcweir                 {
605*cdf0e10cSrcweir                     auto_ptr< rtl_mem > mem(
606*cdf0e10cSrcweir                         rtl_mem::allocate( sizeof (sal_Int64) ) );
607*cdf0e10cSrcweir                     *(jlong *) mem.get() = jni->CallLongMethodA(
608*cdf0e10cSrcweir                         java_data.l, m_jni_info->m_method_Long_longValue, 0 );
609*cdf0e10cSrcweir                     jni.ensure_no_exception();
610*cdf0e10cSrcweir                     pAny->pData = mem.release();
611*cdf0e10cSrcweir                 }
612*cdf0e10cSrcweir                 break;
613*cdf0e10cSrcweir             case typelib_TypeClass_FLOAT:
614*cdf0e10cSrcweir                 if (sizeof (float) <= sizeof (void *))
615*cdf0e10cSrcweir                 {
616*cdf0e10cSrcweir                     *(jfloat *) &pAny->pReserved = jni->CallFloatMethodA(
617*cdf0e10cSrcweir                         java_data.l, m_jni_info->m_method_Float_floatValue, 0 );
618*cdf0e10cSrcweir                     jni.ensure_no_exception();
619*cdf0e10cSrcweir                     pAny->pData = &pAny->pReserved;
620*cdf0e10cSrcweir                 }
621*cdf0e10cSrcweir                 else
622*cdf0e10cSrcweir                 {
623*cdf0e10cSrcweir                     auto_ptr< rtl_mem > mem(
624*cdf0e10cSrcweir                         rtl_mem::allocate( sizeof (float) ) );
625*cdf0e10cSrcweir                     *(jfloat *) mem.get() = jni->CallFloatMethodA(
626*cdf0e10cSrcweir                         java_data.l, m_jni_info->m_method_Float_floatValue, 0 );
627*cdf0e10cSrcweir                     jni.ensure_no_exception();
628*cdf0e10cSrcweir                     pAny->pData = mem.release();
629*cdf0e10cSrcweir                 }
630*cdf0e10cSrcweir                 break;
631*cdf0e10cSrcweir             case typelib_TypeClass_DOUBLE:
632*cdf0e10cSrcweir                 if (sizeof (double) <= sizeof (void *))
633*cdf0e10cSrcweir                 {
634*cdf0e10cSrcweir                     *(jdouble *) &pAny->pReserved =
635*cdf0e10cSrcweir                         jni->CallDoubleMethodA(
636*cdf0e10cSrcweir                             java_data.l,
637*cdf0e10cSrcweir                             m_jni_info->m_method_Double_doubleValue, 0 );
638*cdf0e10cSrcweir                     jni.ensure_no_exception();
639*cdf0e10cSrcweir                     pAny->pData = &pAny->pReserved;
640*cdf0e10cSrcweir                 }
641*cdf0e10cSrcweir                 else
642*cdf0e10cSrcweir                 {
643*cdf0e10cSrcweir                     auto_ptr< rtl_mem > mem(
644*cdf0e10cSrcweir                         rtl_mem::allocate( sizeof (double) ) );
645*cdf0e10cSrcweir                     *(jdouble *) mem.get() =
646*cdf0e10cSrcweir                         jni->CallDoubleMethodA(
647*cdf0e10cSrcweir                             java_data.l,
648*cdf0e10cSrcweir                             m_jni_info->m_method_Double_doubleValue, 0 );
649*cdf0e10cSrcweir                     jni.ensure_no_exception();
650*cdf0e10cSrcweir                     pAny->pData = mem.release();
651*cdf0e10cSrcweir                 }
652*cdf0e10cSrcweir                 break;
653*cdf0e10cSrcweir             case typelib_TypeClass_STRING:
654*cdf0e10cSrcweir                 // opt: anies often contain strings; copy string directly
655*cdf0e10cSrcweir                 pAny->pReserved = 0;
656*cdf0e10cSrcweir                 jstring_to_ustring(
657*cdf0e10cSrcweir                     jni, (rtl_uString **)&pAny->pReserved,
658*cdf0e10cSrcweir                     (jstring) java_data.l );
659*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
660*cdf0e10cSrcweir                 break;
661*cdf0e10cSrcweir             case typelib_TypeClass_TYPE:
662*cdf0e10cSrcweir             case typelib_TypeClass_ENUM:
663*cdf0e10cSrcweir             case typelib_TypeClass_SEQUENCE:
664*cdf0e10cSrcweir             case typelib_TypeClass_INTERFACE:
665*cdf0e10cSrcweir                 map_to_uno(
666*cdf0e10cSrcweir                     jni, &pAny->pReserved, java_data,
667*cdf0e10cSrcweir                     value_td.get()->pWeakRef, 0,
668*cdf0e10cSrcweir                     false /* no assign */, false /* no out param */ );
669*cdf0e10cSrcweir                 pAny->pData = &pAny->pReserved;
670*cdf0e10cSrcweir                 break;
671*cdf0e10cSrcweir             case typelib_TypeClass_STRUCT:
672*cdf0e10cSrcweir             case typelib_TypeClass_EXCEPTION:
673*cdf0e10cSrcweir             {
674*cdf0e10cSrcweir                 auto_ptr< rtl_mem > mem(
675*cdf0e10cSrcweir                     rtl_mem::allocate( value_td.get()->nSize ) );
676*cdf0e10cSrcweir                 map_to_uno(
677*cdf0e10cSrcweir                     jni, mem.get(), java_data, value_td.get()->pWeakRef, 0,
678*cdf0e10cSrcweir                     false /* no assign */, false /* no out param */ );
679*cdf0e10cSrcweir                 pAny->pData = mem.release();
680*cdf0e10cSrcweir                 break;
681*cdf0e10cSrcweir             }
682*cdf0e10cSrcweir             default:
683*cdf0e10cSrcweir             {
684*cdf0e10cSrcweir                 OUStringBuffer buf( 128 );
685*cdf0e10cSrcweir                 buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
686*cdf0e10cSrcweir                 buf.append( type_name );
687*cdf0e10cSrcweir                 buf.appendAscii(
688*cdf0e10cSrcweir                     RTL_CONSTASCII_STRINGPARAM("] unsupported value type "
689*cdf0e10cSrcweir                                                "of any!") );
690*cdf0e10cSrcweir                 buf.append( jni.get_stack_trace() );
691*cdf0e10cSrcweir                 throw BridgeRuntimeError( buf.makeStringAndClear() );
692*cdf0e10cSrcweir             }
693*cdf0e10cSrcweir             }
694*cdf0e10cSrcweir         }
695*cdf0e10cSrcweir         catch (...)
696*cdf0e10cSrcweir         {
697*cdf0e10cSrcweir             if (assign)
698*cdf0e10cSrcweir             {
699*cdf0e10cSrcweir                 // restore to valid any
700*cdf0e10cSrcweir                 uno_any_construct( pAny, 0, 0, 0 );
701*cdf0e10cSrcweir             }
702*cdf0e10cSrcweir             throw;
703*cdf0e10cSrcweir         }
704*cdf0e10cSrcweir         typelib_typedescriptionreference_acquire( value_td.get()->pWeakRef );
705*cdf0e10cSrcweir         pAny->pType = value_td.get()->pWeakRef;
706*cdf0e10cSrcweir         break;
707*cdf0e10cSrcweir     }
708*cdf0e10cSrcweir 	case typelib_TypeClass_ENUM:
709*cdf0e10cSrcweir     {
710*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
711*cdf0e10cSrcweir         if (out_param)
712*cdf0e10cSrcweir         {
713*cdf0e10cSrcweir             jo_out_holder.reset(
714*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
715*cdf0e10cSrcweir             jni.ensure_no_exception();
716*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
717*cdf0e10cSrcweir         }
718*cdf0e10cSrcweir         if (0 == java_data.l)
719*cdf0e10cSrcweir         {
720*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
721*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
722*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
723*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] null-ref given!") );
724*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
725*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
726*cdf0e10cSrcweir         }
727*cdf0e10cSrcweir 
728*cdf0e10cSrcweir         *(jint *) uno_data = jni->GetIntField(
729*cdf0e10cSrcweir             java_data.l, m_jni_info->m_field_Enum_m_value );
730*cdf0e10cSrcweir         break;
731*cdf0e10cSrcweir     }
732*cdf0e10cSrcweir 	case typelib_TypeClass_STRUCT:
733*cdf0e10cSrcweir 	case typelib_TypeClass_EXCEPTION:
734*cdf0e10cSrcweir     {
735*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
736*cdf0e10cSrcweir         if (out_param)
737*cdf0e10cSrcweir         {
738*cdf0e10cSrcweir             jo_out_holder.reset(
739*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
740*cdf0e10cSrcweir             jni.ensure_no_exception();
741*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
742*cdf0e10cSrcweir         }
743*cdf0e10cSrcweir         if (0 == java_data.l)
744*cdf0e10cSrcweir         {
745*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
746*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
747*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
748*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] null-ref given!") );
749*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
750*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
751*cdf0e10cSrcweir         }
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir         if (0 == info)
754*cdf0e10cSrcweir             info = m_jni_info->get_type_info( jni, type );
755*cdf0e10cSrcweir         JNI_compound_type_info const * comp_info =
756*cdf0e10cSrcweir             static_cast< JNI_compound_type_info const * >( info );
757*cdf0e10cSrcweir 
758*cdf0e10cSrcweir         typelib_CompoundTypeDescription * comp_td =
759*cdf0e10cSrcweir             (typelib_CompoundTypeDescription *)comp_info->m_td.get();
760*cdf0e10cSrcweir         bool polymorphic
761*cdf0e10cSrcweir             = comp_td->aBase.eTypeClass == typelib_TypeClass_STRUCT
762*cdf0e10cSrcweir             && reinterpret_cast< typelib_StructTypeDescription * >(
763*cdf0e10cSrcweir                 comp_td)->pParameterizedTypes != 0;
764*cdf0e10cSrcweir 
765*cdf0e10cSrcweir         sal_Int32 nPos = 0;
766*cdf0e10cSrcweir         sal_Int32 nMembers = comp_td->nMembers;
767*cdf0e10cSrcweir         try
768*cdf0e10cSrcweir         {
769*cdf0e10cSrcweir             if (0 != comp_td->pBaseTypeDescription)
770*cdf0e10cSrcweir             {
771*cdf0e10cSrcweir                 map_to_uno(
772*cdf0e10cSrcweir                     jni, uno_data, java_data,
773*cdf0e10cSrcweir                     ((typelib_TypeDescription *) comp_td->pBaseTypeDescription)
774*cdf0e10cSrcweir                       ->pWeakRef,
775*cdf0e10cSrcweir                     comp_info->m_base,
776*cdf0e10cSrcweir                     assign, false /* no out param */ );
777*cdf0e10cSrcweir             }
778*cdf0e10cSrcweir 
779*cdf0e10cSrcweir             for ( ; nPos < nMembers; ++nPos )
780*cdf0e10cSrcweir             {
781*cdf0e10cSrcweir                 void * p = (char *)uno_data + comp_td->pMemberOffsets[ nPos ];
782*cdf0e10cSrcweir                 typelib_TypeDescriptionReference * member_type =
783*cdf0e10cSrcweir                     comp_td->ppTypeRefs[ nPos ];
784*cdf0e10cSrcweir                 jfieldID field_id = comp_info->m_fields[ nPos ];
785*cdf0e10cSrcweir                 bool parameterizedType = polymorphic
786*cdf0e10cSrcweir                     && reinterpret_cast< typelib_StructTypeDescription * >(
787*cdf0e10cSrcweir                         comp_td)->pParameterizedTypes[nPos];
788*cdf0e10cSrcweir                 switch (member_type->eTypeClass)
789*cdf0e10cSrcweir                 {
790*cdf0e10cSrcweir                 case typelib_TypeClass_CHAR:
791*cdf0e10cSrcweir                     if (parameterizedType) {
792*cdf0e10cSrcweir                         JLocalAutoRef jo(
793*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
794*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
795*cdf0e10cSrcweir                             *(jchar *) p = 0;
796*cdf0e10cSrcweir                         } else {
797*cdf0e10cSrcweir                             jvalue val;
798*cdf0e10cSrcweir                             val.l = jo.get();
799*cdf0e10cSrcweir                             map_to_uno(
800*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
801*cdf0e10cSrcweir                                 true );
802*cdf0e10cSrcweir                         }
803*cdf0e10cSrcweir                     } else {
804*cdf0e10cSrcweir                         *(jchar *) p = jni->GetCharField(
805*cdf0e10cSrcweir                             java_data.l, field_id );
806*cdf0e10cSrcweir                     }
807*cdf0e10cSrcweir                     break;
808*cdf0e10cSrcweir                 case typelib_TypeClass_BOOLEAN:
809*cdf0e10cSrcweir                     if (parameterizedType) {
810*cdf0e10cSrcweir                         JLocalAutoRef jo(
811*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
812*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
813*cdf0e10cSrcweir                             *(jboolean *) p = false;
814*cdf0e10cSrcweir                         } else {
815*cdf0e10cSrcweir                             jvalue val;
816*cdf0e10cSrcweir                             val.l = jo.get();
817*cdf0e10cSrcweir                             map_to_uno(
818*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
819*cdf0e10cSrcweir                                 true );
820*cdf0e10cSrcweir                         }
821*cdf0e10cSrcweir                     } else {
822*cdf0e10cSrcweir                         *(jboolean *) p = jni->GetBooleanField(
823*cdf0e10cSrcweir                             java_data.l, field_id );
824*cdf0e10cSrcweir                     }
825*cdf0e10cSrcweir                     break;
826*cdf0e10cSrcweir                 case typelib_TypeClass_BYTE:
827*cdf0e10cSrcweir                     if (parameterizedType) {
828*cdf0e10cSrcweir                         JLocalAutoRef jo(
829*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
830*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
831*cdf0e10cSrcweir                             *(jbyte *) p = 0;
832*cdf0e10cSrcweir                         } else {
833*cdf0e10cSrcweir                             jvalue val;
834*cdf0e10cSrcweir                             val.l = jo.get();
835*cdf0e10cSrcweir                             map_to_uno(
836*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
837*cdf0e10cSrcweir                                 true );
838*cdf0e10cSrcweir                         }
839*cdf0e10cSrcweir                     } else {
840*cdf0e10cSrcweir                         *(jbyte *) p = jni->GetByteField(
841*cdf0e10cSrcweir                             java_data.l, field_id );
842*cdf0e10cSrcweir                     }
843*cdf0e10cSrcweir                     break;
844*cdf0e10cSrcweir                 case typelib_TypeClass_SHORT:
845*cdf0e10cSrcweir                 case typelib_TypeClass_UNSIGNED_SHORT:
846*cdf0e10cSrcweir                     if (parameterizedType) {
847*cdf0e10cSrcweir                         JLocalAutoRef jo(
848*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
849*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
850*cdf0e10cSrcweir                             *(jshort *) p = 0;
851*cdf0e10cSrcweir                         } else {
852*cdf0e10cSrcweir                             jvalue val;
853*cdf0e10cSrcweir                             val.l = jo.get();
854*cdf0e10cSrcweir                             map_to_uno(
855*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
856*cdf0e10cSrcweir                                 true );
857*cdf0e10cSrcweir                         }
858*cdf0e10cSrcweir                     } else {
859*cdf0e10cSrcweir                         *(jshort *) p = jni->GetShortField(
860*cdf0e10cSrcweir                             java_data.l, field_id );
861*cdf0e10cSrcweir                     }
862*cdf0e10cSrcweir                     break;
863*cdf0e10cSrcweir                 case typelib_TypeClass_LONG:
864*cdf0e10cSrcweir                 case typelib_TypeClass_UNSIGNED_LONG:
865*cdf0e10cSrcweir                     if (parameterizedType) {
866*cdf0e10cSrcweir                         JLocalAutoRef jo(
867*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
868*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
869*cdf0e10cSrcweir                             *(jint *) p = 0;
870*cdf0e10cSrcweir                         } else {
871*cdf0e10cSrcweir                             jvalue val;
872*cdf0e10cSrcweir                             val.l = jo.get();
873*cdf0e10cSrcweir                             map_to_uno(
874*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
875*cdf0e10cSrcweir                                 true );
876*cdf0e10cSrcweir                         }
877*cdf0e10cSrcweir                     } else {
878*cdf0e10cSrcweir                         *(jint *) p = jni->GetIntField( java_data.l, field_id );
879*cdf0e10cSrcweir                     }
880*cdf0e10cSrcweir                     break;
881*cdf0e10cSrcweir                 case typelib_TypeClass_HYPER:
882*cdf0e10cSrcweir                 case typelib_TypeClass_UNSIGNED_HYPER:
883*cdf0e10cSrcweir                     if (parameterizedType) {
884*cdf0e10cSrcweir                         JLocalAutoRef jo(
885*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
886*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
887*cdf0e10cSrcweir                             *(jlong *) p = 0;
888*cdf0e10cSrcweir                         } else {
889*cdf0e10cSrcweir                             jvalue val;
890*cdf0e10cSrcweir                             val.l = jo.get();
891*cdf0e10cSrcweir                             map_to_uno(
892*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
893*cdf0e10cSrcweir                                 true );
894*cdf0e10cSrcweir                         }
895*cdf0e10cSrcweir                     } else {
896*cdf0e10cSrcweir                         *(jlong *) p = jni->GetLongField(
897*cdf0e10cSrcweir                             java_data.l, field_id );
898*cdf0e10cSrcweir                     }
899*cdf0e10cSrcweir                     break;
900*cdf0e10cSrcweir                 case typelib_TypeClass_FLOAT:
901*cdf0e10cSrcweir                     if (parameterizedType) {
902*cdf0e10cSrcweir                         JLocalAutoRef jo(
903*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
904*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
905*cdf0e10cSrcweir                             *(jfloat *) p = 0;
906*cdf0e10cSrcweir                         } else {
907*cdf0e10cSrcweir                             jvalue val;
908*cdf0e10cSrcweir                             val.l = jo.get();
909*cdf0e10cSrcweir                             map_to_uno(
910*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
911*cdf0e10cSrcweir                                 true );
912*cdf0e10cSrcweir                         }
913*cdf0e10cSrcweir                     } else {
914*cdf0e10cSrcweir                         *(jfloat *) p = jni->GetFloatField(
915*cdf0e10cSrcweir                             java_data.l, field_id );
916*cdf0e10cSrcweir                     }
917*cdf0e10cSrcweir                     break;
918*cdf0e10cSrcweir                 case typelib_TypeClass_DOUBLE:
919*cdf0e10cSrcweir                     if (parameterizedType) {
920*cdf0e10cSrcweir                         JLocalAutoRef jo(
921*cdf0e10cSrcweir                             jni, jni->GetObjectField( java_data.l, field_id ) );
922*cdf0e10cSrcweir                         if ( jo.get() == 0 ) {
923*cdf0e10cSrcweir                             *(jdouble *) p = 0;
924*cdf0e10cSrcweir                         } else {
925*cdf0e10cSrcweir                             jvalue val;
926*cdf0e10cSrcweir                             val.l = jo.get();
927*cdf0e10cSrcweir                             map_to_uno(
928*cdf0e10cSrcweir                                 jni, p, val, member_type, 0, assign, false,
929*cdf0e10cSrcweir                                 true );
930*cdf0e10cSrcweir                         }
931*cdf0e10cSrcweir                     } else {
932*cdf0e10cSrcweir                         *(jdouble *) p = jni->GetDoubleField(
933*cdf0e10cSrcweir                             java_data.l, field_id );
934*cdf0e10cSrcweir                     }
935*cdf0e10cSrcweir                     break;
936*cdf0e10cSrcweir                 default:
937*cdf0e10cSrcweir                 {
938*cdf0e10cSrcweir                     JLocalAutoRef jo_field( jni );
939*cdf0e10cSrcweir                     bool checkNull;
940*cdf0e10cSrcweir                     if (0 == field_id)
941*cdf0e10cSrcweir                     {
942*cdf0e10cSrcweir                         // special for Message: call Throwable.getMessage()
943*cdf0e10cSrcweir                         OSL_ASSERT(
944*cdf0e10cSrcweir                             type_equals(
945*cdf0e10cSrcweir                                 type,
946*cdf0e10cSrcweir                                 m_jni_info->m_Exception_type.getTypeLibType() )
947*cdf0e10cSrcweir                             || type_equals(
948*cdf0e10cSrcweir                                 type,
949*cdf0e10cSrcweir                                 m_jni_info->m_RuntimeException_type.
950*cdf0e10cSrcweir                                 getTypeLibType() ) );
951*cdf0e10cSrcweir                         OSL_ASSERT( 0 == nPos ); // first member
952*cdf0e10cSrcweir                         // call getMessage()
953*cdf0e10cSrcweir                         jo_field.reset(
954*cdf0e10cSrcweir                             jni->CallObjectMethodA(
955*cdf0e10cSrcweir                                 java_data.l,
956*cdf0e10cSrcweir                                 m_jni_info->m_method_Throwable_getMessage, 0 )
957*cdf0e10cSrcweir                             );
958*cdf0e10cSrcweir                         jni.ensure_no_exception();
959*cdf0e10cSrcweir                         checkNull = true;
960*cdf0e10cSrcweir                     }
961*cdf0e10cSrcweir                     else
962*cdf0e10cSrcweir                     {
963*cdf0e10cSrcweir                         jo_field.reset(
964*cdf0e10cSrcweir                             jni->GetObjectField( java_data.l, field_id ) );
965*cdf0e10cSrcweir                         checkNull = parameterizedType;
966*cdf0e10cSrcweir                     }
967*cdf0e10cSrcweir                     if (checkNull && !jo_field.is()) {
968*cdf0e10cSrcweir                         createDefaultUnoValue(jni, p, member_type, 0, assign);
969*cdf0e10cSrcweir                     } else {
970*cdf0e10cSrcweir                         jvalue val;
971*cdf0e10cSrcweir                         val.l = jo_field.get();
972*cdf0e10cSrcweir                         map_to_uno(
973*cdf0e10cSrcweir                             jni, p, val, member_type, 0,
974*cdf0e10cSrcweir                             assign, false /* no out param */ );
975*cdf0e10cSrcweir                     }
976*cdf0e10cSrcweir                     break;
977*cdf0e10cSrcweir                 }
978*cdf0e10cSrcweir                 }
979*cdf0e10cSrcweir             }
980*cdf0e10cSrcweir         }
981*cdf0e10cSrcweir         catch (...)
982*cdf0e10cSrcweir         {
983*cdf0e10cSrcweir 			if (! assign)
984*cdf0e10cSrcweir             {
985*cdf0e10cSrcweir                 // cleanup
986*cdf0e10cSrcweir                 for ( sal_Int32 nCleanup = 0; nCleanup < nPos; ++nCleanup )
987*cdf0e10cSrcweir                 {
988*cdf0e10cSrcweir                     void * p =
989*cdf0e10cSrcweir                         (char *)uno_data + comp_td->pMemberOffsets[ nCleanup ];
990*cdf0e10cSrcweir                     uno_type_destructData(
991*cdf0e10cSrcweir                         p, comp_td->ppTypeRefs[ nCleanup ], 0 );
992*cdf0e10cSrcweir                 }
993*cdf0e10cSrcweir                 if (0 != comp_td->pBaseTypeDescription)
994*cdf0e10cSrcweir                 {
995*cdf0e10cSrcweir                     uno_destructData(
996*cdf0e10cSrcweir                         uno_data,
997*cdf0e10cSrcweir                         (typelib_TypeDescription *) comp_td
998*cdf0e10cSrcweir                           ->pBaseTypeDescription, 0 );
999*cdf0e10cSrcweir                 }
1000*cdf0e10cSrcweir             }
1001*cdf0e10cSrcweir             throw;
1002*cdf0e10cSrcweir         }
1003*cdf0e10cSrcweir         break;
1004*cdf0e10cSrcweir     }
1005*cdf0e10cSrcweir 	case typelib_TypeClass_SEQUENCE:
1006*cdf0e10cSrcweir     {
1007*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
1008*cdf0e10cSrcweir         if (out_param)
1009*cdf0e10cSrcweir         {
1010*cdf0e10cSrcweir             jo_out_holder.reset(
1011*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
1012*cdf0e10cSrcweir             jni.ensure_no_exception();
1013*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
1014*cdf0e10cSrcweir         }
1015*cdf0e10cSrcweir         if (0 == java_data.l)
1016*cdf0e10cSrcweir         {
1017*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
1018*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
1019*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
1020*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] null-ref given!") );
1021*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
1022*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
1023*cdf0e10cSrcweir         }
1024*cdf0e10cSrcweir 
1025*cdf0e10cSrcweir         TypeDescr td( type );
1026*cdf0e10cSrcweir         typelib_TypeDescriptionReference * element_type =
1027*cdf0e10cSrcweir             ((typelib_IndirectTypeDescription *)td.get())->pType;
1028*cdf0e10cSrcweir 
1029*cdf0e10cSrcweir         auto_ptr< rtl_mem > seq;
1030*cdf0e10cSrcweir         sal_Int32 nElements = jni->GetArrayLength( (jarray) java_data.l );
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir         switch (element_type->eTypeClass)
1033*cdf0e10cSrcweir         {
1034*cdf0e10cSrcweir         case typelib_TypeClass_CHAR:
1035*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (sal_Unicode) ) );
1036*cdf0e10cSrcweir             jni->GetCharArrayRegion(
1037*cdf0e10cSrcweir                 (jcharArray) java_data.l, 0, nElements,
1038*cdf0e10cSrcweir                 (jchar *) ((uno_Sequence *) seq.get())->elements );
1039*cdf0e10cSrcweir             jni.ensure_no_exception();
1040*cdf0e10cSrcweir             break;
1041*cdf0e10cSrcweir         case typelib_TypeClass_BOOLEAN:
1042*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (sal_Bool) ) );
1043*cdf0e10cSrcweir             jni->GetBooleanArrayRegion(
1044*cdf0e10cSrcweir                 (jbooleanArray) java_data.l, 0, nElements,
1045*cdf0e10cSrcweir                 (jboolean *) ((uno_Sequence *) seq.get())->elements );
1046*cdf0e10cSrcweir             jni.ensure_no_exception();
1047*cdf0e10cSrcweir             break;
1048*cdf0e10cSrcweir         case typelib_TypeClass_BYTE:
1049*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (sal_Int8) ) );
1050*cdf0e10cSrcweir             jni->GetByteArrayRegion(
1051*cdf0e10cSrcweir                 (jbyteArray) java_data.l, 0, nElements,
1052*cdf0e10cSrcweir                 (jbyte *) ((uno_Sequence *) seq.get())->elements );
1053*cdf0e10cSrcweir             jni.ensure_no_exception();
1054*cdf0e10cSrcweir             break;
1055*cdf0e10cSrcweir         case typelib_TypeClass_SHORT:
1056*cdf0e10cSrcweir         case typelib_TypeClass_UNSIGNED_SHORT:
1057*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (sal_Int16) ) );
1058*cdf0e10cSrcweir             jni->GetShortArrayRegion(
1059*cdf0e10cSrcweir                 (jshortArray) java_data.l, 0, nElements,
1060*cdf0e10cSrcweir                 (jshort *) ((uno_Sequence *) seq.get())->elements );
1061*cdf0e10cSrcweir             jni.ensure_no_exception();
1062*cdf0e10cSrcweir             break;
1063*cdf0e10cSrcweir         case typelib_TypeClass_LONG:
1064*cdf0e10cSrcweir         case typelib_TypeClass_UNSIGNED_LONG:
1065*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (sal_Int32) ) );
1066*cdf0e10cSrcweir             jni->GetIntArrayRegion(
1067*cdf0e10cSrcweir                 (jintArray) java_data.l, 0, nElements,
1068*cdf0e10cSrcweir                 (jint *) ((uno_Sequence *) seq.get())->elements );
1069*cdf0e10cSrcweir             jni.ensure_no_exception();
1070*cdf0e10cSrcweir             break;
1071*cdf0e10cSrcweir         case typelib_TypeClass_HYPER:
1072*cdf0e10cSrcweir         case typelib_TypeClass_UNSIGNED_HYPER:
1073*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (sal_Int64) ) );
1074*cdf0e10cSrcweir             jni->GetLongArrayRegion(
1075*cdf0e10cSrcweir                 (jlongArray) java_data.l, 0, nElements,
1076*cdf0e10cSrcweir                 (jlong *) ((uno_Sequence *) seq.get())->elements );
1077*cdf0e10cSrcweir             jni.ensure_no_exception();
1078*cdf0e10cSrcweir             break;
1079*cdf0e10cSrcweir         case typelib_TypeClass_FLOAT:
1080*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (float) ) );
1081*cdf0e10cSrcweir             jni->GetFloatArrayRegion(
1082*cdf0e10cSrcweir                 (jfloatArray) java_data.l, 0, nElements,
1083*cdf0e10cSrcweir                 (jfloat *)((uno_Sequence *)seq.get())->elements );
1084*cdf0e10cSrcweir             jni.ensure_no_exception();
1085*cdf0e10cSrcweir             break;
1086*cdf0e10cSrcweir         case typelib_TypeClass_DOUBLE:
1087*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, sizeof (double) ) );
1088*cdf0e10cSrcweir             jni->GetDoubleArrayRegion(
1089*cdf0e10cSrcweir                 (jdoubleArray) java_data.l, 0, nElements,
1090*cdf0e10cSrcweir                 (jdouble *) ((uno_Sequence *) seq.get())->elements );
1091*cdf0e10cSrcweir             jni.ensure_no_exception();
1092*cdf0e10cSrcweir             break;
1093*cdf0e10cSrcweir         case typelib_TypeClass_STRING:
1094*cdf0e10cSrcweir         case typelib_TypeClass_TYPE:
1095*cdf0e10cSrcweir         case typelib_TypeClass_ANY:
1096*cdf0e10cSrcweir         case typelib_TypeClass_ENUM:
1097*cdf0e10cSrcweir         case typelib_TypeClass_STRUCT:
1098*cdf0e10cSrcweir         case typelib_TypeClass_EXCEPTION:
1099*cdf0e10cSrcweir         case typelib_TypeClass_SEQUENCE:
1100*cdf0e10cSrcweir         case typelib_TypeClass_INTERFACE:
1101*cdf0e10cSrcweir         {
1102*cdf0e10cSrcweir             TypeDescr element_td( element_type );
1103*cdf0e10cSrcweir             seq.reset( seq_allocate( nElements, element_td.get()->nSize ) );
1104*cdf0e10cSrcweir 
1105*cdf0e10cSrcweir             JNI_type_info const * element_info;
1106*cdf0e10cSrcweir             if (typelib_TypeClass_STRUCT == element_type->eTypeClass ||
1107*cdf0e10cSrcweir                 typelib_TypeClass_EXCEPTION == element_type->eTypeClass ||
1108*cdf0e10cSrcweir                 typelib_TypeClass_INTERFACE == element_type->eTypeClass)
1109*cdf0e10cSrcweir             {
1110*cdf0e10cSrcweir                 element_info =
1111*cdf0e10cSrcweir                     m_jni_info->get_type_info( jni, element_td.get() );
1112*cdf0e10cSrcweir             }
1113*cdf0e10cSrcweir             else
1114*cdf0e10cSrcweir             {
1115*cdf0e10cSrcweir                 element_info = 0;
1116*cdf0e10cSrcweir             }
1117*cdf0e10cSrcweir 
1118*cdf0e10cSrcweir             for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
1119*cdf0e10cSrcweir             {
1120*cdf0e10cSrcweir                 try
1121*cdf0e10cSrcweir                 {
1122*cdf0e10cSrcweir                     JLocalAutoRef jo(
1123*cdf0e10cSrcweir                         jni, jni->GetObjectArrayElement(
1124*cdf0e10cSrcweir                             (jobjectArray) java_data.l, nPos ) );
1125*cdf0e10cSrcweir                     jni.ensure_no_exception();
1126*cdf0e10cSrcweir                     jvalue val;
1127*cdf0e10cSrcweir                     val.l = jo.get();
1128*cdf0e10cSrcweir                     void * p =
1129*cdf0e10cSrcweir                         ((uno_Sequence *)seq.get())->elements +
1130*cdf0e10cSrcweir                         (nPos * element_td.get()->nSize);
1131*cdf0e10cSrcweir                     map_to_uno(
1132*cdf0e10cSrcweir                         jni, p, val, element_td.get()->pWeakRef, element_info,
1133*cdf0e10cSrcweir                         false /* no assign */, false /* no out param */ );
1134*cdf0e10cSrcweir                 }
1135*cdf0e10cSrcweir                 catch (...)
1136*cdf0e10cSrcweir                 {
1137*cdf0e10cSrcweir                     // cleanup
1138*cdf0e10cSrcweir                     for ( sal_Int32 nCleanPos = 0;
1139*cdf0e10cSrcweir                           nCleanPos < nPos; ++nCleanPos )
1140*cdf0e10cSrcweir                     {
1141*cdf0e10cSrcweir                         void * p =
1142*cdf0e10cSrcweir                             ((uno_Sequence *)seq.get())->elements +
1143*cdf0e10cSrcweir                             (nCleanPos * element_td.get()->nSize);
1144*cdf0e10cSrcweir                         uno_destructData( p, element_td.get(), 0 );
1145*cdf0e10cSrcweir                     }
1146*cdf0e10cSrcweir                     throw;
1147*cdf0e10cSrcweir                 }
1148*cdf0e10cSrcweir             }
1149*cdf0e10cSrcweir             break;
1150*cdf0e10cSrcweir         }
1151*cdf0e10cSrcweir         default:
1152*cdf0e10cSrcweir         {
1153*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
1154*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
1155*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
1156*cdf0e10cSrcweir             buf.appendAscii(
1157*cdf0e10cSrcweir                 RTL_CONSTASCII_STRINGPARAM("] unsupported sequence element"
1158*cdf0e10cSrcweir                                            " type: ") );
1159*cdf0e10cSrcweir             buf.append( OUString::unacquired( &element_type->pTypeName ) );
1160*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
1161*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
1162*cdf0e10cSrcweir         }
1163*cdf0e10cSrcweir         }
1164*cdf0e10cSrcweir 
1165*cdf0e10cSrcweir         if (assign)
1166*cdf0e10cSrcweir             uno_destructData( uno_data, td.get(), 0 );
1167*cdf0e10cSrcweir         *(uno_Sequence **)uno_data = (uno_Sequence *)seq.release();
1168*cdf0e10cSrcweir         break;
1169*cdf0e10cSrcweir     }
1170*cdf0e10cSrcweir 	case typelib_TypeClass_INTERFACE:
1171*cdf0e10cSrcweir     {
1172*cdf0e10cSrcweir         JLocalAutoRef jo_out_holder( jni );
1173*cdf0e10cSrcweir         if (out_param)
1174*cdf0e10cSrcweir         {
1175*cdf0e10cSrcweir             jo_out_holder.reset(
1176*cdf0e10cSrcweir                 jni->GetObjectArrayElement( (jobjectArray) java_data.l, 0 ) );
1177*cdf0e10cSrcweir             jni.ensure_no_exception();
1178*cdf0e10cSrcweir             java_data.l = jo_out_holder.get();
1179*cdf0e10cSrcweir         }
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir         if (0 == java_data.l) // null-ref
1182*cdf0e10cSrcweir         {
1183*cdf0e10cSrcweir             if (assign)
1184*cdf0e10cSrcweir             {
1185*cdf0e10cSrcweir                 uno_Interface * p = *(uno_Interface **)uno_data;
1186*cdf0e10cSrcweir                 if (0 != p)
1187*cdf0e10cSrcweir                     (*p->release)( p );
1188*cdf0e10cSrcweir             }
1189*cdf0e10cSrcweir             *(uno_Interface **)uno_data = 0;
1190*cdf0e10cSrcweir         }
1191*cdf0e10cSrcweir         else
1192*cdf0e10cSrcweir         {
1193*cdf0e10cSrcweir             if (0 == info)
1194*cdf0e10cSrcweir                 info = m_jni_info->get_type_info( jni, type );
1195*cdf0e10cSrcweir             JNI_interface_type_info const * iface_info =
1196*cdf0e10cSrcweir                 static_cast< JNI_interface_type_info const * >( info );
1197*cdf0e10cSrcweir             uno_Interface * pUnoI = map_to_uno( jni, java_data.l, iface_info );
1198*cdf0e10cSrcweir             if (assign)
1199*cdf0e10cSrcweir             {
1200*cdf0e10cSrcweir                 uno_Interface * p = *(uno_Interface **)uno_data;
1201*cdf0e10cSrcweir                 if (0 != p)
1202*cdf0e10cSrcweir                     (*p->release)( p );
1203*cdf0e10cSrcweir             }
1204*cdf0e10cSrcweir             *(uno_Interface **)uno_data = pUnoI;
1205*cdf0e10cSrcweir         }
1206*cdf0e10cSrcweir         break;
1207*cdf0e10cSrcweir     }
1208*cdf0e10cSrcweir     default:
1209*cdf0e10cSrcweir     {
1210*cdf0e10cSrcweir         OUStringBuffer buf( 128 );
1211*cdf0e10cSrcweir         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_uno():") );
1212*cdf0e10cSrcweir         buf.append( OUString::unacquired( &type->pTypeName ) );
1213*cdf0e10cSrcweir         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] unsupported type!") );
1214*cdf0e10cSrcweir         buf.append( jni.get_stack_trace() );
1215*cdf0e10cSrcweir         throw BridgeRuntimeError( buf.makeStringAndClear() );
1216*cdf0e10cSrcweir     }
1217*cdf0e10cSrcweir     }
1218*cdf0e10cSrcweir }
1219*cdf0e10cSrcweir 
1220*cdf0e10cSrcweir //##############################################################################
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir //______________________________________________________________________________
1223*cdf0e10cSrcweir void Bridge::map_to_java(
1224*cdf0e10cSrcweir     JNI_context const & jni,
1225*cdf0e10cSrcweir     jvalue * java_data, void const * uno_data,
1226*cdf0e10cSrcweir     typelib_TypeDescriptionReference * type,
1227*cdf0e10cSrcweir     JNI_type_info const * info /* maybe 0 */,
1228*cdf0e10cSrcweir     bool in_param, bool out_param,
1229*cdf0e10cSrcweir     bool special_wrapped_integral_types ) const
1230*cdf0e10cSrcweir {
1231*cdf0e10cSrcweir     switch (type->eTypeClass)
1232*cdf0e10cSrcweir     {
1233*cdf0e10cSrcweir     case typelib_TypeClass_CHAR:
1234*cdf0e10cSrcweir         if (out_param)
1235*cdf0e10cSrcweir         {
1236*cdf0e10cSrcweir             if (0 == java_data->l)
1237*cdf0e10cSrcweir             {
1238*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewCharArray( 1 ) );
1239*cdf0e10cSrcweir                 jni.ensure_no_exception();
1240*cdf0e10cSrcweir                 if (in_param)
1241*cdf0e10cSrcweir                 {
1242*cdf0e10cSrcweir                     jni->SetCharArrayRegion(
1243*cdf0e10cSrcweir                         (jcharArray) jo_ar.get(), 0, 1, (jchar *) uno_data );
1244*cdf0e10cSrcweir                     jni.ensure_no_exception();
1245*cdf0e10cSrcweir                 }
1246*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1247*cdf0e10cSrcweir             }
1248*cdf0e10cSrcweir             else
1249*cdf0e10cSrcweir             {
1250*cdf0e10cSrcweir                 if (in_param)
1251*cdf0e10cSrcweir                 {
1252*cdf0e10cSrcweir                     jni->SetCharArrayRegion(
1253*cdf0e10cSrcweir                         (jcharArray) java_data->l, 0, 1, (jchar *) uno_data );
1254*cdf0e10cSrcweir                     jni.ensure_no_exception();
1255*cdf0e10cSrcweir                 }
1256*cdf0e10cSrcweir             }
1257*cdf0e10cSrcweir         }
1258*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1259*cdf0e10cSrcweir         {
1260*cdf0e10cSrcweir             jvalue arg;
1261*cdf0e10cSrcweir             arg.c = *(jchar const *) uno_data;
1262*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1263*cdf0e10cSrcweir                 m_jni_info->m_class_Character,
1264*cdf0e10cSrcweir                 m_jni_info->m_ctor_Character_with_char, &arg );
1265*cdf0e10cSrcweir             jni.ensure_no_exception();
1266*cdf0e10cSrcweir         }
1267*cdf0e10cSrcweir         else
1268*cdf0e10cSrcweir         {
1269*cdf0e10cSrcweir             java_data->c = *(jchar const *) uno_data;
1270*cdf0e10cSrcweir         }
1271*cdf0e10cSrcweir         break;
1272*cdf0e10cSrcweir     case typelib_TypeClass_BOOLEAN:
1273*cdf0e10cSrcweir         if (out_param)
1274*cdf0e10cSrcweir         {
1275*cdf0e10cSrcweir             if (0 == java_data->l)
1276*cdf0e10cSrcweir             {
1277*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewBooleanArray( 1 ) );
1278*cdf0e10cSrcweir                 jni.ensure_no_exception();
1279*cdf0e10cSrcweir                 if (in_param)
1280*cdf0e10cSrcweir                 {
1281*cdf0e10cSrcweir                     jni->SetBooleanArrayRegion(
1282*cdf0e10cSrcweir                         (jbooleanArray) jo_ar.get(),
1283*cdf0e10cSrcweir                         0, 1, (jboolean *) uno_data );
1284*cdf0e10cSrcweir                     jni.ensure_no_exception();
1285*cdf0e10cSrcweir                 }
1286*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1287*cdf0e10cSrcweir             }
1288*cdf0e10cSrcweir             else
1289*cdf0e10cSrcweir             {
1290*cdf0e10cSrcweir                 if (in_param)
1291*cdf0e10cSrcweir                 {
1292*cdf0e10cSrcweir                     jni->SetBooleanArrayRegion(
1293*cdf0e10cSrcweir                         (jbooleanArray) java_data->l,
1294*cdf0e10cSrcweir                         0, 1, (jboolean *) uno_data );
1295*cdf0e10cSrcweir                     jni.ensure_no_exception();
1296*cdf0e10cSrcweir                 }
1297*cdf0e10cSrcweir             }
1298*cdf0e10cSrcweir         }
1299*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1300*cdf0e10cSrcweir         {
1301*cdf0e10cSrcweir             jvalue arg;
1302*cdf0e10cSrcweir             arg.z = *(jboolean const *) uno_data;
1303*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1304*cdf0e10cSrcweir                 m_jni_info->m_class_Boolean,
1305*cdf0e10cSrcweir                 m_jni_info->m_ctor_Boolean_with_boolean, &arg );
1306*cdf0e10cSrcweir             jni.ensure_no_exception();
1307*cdf0e10cSrcweir         }
1308*cdf0e10cSrcweir         else
1309*cdf0e10cSrcweir         {
1310*cdf0e10cSrcweir             java_data->z = *(jboolean const *) uno_data;
1311*cdf0e10cSrcweir         }
1312*cdf0e10cSrcweir         break;
1313*cdf0e10cSrcweir     case typelib_TypeClass_BYTE:
1314*cdf0e10cSrcweir         if (out_param)
1315*cdf0e10cSrcweir         {
1316*cdf0e10cSrcweir             if (0 == java_data->l)
1317*cdf0e10cSrcweir             {
1318*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewByteArray( 1 ) );
1319*cdf0e10cSrcweir                 jni.ensure_no_exception();
1320*cdf0e10cSrcweir                 if (in_param)
1321*cdf0e10cSrcweir                 {
1322*cdf0e10cSrcweir                     jni->SetByteArrayRegion(
1323*cdf0e10cSrcweir                         (jbyteArray) jo_ar.get(), 0, 1, (jbyte *) uno_data );
1324*cdf0e10cSrcweir                     jni.ensure_no_exception();
1325*cdf0e10cSrcweir                 }
1326*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1327*cdf0e10cSrcweir             }
1328*cdf0e10cSrcweir             else
1329*cdf0e10cSrcweir             {
1330*cdf0e10cSrcweir                 if (in_param)
1331*cdf0e10cSrcweir                 {
1332*cdf0e10cSrcweir                     jni->SetByteArrayRegion(
1333*cdf0e10cSrcweir                         (jbyteArray) java_data->l, 0, 1, (jbyte *) uno_data );
1334*cdf0e10cSrcweir                     jni.ensure_no_exception();
1335*cdf0e10cSrcweir                 }
1336*cdf0e10cSrcweir             }
1337*cdf0e10cSrcweir         }
1338*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1339*cdf0e10cSrcweir         {
1340*cdf0e10cSrcweir             jvalue arg;
1341*cdf0e10cSrcweir             arg.b = *(jbyte const *) uno_data;
1342*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1343*cdf0e10cSrcweir                 m_jni_info->m_class_Byte,
1344*cdf0e10cSrcweir                 m_jni_info->m_ctor_Byte_with_byte, &arg );
1345*cdf0e10cSrcweir             jni.ensure_no_exception();
1346*cdf0e10cSrcweir         }
1347*cdf0e10cSrcweir         else
1348*cdf0e10cSrcweir         {
1349*cdf0e10cSrcweir             java_data->b = *(jbyte const *) uno_data;
1350*cdf0e10cSrcweir         }
1351*cdf0e10cSrcweir         break;
1352*cdf0e10cSrcweir     case typelib_TypeClass_SHORT:
1353*cdf0e10cSrcweir     case typelib_TypeClass_UNSIGNED_SHORT:
1354*cdf0e10cSrcweir         if (out_param)
1355*cdf0e10cSrcweir         {
1356*cdf0e10cSrcweir             if (0 == java_data->l)
1357*cdf0e10cSrcweir             {
1358*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewShortArray( 1 ) );
1359*cdf0e10cSrcweir                 jni.ensure_no_exception();
1360*cdf0e10cSrcweir                 if (in_param)
1361*cdf0e10cSrcweir                 {
1362*cdf0e10cSrcweir                     jni->SetShortArrayRegion(
1363*cdf0e10cSrcweir                         (jshortArray) jo_ar.get(), 0, 1, (jshort *) uno_data );
1364*cdf0e10cSrcweir                     jni.ensure_no_exception();
1365*cdf0e10cSrcweir                 }
1366*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1367*cdf0e10cSrcweir             }
1368*cdf0e10cSrcweir             else
1369*cdf0e10cSrcweir             {
1370*cdf0e10cSrcweir                 if (in_param)
1371*cdf0e10cSrcweir                 {
1372*cdf0e10cSrcweir                     jni->SetShortArrayRegion(
1373*cdf0e10cSrcweir                         (jshortArray) java_data->l, 0, 1, (jshort *) uno_data );
1374*cdf0e10cSrcweir                     jni.ensure_no_exception();
1375*cdf0e10cSrcweir                 }
1376*cdf0e10cSrcweir             }
1377*cdf0e10cSrcweir         }
1378*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1379*cdf0e10cSrcweir         {
1380*cdf0e10cSrcweir             jvalue arg;
1381*cdf0e10cSrcweir             arg.s = *(jshort const *) uno_data;
1382*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1383*cdf0e10cSrcweir                 m_jni_info->m_class_Short,
1384*cdf0e10cSrcweir                 m_jni_info->m_ctor_Short_with_short, &arg );
1385*cdf0e10cSrcweir             jni.ensure_no_exception();
1386*cdf0e10cSrcweir         }
1387*cdf0e10cSrcweir         else
1388*cdf0e10cSrcweir         {
1389*cdf0e10cSrcweir             java_data->s = *(jshort const *) uno_data;
1390*cdf0e10cSrcweir         }
1391*cdf0e10cSrcweir         break;
1392*cdf0e10cSrcweir     case typelib_TypeClass_LONG:
1393*cdf0e10cSrcweir     case typelib_TypeClass_UNSIGNED_LONG:
1394*cdf0e10cSrcweir         if (out_param)
1395*cdf0e10cSrcweir         {
1396*cdf0e10cSrcweir             if (0 == java_data->l)
1397*cdf0e10cSrcweir             {
1398*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewIntArray( 1 ) );
1399*cdf0e10cSrcweir                 jni.ensure_no_exception();
1400*cdf0e10cSrcweir                 if (in_param)
1401*cdf0e10cSrcweir                 {
1402*cdf0e10cSrcweir                     jni->SetIntArrayRegion(
1403*cdf0e10cSrcweir                         (jintArray) jo_ar.get(), 0, 1, (jint *) uno_data );
1404*cdf0e10cSrcweir                     jni.ensure_no_exception();
1405*cdf0e10cSrcweir                 }
1406*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1407*cdf0e10cSrcweir             }
1408*cdf0e10cSrcweir             else
1409*cdf0e10cSrcweir             {
1410*cdf0e10cSrcweir                 if (in_param)
1411*cdf0e10cSrcweir                 {
1412*cdf0e10cSrcweir                     jni->SetIntArrayRegion(
1413*cdf0e10cSrcweir                         (jintArray) java_data->l, 0, 1, (jint *) uno_data );
1414*cdf0e10cSrcweir                     jni.ensure_no_exception();
1415*cdf0e10cSrcweir                 }
1416*cdf0e10cSrcweir             }
1417*cdf0e10cSrcweir         }
1418*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1419*cdf0e10cSrcweir         {
1420*cdf0e10cSrcweir             jvalue arg;
1421*cdf0e10cSrcweir             arg.i = *(jint const *) uno_data;
1422*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1423*cdf0e10cSrcweir                 m_jni_info->m_class_Integer,
1424*cdf0e10cSrcweir                 m_jni_info->m_ctor_Integer_with_int, &arg );
1425*cdf0e10cSrcweir             jni.ensure_no_exception();
1426*cdf0e10cSrcweir         }
1427*cdf0e10cSrcweir         else
1428*cdf0e10cSrcweir         {
1429*cdf0e10cSrcweir             java_data->i = *(jint const *) uno_data;
1430*cdf0e10cSrcweir         }
1431*cdf0e10cSrcweir         break;
1432*cdf0e10cSrcweir     case typelib_TypeClass_HYPER:
1433*cdf0e10cSrcweir     case typelib_TypeClass_UNSIGNED_HYPER:
1434*cdf0e10cSrcweir         if (out_param)
1435*cdf0e10cSrcweir         {
1436*cdf0e10cSrcweir             if (0 == java_data->l)
1437*cdf0e10cSrcweir             {
1438*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewLongArray( 1 ) );
1439*cdf0e10cSrcweir                 jni.ensure_no_exception();
1440*cdf0e10cSrcweir                 if (in_param)
1441*cdf0e10cSrcweir                 {
1442*cdf0e10cSrcweir                     jni->SetLongArrayRegion(
1443*cdf0e10cSrcweir                         (jlongArray)jo_ar.get(), 0, 1, (jlong *) uno_data );
1444*cdf0e10cSrcweir                     jni.ensure_no_exception();
1445*cdf0e10cSrcweir                 }
1446*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1447*cdf0e10cSrcweir             }
1448*cdf0e10cSrcweir             else
1449*cdf0e10cSrcweir             {
1450*cdf0e10cSrcweir                 if (in_param)
1451*cdf0e10cSrcweir                 {
1452*cdf0e10cSrcweir                     jni->SetLongArrayRegion(
1453*cdf0e10cSrcweir                         (jlongArray)java_data->l, 0, 1, (jlong *) uno_data );
1454*cdf0e10cSrcweir                     jni.ensure_no_exception();
1455*cdf0e10cSrcweir                 }
1456*cdf0e10cSrcweir             }
1457*cdf0e10cSrcweir         }
1458*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1459*cdf0e10cSrcweir         {
1460*cdf0e10cSrcweir             jvalue arg;
1461*cdf0e10cSrcweir             arg.j = *(jlong const *) uno_data;
1462*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1463*cdf0e10cSrcweir                 m_jni_info->m_class_Long,
1464*cdf0e10cSrcweir                 m_jni_info->m_ctor_Long_with_long, &arg );
1465*cdf0e10cSrcweir             jni.ensure_no_exception();
1466*cdf0e10cSrcweir         }
1467*cdf0e10cSrcweir         else
1468*cdf0e10cSrcweir         {
1469*cdf0e10cSrcweir             java_data->j = *(jlong const *) uno_data;
1470*cdf0e10cSrcweir         }
1471*cdf0e10cSrcweir         break;
1472*cdf0e10cSrcweir     case typelib_TypeClass_FLOAT:
1473*cdf0e10cSrcweir         if (out_param)
1474*cdf0e10cSrcweir         {
1475*cdf0e10cSrcweir             if (0 == java_data->l)
1476*cdf0e10cSrcweir             {
1477*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewFloatArray( 1 ) );
1478*cdf0e10cSrcweir                 jni.ensure_no_exception();
1479*cdf0e10cSrcweir                 if (in_param)
1480*cdf0e10cSrcweir                 {
1481*cdf0e10cSrcweir                     jni->SetFloatArrayRegion(
1482*cdf0e10cSrcweir                         (jfloatArray) jo_ar.get(), 0, 1, (jfloat *) uno_data );
1483*cdf0e10cSrcweir                     jni.ensure_no_exception();
1484*cdf0e10cSrcweir                 }
1485*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1486*cdf0e10cSrcweir             }
1487*cdf0e10cSrcweir             else
1488*cdf0e10cSrcweir             {
1489*cdf0e10cSrcweir                 if (in_param)
1490*cdf0e10cSrcweir                 {
1491*cdf0e10cSrcweir                     jni->SetFloatArrayRegion(
1492*cdf0e10cSrcweir                         (jfloatArray) java_data->l, 0, 1, (jfloat *) uno_data );
1493*cdf0e10cSrcweir                     jni.ensure_no_exception();
1494*cdf0e10cSrcweir                 }
1495*cdf0e10cSrcweir             }
1496*cdf0e10cSrcweir         }
1497*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1498*cdf0e10cSrcweir         {
1499*cdf0e10cSrcweir             jvalue arg;
1500*cdf0e10cSrcweir             arg.f = *(jfloat const *) uno_data;
1501*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1502*cdf0e10cSrcweir                 m_jni_info->m_class_Float,
1503*cdf0e10cSrcweir                 m_jni_info->m_ctor_Float_with_float, &arg );
1504*cdf0e10cSrcweir             jni.ensure_no_exception();
1505*cdf0e10cSrcweir         }
1506*cdf0e10cSrcweir         else
1507*cdf0e10cSrcweir         {
1508*cdf0e10cSrcweir             java_data->f = *(jfloat const *) uno_data;
1509*cdf0e10cSrcweir         }
1510*cdf0e10cSrcweir         break;
1511*cdf0e10cSrcweir     case typelib_TypeClass_DOUBLE:
1512*cdf0e10cSrcweir         if (out_param)
1513*cdf0e10cSrcweir         {
1514*cdf0e10cSrcweir             if (0 == java_data->l)
1515*cdf0e10cSrcweir             {
1516*cdf0e10cSrcweir                 JLocalAutoRef jo_ar( jni, jni->NewDoubleArray( 1 ) );
1517*cdf0e10cSrcweir                 jni.ensure_no_exception();
1518*cdf0e10cSrcweir                 if (in_param)
1519*cdf0e10cSrcweir                 {
1520*cdf0e10cSrcweir                     jni->SetDoubleArrayRegion(
1521*cdf0e10cSrcweir                         (jdoubleArray) jo_ar.get(),
1522*cdf0e10cSrcweir                         0, 1, (jdouble *) uno_data );
1523*cdf0e10cSrcweir                     jni.ensure_no_exception();
1524*cdf0e10cSrcweir                 }
1525*cdf0e10cSrcweir                 java_data->l = jo_ar.release();
1526*cdf0e10cSrcweir             }
1527*cdf0e10cSrcweir             else
1528*cdf0e10cSrcweir             {
1529*cdf0e10cSrcweir                 if (in_param)
1530*cdf0e10cSrcweir                 {
1531*cdf0e10cSrcweir                     jni->SetDoubleArrayRegion(
1532*cdf0e10cSrcweir                         (jdoubleArray) java_data->l,
1533*cdf0e10cSrcweir                         0, 1, (jdouble *) uno_data );
1534*cdf0e10cSrcweir                     jni.ensure_no_exception();
1535*cdf0e10cSrcweir                 }
1536*cdf0e10cSrcweir             }
1537*cdf0e10cSrcweir         }
1538*cdf0e10cSrcweir         else if (special_wrapped_integral_types)
1539*cdf0e10cSrcweir         {
1540*cdf0e10cSrcweir             jvalue arg;
1541*cdf0e10cSrcweir             arg.d = *(double const *)uno_data;
1542*cdf0e10cSrcweir             java_data->l = jni->NewObjectA(
1543*cdf0e10cSrcweir                 m_jni_info->m_class_Double,
1544*cdf0e10cSrcweir                 m_jni_info->m_ctor_Double_with_double, &arg );
1545*cdf0e10cSrcweir             jni.ensure_no_exception();
1546*cdf0e10cSrcweir         }
1547*cdf0e10cSrcweir         else
1548*cdf0e10cSrcweir         {
1549*cdf0e10cSrcweir             java_data->d = *(jdouble const *) uno_data;
1550*cdf0e10cSrcweir         }
1551*cdf0e10cSrcweir         break;
1552*cdf0e10cSrcweir     case typelib_TypeClass_STRING:
1553*cdf0e10cSrcweir     {
1554*cdf0e10cSrcweir         if (out_param)
1555*cdf0e10cSrcweir         {
1556*cdf0e10cSrcweir             JLocalAutoRef jo_in( jni );
1557*cdf0e10cSrcweir             if (in_param)
1558*cdf0e10cSrcweir             {
1559*cdf0e10cSrcweir                 jo_in.reset(
1560*cdf0e10cSrcweir                     ustring_to_jstring(
1561*cdf0e10cSrcweir                         jni, *(rtl_uString * const *) uno_data ) );
1562*cdf0e10cSrcweir             }
1563*cdf0e10cSrcweir             if (0 == java_data->l)
1564*cdf0e10cSrcweir             {
1565*cdf0e10cSrcweir                 java_data->l = jni->NewObjectArray(
1566*cdf0e10cSrcweir                     1, m_jni_info->m_class_String, jo_in.get() );
1567*cdf0e10cSrcweir                 jni.ensure_no_exception();
1568*cdf0e10cSrcweir             }
1569*cdf0e10cSrcweir             else
1570*cdf0e10cSrcweir             {
1571*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
1572*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_in.get() );
1573*cdf0e10cSrcweir                 jni.ensure_no_exception();
1574*cdf0e10cSrcweir             }
1575*cdf0e10cSrcweir         }
1576*cdf0e10cSrcweir         else
1577*cdf0e10cSrcweir         {
1578*cdf0e10cSrcweir             OSL_ASSERT( in_param );
1579*cdf0e10cSrcweir             java_data->l =
1580*cdf0e10cSrcweir                 ustring_to_jstring( jni, *(rtl_uString * const *) uno_data );
1581*cdf0e10cSrcweir         }
1582*cdf0e10cSrcweir         break;
1583*cdf0e10cSrcweir     }
1584*cdf0e10cSrcweir     case typelib_TypeClass_TYPE:
1585*cdf0e10cSrcweir     {
1586*cdf0e10cSrcweir         if (out_param)
1587*cdf0e10cSrcweir         {
1588*cdf0e10cSrcweir             JLocalAutoRef jo_in( jni );
1589*cdf0e10cSrcweir             if (in_param)
1590*cdf0e10cSrcweir             {
1591*cdf0e10cSrcweir                 jo_in.reset(
1592*cdf0e10cSrcweir                     create_type(
1593*cdf0e10cSrcweir                         jni,
1594*cdf0e10cSrcweir                         *(typelib_TypeDescriptionReference * const *) uno_data )
1595*cdf0e10cSrcweir                     );
1596*cdf0e10cSrcweir             }
1597*cdf0e10cSrcweir             if (0 == java_data->l)
1598*cdf0e10cSrcweir             {
1599*cdf0e10cSrcweir                 java_data->l = jni->NewObjectArray(
1600*cdf0e10cSrcweir                     1, m_jni_info->m_class_Type, jo_in.get() );
1601*cdf0e10cSrcweir                 jni.ensure_no_exception();
1602*cdf0e10cSrcweir             }
1603*cdf0e10cSrcweir             else
1604*cdf0e10cSrcweir             {
1605*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
1606*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_in.get() );
1607*cdf0e10cSrcweir                 jni.ensure_no_exception();
1608*cdf0e10cSrcweir             }
1609*cdf0e10cSrcweir         }
1610*cdf0e10cSrcweir         else
1611*cdf0e10cSrcweir         {
1612*cdf0e10cSrcweir             OSL_ASSERT( in_param );
1613*cdf0e10cSrcweir             java_data->l =
1614*cdf0e10cSrcweir                 create_type(
1615*cdf0e10cSrcweir                     jni,
1616*cdf0e10cSrcweir                     *(typelib_TypeDescriptionReference * const *) uno_data );
1617*cdf0e10cSrcweir         }
1618*cdf0e10cSrcweir         break;
1619*cdf0e10cSrcweir     }
1620*cdf0e10cSrcweir     case typelib_TypeClass_ANY:
1621*cdf0e10cSrcweir     {
1622*cdf0e10cSrcweir         JLocalAutoRef jo_any( jni );
1623*cdf0e10cSrcweir         if (in_param)
1624*cdf0e10cSrcweir         {
1625*cdf0e10cSrcweir             uno_Any const * pAny = (uno_Any const *)uno_data;
1626*cdf0e10cSrcweir 
1627*cdf0e10cSrcweir #if defined BRIDGES_JNI_UNO_FORCE_BOXED_ANY
1628*cdf0e10cSrcweir             if (typelib_TypeClass_VOID == pAny->pType->eTypeClass)
1629*cdf0e10cSrcweir             {
1630*cdf0e10cSrcweir                 jo_any.reset(
1631*cdf0e10cSrcweir                     jni->NewLocalRef( m_jni_info->m_object_Any_VOID ) );
1632*cdf0e10cSrcweir             }
1633*cdf0e10cSrcweir             else
1634*cdf0e10cSrcweir             {
1635*cdf0e10cSrcweir                 jvalue args[ 2 ];
1636*cdf0e10cSrcweir                 map_to_java(
1637*cdf0e10cSrcweir                     jni, &args[ 1 ], pAny->pData, pAny->pType, 0,
1638*cdf0e10cSrcweir                     true /* in */, false /* no out */,
1639*cdf0e10cSrcweir                     true /* create integral wrappers */ );
1640*cdf0e10cSrcweir                 jo_any.reset( args[ 1 ].l );
1641*cdf0e10cSrcweir                 // build up com.sun.star.uno.Any
1642*cdf0e10cSrcweir                 JLocalAutoRef jo_type( jni, create_type( jni, pAny->pType ) );
1643*cdf0e10cSrcweir                 args[ 0 ].l = jo_type.get();
1644*cdf0e10cSrcweir                 jo_any.reset(
1645*cdf0e10cSrcweir                     jni->NewObjectA(
1646*cdf0e10cSrcweir                         m_jni_info->m_class_Any,
1647*cdf0e10cSrcweir                         m_jni_info->m_ctor_Any_with_Type_Object, args ) );
1648*cdf0e10cSrcweir                 jni.ensure_no_exception();
1649*cdf0e10cSrcweir             }
1650*cdf0e10cSrcweir #else
1651*cdf0e10cSrcweir             switch (pAny->pType->eTypeClass)
1652*cdf0e10cSrcweir             {
1653*cdf0e10cSrcweir             case typelib_TypeClass_VOID:
1654*cdf0e10cSrcweir                 jo_any.reset(
1655*cdf0e10cSrcweir                     jni->NewLocalRef( m_jni_info->m_object_Any_VOID ) );
1656*cdf0e10cSrcweir                 break;
1657*cdf0e10cSrcweir             case typelib_TypeClass_UNSIGNED_SHORT:
1658*cdf0e10cSrcweir             {
1659*cdf0e10cSrcweir                 jvalue args[ 2 ];
1660*cdf0e10cSrcweir                 args[ 0 ].s = *(jshort const *) &pAny->pReserved;
1661*cdf0e10cSrcweir                 JLocalAutoRef jo_val(
1662*cdf0e10cSrcweir                     jni, jni->NewObjectA(
1663*cdf0e10cSrcweir                         m_jni_info->m_class_Short,
1664*cdf0e10cSrcweir                         m_jni_info->m_ctor_Short_with_short, args ) );
1665*cdf0e10cSrcweir                 jni.ensure_no_exception();
1666*cdf0e10cSrcweir                 // box up in com.sun.star.uno.Any
1667*cdf0e10cSrcweir                 args[ 0 ].l = m_jni_info->m_object_Type_UNSIGNED_SHORT;
1668*cdf0e10cSrcweir                 args[ 1 ].l = jo_val.get();
1669*cdf0e10cSrcweir                 jo_any.reset(
1670*cdf0e10cSrcweir                     jni->NewObjectA(
1671*cdf0e10cSrcweir                         m_jni_info->m_class_Any,
1672*cdf0e10cSrcweir                         m_jni_info->m_ctor_Any_with_Type_Object, args ) );
1673*cdf0e10cSrcweir                 jni.ensure_no_exception();
1674*cdf0e10cSrcweir                 break;
1675*cdf0e10cSrcweir             }
1676*cdf0e10cSrcweir             case typelib_TypeClass_UNSIGNED_LONG:
1677*cdf0e10cSrcweir             {
1678*cdf0e10cSrcweir                 jvalue args[ 2 ];
1679*cdf0e10cSrcweir                 args[ 0 ].i = *(jint const *) &pAny->pReserved;
1680*cdf0e10cSrcweir                 JLocalAutoRef jo_val(
1681*cdf0e10cSrcweir                     jni, jni->NewObjectA(
1682*cdf0e10cSrcweir                         m_jni_info->m_class_Integer,
1683*cdf0e10cSrcweir                         m_jni_info->m_ctor_Integer_with_int, args ) );
1684*cdf0e10cSrcweir                 jni.ensure_no_exception();
1685*cdf0e10cSrcweir                 // box up in com.sun.star.uno.Any
1686*cdf0e10cSrcweir                 args[ 0 ].l = m_jni_info->m_object_Type_UNSIGNED_LONG;
1687*cdf0e10cSrcweir                 args[ 1 ].l = jo_val.get();
1688*cdf0e10cSrcweir                 jo_any.reset(
1689*cdf0e10cSrcweir                     jni->NewObjectA(
1690*cdf0e10cSrcweir                         m_jni_info->m_class_Any,
1691*cdf0e10cSrcweir                         m_jni_info->m_ctor_Any_with_Type_Object, args ) );
1692*cdf0e10cSrcweir                 jni.ensure_no_exception();
1693*cdf0e10cSrcweir                 break;
1694*cdf0e10cSrcweir             }
1695*cdf0e10cSrcweir             case typelib_TypeClass_UNSIGNED_HYPER:
1696*cdf0e10cSrcweir             {
1697*cdf0e10cSrcweir                 jvalue args[ 2 ];
1698*cdf0e10cSrcweir                 args[ 0 ].j = *(jlong const *) pAny->pData;
1699*cdf0e10cSrcweir                 JLocalAutoRef jo_val(
1700*cdf0e10cSrcweir                     jni, jni->NewObjectA(
1701*cdf0e10cSrcweir                         m_jni_info->m_class_Long,
1702*cdf0e10cSrcweir                         m_jni_info->m_ctor_Long_with_long, args ) );
1703*cdf0e10cSrcweir                 jni.ensure_no_exception();
1704*cdf0e10cSrcweir                 // box up in com.sun.star.uno.Any
1705*cdf0e10cSrcweir                 args[ 0 ].l = m_jni_info->m_object_Type_UNSIGNED_HYPER;
1706*cdf0e10cSrcweir                 args[ 1 ].l = jo_val.get();
1707*cdf0e10cSrcweir                 jo_any.reset(
1708*cdf0e10cSrcweir                     jni->NewObjectA(
1709*cdf0e10cSrcweir                         m_jni_info->m_class_Any,
1710*cdf0e10cSrcweir                         m_jni_info->m_ctor_Any_with_Type_Object, args ) );
1711*cdf0e10cSrcweir                 jni.ensure_no_exception();
1712*cdf0e10cSrcweir                 break;
1713*cdf0e10cSrcweir             }
1714*cdf0e10cSrcweir             case typelib_TypeClass_STRING: // opt strings
1715*cdf0e10cSrcweir                 jo_any.reset( ustring_to_jstring(
1716*cdf0e10cSrcweir                                   jni, (rtl_uString *) pAny->pReserved ) );
1717*cdf0e10cSrcweir                 break;
1718*cdf0e10cSrcweir             case typelib_TypeClass_SEQUENCE:
1719*cdf0e10cSrcweir             {
1720*cdf0e10cSrcweir                 jvalue java_data2;
1721*cdf0e10cSrcweir                 // prefetch sequence td
1722*cdf0e10cSrcweir                 TypeDescr seq_td( pAny->pType );
1723*cdf0e10cSrcweir                 map_to_java(
1724*cdf0e10cSrcweir                     jni, &java_data2, pAny->pData, seq_td.get()->pWeakRef, 0,
1725*cdf0e10cSrcweir                     true /* in */, false /* no out */,
1726*cdf0e10cSrcweir                     true /* create integral wrappers */ );
1727*cdf0e10cSrcweir                 jo_any.reset( java_data2.l );
1728*cdf0e10cSrcweir 
1729*cdf0e10cSrcweir                 // determine inner element type
1730*cdf0e10cSrcweir                 ::com::sun::star::uno::Type element_type(
1731*cdf0e10cSrcweir                     ((typelib_IndirectTypeDescription *)seq_td.get())->pType );
1732*cdf0e10cSrcweir                 while (typelib_TypeClass_SEQUENCE ==
1733*cdf0e10cSrcweir                          element_type.getTypeLibType()->eTypeClass)
1734*cdf0e10cSrcweir                 {
1735*cdf0e10cSrcweir                     TypeDescr element_td( element_type.getTypeLibType() );
1736*cdf0e10cSrcweir                     typelib_typedescriptionreference_assign(
1737*cdf0e10cSrcweir                         reinterpret_cast< typelib_TypeDescriptionReference ** >(
1738*cdf0e10cSrcweir                             &element_type ),
1739*cdf0e10cSrcweir                         ((typelib_IndirectTypeDescription *)element_td.get())
1740*cdf0e10cSrcweir                           ->pType );
1741*cdf0e10cSrcweir                 }
1742*cdf0e10cSrcweir                 // box up only if unsigned element type
1743*cdf0e10cSrcweir                 switch (element_type.getTypeLibType()->eTypeClass)
1744*cdf0e10cSrcweir                 {
1745*cdf0e10cSrcweir                 case typelib_TypeClass_UNSIGNED_SHORT:
1746*cdf0e10cSrcweir                 case typelib_TypeClass_UNSIGNED_LONG:
1747*cdf0e10cSrcweir                 case typelib_TypeClass_UNSIGNED_HYPER:
1748*cdf0e10cSrcweir                 {
1749*cdf0e10cSrcweir                     jvalue args[ 2 ];
1750*cdf0e10cSrcweir                     JLocalAutoRef jo_type(
1751*cdf0e10cSrcweir                         jni, create_type( jni, seq_td.get()->pWeakRef ) );
1752*cdf0e10cSrcweir                     args[ 0 ].l = jo_type.get();
1753*cdf0e10cSrcweir                     args[ 1 ].l = jo_any.get();
1754*cdf0e10cSrcweir                     jo_any.reset(
1755*cdf0e10cSrcweir                         jni->NewObjectA(
1756*cdf0e10cSrcweir                             m_jni_info->m_class_Any,
1757*cdf0e10cSrcweir                             m_jni_info->m_ctor_Any_with_Type_Object, args ) );
1758*cdf0e10cSrcweir                     jni.ensure_no_exception();
1759*cdf0e10cSrcweir                     break;
1760*cdf0e10cSrcweir                 }
1761*cdf0e10cSrcweir                 default:
1762*cdf0e10cSrcweir                     break;
1763*cdf0e10cSrcweir                 }
1764*cdf0e10cSrcweir                 break;
1765*cdf0e10cSrcweir             }
1766*cdf0e10cSrcweir             case typelib_TypeClass_INTERFACE:
1767*cdf0e10cSrcweir             {
1768*cdf0e10cSrcweir                 uno_Interface * pUnoI = (uno_Interface *)pAny->pReserved;
1769*cdf0e10cSrcweir                 if (is_XInterface( pAny->pType ))
1770*cdf0e10cSrcweir                 {
1771*cdf0e10cSrcweir                     if (0 != pUnoI)
1772*cdf0e10cSrcweir                     {
1773*cdf0e10cSrcweir                         jo_any.reset(
1774*cdf0e10cSrcweir                             map_to_java(
1775*cdf0e10cSrcweir                                 jni, pUnoI,
1776*cdf0e10cSrcweir                                 m_jni_info->m_XInterface_type_info ) );
1777*cdf0e10cSrcweir                     }
1778*cdf0e10cSrcweir                     // else: empty XInterface ref maps to null-ref
1779*cdf0e10cSrcweir                 }
1780*cdf0e10cSrcweir                 else
1781*cdf0e10cSrcweir                 {
1782*cdf0e10cSrcweir                     JNI_interface_type_info const * iface_info =
1783*cdf0e10cSrcweir                         static_cast< JNI_interface_type_info const * >(
1784*cdf0e10cSrcweir                             m_jni_info->get_type_info( jni, pAny->pType ) );
1785*cdf0e10cSrcweir                     if (0 != pUnoI)
1786*cdf0e10cSrcweir                     {
1787*cdf0e10cSrcweir                         jo_any.reset( map_to_java( jni, pUnoI, iface_info ) );
1788*cdf0e10cSrcweir                     }
1789*cdf0e10cSrcweir                     // box up in com.sun.star.uno.Any
1790*cdf0e10cSrcweir                     jvalue args[ 2 ];
1791*cdf0e10cSrcweir                     args[ 0 ].l = iface_info->m_type;
1792*cdf0e10cSrcweir                     args[ 1 ].l = jo_any.get();
1793*cdf0e10cSrcweir                     jo_any.reset(
1794*cdf0e10cSrcweir                         jni->NewObjectA(
1795*cdf0e10cSrcweir                             m_jni_info->m_class_Any,
1796*cdf0e10cSrcweir                             m_jni_info->m_ctor_Any_with_Type_Object, args ) );
1797*cdf0e10cSrcweir                     jni.ensure_no_exception();
1798*cdf0e10cSrcweir                 }
1799*cdf0e10cSrcweir                 break;
1800*cdf0e10cSrcweir             }
1801*cdf0e10cSrcweir             case typelib_TypeClass_STRUCT:
1802*cdf0e10cSrcweir             {
1803*cdf0e10cSrcweir                 // Do not lose information about type arguments of instantiated
1804*cdf0e10cSrcweir                 // polymorphic struct types:
1805*cdf0e10cSrcweir                 rtl::OUString const & name = rtl::OUString::unacquired(
1806*cdf0e10cSrcweir                     &pAny->pType->pTypeName);
1807*cdf0e10cSrcweir                 OSL_ASSERT(name.getLength() > 0);
1808*cdf0e10cSrcweir                 if (name[name.getLength() - 1] == '>')
1809*cdf0e10cSrcweir                 {
1810*cdf0e10cSrcweir                     // Box up in com.sun.star.uno.Any:
1811*cdf0e10cSrcweir                     JLocalAutoRef jo_type(jni, create_type(jni, pAny->pType));
1812*cdf0e10cSrcweir                     jvalue java_data2;
1813*cdf0e10cSrcweir                     map_to_java(
1814*cdf0e10cSrcweir                         jni, &java_data2, pAny->pData, pAny->pType, 0, true,
1815*cdf0e10cSrcweir                         false);
1816*cdf0e10cSrcweir                     jo_any.reset(java_data2.l);
1817*cdf0e10cSrcweir                     jvalue args[2];
1818*cdf0e10cSrcweir                     args[0].l = jo_type.get();
1819*cdf0e10cSrcweir                     args[1].l = jo_any.get();
1820*cdf0e10cSrcweir                     jo_any.reset(
1821*cdf0e10cSrcweir                         jni->NewObjectA(
1822*cdf0e10cSrcweir                             m_jni_info->m_class_Any,
1823*cdf0e10cSrcweir                             m_jni_info->m_ctor_Any_with_Type_Object, args));
1824*cdf0e10cSrcweir                     jni.ensure_no_exception();
1825*cdf0e10cSrcweir                     break;
1826*cdf0e10cSrcweir                 }
1827*cdf0e10cSrcweir                 // fall through
1828*cdf0e10cSrcweir             }
1829*cdf0e10cSrcweir             default:
1830*cdf0e10cSrcweir             {
1831*cdf0e10cSrcweir                 jvalue java_data2;
1832*cdf0e10cSrcweir                 map_to_java(
1833*cdf0e10cSrcweir                     jni, &java_data2, pAny->pData, pAny->pType, 0,
1834*cdf0e10cSrcweir                     true /* in */, false /* no out */,
1835*cdf0e10cSrcweir                     true /* create integral wrappers */ );
1836*cdf0e10cSrcweir                 jo_any.reset( java_data2.l );
1837*cdf0e10cSrcweir                 break;
1838*cdf0e10cSrcweir             }
1839*cdf0e10cSrcweir             }
1840*cdf0e10cSrcweir #endif
1841*cdf0e10cSrcweir         }
1842*cdf0e10cSrcweir 
1843*cdf0e10cSrcweir         if (out_param)
1844*cdf0e10cSrcweir         {
1845*cdf0e10cSrcweir             if (0 == java_data->l)
1846*cdf0e10cSrcweir             {
1847*cdf0e10cSrcweir                 java_data->l = jni->NewObjectArray(
1848*cdf0e10cSrcweir                     1, m_jni_info->m_class_Object, jo_any.get() );
1849*cdf0e10cSrcweir                 jni.ensure_no_exception();
1850*cdf0e10cSrcweir             }
1851*cdf0e10cSrcweir             else
1852*cdf0e10cSrcweir             {
1853*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
1854*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_any.get() );
1855*cdf0e10cSrcweir                 jni.ensure_no_exception();
1856*cdf0e10cSrcweir             }
1857*cdf0e10cSrcweir         }
1858*cdf0e10cSrcweir         else
1859*cdf0e10cSrcweir         {
1860*cdf0e10cSrcweir             java_data->l = jo_any.release();
1861*cdf0e10cSrcweir         }
1862*cdf0e10cSrcweir         break;
1863*cdf0e10cSrcweir     }
1864*cdf0e10cSrcweir     case typelib_TypeClass_ENUM:
1865*cdf0e10cSrcweir     {
1866*cdf0e10cSrcweir         OUString const & type_name = OUString::unacquired( &type->pTypeName );
1867*cdf0e10cSrcweir         OString class_name(
1868*cdf0e10cSrcweir             OUStringToOString( type_name, RTL_TEXTENCODING_JAVA_UTF8 ) );
1869*cdf0e10cSrcweir         JLocalAutoRef jo_enum_class(
1870*cdf0e10cSrcweir             jni, find_class( jni, class_name.getStr() ) );
1871*cdf0e10cSrcweir 
1872*cdf0e10cSrcweir         JLocalAutoRef jo_enum( jni );
1873*cdf0e10cSrcweir         if (in_param)
1874*cdf0e10cSrcweir         {
1875*cdf0e10cSrcweir             // call static <enum_class>.fromInt( int )
1876*cdf0e10cSrcweir             OStringBuffer sig_buf( 5 + class_name.getLength() );
1877*cdf0e10cSrcweir             sig_buf.append( RTL_CONSTASCII_STRINGPARAM("(I)L") );
1878*cdf0e10cSrcweir             sig_buf.append( class_name.replace( '.', '/' ) );
1879*cdf0e10cSrcweir             sig_buf.append( ';' );
1880*cdf0e10cSrcweir             OString sig( sig_buf.makeStringAndClear() );
1881*cdf0e10cSrcweir             jmethodID method_id = jni->GetStaticMethodID(
1882*cdf0e10cSrcweir                 (jclass) jo_enum_class.get(), "fromInt", sig.getStr() );
1883*cdf0e10cSrcweir             jni.ensure_no_exception();
1884*cdf0e10cSrcweir             OSL_ASSERT( 0 != method_id );
1885*cdf0e10cSrcweir 
1886*cdf0e10cSrcweir             jvalue arg;
1887*cdf0e10cSrcweir             arg.i = *(jint const *) uno_data;
1888*cdf0e10cSrcweir             jo_enum.reset(
1889*cdf0e10cSrcweir                 jni->CallStaticObjectMethodA(
1890*cdf0e10cSrcweir                     (jclass) jo_enum_class.get(), method_id, &arg ) );
1891*cdf0e10cSrcweir             jni.ensure_no_exception();
1892*cdf0e10cSrcweir         }
1893*cdf0e10cSrcweir         if (out_param)
1894*cdf0e10cSrcweir         {
1895*cdf0e10cSrcweir             if (0 == java_data->l)
1896*cdf0e10cSrcweir             {
1897*cdf0e10cSrcweir                 java_data->l = jni->NewObjectArray(
1898*cdf0e10cSrcweir                     1, (jclass) jo_enum_class.get(), jo_enum.get() );
1899*cdf0e10cSrcweir                 jni.ensure_no_exception();
1900*cdf0e10cSrcweir             }
1901*cdf0e10cSrcweir             else
1902*cdf0e10cSrcweir             {
1903*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
1904*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_enum.get() );
1905*cdf0e10cSrcweir                 jni.ensure_no_exception();
1906*cdf0e10cSrcweir             }
1907*cdf0e10cSrcweir         }
1908*cdf0e10cSrcweir         else
1909*cdf0e10cSrcweir         {
1910*cdf0e10cSrcweir             java_data->l = jo_enum.release();
1911*cdf0e10cSrcweir         }
1912*cdf0e10cSrcweir         break;
1913*cdf0e10cSrcweir     }
1914*cdf0e10cSrcweir     case typelib_TypeClass_STRUCT:
1915*cdf0e10cSrcweir     case typelib_TypeClass_EXCEPTION:
1916*cdf0e10cSrcweir     {
1917*cdf0e10cSrcweir         if (0 == info)
1918*cdf0e10cSrcweir             info = m_jni_info->get_type_info( jni, type );
1919*cdf0e10cSrcweir         JNI_compound_type_info const * comp_info =
1920*cdf0e10cSrcweir             static_cast< JNI_compound_type_info const * >( info );
1921*cdf0e10cSrcweir 
1922*cdf0e10cSrcweir         JLocalAutoRef jo_comp( jni );
1923*cdf0e10cSrcweir         if (in_param)
1924*cdf0e10cSrcweir         {
1925*cdf0e10cSrcweir             if (typelib_TypeClass_EXCEPTION == type->eTypeClass)
1926*cdf0e10cSrcweir             {
1927*cdf0e10cSrcweir                 JLocalAutoRef jo_message(
1928*cdf0e10cSrcweir                     jni, ustring_to_jstring( jni, *(rtl_uString **)uno_data ) );
1929*cdf0e10cSrcweir                 jvalue arg;
1930*cdf0e10cSrcweir                 arg.l = jo_message.get();
1931*cdf0e10cSrcweir                 jo_comp.reset(
1932*cdf0e10cSrcweir                     jni->NewObjectA(
1933*cdf0e10cSrcweir                         comp_info->m_class, comp_info->m_exc_ctor, &arg ) );
1934*cdf0e10cSrcweir                 jni.ensure_no_exception();
1935*cdf0e10cSrcweir             }
1936*cdf0e10cSrcweir             else
1937*cdf0e10cSrcweir             {
1938*cdf0e10cSrcweir                 jo_comp.reset( jni->AllocObject( comp_info->m_class ) );
1939*cdf0e10cSrcweir                 jni.ensure_no_exception();
1940*cdf0e10cSrcweir             }
1941*cdf0e10cSrcweir 
1942*cdf0e10cSrcweir             for ( JNI_compound_type_info const * linfo = comp_info;
1943*cdf0e10cSrcweir                   0 != linfo;
1944*cdf0e10cSrcweir                   linfo = static_cast< JNI_compound_type_info const * >(
1945*cdf0e10cSrcweir                       linfo->m_base ) )
1946*cdf0e10cSrcweir             {
1947*cdf0e10cSrcweir                 typelib_CompoundTypeDescription * comp_td =
1948*cdf0e10cSrcweir                     (typelib_CompoundTypeDescription *)linfo->m_td.get();
1949*cdf0e10cSrcweir                 typelib_TypeDescriptionReference ** ppMemberTypeRefs =
1950*cdf0e10cSrcweir                     comp_td->ppTypeRefs;
1951*cdf0e10cSrcweir                 sal_Int32 * pMemberOffsets = comp_td->pMemberOffsets;
1952*cdf0e10cSrcweir                 bool polymorphic
1953*cdf0e10cSrcweir                     = comp_td->aBase.eTypeClass == typelib_TypeClass_STRUCT
1954*cdf0e10cSrcweir                     && reinterpret_cast< typelib_StructTypeDescription * >(
1955*cdf0e10cSrcweir                         comp_td)->pParameterizedTypes != 0;
1956*cdf0e10cSrcweir                 for ( sal_Int32 nPos = comp_td->nMembers; nPos--; )
1957*cdf0e10cSrcweir                 {
1958*cdf0e10cSrcweir                     jfieldID field_id = linfo->m_fields[ nPos ];
1959*cdf0e10cSrcweir                     if (0 != field_id)
1960*cdf0e10cSrcweir                     {
1961*cdf0e10cSrcweir                         void const * p =
1962*cdf0e10cSrcweir                             (char const *)uno_data + pMemberOffsets[ nPos ];
1963*cdf0e10cSrcweir                         typelib_TypeDescriptionReference * member_type =
1964*cdf0e10cSrcweir                             ppMemberTypeRefs[ nPos ];
1965*cdf0e10cSrcweir                         bool parameterizedType = polymorphic
1966*cdf0e10cSrcweir                             && (reinterpret_cast<
1967*cdf0e10cSrcweir                                 typelib_StructTypeDescription * >(comp_td)->
1968*cdf0e10cSrcweir                                 pParameterizedTypes[nPos]);
1969*cdf0e10cSrcweir                         switch (member_type->eTypeClass)
1970*cdf0e10cSrcweir                         {
1971*cdf0e10cSrcweir                         case typelib_TypeClass_CHAR:
1972*cdf0e10cSrcweir                             if (parameterizedType) {
1973*cdf0e10cSrcweir                                 jvalue arg;
1974*cdf0e10cSrcweir                                 arg.c = *(jchar const *) p;
1975*cdf0e10cSrcweir                                 JLocalAutoRef jo(
1976*cdf0e10cSrcweir                                     jni,
1977*cdf0e10cSrcweir                                     jni->NewObjectA(
1978*cdf0e10cSrcweir                                         m_jni_info->m_class_Character,
1979*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Character_with_char,
1980*cdf0e10cSrcweir                                         &arg ) );
1981*cdf0e10cSrcweir                                 jni.ensure_no_exception();
1982*cdf0e10cSrcweir                                 jni->SetObjectField(
1983*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
1984*cdf0e10cSrcweir                             } else {
1985*cdf0e10cSrcweir                                 jni->SetCharField(
1986*cdf0e10cSrcweir                                     jo_comp.get(),
1987*cdf0e10cSrcweir                                     field_id, *(jchar const *) p );
1988*cdf0e10cSrcweir                             }
1989*cdf0e10cSrcweir                             break;
1990*cdf0e10cSrcweir                         case typelib_TypeClass_BOOLEAN:
1991*cdf0e10cSrcweir                             if (parameterizedType) {
1992*cdf0e10cSrcweir                                 jvalue arg;
1993*cdf0e10cSrcweir                                 arg.z = *(jboolean const *) p;
1994*cdf0e10cSrcweir                                 JLocalAutoRef jo(
1995*cdf0e10cSrcweir                                     jni,
1996*cdf0e10cSrcweir                                     jni->NewObjectA(
1997*cdf0e10cSrcweir                                         m_jni_info->m_class_Boolean,
1998*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Boolean_with_boolean,
1999*cdf0e10cSrcweir                                         &arg ) );
2000*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2001*cdf0e10cSrcweir                                 jni->SetObjectField(
2002*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2003*cdf0e10cSrcweir                             } else {
2004*cdf0e10cSrcweir                                 jni->SetBooleanField(
2005*cdf0e10cSrcweir                                     jo_comp.get(),
2006*cdf0e10cSrcweir                                     field_id, *(jboolean const *) p );
2007*cdf0e10cSrcweir                             }
2008*cdf0e10cSrcweir                             break;
2009*cdf0e10cSrcweir                         case typelib_TypeClass_BYTE:
2010*cdf0e10cSrcweir                             if (parameterizedType) {
2011*cdf0e10cSrcweir                                 jvalue arg;
2012*cdf0e10cSrcweir                                 arg.b = *(jbyte const *) p;
2013*cdf0e10cSrcweir                                 JLocalAutoRef jo(
2014*cdf0e10cSrcweir                                     jni,
2015*cdf0e10cSrcweir                                     jni->NewObjectA(
2016*cdf0e10cSrcweir                                         m_jni_info->m_class_Byte,
2017*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Byte_with_byte,
2018*cdf0e10cSrcweir                                         &arg ) );
2019*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2020*cdf0e10cSrcweir                                 jni->SetObjectField(
2021*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2022*cdf0e10cSrcweir                             } else {
2023*cdf0e10cSrcweir                                 jni->SetByteField(
2024*cdf0e10cSrcweir                                     jo_comp.get(),
2025*cdf0e10cSrcweir                                     field_id, *(jbyte const *) p );
2026*cdf0e10cSrcweir                             }
2027*cdf0e10cSrcweir                             break;
2028*cdf0e10cSrcweir                         case typelib_TypeClass_SHORT:
2029*cdf0e10cSrcweir                         case typelib_TypeClass_UNSIGNED_SHORT:
2030*cdf0e10cSrcweir                             if (parameterizedType) {
2031*cdf0e10cSrcweir                                 jvalue arg;
2032*cdf0e10cSrcweir                                 arg.s = *(jshort const *) p;
2033*cdf0e10cSrcweir                                 JLocalAutoRef jo(
2034*cdf0e10cSrcweir                                     jni,
2035*cdf0e10cSrcweir                                     jni->NewObjectA(
2036*cdf0e10cSrcweir                                         m_jni_info->m_class_Short,
2037*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Short_with_short,
2038*cdf0e10cSrcweir                                         &arg ) );
2039*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2040*cdf0e10cSrcweir                                 jni->SetObjectField(
2041*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2042*cdf0e10cSrcweir                             } else {
2043*cdf0e10cSrcweir                                 jni->SetShortField(
2044*cdf0e10cSrcweir                                     jo_comp.get(),
2045*cdf0e10cSrcweir                                     field_id, *(jshort const *) p );
2046*cdf0e10cSrcweir                             }
2047*cdf0e10cSrcweir                             break;
2048*cdf0e10cSrcweir                         case typelib_TypeClass_LONG:
2049*cdf0e10cSrcweir                         case typelib_TypeClass_UNSIGNED_LONG:
2050*cdf0e10cSrcweir                             if (parameterizedType) {
2051*cdf0e10cSrcweir                                 jvalue arg;
2052*cdf0e10cSrcweir                                 arg.i = *(jint const *) p;
2053*cdf0e10cSrcweir                                 JLocalAutoRef jo(
2054*cdf0e10cSrcweir                                     jni,
2055*cdf0e10cSrcweir                                     jni->NewObjectA(
2056*cdf0e10cSrcweir                                         m_jni_info->m_class_Integer,
2057*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Integer_with_int,
2058*cdf0e10cSrcweir                                         &arg ) );
2059*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2060*cdf0e10cSrcweir                                 jni->SetObjectField(
2061*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2062*cdf0e10cSrcweir                             } else {
2063*cdf0e10cSrcweir                                 jni->SetIntField(
2064*cdf0e10cSrcweir                                     jo_comp.get(),
2065*cdf0e10cSrcweir                                     field_id, *(jint const *) p );
2066*cdf0e10cSrcweir                             }
2067*cdf0e10cSrcweir                             break;
2068*cdf0e10cSrcweir                         case typelib_TypeClass_HYPER:
2069*cdf0e10cSrcweir                         case typelib_TypeClass_UNSIGNED_HYPER:
2070*cdf0e10cSrcweir                             if (parameterizedType) {
2071*cdf0e10cSrcweir                                 jvalue arg;
2072*cdf0e10cSrcweir                                 arg.j = *(jlong const *) p;
2073*cdf0e10cSrcweir                                 JLocalAutoRef jo(
2074*cdf0e10cSrcweir                                     jni,
2075*cdf0e10cSrcweir                                     jni->NewObjectA(
2076*cdf0e10cSrcweir                                         m_jni_info->m_class_Long,
2077*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Long_with_long,
2078*cdf0e10cSrcweir                                         &arg ) );
2079*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2080*cdf0e10cSrcweir                                 jni->SetObjectField(
2081*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2082*cdf0e10cSrcweir                             } else {
2083*cdf0e10cSrcweir                                 jni->SetLongField(
2084*cdf0e10cSrcweir                                     jo_comp.get(),
2085*cdf0e10cSrcweir                                     field_id, *(jlong const *) p );
2086*cdf0e10cSrcweir                             }
2087*cdf0e10cSrcweir                             break;
2088*cdf0e10cSrcweir                         case typelib_TypeClass_FLOAT:
2089*cdf0e10cSrcweir                             if (parameterizedType) {
2090*cdf0e10cSrcweir                                 jvalue arg;
2091*cdf0e10cSrcweir                                 arg.f = *(jfloat const *) p;
2092*cdf0e10cSrcweir                                 JLocalAutoRef jo(
2093*cdf0e10cSrcweir                                     jni,
2094*cdf0e10cSrcweir                                     jni->NewObjectA(
2095*cdf0e10cSrcweir                                         m_jni_info->m_class_Float,
2096*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Float_with_float,
2097*cdf0e10cSrcweir                                         &arg ) );
2098*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2099*cdf0e10cSrcweir                                 jni->SetObjectField(
2100*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2101*cdf0e10cSrcweir                             } else {
2102*cdf0e10cSrcweir                                 jni->SetFloatField(
2103*cdf0e10cSrcweir                                     jo_comp.get(),
2104*cdf0e10cSrcweir                                     field_id, *(jfloat const *) p );
2105*cdf0e10cSrcweir                             }
2106*cdf0e10cSrcweir                             break;
2107*cdf0e10cSrcweir                         case typelib_TypeClass_DOUBLE:
2108*cdf0e10cSrcweir                             if (parameterizedType) {
2109*cdf0e10cSrcweir                                 jvalue arg;
2110*cdf0e10cSrcweir                                 arg.d = *(jdouble const *) p;
2111*cdf0e10cSrcweir                                 JLocalAutoRef jo(
2112*cdf0e10cSrcweir                                     jni,
2113*cdf0e10cSrcweir                                     jni->NewObjectA(
2114*cdf0e10cSrcweir                                         m_jni_info->m_class_Double,
2115*cdf0e10cSrcweir                                         m_jni_info->m_ctor_Double_with_double,
2116*cdf0e10cSrcweir                                         &arg ) );
2117*cdf0e10cSrcweir                                 jni.ensure_no_exception();
2118*cdf0e10cSrcweir                                 jni->SetObjectField(
2119*cdf0e10cSrcweir                                     jo_comp.get(), field_id, jo.get() );
2120*cdf0e10cSrcweir                             } else {
2121*cdf0e10cSrcweir                                 jni->SetDoubleField(
2122*cdf0e10cSrcweir                                     jo_comp.get(),
2123*cdf0e10cSrcweir                                     field_id, *(jdouble const *) p );
2124*cdf0e10cSrcweir                             }
2125*cdf0e10cSrcweir                             break;
2126*cdf0e10cSrcweir                         case typelib_TypeClass_STRING: // string opt here
2127*cdf0e10cSrcweir                         {
2128*cdf0e10cSrcweir                             JLocalAutoRef jo_string(
2129*cdf0e10cSrcweir                                 jni, ustring_to_jstring(
2130*cdf0e10cSrcweir                                     jni, *(rtl_uString * const *) p ) );
2131*cdf0e10cSrcweir                             jni->SetObjectField(
2132*cdf0e10cSrcweir                                 jo_comp.get(), field_id, jo_string.get() );
2133*cdf0e10cSrcweir                             break;
2134*cdf0e10cSrcweir                         }
2135*cdf0e10cSrcweir                         default:
2136*cdf0e10cSrcweir                         {
2137*cdf0e10cSrcweir                             jvalue java_data2;
2138*cdf0e10cSrcweir                             map_to_java(
2139*cdf0e10cSrcweir                                 jni, &java_data2, p, member_type, 0,
2140*cdf0e10cSrcweir                                 true /* in */, false /* no out */ );
2141*cdf0e10cSrcweir                             JLocalAutoRef jo_obj( jni, java_data2.l );
2142*cdf0e10cSrcweir                             jni->SetObjectField(
2143*cdf0e10cSrcweir                                 jo_comp.get(), field_id, jo_obj.get() );
2144*cdf0e10cSrcweir                             break;
2145*cdf0e10cSrcweir                         }
2146*cdf0e10cSrcweir                         }
2147*cdf0e10cSrcweir                     }
2148*cdf0e10cSrcweir                 }
2149*cdf0e10cSrcweir             }
2150*cdf0e10cSrcweir         }
2151*cdf0e10cSrcweir         if (out_param)
2152*cdf0e10cSrcweir         {
2153*cdf0e10cSrcweir             if (0 == java_data->l)
2154*cdf0e10cSrcweir             {
2155*cdf0e10cSrcweir                 java_data->l =
2156*cdf0e10cSrcweir                     jni->NewObjectArray( 1, comp_info->m_class, jo_comp.get() );
2157*cdf0e10cSrcweir                 jni.ensure_no_exception();
2158*cdf0e10cSrcweir             }
2159*cdf0e10cSrcweir             else
2160*cdf0e10cSrcweir             {
2161*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
2162*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_comp.get() );
2163*cdf0e10cSrcweir                 jni.ensure_no_exception();
2164*cdf0e10cSrcweir             }
2165*cdf0e10cSrcweir         }
2166*cdf0e10cSrcweir         else
2167*cdf0e10cSrcweir         {
2168*cdf0e10cSrcweir             java_data->l = jo_comp.release();
2169*cdf0e10cSrcweir         }
2170*cdf0e10cSrcweir         break;
2171*cdf0e10cSrcweir     }
2172*cdf0e10cSrcweir     case typelib_TypeClass_SEQUENCE:
2173*cdf0e10cSrcweir     {
2174*cdf0e10cSrcweir         // xxx todo: possible opt for pure out sequences
2175*cdf0e10cSrcweir         JLocalAutoRef jo_ar( jni );
2176*cdf0e10cSrcweir 
2177*cdf0e10cSrcweir         sal_Int32 nElements;
2178*cdf0e10cSrcweir         uno_Sequence const * seq = 0;
2179*cdf0e10cSrcweir         if (in_param)
2180*cdf0e10cSrcweir         {
2181*cdf0e10cSrcweir             seq = *(uno_Sequence * const *)uno_data;
2182*cdf0e10cSrcweir             nElements = seq->nElements;
2183*cdf0e10cSrcweir         }
2184*cdf0e10cSrcweir         else
2185*cdf0e10cSrcweir         {
2186*cdf0e10cSrcweir             nElements = 0;
2187*cdf0e10cSrcweir         }
2188*cdf0e10cSrcweir 
2189*cdf0e10cSrcweir         TypeDescr td( type );
2190*cdf0e10cSrcweir         typelib_TypeDescriptionReference * element_type =
2191*cdf0e10cSrcweir             ((typelib_IndirectTypeDescription *)td.get())->pType;
2192*cdf0e10cSrcweir 
2193*cdf0e10cSrcweir         switch (element_type->eTypeClass)
2194*cdf0e10cSrcweir         {
2195*cdf0e10cSrcweir         case typelib_TypeClass_CHAR:
2196*cdf0e10cSrcweir             jo_ar.reset( jni->NewCharArray( nElements ) );
2197*cdf0e10cSrcweir             jni.ensure_no_exception();
2198*cdf0e10cSrcweir             if (0 < nElements)
2199*cdf0e10cSrcweir             {
2200*cdf0e10cSrcweir                 jni->SetCharArrayRegion(
2201*cdf0e10cSrcweir                     (jcharArray) jo_ar.get(),
2202*cdf0e10cSrcweir                     0, nElements, (jchar *) seq->elements );
2203*cdf0e10cSrcweir                 jni.ensure_no_exception();
2204*cdf0e10cSrcweir             }
2205*cdf0e10cSrcweir             break;
2206*cdf0e10cSrcweir         case typelib_TypeClass_BOOLEAN:
2207*cdf0e10cSrcweir             jo_ar.reset( jni->NewBooleanArray( nElements ) );
2208*cdf0e10cSrcweir             jni.ensure_no_exception();
2209*cdf0e10cSrcweir             if (0 < nElements)
2210*cdf0e10cSrcweir             {
2211*cdf0e10cSrcweir                 jni->SetBooleanArrayRegion(
2212*cdf0e10cSrcweir                     (jbooleanArray) jo_ar.get(),
2213*cdf0e10cSrcweir                     0, nElements, (jboolean *) seq->elements );
2214*cdf0e10cSrcweir                 jni.ensure_no_exception();
2215*cdf0e10cSrcweir             }
2216*cdf0e10cSrcweir             break;
2217*cdf0e10cSrcweir         case typelib_TypeClass_BYTE:
2218*cdf0e10cSrcweir             jo_ar.reset( jni->NewByteArray( nElements ) );
2219*cdf0e10cSrcweir             jni.ensure_no_exception();
2220*cdf0e10cSrcweir             if (0 < nElements)
2221*cdf0e10cSrcweir             {
2222*cdf0e10cSrcweir                 jni->SetByteArrayRegion(
2223*cdf0e10cSrcweir                     (jbyteArray) jo_ar.get(),
2224*cdf0e10cSrcweir                     0, nElements, (jbyte *) seq->elements );
2225*cdf0e10cSrcweir                 jni.ensure_no_exception();
2226*cdf0e10cSrcweir             }
2227*cdf0e10cSrcweir             break;
2228*cdf0e10cSrcweir         case typelib_TypeClass_SHORT:
2229*cdf0e10cSrcweir         case typelib_TypeClass_UNSIGNED_SHORT:
2230*cdf0e10cSrcweir             jo_ar.reset( jni->NewShortArray( nElements ) );
2231*cdf0e10cSrcweir             jni.ensure_no_exception();
2232*cdf0e10cSrcweir             if (0 < nElements)
2233*cdf0e10cSrcweir             {
2234*cdf0e10cSrcweir                 jni->SetShortArrayRegion(
2235*cdf0e10cSrcweir                     (jshortArray) jo_ar.get(),
2236*cdf0e10cSrcweir                     0, nElements, (jshort *) seq->elements );
2237*cdf0e10cSrcweir                 jni.ensure_no_exception();
2238*cdf0e10cSrcweir             }
2239*cdf0e10cSrcweir             break;
2240*cdf0e10cSrcweir         case typelib_TypeClass_LONG:
2241*cdf0e10cSrcweir         case typelib_TypeClass_UNSIGNED_LONG:
2242*cdf0e10cSrcweir             jo_ar.reset( jni->NewIntArray( nElements ) );
2243*cdf0e10cSrcweir             jni.ensure_no_exception();
2244*cdf0e10cSrcweir             if (0 < nElements)
2245*cdf0e10cSrcweir             {
2246*cdf0e10cSrcweir                 jni->SetIntArrayRegion(
2247*cdf0e10cSrcweir                     (jintArray) jo_ar.get(),
2248*cdf0e10cSrcweir                     0, nElements, (jint *) seq->elements );
2249*cdf0e10cSrcweir                 jni.ensure_no_exception();
2250*cdf0e10cSrcweir             }
2251*cdf0e10cSrcweir             break;
2252*cdf0e10cSrcweir         case typelib_TypeClass_HYPER:
2253*cdf0e10cSrcweir         case typelib_TypeClass_UNSIGNED_HYPER:
2254*cdf0e10cSrcweir             jo_ar.reset( jni->NewLongArray( nElements ) );
2255*cdf0e10cSrcweir             jni.ensure_no_exception();
2256*cdf0e10cSrcweir             if (0 < nElements)
2257*cdf0e10cSrcweir             {
2258*cdf0e10cSrcweir                 jni->SetLongArrayRegion(
2259*cdf0e10cSrcweir                     (jlongArray) jo_ar.get(),
2260*cdf0e10cSrcweir                     0, nElements, (jlong *) seq->elements );
2261*cdf0e10cSrcweir                 jni.ensure_no_exception();
2262*cdf0e10cSrcweir             }
2263*cdf0e10cSrcweir             break;
2264*cdf0e10cSrcweir         case typelib_TypeClass_FLOAT:
2265*cdf0e10cSrcweir             jo_ar.reset( jni->NewFloatArray( nElements ) );
2266*cdf0e10cSrcweir             jni.ensure_no_exception();
2267*cdf0e10cSrcweir             if (0 < nElements)
2268*cdf0e10cSrcweir             {
2269*cdf0e10cSrcweir                 jni->SetFloatArrayRegion(
2270*cdf0e10cSrcweir                     (jfloatArray) jo_ar.get(),
2271*cdf0e10cSrcweir                     0, nElements, (jfloat *) seq->elements );
2272*cdf0e10cSrcweir                 jni.ensure_no_exception();
2273*cdf0e10cSrcweir             }
2274*cdf0e10cSrcweir             break;
2275*cdf0e10cSrcweir         case typelib_TypeClass_DOUBLE:
2276*cdf0e10cSrcweir             jo_ar.reset( jni->NewDoubleArray( nElements ) );
2277*cdf0e10cSrcweir             jni.ensure_no_exception();
2278*cdf0e10cSrcweir             if (0 < nElements)
2279*cdf0e10cSrcweir             {
2280*cdf0e10cSrcweir                 jni->SetDoubleArrayRegion(
2281*cdf0e10cSrcweir                     (jdoubleArray) jo_ar.get(),
2282*cdf0e10cSrcweir                     0, nElements, (jdouble *) seq->elements );
2283*cdf0e10cSrcweir                 jni.ensure_no_exception();
2284*cdf0e10cSrcweir             }
2285*cdf0e10cSrcweir             break;
2286*cdf0e10cSrcweir         case typelib_TypeClass_STRING:
2287*cdf0e10cSrcweir             jo_ar.reset(
2288*cdf0e10cSrcweir                 jni->NewObjectArray(
2289*cdf0e10cSrcweir                     nElements, m_jni_info->m_class_String, 0 ) );
2290*cdf0e10cSrcweir             jni.ensure_no_exception();
2291*cdf0e10cSrcweir             if (in_param)
2292*cdf0e10cSrcweir             {
2293*cdf0e10cSrcweir                 rtl_uString * const * pp =
2294*cdf0e10cSrcweir                     (rtl_uString * const *) seq->elements;
2295*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2296*cdf0e10cSrcweir                 {
2297*cdf0e10cSrcweir                     JLocalAutoRef jo_string(
2298*cdf0e10cSrcweir                         jni, ustring_to_jstring( jni, pp[ nPos ] ) );
2299*cdf0e10cSrcweir                     jni->SetObjectArrayElement(
2300*cdf0e10cSrcweir                         (jobjectArray) jo_ar.get(), nPos, jo_string.get() );
2301*cdf0e10cSrcweir                     jni.ensure_no_exception();
2302*cdf0e10cSrcweir                 }
2303*cdf0e10cSrcweir             }
2304*cdf0e10cSrcweir             break;
2305*cdf0e10cSrcweir         case typelib_TypeClass_TYPE:
2306*cdf0e10cSrcweir             jo_ar.reset(
2307*cdf0e10cSrcweir                 jni->NewObjectArray( nElements, m_jni_info->m_class_Type, 0 ) );
2308*cdf0e10cSrcweir             jni.ensure_no_exception();
2309*cdf0e10cSrcweir             if (in_param)
2310*cdf0e10cSrcweir             {
2311*cdf0e10cSrcweir                 typelib_TypeDescriptionReference * const * pp =
2312*cdf0e10cSrcweir                     (typelib_TypeDescriptionReference * const *)seq->elements;
2313*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2314*cdf0e10cSrcweir                 {
2315*cdf0e10cSrcweir                     jvalue val;
2316*cdf0e10cSrcweir                     map_to_java(
2317*cdf0e10cSrcweir                         jni, &val, &pp[ nPos ], element_type, 0,
2318*cdf0e10cSrcweir                         true /* in */, false /* no out */ );
2319*cdf0e10cSrcweir                     JLocalAutoRef jo_element( jni, val.l );
2320*cdf0e10cSrcweir                     jni->SetObjectArrayElement(
2321*cdf0e10cSrcweir                         (jobjectArray) jo_ar.get(), nPos, jo_element.get() );
2322*cdf0e10cSrcweir                     jni.ensure_no_exception();
2323*cdf0e10cSrcweir                 }
2324*cdf0e10cSrcweir             }
2325*cdf0e10cSrcweir             break;
2326*cdf0e10cSrcweir         case typelib_TypeClass_ANY:
2327*cdf0e10cSrcweir             jo_ar.reset(
2328*cdf0e10cSrcweir                 jni->NewObjectArray(
2329*cdf0e10cSrcweir                     nElements, m_jni_info->m_class_Object, 0 ) );
2330*cdf0e10cSrcweir             jni.ensure_no_exception();
2331*cdf0e10cSrcweir             if (in_param)
2332*cdf0e10cSrcweir             {
2333*cdf0e10cSrcweir                 uno_Any const * p = (uno_Any const *)seq->elements;
2334*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2335*cdf0e10cSrcweir                 {
2336*cdf0e10cSrcweir                     jvalue val;
2337*cdf0e10cSrcweir                     map_to_java(
2338*cdf0e10cSrcweir                         jni, &val, &p[ nPos ], element_type, 0,
2339*cdf0e10cSrcweir                         true /* in */, false /* no out */ );
2340*cdf0e10cSrcweir                     JLocalAutoRef jo_element( jni, val.l );
2341*cdf0e10cSrcweir                     jni->SetObjectArrayElement(
2342*cdf0e10cSrcweir                         (jobjectArray) jo_ar.get(), nPos, jo_element.get() );
2343*cdf0e10cSrcweir                     jni.ensure_no_exception();
2344*cdf0e10cSrcweir                 }
2345*cdf0e10cSrcweir             }
2346*cdf0e10cSrcweir             break;
2347*cdf0e10cSrcweir         case typelib_TypeClass_ENUM:
2348*cdf0e10cSrcweir         {
2349*cdf0e10cSrcweir             OUString const & element_type_name =
2350*cdf0e10cSrcweir                 OUString::unacquired( &element_type->pTypeName );
2351*cdf0e10cSrcweir             OString class_name(
2352*cdf0e10cSrcweir                 OUStringToOString(
2353*cdf0e10cSrcweir                     element_type_name, RTL_TEXTENCODING_JAVA_UTF8 ) );
2354*cdf0e10cSrcweir             JLocalAutoRef jo_enum_class(
2355*cdf0e10cSrcweir                 jni, find_class( jni, class_name.getStr() ) );
2356*cdf0e10cSrcweir 
2357*cdf0e10cSrcweir             jo_ar.reset(
2358*cdf0e10cSrcweir                 jni->NewObjectArray(
2359*cdf0e10cSrcweir                     nElements, (jclass) jo_enum_class.get(), 0 ) );
2360*cdf0e10cSrcweir             jni.ensure_no_exception();
2361*cdf0e10cSrcweir 
2362*cdf0e10cSrcweir             if (0 < nElements)
2363*cdf0e10cSrcweir             {
2364*cdf0e10cSrcweir                 // call static <enum_class>.fromInt( int )
2365*cdf0e10cSrcweir                 OStringBuffer sig_buf( 5 + class_name.getLength() );
2366*cdf0e10cSrcweir                 sig_buf.append( RTL_CONSTASCII_STRINGPARAM("(I)L") );
2367*cdf0e10cSrcweir                 sig_buf.append( class_name.replace( '.', '/' ) );
2368*cdf0e10cSrcweir                 sig_buf.append( ';' );
2369*cdf0e10cSrcweir                 OString sig( sig_buf.makeStringAndClear() );
2370*cdf0e10cSrcweir                 jmethodID method_id = jni->GetStaticMethodID(
2371*cdf0e10cSrcweir                     (jclass) jo_enum_class.get(), "fromInt", sig.getStr() );
2372*cdf0e10cSrcweir                 jni.ensure_no_exception();
2373*cdf0e10cSrcweir                 OSL_ASSERT( 0 != method_id );
2374*cdf0e10cSrcweir 
2375*cdf0e10cSrcweir                 sal_Int32 const * p = (sal_Int32 const *)seq->elements;
2376*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2377*cdf0e10cSrcweir                 {
2378*cdf0e10cSrcweir                     jvalue arg;
2379*cdf0e10cSrcweir                     arg.i = p[ nPos ];
2380*cdf0e10cSrcweir                     JLocalAutoRef jo_enum(
2381*cdf0e10cSrcweir                         jni, jni->CallStaticObjectMethodA(
2382*cdf0e10cSrcweir                             (jclass) jo_enum_class.get(), method_id, &arg ) );
2383*cdf0e10cSrcweir                     jni.ensure_no_exception();
2384*cdf0e10cSrcweir                     jni->SetObjectArrayElement(
2385*cdf0e10cSrcweir                         (jobjectArray) jo_ar.get(), nPos, jo_enum.get() );
2386*cdf0e10cSrcweir                     jni.ensure_no_exception();
2387*cdf0e10cSrcweir                 }
2388*cdf0e10cSrcweir             }
2389*cdf0e10cSrcweir             break;
2390*cdf0e10cSrcweir         }
2391*cdf0e10cSrcweir         case typelib_TypeClass_STRUCT:
2392*cdf0e10cSrcweir         case typelib_TypeClass_EXCEPTION:
2393*cdf0e10cSrcweir         {
2394*cdf0e10cSrcweir             JNI_type_info const * element_info =
2395*cdf0e10cSrcweir                 m_jni_info->get_type_info( jni, element_type );
2396*cdf0e10cSrcweir 
2397*cdf0e10cSrcweir             jo_ar.reset(
2398*cdf0e10cSrcweir                 jni->NewObjectArray( nElements, element_info->m_class, 0 ) );
2399*cdf0e10cSrcweir             jni.ensure_no_exception();
2400*cdf0e10cSrcweir 
2401*cdf0e10cSrcweir             if (0 < nElements)
2402*cdf0e10cSrcweir             {
2403*cdf0e10cSrcweir                 char * p = (char *)seq->elements;
2404*cdf0e10cSrcweir                 sal_Int32 nSize = element_info->m_td.get()->nSize;
2405*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2406*cdf0e10cSrcweir                 {
2407*cdf0e10cSrcweir                     jvalue val;
2408*cdf0e10cSrcweir                     map_to_java(
2409*cdf0e10cSrcweir                         jni, &val, p + (nSize * nPos),
2410*cdf0e10cSrcweir                         element_type, element_info,
2411*cdf0e10cSrcweir                         true /* in */, false /* no out */ );
2412*cdf0e10cSrcweir                     JLocalAutoRef jo_element( jni, val.l );
2413*cdf0e10cSrcweir                     jni->SetObjectArrayElement(
2414*cdf0e10cSrcweir                         (jobjectArray) jo_ar.get(), nPos, jo_element.get() );
2415*cdf0e10cSrcweir                     jni.ensure_no_exception();
2416*cdf0e10cSrcweir                 }
2417*cdf0e10cSrcweir             }
2418*cdf0e10cSrcweir             break;
2419*cdf0e10cSrcweir         }
2420*cdf0e10cSrcweir         case typelib_TypeClass_SEQUENCE:
2421*cdf0e10cSrcweir         {
2422*cdf0e10cSrcweir             OStringBuffer buf( 64 );
2423*cdf0e10cSrcweir             JNI_info::append_sig(
2424*cdf0e10cSrcweir                 &buf, element_type, false /* use class XInterface */,
2425*cdf0e10cSrcweir                 false /* '.' instead of '/' */ );
2426*cdf0e10cSrcweir             OString class_name( buf.makeStringAndClear() );
2427*cdf0e10cSrcweir             JLocalAutoRef jo_seq_class(
2428*cdf0e10cSrcweir                 jni, find_class( jni, class_name.getStr() ) );
2429*cdf0e10cSrcweir 
2430*cdf0e10cSrcweir             jo_ar.reset(
2431*cdf0e10cSrcweir                 jni->NewObjectArray(
2432*cdf0e10cSrcweir                     nElements, (jclass) jo_seq_class.get(), 0 ) );
2433*cdf0e10cSrcweir             jni.ensure_no_exception();
2434*cdf0e10cSrcweir 
2435*cdf0e10cSrcweir             if (0 < nElements)
2436*cdf0e10cSrcweir             {
2437*cdf0e10cSrcweir                 TypeDescr element_td( element_type );
2438*cdf0e10cSrcweir                 uno_Sequence ** elements = (uno_Sequence **) seq->elements;
2439*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2440*cdf0e10cSrcweir                 {
2441*cdf0e10cSrcweir                     jvalue java_data2;
2442*cdf0e10cSrcweir                     map_to_java(
2443*cdf0e10cSrcweir                         jni, &java_data2, elements + nPos, element_type, 0,
2444*cdf0e10cSrcweir                         true /* in */, false /* no out */ );
2445*cdf0e10cSrcweir                     JLocalAutoRef jo_seq( jni, java_data2.l );
2446*cdf0e10cSrcweir                     jni->SetObjectArrayElement(
2447*cdf0e10cSrcweir                         (jobjectArray) jo_ar.get(), nPos, jo_seq.get() );
2448*cdf0e10cSrcweir                     jni.ensure_no_exception();
2449*cdf0e10cSrcweir                 }
2450*cdf0e10cSrcweir             }
2451*cdf0e10cSrcweir             break;
2452*cdf0e10cSrcweir         }
2453*cdf0e10cSrcweir         case typelib_TypeClass_INTERFACE:
2454*cdf0e10cSrcweir         {
2455*cdf0e10cSrcweir             JNI_interface_type_info const * iface_info =
2456*cdf0e10cSrcweir                 static_cast< JNI_interface_type_info const * >(
2457*cdf0e10cSrcweir                     m_jni_info->get_type_info( jni, element_type ) );
2458*cdf0e10cSrcweir 
2459*cdf0e10cSrcweir             jo_ar.reset(
2460*cdf0e10cSrcweir                 jni->NewObjectArray( nElements, iface_info->m_class, 0 ) );
2461*cdf0e10cSrcweir             jni.ensure_no_exception();
2462*cdf0e10cSrcweir 
2463*cdf0e10cSrcweir             if (0 < nElements)
2464*cdf0e10cSrcweir             {
2465*cdf0e10cSrcweir                 uno_Interface ** pp = (uno_Interface **)seq->elements;
2466*cdf0e10cSrcweir                 for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
2467*cdf0e10cSrcweir                 {
2468*cdf0e10cSrcweir                     uno_Interface * pUnoI = pp[ nPos ];
2469*cdf0e10cSrcweir                     if (0 != pUnoI)
2470*cdf0e10cSrcweir                     {
2471*cdf0e10cSrcweir                         JLocalAutoRef jo_element(
2472*cdf0e10cSrcweir                             jni, map_to_java( jni, pUnoI, iface_info ) );
2473*cdf0e10cSrcweir                         jni->SetObjectArrayElement(
2474*cdf0e10cSrcweir                             (jobjectArray) jo_ar.get(),
2475*cdf0e10cSrcweir                             nPos, jo_element.get() );
2476*cdf0e10cSrcweir                         jni.ensure_no_exception();
2477*cdf0e10cSrcweir                     }
2478*cdf0e10cSrcweir                 }
2479*cdf0e10cSrcweir             }
2480*cdf0e10cSrcweir             break;
2481*cdf0e10cSrcweir         }
2482*cdf0e10cSrcweir         default:
2483*cdf0e10cSrcweir         {
2484*cdf0e10cSrcweir             OUStringBuffer buf( 128 );
2485*cdf0e10cSrcweir             buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_java():") );
2486*cdf0e10cSrcweir             buf.append( OUString::unacquired( &type->pTypeName ) );
2487*cdf0e10cSrcweir             buf.appendAscii(
2488*cdf0e10cSrcweir                 RTL_CONSTASCII_STRINGPARAM("] unsupported element type: ") );
2489*cdf0e10cSrcweir             buf.append( OUString::unacquired( &element_type->pTypeName ) );
2490*cdf0e10cSrcweir             buf.append( jni.get_stack_trace() );
2491*cdf0e10cSrcweir             throw BridgeRuntimeError( buf.makeStringAndClear() );
2492*cdf0e10cSrcweir         }
2493*cdf0e10cSrcweir         }
2494*cdf0e10cSrcweir 
2495*cdf0e10cSrcweir         if (out_param)
2496*cdf0e10cSrcweir         {
2497*cdf0e10cSrcweir             if (0 == java_data->l)
2498*cdf0e10cSrcweir             {
2499*cdf0e10cSrcweir                 JLocalAutoRef jo_element_class(
2500*cdf0e10cSrcweir                     jni, jni->GetObjectClass( jo_ar.get() ) );
2501*cdf0e10cSrcweir                 if (in_param)
2502*cdf0e10cSrcweir                 {
2503*cdf0e10cSrcweir                     java_data->l = jni->NewObjectArray(
2504*cdf0e10cSrcweir                         1, (jclass) jo_element_class.get(), jo_ar.get() );
2505*cdf0e10cSrcweir                 }
2506*cdf0e10cSrcweir                 else
2507*cdf0e10cSrcweir                 {
2508*cdf0e10cSrcweir                     java_data->l = jni->NewObjectArray(
2509*cdf0e10cSrcweir                         1, (jclass) jo_element_class.get(), 0 );
2510*cdf0e10cSrcweir                 }
2511*cdf0e10cSrcweir                 jni.ensure_no_exception();
2512*cdf0e10cSrcweir             }
2513*cdf0e10cSrcweir             else
2514*cdf0e10cSrcweir             {
2515*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
2516*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_ar.get() );
2517*cdf0e10cSrcweir                 jni.ensure_no_exception();
2518*cdf0e10cSrcweir             }
2519*cdf0e10cSrcweir         }
2520*cdf0e10cSrcweir         else
2521*cdf0e10cSrcweir         {
2522*cdf0e10cSrcweir             java_data->l = jo_ar.release();
2523*cdf0e10cSrcweir         }
2524*cdf0e10cSrcweir         break;
2525*cdf0e10cSrcweir     }
2526*cdf0e10cSrcweir     case typelib_TypeClass_INTERFACE:
2527*cdf0e10cSrcweir     {
2528*cdf0e10cSrcweir         JLocalAutoRef jo_iface( jni );
2529*cdf0e10cSrcweir         if (in_param)
2530*cdf0e10cSrcweir         {
2531*cdf0e10cSrcweir             uno_Interface * pUnoI = *(uno_Interface * const *)uno_data;
2532*cdf0e10cSrcweir             if (0 != pUnoI)
2533*cdf0e10cSrcweir             {
2534*cdf0e10cSrcweir                 if (0 == info)
2535*cdf0e10cSrcweir                     info = m_jni_info->get_type_info( jni, type );
2536*cdf0e10cSrcweir                 JNI_interface_type_info const * iface_info =
2537*cdf0e10cSrcweir                     static_cast< JNI_interface_type_info const * >( info );
2538*cdf0e10cSrcweir                 jo_iface.reset( map_to_java( jni, pUnoI, iface_info ) );
2539*cdf0e10cSrcweir             }
2540*cdf0e10cSrcweir         }
2541*cdf0e10cSrcweir         if (out_param)
2542*cdf0e10cSrcweir         {
2543*cdf0e10cSrcweir             if (0 == java_data->l)
2544*cdf0e10cSrcweir             {
2545*cdf0e10cSrcweir                 if (0 == info)
2546*cdf0e10cSrcweir                     info = m_jni_info->get_type_info( jni, type );
2547*cdf0e10cSrcweir                 java_data->l =
2548*cdf0e10cSrcweir                     jni->NewObjectArray( 1, info->m_class, jo_iface.get() );
2549*cdf0e10cSrcweir                 jni.ensure_no_exception();
2550*cdf0e10cSrcweir             }
2551*cdf0e10cSrcweir             else
2552*cdf0e10cSrcweir             {
2553*cdf0e10cSrcweir                 jni->SetObjectArrayElement(
2554*cdf0e10cSrcweir                     (jobjectArray) java_data->l, 0, jo_iface.get() );
2555*cdf0e10cSrcweir                 jni.ensure_no_exception();
2556*cdf0e10cSrcweir             }
2557*cdf0e10cSrcweir         }
2558*cdf0e10cSrcweir         else
2559*cdf0e10cSrcweir         {
2560*cdf0e10cSrcweir             java_data->l = jo_iface.release();
2561*cdf0e10cSrcweir         }
2562*cdf0e10cSrcweir         break;
2563*cdf0e10cSrcweir     }
2564*cdf0e10cSrcweir     default:
2565*cdf0e10cSrcweir     {
2566*cdf0e10cSrcweir         OUStringBuffer buf( 128 );
2567*cdf0e10cSrcweir         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[map_to_java():") );
2568*cdf0e10cSrcweir         buf.append( OUString::unacquired( &type->pTypeName ) );
2569*cdf0e10cSrcweir         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] unsupported type!") );
2570*cdf0e10cSrcweir         buf.append( jni.get_stack_trace() );
2571*cdf0e10cSrcweir         throw BridgeRuntimeError( buf.makeStringAndClear() );
2572*cdf0e10cSrcweir     }
2573*cdf0e10cSrcweir     }
2574*cdf0e10cSrcweir }
2575*cdf0e10cSrcweir 
2576*cdf0e10cSrcweir }
2577