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