LCOV - code coverage report
Current view: top level - bridges/source/jni_uno - jni_data.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 1078 0.0 %
Date: 2014-04-14 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10