summaryrefslogtreecommitdiff
path: root/extensions/source/ole/unoobjw.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/ole/unoobjw.cxx')
-rw-r--r--extensions/source/ole/unoobjw.cxx1688
1 files changed, 0 insertions, 1688 deletions
diff --git a/extensions/source/ole/unoobjw.cxx b/extensions/source/ole/unoobjw.cxx
deleted file mode 100644
index 268370cab..000000000
--- a/extensions/source/ole/unoobjw.cxx
+++ /dev/null
@@ -1,1688 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_extensions.hxx"
-
-#include "ole2uno.hxx"
-#include <stdio.h>
-#include <tools/presys.h>
-#include <olectl.h>
-#include <vector>
-#include <list>
-#include <boost/unordered_map.hpp>
-#include <tools/postsys.h>
-
-
-#include <osl/diagnose.h>
-#include <salhelper/simplereferenceobject.hxx>
-#include <tools/debug.hxx>
-#include <rtl/ustring.hxx>
-#include <com/sun/star/beans/MethodConcept.hpp>
-#include <com/sun/star/beans/PropertyConcept.hpp>
-#include <com/sun/star/script/FailReason.hpp>
-#include <com/sun/star/reflection/ParamInfo.hpp>
-#include <com/sun/star/beans/XExactName.hpp>
-#include <com/sun/star/container/NoSuchElementException.hpp>
-
-#include <com/sun/star/beans/XMaterialHolder.hpp>
-#include <com/sun/star/script/XInvocation2.hpp>
-#include <com/sun/star/script/MemberType.hpp>
-#include <com/sun/star/reflection/XIdlReflection.hpp>
-#include <osl/interlck.h>
-#include <com/sun/star/uno/genfunc.h>
-#include <cppuhelper/implbase1.hxx>
-
-#include "comifaces.hxx"
-#include "jscriptclasses.hxx"
-#include "unotypewrapper.hxx"
-#include "oleobjw.hxx"
-#include "unoobjw.hxx"
-#include "servprov.hxx"
-
-using namespace std;
-using namespace osl;
-using namespace cppu;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::beans;
-using namespace com::sun::star::container;
-using namespace com::sun::star::script;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::bridge::ModelDependent;
-using namespace com::sun::star::reflection;
-
-using ::rtl::OUString;
-
-#if _MSC_VER < 1200
-extern "C" const GUID IID_IDispatchEx;
-#endif
-
-namespace ole_adapter
-{
-boost::unordered_map<sal_uInt32, WeakReference<XInterface> > UnoObjToWrapperMap;
-static sal_Bool writeBackOutParameter(VARIANTARG* pDest, VARIANT* pSource);
-static sal_Bool writeBackOutParameter2( VARIANTARG* pDest, VARIANT* pSource);
-static HRESULT mapCannotConvertException( CannotConvertException e, unsigned int * puArgErr);
-
-
-/* Does not throw any exceptions.
- Param pInfo can be NULL.
- */
-static void writeExcepinfo(EXCEPINFO * pInfo, const OUString& message)
-{
- if (pInfo != NULL)
- {
- pInfo->wCode = UNO_2_OLE_EXCEPTIONCODE;
- pInfo->bstrSource = SysAllocString(L"[automation bridge] ");
- pInfo->bstrDescription = SysAllocString(reinterpret_cast<LPCOLESTR>(message.getStr()));
- }
-}
-
-/*****************************************************************************
-
- class implementation: InterfaceOleWrapper_Impl
-
-*****************************************************************************/
-InterfaceOleWrapper_Impl::InterfaceOleWrapper_Impl( Reference<XMultiServiceFactory>& xFactory,
- sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass):
- m_defaultValueType( 0),
- UnoConversionUtilities<InterfaceOleWrapper_Impl>( xFactory, unoWrapperClass, comWrapperClass)
-{
-}
-
-InterfaceOleWrapper_Impl::~InterfaceOleWrapper_Impl()
-{
- MutexGuard guard(getBridgeMutex());
- // remove entries in global map
- IT_Uno it= UnoObjToWrapperMap.find( (sal_uInt32) m_xOrigin.get());
- if(it != UnoObjToWrapperMap.end())
- UnoObjToWrapperMap.erase(it);
-#if OSL_DEBUG_LEVEL > 0
- fprintf(stderr,"[automation bridge] UnoObjToWrapperMap contains: %i \n",
- UnoObjToWrapperMap.size());
-#endif
-
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::QueryInterface(REFIID riid, LPVOID FAR * ppv)
-{
- HRESULT ret= S_OK;
-
- if( !ppv)
- return E_POINTER;
-
- if(IsEqualIID(riid, IID_IUnknown))
- {
- AddRef();
- *ppv = (IUnknown*) (IDispatch*) this;
- }
- else if (IsEqualIID(riid, IID_IDispatch))
- {
- AddRef();
- *ppv = (IDispatch*) this;
- }
- else if( IsEqualIID( riid, __uuidof( IUnoObjectWrapper)))
- {
- AddRef();
- *ppv= (IUnoObjectWrapper*) this;
- }
- else
- ret= E_NOINTERFACE;
- return ret;
-}
-
-STDMETHODIMP_(ULONG) InterfaceOleWrapper_Impl::AddRef()
-{
- acquire();
- // does not need to guard because one should not rely on the return value of
- // AddRef anyway
- return m_refCount;
-}
-
-STDMETHODIMP_(ULONG) InterfaceOleWrapper_Impl::Release()
-{
- ULONG n= m_refCount;
- release();
- return n - 1;
-}
-
-// IUnoObjectWrapper --------------------------------------------------------
-STDMETHODIMP InterfaceOleWrapper_Impl::getWrapperXInterface( Reference<XInterface>* pXInt)
-{
- *pXInt= Reference<XInterface>( static_cast<XWeak*>( this), UNO_QUERY);
- return pXInt->is() ? S_OK : E_FAIL;
-}
-STDMETHODIMP InterfaceOleWrapper_Impl::getOriginalUnoObject( Reference<XInterface>* pXInt)
-{
- *pXInt= m_xOrigin;
- return m_xOrigin.is() ? S_OK : E_FAIL;
-}
-STDMETHODIMP InterfaceOleWrapper_Impl::getOriginalUnoStruct( Any * pStruct)
-{
- HRESULT ret= E_FAIL;
- if( !m_xOrigin.is())
- {
- Reference<XMaterialHolder> xMatHolder( m_xInvocation, UNO_QUERY);
- if( xMatHolder.is())
- {
- Any any = xMatHolder->getMaterial();
- if( any.getValueTypeClass() == TypeClass_STRUCT)
- {
- *pStruct= any;
- ret= S_OK;
- }
- }
- }
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetTypeInfoCount( unsigned int * /*pctinfo*/ )
-{
- return E_NOTIMPL ;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetTypeInfo(unsigned int /*itinfo*/, LCID /*lcid*/, ITypeInfo ** /*pptinfo*/)
-{
- return E_NOTIMPL;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetIDsOfNames(REFIID /*riid*/,
- OLECHAR ** rgszNames,
- unsigned int cNames,
- LCID /*lcid*/,
- DISPID * rgdispid )
-{
- HRESULT ret = DISP_E_UNKNOWNNAME;
- try
- {
- MutexGuard guard( getBridgeMutex());
- if( ! rgdispid)
- return E_POINTER;
-
- // ----------------------------------------
- if( ! _wcsicmp( *rgszNames, JSCRIPT_VALUE_FUNC) ||
- ! _wcsicmp( *rgszNames, BRIDGE_VALUE_FUNC))
- {
- *rgdispid= DISPID_JSCRIPT_VALUE_FUNC;
- return S_OK;
- }
- else if( ! _wcsicmp( *rgszNames, GET_STRUCT_FUNC) ||
- ! _wcsicmp( *rgszNames, BRIDGE_GET_STRUCT_FUNC))
- {
- *rgdispid= DISPID_GET_STRUCT_FUNC;
- return S_OK;
- }
- else if( ! _wcsicmp( *rgszNames, BRIDGE_CREATE_TYPE_FUNC))
- {
- *rgdispid= DISPID_CREATE_TYPE_FUNC;
- return S_OK;
- }
-
- // ----------------------------------------
- if (m_xInvocation.is() && (cNames > 0))
- {
- OUString name(reinterpret_cast<const sal_Unicode*>(rgszNames[0]));
- NameToIdMap::iterator iter = m_nameToDispIdMap.find(name);
-
- if (iter == m_nameToDispIdMap.end())
- {
- OUString exactName;
-
- if (m_xExactName.is())
- {
- exactName = m_xExactName->getExactName(name);
- }
- else
- {
- exactName = name;
- }
-
- MemberInfo d(0, exactName);
-
- if (m_xInvocation->hasProperty(exactName))
- {
- d.flags |= DISPATCH_PROPERTYGET;
- d.flags |= DISPATCH_PROPERTYPUT;
- d.flags |= DISPATCH_PROPERTYPUTREF;
- }
-
- if (m_xInvocation->hasMethod(exactName))
- {
- d.flags |= DISPATCH_METHOD;
- }
-
- if (d.flags != 0)
- {
- m_MemberInfos.push_back(d);
- iter = m_nameToDispIdMap.insert(NameToIdMap::value_type(exactName, (DISPID)m_MemberInfos.size())).first;
-
- if (exactName != name)
- {
- iter = m_nameToDispIdMap.insert(NameToIdMap::value_type(name, (DISPID)m_MemberInfos.size())).first;
- }
- }
- }
-
- if (iter == m_nameToDispIdMap.end())
- {
- ret = DISP_E_UNKNOWNNAME;
- }
- else
- {
- *rgdispid = (*iter).second;
- ret = S_OK;
- }
- }
- }
- catch(BridgeRuntimeError& )
- {
- OSL_ASSERT(0);
- }
- catch(Exception& )
- {
- OSL_ASSERT(0);
- }
- catch(...)
- {
- OSL_ASSERT(0);
- }
-
- return ret;
-}
-
-// "convertDispparamsArgs" converts VARIANTS to their respecting Any counterparts
-// The parameters "id", "wFlags" and "pdispparams" equal those as used in
-// IDispatch::Invoke. The function handles special JavaScript
-// cases where a VARIANT of type VT_DISPATCH is ambiguous and could represent
-// an object, array ( JavaScript Array object), out parameter and in/out ( JavaScript Array object)
-// parameter (JavaScript Array object)
-// Because all those VT_DISPATCH objects need a different conversion
-// we have to find out what the object is supposed to be. The function does this
-// by either using type information or by help of a specialized ValueObject object.
-
-// A. Type Information
-// -----------------------------------------------------------------------------
-// With the help of type information the kind of parameter can be exactly determined
-// and an appropriate conversion can be choosen. A problem arises if a method expects
-// an Any. Then the type info does not tell what the type of the value, that is kept
-// by the any, should be. In this situation the decision wheter the param is a
-// sequence or an object is made upon the fact if the object has a property "0"
-// ( see function "isJScriptArray"). Since this is unsafe it is recommended to use
-// the JScript value objects within a JScript script on such an occasion.
-
-// B. JavaScript Value Object ( class JScriptValue )
-// -----------------------------------------------------------------------------
-// A JScriptValue (ValueObject) object is a COM object in that it implements IDispatch and the
-// IJScriptValue object interface. Such objects are provided by all UNO wrapper
-// objects used within a JScript script. To obtain an instance one has to call
-// "_GetValueObject() or Bridge_GetValueObject()" on an UNO wrapper object (class InterfaceOleWrapper_Impl).
-// A value object is appropriately initialized within the script and passed as
-// parameter to an UNO object method or property. The convertDispparamsArgs function
-// can easily find out that a param is such an object by queriing for the
-// IJScriptValue interface. By this interface one the type and kind ( out, in/out)
-// can be determined and the right conversion can be applied.
-// Using ValueObjects we spare us the effort of aquiring and examining type information
-// in order to figure out what the an IDispatch parameter is meant for.
-
-// Normal JScript object parameter can be mixed with JScriptValue object. If an
-// VARIANT contains an VT_DISPATCH that is no JScriptValue than the type information
-// is used to find out about the reqired type.
-void InterfaceOleWrapper_Impl::convertDispparamsArgs(DISPID id,
- unsigned short /*wFlags*/, DISPPARAMS* pdispparams, Sequence<Any>& rSeq)
-{
- HRESULT hr= S_OK;
- sal_Int32 countArgs= pdispparams->cArgs;
- if( countArgs == 0)
- return;
-
- rSeq.realloc( countArgs);
- Any* pParams = rSeq.getArray();
-
- Any anyParam;
-
- //Get type information for the current call
- InvocationInfo info;
- if( ! getInvocationInfoForCall( id, info))
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]InterfaceOleWrapper_Impl::convertDispparamsArgs \n"
- "Could not obtain type information for current call."));
-
- for (int i = 0; i < countArgs; i++)
- {
- if (info.eMemberType == MemberType_METHOD &&
- info.aParamModes[ countArgs - i -1 ] == ParamMode_OUT)
- continue;
-
- if(convertValueObject( & pdispparams->rgvarg[i], anyParam))
- { //a param is a ValueObject and could be converted
- pParams[countArgs - (i + 1)] = anyParam;
- continue;
- }
-
- // If the param is an out, in/out parameter in
- // JScript (Array object, with value at index 0) then we
- // extract Array[0] and put the value into varParam. At the end of the loop varParam
- // is converted if it contains a value otherwise the VARIANT from
- // DISPPARAMS is converted.
- CComVariant varParam;
-
- // Check for JScript out and in/out paramsobjects (VT_DISPATCH).
- // To find them out we use typeinformation of the function being called.
- if( pdispparams->rgvarg[i].vt == VT_DISPATCH )
- {
- if( info.eMemberType == MemberType_METHOD && info.aParamModes[ countArgs - i -1 ] == ParamMode_INOUT)
- {
- // INOUT-param
- // Index ( property) "0" contains the actual IN-param. The object is a JScript
- // Array object.
- // Get the IN-param at index "0"
- IDispatch* pdisp= pdispparams->rgvarg[i].pdispVal;
-
- OLECHAR* sindex= L"0";
- DISPID id;
- DISPPARAMS noParams= {0,0,0,0};
- if(SUCCEEDED( hr= pdisp->GetIDsOfNames( IID_NULL, &sindex, 1, LOCALE_USER_DEFAULT, &id)))
- hr= pdisp->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
- & noParams, & varParam, NULL, NULL);
- if( FAILED( hr))
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] Could not determine "
- "if the object has a member \"0\". Error: ") +
- OUString::valueOf(hr));
- }
- }
- }
-
- if( varParam.vt == VT_EMPTY) // then it was no in/out parameter
- varParam= pdispparams->rgvarg[i];
-
- if(info.eMemberType == MemberType_METHOD)
- variantToAny( & varParam, anyParam,
- info.aParamTypes[ countArgs - i - 1]);
- else if(info.eMemberType == MemberType_PROPERTY)
- variantToAny( & varParam, anyParam, info.aType);
- else
- OSL_ASSERT(0);
-
- pParams[countArgs - (i + 1)]= anyParam;
- }// end for / iterating over all parameters
-}
-
-sal_Bool InterfaceOleWrapper_Impl::getInvocationInfoForCall( DISPID id, InvocationInfo& info)
-{
- sal_Bool bTypesAvailable= sal_False;
-
- if( !m_xInvocation.is() )return false;
- Reference<XInvocation2> inv2( m_xInvocation, UNO_QUERY);
- if( inv2.is())
- {
- // We need the name of the property or method to get its type information.
- // The name can be identified through the param "id"
- // that is kept as value in the map m_nameToDispIdMap.
- // Proplem: the Windows JScript engine sometimes changes small letters to capital
- // letters as happens in xidlclass_obj.createObject( var) // in JScript.
- // IDispatch::GetIdsOfNames is then called with "CreateObject" !!!
- // m_nameToDispIdMap can contain several names for one DISPID but only one is
- // the exact one. If there's no m_xExactName and therefore no exact name then
- // there's only one entry in the map.
- typedef NameToIdMap::const_iterator cit;
- OUString sMemberName;
-
- for(cit ci1= m_nameToDispIdMap.begin(); ci1 != m_nameToDispIdMap.end(); ++ci1)
- {
- if( (*ci1).second == id) // iterator is a pair< OUString, DISPID>
- {
- sMemberName= (*ci1).first;
- break;
- }
- }
- // Get information for the current call ( property or method).
- // There could be similar names which only differ in the cases
- // of letters. First we assume that the name which was passed into
- // GetIDsOfNames is correct. If we won't get information with that
- // name then we have the invocation service use the XExactName interface.
- sal_Bool validInfo= sal_True;
- InvocationInfo invInfo;
- try{
- invInfo= inv2->getInfoForName( sMemberName, sal_False);
- }
- catch( IllegalArgumentException )
- {
- validInfo= sal_False;
- }
-
- if( ! validInfo)
- {
- invInfo= inv2->getInfoForName( sMemberName, sal_True);
- }
- if( invInfo.aName.pData)
- {
- bTypesAvailable= sal_True;
- info= invInfo;
- }
- }
- return bTypesAvailable;
-}
-// XBridgeSupplier2 ---------------------------------------------------
-// only bridges itself ( this instance of InterfaceOleWrapper_Impl)from UNO to IDispatch
-// If sourceModelType is UNO than any UNO interface implemented by InterfaceOleWrapper_Impl
-// can bridged to IDispatch ( if destModelType == OLE). The IDispatch is
-// implemented by this class.
-Any SAL_CALL InterfaceOleWrapper_Impl::createBridge(const Any& modelDepObject,
- const Sequence<sal_Int8>& /*ProcessId*/,
- sal_Int16 sourceModelType,
- sal_Int16 destModelType)
- throw (IllegalArgumentException, RuntimeException)
-{
-
- Any retAny;
- if( sourceModelType == UNO && destModelType == OLE &&
- modelDepObject.getValueTypeClass() == TypeClass_INTERFACE )
- {
- Reference<XInterface> xInt;
- if( modelDepObject >>= xInt )
- {
- if( xInt == Reference<XInterface>( static_cast<XWeak*>( this), UNO_QUERY))
- {
- VARIANT *pVar= (VARIANT*)CoTaskMemAlloc( sizeof( VARIANT));
- if( pVar)
- {
- pVar->vt= VT_DISPATCH;
- pVar->pdispVal= static_cast<IDispatch*>( this);
- AddRef();
-
- retAny<<= reinterpret_cast< sal_uInt32 >( pVar);
- }
- }
- }
- }
-
- return retAny;
-}
-
-
-// XInitialization --------------------------------------------------
-void SAL_CALL InterfaceOleWrapper_Impl::initialize( const Sequence< Any >& aArguments )
- throw(Exception, RuntimeException)
-{
- switch( aArguments.getLength() )
- {
- case 2: // the object wraps an UNO struct
- aArguments[0] >>= m_xInvocation;
- aArguments[1] >>= m_defaultValueType;
- break;
- case 3: // the object wraps an UNO interface
- aArguments[0] >>= m_xInvocation;
- aArguments[1] >>= m_xOrigin;
- aArguments[2] >>= m_defaultValueType;
- break;
- }
-
- m_xExactName= Reference<XExactName>( m_xInvocation, UNO_QUERY);
-}
-
-Reference< XInterface > InterfaceOleWrapper_Impl::createUnoWrapperInstance()
-{
- Reference<XWeak> xWeak= static_cast<XWeak*>( new InterfaceOleWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
-}
-
-Reference<XInterface> InterfaceOleWrapper_Impl::createComWrapperInstance()
-{
- Reference<XWeak> xWeak= static_cast<XWeak*>( new IUnknownWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
-}
-
-
-
-// "getType" is used in convertValueObject to map the string denoting the type
-// to an actual Type object.
-bool getType( const BSTR name, Type & type)
-{
- Type retType;
- bool ret = false;
- typelib_TypeDescription * pDesc= NULL;
- OUString str( reinterpret_cast<const sal_Unicode*>(name));
- typelib_typedescription_getByName( &pDesc, str.pData );
- if( pDesc)
- {
- type = Type( pDesc->pWeakRef );
- typelib_typedescription_release( pDesc);
- ret = true;
- }
- return ret;
-}
-
-static sal_Bool writeBackOutParameter2( VARIANTARG* pDest, VARIANT* pSource)
-{
- sal_Bool ret = sal_False;
- HRESULT hr;
-
- // Handle JScriptValue objects and JScript out params ( Array object )
- CComVariant varDest( *pDest);
-
- if( SUCCEEDED( varDest.ChangeType(VT_DISPATCH)))
- {
- CComPtr<IDispatch> spDispDest(varDest.pdispVal);
-
- // special Handling for a JScriptValue object
-#ifdef __MINGW32__
- CComQIPtr<IJScriptValueObject, &__uuidof(IJScriptValueObject)> spValueDest(spDispDest);
-#else
- CComQIPtr<IJScriptValueObject> spValueDest(spDispDest);
-#endif
- if (spValueDest)
- {
- VARIANT_BOOL varBool= VARIANT_FALSE;
- if( SUCCEEDED( hr= spValueDest->IsOutParam( &varBool) )
- && varBool == VARIANT_TRUE ||
- SUCCEEDED(hr= spValueDest->IsInOutParam( &varBool) )
- && varBool == VARIANT_TRUE )
- {
- if( SUCCEEDED( spValueDest->Set( CComVariant(), *pSource)))
- ret= sal_True;
- }
- }
- else if (pDest->vt == VT_DISPATCH)// VT_DISPATCH -> JScript out param
- {
- // We use IDispatchEx because its GetDispID function causes the creation
- // of a property if it does not exist already. This is convenient for
- // out parameters in JScript. Then the user must not specify propery "0"
- // explicitly
-#ifdef __MINGW32__
- CComQIPtr<IDispatchEx, &__uuidof(IDispatchEx)> spDispEx( spDispDest);
-#else
- CComQIPtr<IDispatchEx> spDispEx( spDispDest);
-#endif
- if( spDispEx)
- {
- CComBSTR nullProp(L"0");
- DISPID dwDispID;
- if( SUCCEEDED( spDispEx->GetDispID( nullProp, fdexNameEnsure, &dwDispID)))
- {
- DISPPARAMS dispparams = {NULL, NULL, 1, 1};
- dispparams.rgvarg = pSource;
- DISPID dispidPut = DISPID_PROPERTYPUT;
- dispparams.rgdispidNamedArgs = &dispidPut;
-
- if (pSource->vt == VT_UNKNOWN || pSource->vt == VT_DISPATCH ||
- (pSource->vt & VT_ARRAY) || (pSource->vt & VT_BYREF))
- hr = spDispEx->InvokeEx(dwDispID, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF,
- &dispparams, NULL, NULL, NULL);
- else
- hr= spDispEx->InvokeEx(dwDispID, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT,
- &dispparams, NULL, NULL, NULL);
- if( SUCCEEDED(hr))
- ret= sal_True;
- }
- }
- }
- else
- ret= writeBackOutParameter( pDest, pSource);
- }
- else // The param can't be a JScript out-parameter ( an Array object), it could be a VBScript
- { // param. The function checks itself for correct VBScript params
- ret= writeBackOutParameter( pDest, pSource);
- }
- return ret;
-}
-// VisualBasic Script passes arguments as VT_VARIANT | VT_BYREF be it in or out parameter.
-// Thus we are in charge of freeing an eventual value contained by the inner VARIANT
-// Please note: VariantCopy doesn't free a VT_BYREF value
-// The out parameters are expected to have always a valid type
-static sal_Bool writeBackOutParameter(VARIANTARG* pDest, VARIANT* pSource)
-{
- HRESULT hr;
- sal_Bool ret = FALSE;
- // Out parameter must be VT_BYREF
- if ((V_VT(pDest) & VT_BYREF) != 0 )
- {
- VARTYPE oleTypeFlags = V_VT(pSource);
-
- // if caller accept VARIANT as out parameter, any value must be converted
- if (V_VT(pDest) == (VT_VARIANT | VT_BYREF))
- {
- // When the user provides a VARIANT rather then a concrete type
- // we just copy the source to the out, in/out parameter
- // VT_DISPATCH, VT_UNKNOWN, VT_ARRAY, VT_BSTR in the VARIANT that
- // is contained in pDest are released by VariantCopy
- VariantCopy(V_VARIANTREF(pDest), pSource);
- ret = sal_True;
- }
- else
- {
- // variantarg and variant must have same type
- if ((V_VT(pDest) & oleTypeFlags) == oleTypeFlags)
- {
- if ((oleTypeFlags & VT_ARRAY) != 0)
- {
- // In / Out Param
- if( *V_ARRAYREF(pDest) != NULL)
- hr= SafeArrayCopyData( V_ARRAY(pSource), *V_ARRAYREF(pDest));
- else
- // Out Param
- hr= SafeArrayCopy(V_ARRAY(pSource), V_ARRAYREF(pDest)) == NOERROR;
- if( SUCCEEDED( hr))
- ret = sal_True;
- }
- else
- {
- // copy base type
- switch (V_VT(pSource))
- {
- case VT_I2:
- {
- *V_I2REF(pDest) = V_I2(pSource);
- ret = sal_True;
- break;
- }
- case VT_I4:
- *V_I4REF(pDest) = V_I4(pSource);
- ret = sal_True;
- break;
- case VT_R4:
- *V_R4REF(pDest) = V_R4(pSource);
- ret = sal_True;
- break;
- case VT_R8:
- *V_R8REF(pDest) = V_R8(pSource);
- ret = sal_True;
- break;
- case VT_CY:
- *V_CYREF(pDest) = V_CY(pSource);
- ret = sal_True;
- break;
- case VT_DATE:
- *V_DATEREF(pDest) = V_DATE(pSource);
- ret = sal_True;
- break;
- case VT_BSTR:
- SysFreeString( *pDest->pbstrVal);
-
- *V_BSTRREF(pDest) = SysAllocString(V_BSTR(pSource));
- ret = sal_True;
- break;
- case VT_DISPATCH:
- if (*V_DISPATCHREF(pDest) != NULL)
- (*V_DISPATCHREF(pDest))->Release();
-
- *V_DISPATCHREF(pDest) = V_DISPATCH(pSource);
-
- if (*V_DISPATCHREF(pDest) != NULL)
- (*V_DISPATCHREF(pDest))->AddRef();
-
- ret = sal_True;
- break;
- case VT_ERROR:
- *V_ERRORREF(pDest) = V_ERROR(pSource);
- ret = sal_True;
- break;
- case VT_BOOL:
- *V_BOOLREF(pDest) = V_BOOL(pSource);
- ret = sal_True;
- break;
- case VT_UNKNOWN:
- if (*V_UNKNOWNREF(pDest) != NULL)
- (*V_UNKNOWNREF(pDest))->Release();
-
- *V_UNKNOWNREF(pDest) = V_UNKNOWN(pSource);
-
- if (*V_UNKNOWNREF(pDest) != NULL)
- (*V_UNKNOWNREF(pDest))->AddRef();
-
- ret = sal_True;
- break;
- case VT_I1:
- *V_I1REF(pDest) = V_I1(pSource);
- ret = sal_True;
- break;
- case VT_UI1:
- *V_UI1REF(pDest) = V_UI1(pSource);
- ret = sal_True;
- break;
- case VT_UI2:
- *V_UI2REF(pDest) = V_UI2(pSource);
- ret = sal_True;
- break;
- case VT_UI4:
- *V_UI4REF(pDest) = V_UI4(pSource);
- ret = sal_True;
- break;
- case VT_INT:
- *V_INTREF(pDest) = V_INT(pSource);
- ret = sal_True;
- break;
- case VT_UINT:
- *V_UINTREF(pDest) = V_UINT(pSource);
- ret = sal_True;
- break;
- case VT_DECIMAL:
- memcpy(pDest->pdecVal, pSource, sizeof(DECIMAL));
- ret = sal_True;
- break;
- default:
- break;
- }
- }
- }
- else
- {
- // Handling of special cases
- // Destination and source types are different
- if( pDest->vt == (VT_BSTR | VT_BYREF)
- && pSource->vt == VT_I2)
- {
- // When the user provides a String as out our in/out parameter
- // and the type is char (TypeClass_CHAR) then we convert to a BSTR
- // instead of VT_I2 as is done otherwise
- OLECHAR buff[]= {0,0};
- buff[0]= pSource->iVal;
-
- SysFreeString( *pDest->pbstrVal);
- *pDest->pbstrVal= SysAllocString( buff);
- ret = sal_True;
- }
- }
- }
- }
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::Invoke(DISPID dispidMember,
- REFIID /*riid*/,
- LCID /*lcid*/,
- unsigned short wFlags,
- DISPPARAMS * pdispparams,
- VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo,
- unsigned int * puArgErr )
-{
- HRESULT ret = S_OK;
-
- try
- {
- sal_Bool bHandled= sal_False;
- ret= InvokeGeneral( dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo,
- puArgErr, bHandled);
- if( bHandled)
- return ret;
-
- if ((dispidMember > 0) && ((size_t)dispidMember <= m_MemberInfos.size()) && m_xInvocation.is())
- {
- MemberInfo d = m_MemberInfos[dispidMember - 1];
- DWORD flags = wFlags & d.flags;
-
- if (flags != 0)
- {
- if ((flags & DISPATCH_METHOD) != 0)
- {
- if (pdispparams->cNamedArgs > 0)
- ret = DISP_E_NONAMEDARGS;
- else
- {
- Sequence<Any> params;
-
- convertDispparamsArgs(dispidMember, wFlags, pdispparams , params );
-
- ret= doInvoke(pdispparams, pvarResult,
- pexcepinfo, puArgErr, d.name, params);
- }
- }
- else if ((flags & DISPATCH_PROPERTYGET) != 0)
- {
- ret= doGetProperty( pdispparams, pvarResult,
- pexcepinfo, d.name);
- }
- else if ((flags & DISPATCH_PROPERTYPUT || flags & DISPATCH_PROPERTYPUTREF) != 0)
- {
- if (pdispparams->cArgs != 1)
- ret = DISP_E_BADPARAMCOUNT;
- else
- {
- Sequence<Any> params;
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
- if(params.getLength() > 0)
- ret= doSetProperty( pdispparams, pvarResult, pexcepinfo, puArgErr, d.name, params);
- else
- ret = DISP_E_BADVARTYPE;
- }
- }
- }
- else
- ret= DISP_E_MEMBERNOTFOUND;
- }
- else
- ret = DISP_E_MEMBERNOTFOUND;
- }
- catch(BridgeRuntimeError& e)
- {
- writeExcepinfo(pexcepinfo, e.message);
- ret = DISP_E_EXCEPTION;
- }
- catch(Exception& e)
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::Invoke : \n") +
- e.Message;
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- catch(...)
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::Invoke : \n"
- "Unexpected exception");
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
-
- return ret;
-}
-
-HRESULT InterfaceOleWrapper_Impl::doInvoke( DISPPARAMS * pdispparams, VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo, unsigned int * puArgErr, OUString& name, Sequence<Any>& params)
-{
-
-
- HRESULT ret= S_OK;
- try
- {
- Sequence<sal_Int16> outIndex;
- Sequence<Any> outParams;
- Any returnValue;
-
- if (pdispparams->cNamedArgs > 0)
- return DISP_E_NONAMEDARGS;
-
- // invoke method and take care of exceptions
- returnValue = m_xInvocation->invoke(name,
- params,
- outIndex,
- outParams);
-
- // try to write back out parameter
- if (outIndex.getLength() > 0)
- {
- const sal_Int16* pOutIndex = outIndex.getConstArray();
- const Any* pOutParams = outParams.getConstArray();
-
- for (sal_Int32 i = 0; i < outIndex.getLength(); i++)
- {
- CComVariant variant;
- // Currently a Sequence is converted to an SafeArray of VARIANTs.
- anyToVariant( &variant, pOutParams[i]);
-
- // out parameter need special handling if they are VT_DISPATCH
- // and used in JScript
- int outindex= pOutIndex[i];
- writeBackOutParameter2(&(pdispparams->rgvarg[pdispparams->cArgs - 1 - outindex]),
- &variant );
- }
- }
-
- // write back return value
- if (pvarResult != NULL)
- anyToVariant(pvarResult, returnValue);
- }
- catch(IllegalArgumentException & e) //XInvocation::invoke
- {
- writeExcepinfo(pexcepinfo, e.Message);
- ret = DISP_E_TYPEMISMATCH;
- }
- catch(CannotConvertException & e) //XInvocation::invoke
- {
- writeExcepinfo(pexcepinfo, e.Message);
- ret = mapCannotConvertException( e, puArgErr);
- }
- catch(InvocationTargetException & e) //XInvocation::invoke
- {
- const Any& org = e.TargetException;
- Exception excTarget;
- org >>= excTarget;
- OUString message=
- org.getValueType().getTypeName() + OUSTR(": ") + excTarget.Message;
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- catch(NoSuchMethodException & e) //XInvocation::invoke
- {
- writeExcepinfo(pexcepinfo, e.Message);
- ret = DISP_E_MEMBERNOTFOUND;
- }
- catch(BridgeRuntimeError & e)
- {
- writeExcepinfo(pexcepinfo, e.message);
- ret = DISP_E_EXCEPTION;
- }
- catch(Exception & e)
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::doInvoke : \n") +
- e.Message;
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- catch( ... )
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::doInvoke : \n"
- "Unexpected exception");
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- return ret;
-}
-
-HRESULT InterfaceOleWrapper_Impl::doGetProperty( DISPPARAMS * /*pdispparams*/, VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo, OUString& name)
-{
- HRESULT ret= S_OK;
-
- Any value;
- try
- {
- Any returnValue = m_xInvocation->getValue( name);
- // write back return value
- if (pvarResult)
- anyToVariant(pvarResult, returnValue);
- }
- catch(UnknownPropertyException e) //XInvocation::getValue
- {
- writeExcepinfo(pexcepinfo, e.Message);
- ret = DISP_E_MEMBERNOTFOUND;
- }
- catch(BridgeRuntimeError& e)
- {
- writeExcepinfo(pexcepinfo, e.message);
- ret = DISP_E_EXCEPTION;
- }
- catch(Exception& e)
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::doGetProperty : \n") +
- e.Message;
- writeExcepinfo(pexcepinfo, message);
- }
- catch( ... )
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::doInvoke : \n"
- "Unexpected exception");
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- return ret;
-}
-
-HRESULT InterfaceOleWrapper_Impl::doSetProperty( DISPPARAMS * /*pdispparams*/, VARIANT * /*pvarResult*/,
- EXCEPINFO * pexcepinfo, unsigned int * puArgErr, OUString& name, Sequence<Any> params)
-{
- HRESULT ret= S_OK;
-
- try
- {
- m_xInvocation->setValue( name, params.getConstArray()[0]);
- }
- catch(UnknownPropertyException )
- {
- ret = DISP_E_MEMBERNOTFOUND;
- }
- catch(CannotConvertException e)
- {
- ret= mapCannotConvertException( e, puArgErr);
- }
- catch(InvocationTargetException e)
- {
- if (pexcepinfo != NULL)
- {
- Any org = e.TargetException;
-
- pexcepinfo->wCode = UNO_2_OLE_EXCEPTIONCODE;
- pexcepinfo->bstrSource = SysAllocString(L"any ONE component");
- pexcepinfo->bstrDescription = SysAllocString(
- reinterpret_cast<LPCOLESTR>(org.getValueType().getTypeName().getStr()));
- }
- ret = DISP_E_EXCEPTION;
- }
- catch( ... )
- {
- ret= DISP_E_EXCEPTION;
- }
- return ret;
-}
-
-HRESULT InterfaceOleWrapper_Impl::InvokeGeneral( DISPID dispidMember, unsigned short wFlags,
- DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
- unsigned int * /*puArgErr*/, sal_Bool& bHandled)
-{
- HRESULT ret= S_OK;
- try
- {
-// DISPID_VALUE | The DEFAULT Value is required in JScript when the situation
-// is that we put an object into an Array object ( out parameter). We have to return
-// IDispatch otherwise the object cannot be accessed from the Script.
- if( dispidMember == DISPID_VALUE && wFlags == DISPATCH_PROPERTYGET
- && m_defaultValueType != VT_EMPTY && pvarResult != NULL)
- {
- bHandled= sal_True;
- if( m_defaultValueType == VT_DISPATCH)
- {
- pvarResult->vt= VT_DISPATCH;
- pvarResult->pdispVal= static_cast<IDispatch*>( this);
- AddRef();
- ret= S_OK;
- }
- }
-// ---------
- // function: _GetValueObject
- else if( dispidMember == DISPID_JSCRIPT_VALUE_FUNC)
- {
- bHandled= sal_True;
- if( !pvarResult)
- ret= E_POINTER;
- CComObject< JScriptValue>* pValue;
- if( SUCCEEDED( CComObject<JScriptValue>::CreateInstance( &pValue)))
- {
- pValue->AddRef();
- pvarResult->vt= VT_DISPATCH;
-#ifdef __MINGW32__
- pvarResult->pdispVal= CComQIPtr<IDispatch, &__uuidof(IDispatch)>(pValue->GetUnknown());
-#else
- pvarResult->pdispVal= CComQIPtr<IDispatch>(pValue->GetUnknown());
-#endif
- ret= S_OK;
- }
- else
- ret= DISP_E_EXCEPTION;
- }
- else if( dispidMember == DISPID_GET_STRUCT_FUNC)
- {
- bHandled= sal_True;
- sal_Bool bStruct= sal_False;
-
-
- Reference<XInterface> xIntCore= m_smgr->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.reflection.CoreReflection")));
- Reference<XIdlReflection> xRefl( xIntCore, UNO_QUERY);
- if( xRefl.is() )
- {
- // the first parameter is in DISPPARAMS rgvargs contains the name of the struct.
- CComVariant arg;
- if( pdispparams->cArgs == 1 && SUCCEEDED( arg.ChangeType( VT_BSTR, &pdispparams->rgvarg[0])) )
- {
- Reference<XIdlClass> classStruct= xRefl->forName( reinterpret_cast<const sal_Unicode*>(arg.bstrVal));
- if( classStruct.is())
- {
- Any anyStruct;
- classStruct->createObject( anyStruct);
- CComVariant var;
- anyToVariant( &var, anyStruct );
-
- if( var.vt == VT_DISPATCH)
- {
- VariantCopy( pvarResult, & var);
- bStruct= sal_True;
- }
- }
- }
- }
- ret= bStruct == sal_True ? S_OK : DISP_E_EXCEPTION;
- }
- else if (dispidMember == DISPID_CREATE_TYPE_FUNC)
- {
- bHandled= sal_True;
- if( !pvarResult)
- ret= E_POINTER;
- // the first parameter is in DISPPARAMS rgvargs contains the name of the struct.
- CComVariant arg;
- if( pdispparams->cArgs != 1)
- return DISP_E_BADPARAMCOUNT;
- if (FAILED( arg.ChangeType( VT_BSTR, &pdispparams->rgvarg[0])))
- return DISP_E_BADVARTYPE;
-
- //check if the provided name represents a valid type
- Type type;
- if (getType(arg.bstrVal, type) == false)
- {
- writeExcepinfo(pexcepinfo,OUString(
- OUSTR("[automation bridge] A UNO type with the name ") +
- OUString(reinterpret_cast<const sal_Unicode*>(arg.bstrVal)) + OUSTR(" does not exist!")));
- return DISP_E_EXCEPTION;
- }
-
- if (createUnoTypeWrapper(arg.bstrVal, pvarResult) == false)
- {
- writeExcepinfo(pexcepinfo,OUSTR("[automation bridge] InterfaceOleWrapper_Impl::InvokeGeneral\n"
- "Could not initialize UnoTypeWrapper object!"));
- return DISP_E_EXCEPTION;
- }
- }
- }
- catch(BridgeRuntimeError & e)
- {
- writeExcepinfo(pexcepinfo, e.message);
- ret = DISP_E_EXCEPTION;
- }
- catch(Exception & e)
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::InvokeGeneral : \n") +
- e.Message;
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- catch( ... )
- {
- OUString message= OUSTR("InterfaceOleWrapper_Impl::InvokeGeneral : \n"
- "Unexpected exception");
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- return ret;
-}
-
-
-
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetDispID(BSTR /*bstrName*/, DWORD /*grfdex*/, DISPID __RPC_FAR* /*pid*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::InvokeEx(
- /* [in] */ DISPID /*id*/,
- /* [in] */ LCID /*lcid*/,
- /* [in] */ WORD /*wFlags*/,
- /* [in] */ DISPPARAMS __RPC_FAR* /*pdp*/,
- /* [out] */ VARIANT __RPC_FAR* /*pvarRes*/,
- /* [out] */ EXCEPINFO __RPC_FAR* /*pei*/,
- /* [unique][in] */ IServiceProvider __RPC_FAR* /*pspCaller*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-
-STDMETHODIMP InterfaceOleWrapper_Impl::DeleteMemberByName(
- /* [in] */ BSTR /*bstr*/,
- /* [in] */ DWORD /*grfdex*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::DeleteMemberByDispID(DISPID /*id*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetMemberProperties(
- /* [in] */ DISPID /*id*/,
- /* [in] */ DWORD /*grfdexFetch*/,
- /* [out] */ DWORD __RPC_FAR* /*pgrfdex*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetMemberName(
- /* [in] */ DISPID /*id*/,
- /* [out] */ BSTR __RPC_FAR* /*pbstrName*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetNextDispID(
- /* [in] */ DWORD /*grfdex*/,
- /* [in] */ DISPID /*id*/,
- /* [out] */ DISPID __RPC_FAR* /*pid*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-STDMETHODIMP InterfaceOleWrapper_Impl::GetNameSpaceParent(
- /* [out] */ IUnknown __RPC_FAR *__RPC_FAR* /*ppunk*/)
-{
- HRESULT ret = ResultFromScode(E_NOTIMPL);
-
- return ret;
-}
-
-
-/*************************************************************************
-
- UnoObjectWrapperRemoteOpt
-
-*************************************************************************/
-UnoObjectWrapperRemoteOpt::UnoObjectWrapperRemoteOpt( Reference<XMultiServiceFactory>& aFactory,
- sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass):
-InterfaceOleWrapper_Impl( aFactory, unoWrapperClass, comWrapperClass),
-m_currentId(1)
-
-{
-}
-UnoObjectWrapperRemoteOpt::~UnoObjectWrapperRemoteOpt()
-{
-}
-
-// UnoConversionUtilities
-Reference< XInterface > UnoObjectWrapperRemoteOpt::createUnoWrapperInstance()
-{
- Reference<XWeak> xWeak= static_cast<XWeak*>( new UnoObjectWrapperRemoteOpt(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
-}
-
-STDMETHODIMP UnoObjectWrapperRemoteOpt::GetIDsOfNames ( REFIID /*riid*/, OLECHAR ** rgszNames, unsigned int cNames,
- LCID /*lcid*/, DISPID * rgdispid )
-{
- MutexGuard guard( getBridgeMutex());
-
- if( ! rgdispid)
- return E_POINTER;
- HRESULT ret = E_UNEXPECTED;
- // ----------------------------------------
- // _GetValueObject
- if( ! wcscmp( *rgszNames, JSCRIPT_VALUE_FUNC))
- {
- *rgdispid= DISPID_JSCRIPT_VALUE_FUNC;
- return S_OK;
- }
- else if( ! wcscmp( *rgszNames, GET_STRUCT_FUNC))
- {
- *rgdispid= DISPID_GET_STRUCT_FUNC;
- return S_OK;
- }
-
- // ----------------------------------------
- if (m_xInvocation.is() && (cNames > 0))
- {
- OUString name(reinterpret_cast<const sal_Unicode*>(rgszNames[0]));
- // has this name been determined as "bad"
- BadNameMap::iterator badIter= m_badNameMap.find( name);
- if( badIter == m_badNameMap.end() )
- {
- // name has not been bad before( member exists
- typedef NameToIdMap::iterator ITnames;
- pair< ITnames, bool > pair_id= m_nameToDispIdMap.insert( NameToIdMap::value_type(name, m_currentId++));
- // new ID inserted ?
- if( pair_id.second )
- {// yes, now create MemberInfo and ad to IdToMemberInfoMap
- MemberInfo d(0, name);
- m_idToMemberInfoMap.insert( IdToMemberInfoMap::value_type( m_currentId - 1, d));
- }
-
- *rgdispid = pair_id.first->second;
- ret = S_OK;
- }
- else
- ret= DISP_E_UNKNOWNNAME;
- }
- return ret;
-}
-
-STDMETHODIMP UnoObjectWrapperRemoteOpt::Invoke ( DISPID dispidMember, REFIID /*riid*/, LCID /*lcid*/, unsigned short wFlags,
- DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
- unsigned int * puArgErr )
-{
- HRESULT ret = S_OK;
- try
- {
- sal_Bool bHandled= sal_False;
- ret= InvokeGeneral( dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo,
- puArgErr, bHandled);
- if( bHandled)
- return ret;
-
- if ( dispidMember > 0 && m_xInvocation.is())
- {
-
- IdToMemberInfoMap::iterator it_MemberInfo= m_idToMemberInfoMap.find( dispidMember);
- if( it_MemberInfo != m_idToMemberInfoMap.end() )
- {
- MemberInfo& info= it_MemberInfo->second;
-
- Sequence<Any> params; // holds converted any s
- if( ! info.flags )
- { // DISPID called for the first time
- if( wFlags == DISPATCH_METHOD )
- {
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
-
- if( FAILED( ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- // try to get the exact name
- OUString exactName;
- if (m_xExactName.is())
- {
- exactName = m_xExactName->getExactName( info.name);
- // invoke again
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, exactName, params)))
- info.name= exactName;
- }
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_METHOD;
- } //if( wFlags == DISPATCH_METHOD )
-
- else if( wFlags == DISPATCH_PROPERTYPUT || wFlags == DISPATCH_PROPERTYPUTREF)
- {
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
- if( FAILED( ret= doSetProperty( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- // try to get the exact name
- OUString exactName;
- if (m_xExactName.is())
- {
- exactName = m_xExactName->getExactName( info.name);
- // invoke again
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doSetProperty( pdispparams, pvarResult,
- pexcepinfo, puArgErr, exactName, params)))
- info.name= exactName;
- }
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYGET;
- }
-
- else if( wFlags == DISPATCH_PROPERTYGET)
- {
- if( FAILED( ret= doGetProperty( pdispparams, pvarResult,
- pexcepinfo, info.name))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- // try to get the exact name
- OUString exactName;
- if (m_xExactName.is())
- {
- exactName = m_xExactName->getExactName( info.name);
- // invoke again
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doGetProperty( pdispparams, pvarResult,
- pexcepinfo, exactName)))
- info.name= exactName;
- }
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT;
- }
- else if( wFlags & DISPATCH_METHOD &&
- (wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF))
- {
-
- OUString exactName;
- // convert params for DISPATCH_METHOD or DISPATCH_PROPERTYPUT
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
- // try first as method
- if( FAILED( ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- // try to get the exact name
- if (m_xExactName.is())
- {
- exactName = m_xExactName->getExactName( info.name);
- // invoke again
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, exactName, params)))
- info.name= exactName;
- }
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_METHOD;
-
- // try as property
- if( FAILED( ret) && pdispparams->cArgs == 1)
- {
- if( FAILED( ret= doSetProperty( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- // try to get the exact name
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doSetProperty( pdispparams, pvarResult,
- pexcepinfo, puArgErr, exactName, params)))
- info.name= exactName;
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYGET;
- }
- }
- else if( wFlags & DISPATCH_METHOD && wFlags & DISPATCH_PROPERTYGET)
- {
- OUString exactName;
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
-
- if( FAILED( ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- // try to get the exact name
- if (m_xExactName.is())
- {
- exactName = m_xExactName->getExactName( info.name);
- // invoke again
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, exactName, params)))
- info.name= exactName;
- }
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_METHOD;
-
- // try as property
- if( FAILED( ret) && pdispparams->cArgs == 1)
- {
- if( FAILED( ret= doGetProperty( pdispparams, pvarResult,
- pexcepinfo, info.name))
- && ret == DISP_E_MEMBERNOTFOUND)
- {
- if( exactName.getLength() != 0)
- {
- if( SUCCEEDED( ret= doSetProperty( pdispparams, pvarResult,
- pexcepinfo, puArgErr, exactName, params)))
- info.name= exactName;
- }
- }
- if( SUCCEEDED( ret ) )
- info.flags= DISPATCH_PROPERTYGET;
- }
- }
-
- // update ínformation about this member
- if( ret == DISP_E_MEMBERNOTFOUND)
- {
- // Remember the name as not existing
- // and remove the MemberInfo
- m_badNameMap[info.name]= sal_False;
- m_idToMemberInfoMap.erase( it_MemberInfo);
- }
- } // if( ! info.flags )
- else // IdToMemberInfoMap contains a MemberInfo
- {
- if( wFlags & DISPATCH_METHOD && info.flags == DISPATCH_METHOD)
- {
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
- ret= doInvoke( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params);
- }
- else if( (wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF ) &&
- info.flags & DISPATCH_PROPERTYPUT)
- {
- convertDispparamsArgs(dispidMember, wFlags, pdispparams, params );
- ret= doSetProperty( pdispparams, pvarResult,
- pexcepinfo, puArgErr, info.name, params);
- }
- else if( (wFlags & DISPATCH_PROPERTYGET) && ( info.flags & DISPATCH_PROPERTYGET))
- {
- ret= doGetProperty( pdispparams, pvarResult,
- pexcepinfo, info.name);
- }
- else
- {
- ret= DISP_E_MEMBERNOTFOUND;
- }
- }
- }// if( it_MemberInfo != m_idToMemberInfoMap.end() )
- else
- ret= DISP_E_MEMBERNOTFOUND;
- }
- }
- catch(BridgeRuntimeError& e)
- {
- writeExcepinfo(pexcepinfo, e.message);
- ret = DISP_E_EXCEPTION;
- }
- catch(Exception& e)
- {
- OUString message= OUSTR("UnoObjectWrapperRemoteOpt::Invoke : \n") +
- e.Message;
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
- catch(...)
- {
- OUString message= OUSTR("UnoObjectWrapperRemoteOpt::Invoke : \n"
- "Unexpected exception");
- writeExcepinfo(pexcepinfo, message);
- ret = DISP_E_EXCEPTION;
- }
-
- return ret;
-}
-
-HRESULT UnoObjectWrapperRemoteOpt::methodInvoke( DISPID /*dispidMember*/, DISPPARAMS * /*pdispparams*/, VARIANT * /*pvarResult*/,
- EXCEPINFO * /*pexcepinfo*/, unsigned int * /*puArgErr*/, Sequence<Any> params)
-{
- return S_OK;
-}
-
-
-// The returned HRESULT is only appropriate for IDispatch::Invoke
-static HRESULT mapCannotConvertException( CannotConvertException e, unsigned int * puArgErr)
-{
- HRESULT ret;
- sal_Bool bWriteIndex= sal_True;
-
- switch ( e.Reason)
- {
- case FailReason::OUT_OF_RANGE:
- ret = DISP_E_OVERFLOW;
- break;
- case FailReason::IS_NOT_NUMBER:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::IS_NOT_ENUM:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::IS_NOT_BOOL:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::NO_SUCH_INTERFACE:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::SOURCE_IS_NO_DERIVED_TYPE:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::TYPE_NOT_SUPPORTED:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::INVALID:
- ret = DISP_E_TYPEMISMATCH;
- break;
- case FailReason::NO_DEFAULT_AVAILABLE:
- ret = DISP_E_BADPARAMCOUNT;
- break;
- case FailReason::UNKNOWN:
- ret = E_UNEXPECTED;
- break;
- default:
- ret = E_UNEXPECTED;
- bWriteIndex= sal_False;
- break;
- }
-
- if( bWriteIndex && puArgErr != NULL)
- *puArgErr = e.ArgumentIndex;
- return ret;
-}
-
-// The function maps the TypeClass of the any to VARTYPE: If
-// the Any contains STRUCT or INTERFACE then the return value
-// is VT_DISPATCH. The function is used from o2u_createUnoObjectWrapper
-// and the result is put into the constructor of the uno - wrapper
-// object. If a client asks the object for DISPID_VALUE and this
-// funtion returned VT_DISPATCH then the IDispatch of the same
-// object is being returned.
-// See InterfaceOleWrapper_Impl::Invoke, InterfaceOleWrapper_Impl::m_defaultValueType
-const VARTYPE getVarType( const Any& value)
-{
- VARTYPE ret= VT_EMPTY;
-
- switch ( value.getValueTypeClass())
- {
- case TypeClass_STRUCT: ret= VT_DISPATCH; break;
- case TypeClass_INTERFACE: ret= VT_DISPATCH; break;
- default: break;
- }
- return ret;
-}
-
-
-
-
-} // end namespace
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */