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