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