xref: /trunk/main/bridges/source/cpp_uno/msvc_win64_x86-64/uno2cpp.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*b146d3b3SDamjan Jovanovic /**************************************************************
2*b146d3b3SDamjan Jovanovic  *
3*b146d3b3SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*b146d3b3SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*b146d3b3SDamjan Jovanovic  * distributed with this work for additional information
6*b146d3b3SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*b146d3b3SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*b146d3b3SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*b146d3b3SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*b146d3b3SDamjan Jovanovic  *
11*b146d3b3SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*b146d3b3SDamjan Jovanovic  *
13*b146d3b3SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*b146d3b3SDamjan Jovanovic  * software distributed under the License is distributed on an
15*b146d3b3SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b146d3b3SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*b146d3b3SDamjan Jovanovic  * specific language governing permissions and limitations
18*b146d3b3SDamjan Jovanovic  * under the License.
19*b146d3b3SDamjan Jovanovic  *
20*b146d3b3SDamjan Jovanovic  *************************************************************/
21*b146d3b3SDamjan Jovanovic 
22*b146d3b3SDamjan Jovanovic 
23*b146d3b3SDamjan Jovanovic 
24*b146d3b3SDamjan Jovanovic // MARKER(update_precomp.py): autogen include statement, do not remove
25*b146d3b3SDamjan Jovanovic #include "precompiled_bridges.hxx"
26*b146d3b3SDamjan Jovanovic 
27*b146d3b3SDamjan Jovanovic #include <malloc.h>
28*b146d3b3SDamjan Jovanovic 
29*b146d3b3SDamjan Jovanovic #include <com/sun/star/uno/genfunc.hxx>
30*b146d3b3SDamjan Jovanovic #include <uno/data.h>
31*b146d3b3SDamjan Jovanovic 
32*b146d3b3SDamjan Jovanovic #include "bridges/cpp_uno/shared/bridge.hxx"
33*b146d3b3SDamjan Jovanovic #include "bridges/cpp_uno/shared/types.hxx"
34*b146d3b3SDamjan Jovanovic #include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
35*b146d3b3SDamjan Jovanovic #include "bridges/cpp_uno/shared/vtables.hxx"
36*b146d3b3SDamjan Jovanovic 
37*b146d3b3SDamjan Jovanovic #include "abi.hxx"
38*b146d3b3SDamjan Jovanovic #include "mscx.hxx"
39*b146d3b3SDamjan Jovanovic 
40*b146d3b3SDamjan Jovanovic using namespace ::rtl;
41*b146d3b3SDamjan Jovanovic using namespace ::com::sun::star::uno;
42*b146d3b3SDamjan Jovanovic 
43*b146d3b3SDamjan Jovanovic namespace
44*b146d3b3SDamjan Jovanovic {
45*b146d3b3SDamjan Jovanovic 
46*b146d3b3SDamjan Jovanovic //==================================================================================================
47*b146d3b3SDamjan Jovanovic extern "C" void callVirtualMethod(
48*b146d3b3SDamjan Jovanovic     void * pAdjustedThisPtr, sal_Int32 nVtableIndex,
49*b146d3b3SDamjan Jovanovic     void * pRegisterReturn, typelib_TypeClass eReturnTypeClass,
50*b146d3b3SDamjan Jovanovic     sal_uInt64 * pStackLongs, sal_uInt32 nStackLongs );
51*b146d3b3SDamjan Jovanovic 
52*b146d3b3SDamjan Jovanovic //==================================================================================================
cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,bridges::cpp_uno::shared::VtableSlot aVtableSlot,typelib_TypeDescriptionReference * pReturnTypeRef,sal_Int32 nParams,typelib_MethodParameter * pParams,void * pUnoReturn,void * pUnoArgs[],uno_Any ** ppUnoExc)53*b146d3b3SDamjan Jovanovic static void cpp_call(
54*b146d3b3SDamjan Jovanovic     bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
55*b146d3b3SDamjan Jovanovic     bridges::cpp_uno::shared::VtableSlot aVtableSlot,
56*b146d3b3SDamjan Jovanovic     typelib_TypeDescriptionReference * pReturnTypeRef,
57*b146d3b3SDamjan Jovanovic     sal_Int32 nParams, typelib_MethodParameter * pParams,
58*b146d3b3SDamjan Jovanovic     void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc ) throw ()
59*b146d3b3SDamjan Jovanovic {
60*b146d3b3SDamjan Jovanovic     // max space for: [complex ret ptr], values|ptr ...
61*b146d3b3SDamjan Jovanovic     sal_uInt64 *pStack = (sal_uInt64 *)alloca( (nParams + 3) * sizeof(sal_uInt64) );
62*b146d3b3SDamjan Jovanovic     sal_uInt64 *pStackStart = pStack;
63*b146d3b3SDamjan Jovanovic 
64*b146d3b3SDamjan Jovanovic     // Push "this" pointer
65*b146d3b3SDamjan Jovanovic     void * pAdjustedThisPtr = reinterpret_cast< void ** >( pThis->getCppI() ) + aVtableSlot.offset;
66*b146d3b3SDamjan Jovanovic     *pStack++ = *(sal_uInt64*)&pAdjustedThisPtr;
67*b146d3b3SDamjan Jovanovic 
68*b146d3b3SDamjan Jovanovic     // return
69*b146d3b3SDamjan Jovanovic     typelib_TypeDescription * pReturnTypeDescr = 0;
70*b146d3b3SDamjan Jovanovic     TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
71*b146d3b3SDamjan Jovanovic     OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
72*b146d3b3SDamjan Jovanovic 
73*b146d3b3SDamjan Jovanovic     void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
74*b146d3b3SDamjan Jovanovic 
75*b146d3b3SDamjan Jovanovic     if ( pReturnTypeDescr )
76*b146d3b3SDamjan Jovanovic     {
77*b146d3b3SDamjan Jovanovic         if ( x86_64::return_in_hidden_param( pReturnTypeRef ) )
78*b146d3b3SDamjan Jovanovic         {
79*b146d3b3SDamjan Jovanovic             // complex return via ptr
80*b146d3b3SDamjan Jovanovic             pCppReturn = bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )?
81*b146d3b3SDamjan Jovanovic                          alloca( pReturnTypeDescr->nSize ) : pUnoReturn; // direct way
82*b146d3b3SDamjan Jovanovic             *pStack++ = *(sal_uInt64*)&pCppReturn;
83*b146d3b3SDamjan Jovanovic         }
84*b146d3b3SDamjan Jovanovic         else
85*b146d3b3SDamjan Jovanovic             pCppReturn = pUnoReturn; // direct way for simple types
86*b146d3b3SDamjan Jovanovic     }
87*b146d3b3SDamjan Jovanovic 
88*b146d3b3SDamjan Jovanovic     // Args
89*b146d3b3SDamjan Jovanovic     void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams );
90*b146d3b3SDamjan Jovanovic     // Indices of values this have to be converted (interface conversion cpp<=>uno)
91*b146d3b3SDamjan Jovanovic     sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams);
92*b146d3b3SDamjan Jovanovic     // Type descriptions for reconversions
93*b146d3b3SDamjan Jovanovic     typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams));
94*b146d3b3SDamjan Jovanovic 
95*b146d3b3SDamjan Jovanovic     sal_Int32 nTempIndizes = 0;
96*b146d3b3SDamjan Jovanovic 
97*b146d3b3SDamjan Jovanovic     for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
98*b146d3b3SDamjan Jovanovic     {
99*b146d3b3SDamjan Jovanovic         const typelib_MethodParameter & rParam = pParams[nPos];
100*b146d3b3SDamjan Jovanovic         typelib_TypeDescription * pParamTypeDescr = 0;
101*b146d3b3SDamjan Jovanovic         TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
102*b146d3b3SDamjan Jovanovic 
103*b146d3b3SDamjan Jovanovic         if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
104*b146d3b3SDamjan Jovanovic         {
105*b146d3b3SDamjan Jovanovic             uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), pUnoArgs[nPos], pParamTypeDescr,
106*b146d3b3SDamjan Jovanovic                                     pThis->getBridge()->getUno2Cpp() );
107*b146d3b3SDamjan Jovanovic 
108*b146d3b3SDamjan Jovanovic             switch (pParamTypeDescr->eTypeClass)
109*b146d3b3SDamjan Jovanovic             {
110*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_HYPER:
111*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_UNSIGNED_HYPER:
112*b146d3b3SDamjan Jovanovic                 *pStack++ = *(sal_uInt64*)&pCppArgs[nPos];
113*b146d3b3SDamjan Jovanovic                 break;
114*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_LONG:
115*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_UNSIGNED_LONG:
116*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_ENUM:
117*b146d3b3SDamjan Jovanovic                 *pStack++ = *(sal_uInt32*)&pCppArgs[nPos];
118*b146d3b3SDamjan Jovanovic                 break;
119*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_SHORT:
120*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_UNSIGNED_SHORT:
121*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_CHAR:
122*b146d3b3SDamjan Jovanovic                 *pStack++ = *(sal_uInt16*)&pCppArgs[nPos];
123*b146d3b3SDamjan Jovanovic                 break;
124*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_BOOLEAN:
125*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_BYTE:
126*b146d3b3SDamjan Jovanovic                 *pStack++ = *(sal_uInt8*)&pCppArgs[nPos];
127*b146d3b3SDamjan Jovanovic                 break;
128*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_FLOAT:
129*b146d3b3SDamjan Jovanovic             case typelib_TypeClass_DOUBLE:
130*b146d3b3SDamjan Jovanovic                 *pStack++ = *(sal_uInt64*)&pCppArgs[nPos]; // verbatim!
131*b146d3b3SDamjan Jovanovic                 break;
132*b146d3b3SDamjan Jovanovic             default:
133*b146d3b3SDamjan Jovanovic                 break;
134*b146d3b3SDamjan Jovanovic             }
135*b146d3b3SDamjan Jovanovic             // no longer needed
136*b146d3b3SDamjan Jovanovic             TYPELIB_DANGER_RELEASE( pParamTypeDescr );
137*b146d3b3SDamjan Jovanovic         }
138*b146d3b3SDamjan Jovanovic         else // ptr to complex value | ref
139*b146d3b3SDamjan Jovanovic         {
140*b146d3b3SDamjan Jovanovic             if (! rParam.bIn) // is pure out
141*b146d3b3SDamjan Jovanovic             {
142*b146d3b3SDamjan Jovanovic                 // cpp out is constructed mem, uno out is not!
143*b146d3b3SDamjan Jovanovic                 uno_constructData(
144*b146d3b3SDamjan Jovanovic                     pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
145*b146d3b3SDamjan Jovanovic                     pParamTypeDescr );
146*b146d3b3SDamjan Jovanovic                 pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
147*b146d3b3SDamjan Jovanovic                 // will be released at reconversion
148*b146d3b3SDamjan Jovanovic                 ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
149*b146d3b3SDamjan Jovanovic             }
150*b146d3b3SDamjan Jovanovic             // is in/inout
151*b146d3b3SDamjan Jovanovic             else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr ))
152*b146d3b3SDamjan Jovanovic             {
153*b146d3b3SDamjan Jovanovic                 uno_copyAndConvertData(
154*b146d3b3SDamjan Jovanovic                     pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
155*b146d3b3SDamjan Jovanovic                     pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
156*b146d3b3SDamjan Jovanovic 
157*b146d3b3SDamjan Jovanovic                 pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
158*b146d3b3SDamjan Jovanovic                 // will be released at reconversion
159*b146d3b3SDamjan Jovanovic                 ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
160*b146d3b3SDamjan Jovanovic             }
161*b146d3b3SDamjan Jovanovic             else // direct way
162*b146d3b3SDamjan Jovanovic             {
163*b146d3b3SDamjan Jovanovic                 pCppArgs[nPos] = pUnoArgs[nPos];
164*b146d3b3SDamjan Jovanovic                 // no longer needed
165*b146d3b3SDamjan Jovanovic                 TYPELIB_DANGER_RELEASE( pParamTypeDescr );
166*b146d3b3SDamjan Jovanovic             }
167*b146d3b3SDamjan Jovanovic             *pStack++ = *(sal_uInt64*)&pCppArgs[nPos];
168*b146d3b3SDamjan Jovanovic         }
169*b146d3b3SDamjan Jovanovic     }
170*b146d3b3SDamjan Jovanovic 
171*b146d3b3SDamjan Jovanovic     __try
172*b146d3b3SDamjan Jovanovic     {
173*b146d3b3SDamjan Jovanovic         // pCppI is mscx this pointer
174*b146d3b3SDamjan Jovanovic         callVirtualMethod(
175*b146d3b3SDamjan Jovanovic             pAdjustedThisPtr,
176*b146d3b3SDamjan Jovanovic             aVtableSlot.index,
177*b146d3b3SDamjan Jovanovic             pCppReturn, pReturnTypeDescr->eTypeClass,
178*b146d3b3SDamjan Jovanovic             pStackStart, (pStack - pStackStart) );
179*b146d3b3SDamjan Jovanovic     }
180*b146d3b3SDamjan Jovanovic     __except (CPPU_CURRENT_NAMESPACE::mscx_filterCppException(
181*b146d3b3SDamjan Jovanovic                   GetExceptionInformation(),
182*b146d3b3SDamjan Jovanovic                   *ppUnoExc, pThis->getBridge()->getCpp2Uno() ))
183*b146d3b3SDamjan Jovanovic    {
184*b146d3b3SDamjan Jovanovic         // *ppUnoExc was constructed by filter function
185*b146d3b3SDamjan Jovanovic         // temporary params
186*b146d3b3SDamjan Jovanovic         for ( ; nTempIndizes--; )
187*b146d3b3SDamjan Jovanovic         {
188*b146d3b3SDamjan Jovanovic             sal_Int32 nIndex = pTempIndizes[nTempIndizes];
189*b146d3b3SDamjan Jovanovic             // destroy temp cpp param => cpp: every param was constructed
190*b146d3b3SDamjan Jovanovic             uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release );
191*b146d3b3SDamjan Jovanovic             TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
192*b146d3b3SDamjan Jovanovic         }
193*b146d3b3SDamjan Jovanovic         // return type
194*b146d3b3SDamjan Jovanovic         if (pReturnTypeDescr)
195*b146d3b3SDamjan Jovanovic             TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
196*b146d3b3SDamjan Jovanovic         // end here
197*b146d3b3SDamjan Jovanovic         return;
198*b146d3b3SDamjan Jovanovic     }
199*b146d3b3SDamjan Jovanovic 
200*b146d3b3SDamjan Jovanovic     // NO exception occurred
201*b146d3b3SDamjan Jovanovic     *ppUnoExc = 0;
202*b146d3b3SDamjan Jovanovic 
203*b146d3b3SDamjan Jovanovic     // reconvert temporary params
204*b146d3b3SDamjan Jovanovic     for ( ; nTempIndizes--; )
205*b146d3b3SDamjan Jovanovic     {
206*b146d3b3SDamjan Jovanovic         sal_Int32 nIndex = pTempIndizes[nTempIndizes];
207*b146d3b3SDamjan Jovanovic         typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
208*b146d3b3SDamjan Jovanovic 
209*b146d3b3SDamjan Jovanovic         if (pParams[nIndex].bIn)
210*b146d3b3SDamjan Jovanovic         {
211*b146d3b3SDamjan Jovanovic             if (pParams[nIndex].bOut) // inout
212*b146d3b3SDamjan Jovanovic             {
213*b146d3b3SDamjan Jovanovic                 uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value
214*b146d3b3SDamjan Jovanovic                 uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
215*b146d3b3SDamjan Jovanovic                                         pThis->getBridge()->getCpp2Uno() );
216*b146d3b3SDamjan Jovanovic             }
217*b146d3b3SDamjan Jovanovic         }
218*b146d3b3SDamjan Jovanovic         else // pure out
219*b146d3b3SDamjan Jovanovic         {
220*b146d3b3SDamjan Jovanovic             uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
221*b146d3b3SDamjan Jovanovic                                     pThis->getBridge()->getCpp2Uno() );
222*b146d3b3SDamjan Jovanovic         }
223*b146d3b3SDamjan Jovanovic         // destroy temp cpp param => cpp: every param was constructed
224*b146d3b3SDamjan Jovanovic         uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
225*b146d3b3SDamjan Jovanovic 
226*b146d3b3SDamjan Jovanovic         TYPELIB_DANGER_RELEASE( pParamTypeDescr );
227*b146d3b3SDamjan Jovanovic     }
228*b146d3b3SDamjan Jovanovic     // return value
229*b146d3b3SDamjan Jovanovic     if (pCppReturn && pUnoReturn != pCppReturn)
230*b146d3b3SDamjan Jovanovic     {
231*b146d3b3SDamjan Jovanovic         uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr,
232*b146d3b3SDamjan Jovanovic                                 pThis->getBridge()->getCpp2Uno() );
233*b146d3b3SDamjan Jovanovic         uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
234*b146d3b3SDamjan Jovanovic     }
235*b146d3b3SDamjan Jovanovic     // return type
236*b146d3b3SDamjan Jovanovic     if (pReturnTypeDescr)
237*b146d3b3SDamjan Jovanovic         TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
238*b146d3b3SDamjan Jovanovic }
239*b146d3b3SDamjan Jovanovic 
240*b146d3b3SDamjan Jovanovic }
241*b146d3b3SDamjan Jovanovic 
242*b146d3b3SDamjan Jovanovic namespace bridges { namespace cpp_uno { namespace shared {
243*b146d3b3SDamjan Jovanovic 
unoInterfaceProxyDispatch(uno_Interface * pUnoI,const typelib_TypeDescription * pMemberDescr,void * pReturn,void * pArgs[],uno_Any ** ppException)244*b146d3b3SDamjan Jovanovic void unoInterfaceProxyDispatch(
245*b146d3b3SDamjan Jovanovic     uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
246*b146d3b3SDamjan Jovanovic     void * pReturn, void * pArgs[], uno_Any ** ppException )
247*b146d3b3SDamjan Jovanovic {
248*b146d3b3SDamjan Jovanovic     // is my surrogate
249*b146d3b3SDamjan Jovanovic     bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
250*b146d3b3SDamjan Jovanovic         = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * >(pUnoI);
251*b146d3b3SDamjan Jovanovic 
252*b146d3b3SDamjan Jovanovic     switch (pMemberDescr->eTypeClass)
253*b146d3b3SDamjan Jovanovic     {
254*b146d3b3SDamjan Jovanovic     case typelib_TypeClass_INTERFACE_ATTRIBUTE:
255*b146d3b3SDamjan Jovanovic     {
256*b146d3b3SDamjan Jovanovic         VtableSlot aVtableSlot(
257*b146d3b3SDamjan Jovanovic             getVtableSlot(
258*b146d3b3SDamjan Jovanovic                 reinterpret_cast<
259*b146d3b3SDamjan Jovanovic                     typelib_InterfaceAttributeTypeDescription const * >(
260*b146d3b3SDamjan Jovanovic                         pMemberDescr)));
261*b146d3b3SDamjan Jovanovic 
262*b146d3b3SDamjan Jovanovic         if (pReturn)
263*b146d3b3SDamjan Jovanovic         {
264*b146d3b3SDamjan Jovanovic             // dependent dispatch
265*b146d3b3SDamjan Jovanovic             cpp_call(
266*b146d3b3SDamjan Jovanovic                 pThis, aVtableSlot,
267*b146d3b3SDamjan Jovanovic                 ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef,
268*b146d3b3SDamjan Jovanovic                 0, 0, // no params
269*b146d3b3SDamjan Jovanovic                 pReturn, pArgs, ppException );
270*b146d3b3SDamjan Jovanovic         }
271*b146d3b3SDamjan Jovanovic         else
272*b146d3b3SDamjan Jovanovic         {
273*b146d3b3SDamjan Jovanovic             // is SET
274*b146d3b3SDamjan Jovanovic             typelib_MethodParameter aParam;
275*b146d3b3SDamjan Jovanovic             aParam.pTypeRef =
276*b146d3b3SDamjan Jovanovic                 ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef;
277*b146d3b3SDamjan Jovanovic             aParam.bIn      = sal_True;
278*b146d3b3SDamjan Jovanovic             aParam.bOut     = sal_False;
279*b146d3b3SDamjan Jovanovic 
280*b146d3b3SDamjan Jovanovic             typelib_TypeDescriptionReference * pReturnTypeRef = 0;
281*b146d3b3SDamjan Jovanovic             OUString aVoidName( RTL_CONSTASCII_USTRINGPARAM("void") );
282*b146d3b3SDamjan Jovanovic             typelib_typedescriptionreference_new(
283*b146d3b3SDamjan Jovanovic                 &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
284*b146d3b3SDamjan Jovanovic 
285*b146d3b3SDamjan Jovanovic             // dependent dispatch
286*b146d3b3SDamjan Jovanovic             aVtableSlot.index += 1; // get, then set method
287*b146d3b3SDamjan Jovanovic             cpp_call(
288*b146d3b3SDamjan Jovanovic                 pThis, aVtableSlot, // get, then set method
289*b146d3b3SDamjan Jovanovic                 pReturnTypeRef,
290*b146d3b3SDamjan Jovanovic                 1, &aParam,
291*b146d3b3SDamjan Jovanovic                 pReturn, pArgs, ppException );
292*b146d3b3SDamjan Jovanovic 
293*b146d3b3SDamjan Jovanovic             typelib_typedescriptionreference_release( pReturnTypeRef );
294*b146d3b3SDamjan Jovanovic         }
295*b146d3b3SDamjan Jovanovic 
296*b146d3b3SDamjan Jovanovic         break;
297*b146d3b3SDamjan Jovanovic     }
298*b146d3b3SDamjan Jovanovic     case typelib_TypeClass_INTERFACE_METHOD:
299*b146d3b3SDamjan Jovanovic     {
300*b146d3b3SDamjan Jovanovic         VtableSlot aVtableSlot(
301*b146d3b3SDamjan Jovanovic             getVtableSlot(
302*b146d3b3SDamjan Jovanovic                 reinterpret_cast<
303*b146d3b3SDamjan Jovanovic                     typelib_InterfaceMethodTypeDescription const * >(
304*b146d3b3SDamjan Jovanovic                         pMemberDescr)));
305*b146d3b3SDamjan Jovanovic 
306*b146d3b3SDamjan Jovanovic         switch (aVtableSlot.index)
307*b146d3b3SDamjan Jovanovic         {
308*b146d3b3SDamjan Jovanovic             // standard calls
309*b146d3b3SDamjan Jovanovic         case 1: // acquire uno interface
310*b146d3b3SDamjan Jovanovic             (*pUnoI->acquire)( pUnoI );
311*b146d3b3SDamjan Jovanovic             *ppException = 0;
312*b146d3b3SDamjan Jovanovic             break;
313*b146d3b3SDamjan Jovanovic         case 2: // release uno interface
314*b146d3b3SDamjan Jovanovic             (*pUnoI->release)( pUnoI );
315*b146d3b3SDamjan Jovanovic             *ppException = 0;
316*b146d3b3SDamjan Jovanovic             break;
317*b146d3b3SDamjan Jovanovic         case 0: // queryInterface() opt
318*b146d3b3SDamjan Jovanovic         {
319*b146d3b3SDamjan Jovanovic             typelib_TypeDescription * pTD = 0;
320*b146d3b3SDamjan Jovanovic             TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() );
321*b146d3b3SDamjan Jovanovic             if (pTD)
322*b146d3b3SDamjan Jovanovic             {
323*b146d3b3SDamjan Jovanovic                 uno_Interface * pInterface = 0;
324*b146d3b3SDamjan Jovanovic                 (*pThis->getBridge()->getUnoEnv()->getRegisteredInterface)(
325*b146d3b3SDamjan Jovanovic                     pThis->getBridge()->getUnoEnv(),
326*b146d3b3SDamjan Jovanovic                     (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD );
327*b146d3b3SDamjan Jovanovic 
328*b146d3b3SDamjan Jovanovic                 if (pInterface)
329*b146d3b3SDamjan Jovanovic                 {
330*b146d3b3SDamjan Jovanovic                     ::uno_any_construct(
331*b146d3b3SDamjan Jovanovic                         reinterpret_cast< uno_Any * >( pReturn ),
332*b146d3b3SDamjan Jovanovic                         &pInterface, pTD, 0 );
333*b146d3b3SDamjan Jovanovic                     (*pInterface->release)( pInterface );
334*b146d3b3SDamjan Jovanovic                     TYPELIB_DANGER_RELEASE( pTD );
335*b146d3b3SDamjan Jovanovic                     *ppException = 0;
336*b146d3b3SDamjan Jovanovic                     break;
337*b146d3b3SDamjan Jovanovic                 }
338*b146d3b3SDamjan Jovanovic                 TYPELIB_DANGER_RELEASE( pTD );
339*b146d3b3SDamjan Jovanovic             }
340*b146d3b3SDamjan Jovanovic         } // else perform queryInterface()
341*b146d3b3SDamjan Jovanovic         default:
342*b146d3b3SDamjan Jovanovic             // dependent dispatch
343*b146d3b3SDamjan Jovanovic             cpp_call(
344*b146d3b3SDamjan Jovanovic                 pThis, aVtableSlot,
345*b146d3b3SDamjan Jovanovic                 ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef,
346*b146d3b3SDamjan Jovanovic                 ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams,
347*b146d3b3SDamjan Jovanovic                 ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams,
348*b146d3b3SDamjan Jovanovic                 pReturn, pArgs, ppException );
349*b146d3b3SDamjan Jovanovic         }
350*b146d3b3SDamjan Jovanovic         break;
351*b146d3b3SDamjan Jovanovic     }
352*b146d3b3SDamjan Jovanovic     default:
353*b146d3b3SDamjan Jovanovic     {
354*b146d3b3SDamjan Jovanovic         ::com::sun::star::uno::RuntimeException aExc(
355*b146d3b3SDamjan Jovanovic             OUString( RTL_CONSTASCII_USTRINGPARAM("illegal member type description!") ),
356*b146d3b3SDamjan Jovanovic             ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() );
357*b146d3b3SDamjan Jovanovic 
358*b146d3b3SDamjan Jovanovic         Type const & rExcType = ::getCppuType( &aExc );
359*b146d3b3SDamjan Jovanovic         // binary identical null reference
360*b146d3b3SDamjan Jovanovic         ::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 );
361*b146d3b3SDamjan Jovanovic     }
362*b146d3b3SDamjan Jovanovic     }
363*b146d3b3SDamjan Jovanovic }
364*b146d3b3SDamjan Jovanovic 
365*b146d3b3SDamjan Jovanovic } } }
366