summaryrefslogtreecommitdiff
path: root/extensions/source/ole
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/ole')
-rw-r--r--extensions/source/ole/comifaces.hxx72
-rw-r--r--extensions/source/ole/jscriptclasses.cxx324
-rw-r--r--extensions/source/ole/jscriptclasses.hxx164
-rw-r--r--extensions/source/ole/makefile.mk132
-rw-r--r--extensions/source/ole/ole2uno.cxx60
-rw-r--r--extensions/source/ole/ole2uno.hxx144
-rw-r--r--extensions/source/ole/oleautobridge.component46
-rw-r--r--extensions/source/ole/oleautobridge.uno.dxp2
-rw-r--r--extensions/source/ole/oledll.cxx72
-rw-r--r--extensions/source/ole/oleobjw.cxx2644
-rw-r--r--extensions/source/ole/oleobjw.hxx295
-rw-r--r--extensions/source/ole/olethread.cxx79
-rw-r--r--extensions/source/ole/servprov.cxx754
-rw-r--r--extensions/source/ole/servprov.hxx276
-rw-r--r--extensions/source/ole/servreg.cxx128
-rw-r--r--extensions/source/ole/unoconversionutilities.hxx2445
-rw-r--r--extensions/source/ole/unoobjw.cxx1688
-rw-r--r--extensions/source/ole/unoobjw.hxx297
-rw-r--r--extensions/source/ole/unotypewrapper.cxx181
-rw-r--r--extensions/source/ole/unotypewrapper.hxx105
-rw-r--r--extensions/source/ole/windata.cxx42
-rw-r--r--extensions/source/ole/windata.hxx201
22 files changed, 0 insertions, 10151 deletions
diff --git a/extensions/source/ole/comifaces.hxx b/extensions/source/ole/comifaces.hxx
deleted file mode 100644
index d33f350b8..000000000
--- a/extensions/source/ole/comifaces.hxx
+++ /dev/null
@@ -1,72 +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.
- *
- ************************************************************************/
-#ifndef __COMIFACES_HXX
-#define __COMIFACES_HXX
-
-#include <com/sun/star/uno/XInterface.hpp>
-
-using namespace com::sun::star::uno;
-
-#ifdef __MINGW32__
-DEFINE_GUID(IID_IJScriptValueObject, 0xe40a2331, 0x3bc1, 0x11d4, 0x83, 0x21, 0x00, 0x50, 0x04, 0x52, 0x6a, 0xb4);
-DEFINE_GUID(IID_IUnoObjectWrapper, 0x7B5C3410, 0x66FA, 0x11d4, 0x83, 0x2A, 0x00, 0x50, 0x04, 0x52, 0x6A, 0xB4);
-DEFINE_GUID(IID_IUnoTypeWrapper, 0x8BB66591, 0xA544, 0x4de9, 0x82, 0x2C, 0x57, 0xAB, 0x57, 0xBC, 0xED, 0x1C);
-#endif
-MIDL_INTERFACE("e40a2331-3bc1-11d4-8321-005004526ab4")
-IJScriptValueObject: public IUnknown
-{
- STDMETHOD( Set)( VARIANT type, VARIANT value)= 0;
- STDMETHOD( Get)( VARIANT *val)= 0;
- STDMETHOD( InitOutParam)()= 0;
- STDMETHOD( InitInOutParam)( VARIANT type, VARIANT value)= 0;
- STDMETHOD( IsOutParam)( VARIANT_BOOL * flag)= 0;
- STDMETHOD( IsInOutParam)( VARIANT_BOOL * flag)= 0;
- STDMETHOD( GetValue)( BSTR* type, VARIANT *value)= 0;
-
-};
-
-MIDL_INTERFACE("7B5C3410-66FA-11d4-832A-005004526AB4")
-IUnoObjectWrapper: public IUnknown
-{
- STDMETHOD( getWrapperXInterface)( Reference<XInterface>* pInt)=0;
- STDMETHOD( getOriginalUnoObject)( Reference<XInterface>* pInt)=0;
- STDMETHOD( getOriginalUnoStruct)( Any * pStruct)=0;
-
-};
-
-MIDL_INTERFACE("8BB66591-A544-4de9-822C-57AB57BCED1C")
-IUnoTypeWrapper: public IUnknown
-{
- STDMETHOD(put_Name)(BSTR val) = 0;
- STDMETHOD(get_Name)(BSTR* pVal) = 0;
-};
-
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/jscriptclasses.cxx b/extensions/source/ole/jscriptclasses.cxx
deleted file mode 100644
index 5b5083a0c..000000000
--- a/extensions/source/ole/jscriptclasses.cxx
+++ /dev/null
@@ -1,324 +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 "jscriptclasses.hxx"
-
-//========================================================================
-// JScriptValue
-//========================================================================
-JScriptValue::JScriptValue(): m_bOutParam(0), m_bInOutParam(0)
-{
-}
-
-JScriptValue::~JScriptValue()
-{
-}
-
-
-// JScriptValue, IDispatch --------------------------------------------
-STDMETHODIMP JScriptValue::GetTypeInfoCount(UINT* /*pctinfo*/)
-{
- return E_NOTIMPL;
-}
-
-// JScriptValue, IDispatch --------------------------------------------
-STDMETHODIMP JScriptValue::GetTypeInfo( UINT /*iTInfo*/,
- LCID /*lcid*/,
- ITypeInfo** /*ppTInfo*/)
-{
- return E_NOTIMPL;
-}
-
-// JScriptValue, IDispatch --------------------------------------------
-STDMETHODIMP JScriptValue::GetIDsOfNames( REFIID /*riid*/,
- LPOLESTR *rgszNames,
- UINT /*cNames*/,
- LCID /*lcid*/,
- DISPID *rgDispId)
-{
- if( !rgDispId)
- return E_POINTER;
-
-
- HRESULT ret= S_OK;
- CComBSTR name(*rgszNames);
- name.ToLower();
-
- if( name == CComBSTR( L"set") )
- *rgDispId= 1;
- else if( name == CComBSTR( L"get") )
- *rgDispId= 2;
- else if( name == CComBSTR( L"initoutparam") )
- *rgDispId= 3;
- else if( name == CComBSTR( L"initinoutparam") )
- *rgDispId= 4;
- else
- ret= DISP_E_UNKNOWNNAME;
-
- return ret;
-}
-
-// JScriptValue, IDispatch --------------------------------------------
-STDMETHODIMP JScriptValue::Invoke( DISPID dispIdMember,
- REFIID /*riid*/,
- LCID /*lcid*/,
- WORD wFlags,
- DISPPARAMS *pDispParams,
- VARIANT *pVarResult,
- EXCEPINFO* /*pExcepInfo*/,
- UINT* /*puArgErr*/)
-{
- if( pDispParams->cNamedArgs)
- return DISP_E_NONAMEDARGS;
-
-
- HRESULT ret= S_OK;
- switch( dispIdMember)
- {
- case 0: // DISPID_VALUE
- if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
- {
- if( FAILED( VariantCopy( pVarResult, &m_varValue)))
- ret= E_FAIL;
- }
- else
- ret= E_POINTER;
- break;
- case 1:
- if( wFlags & DISPATCH_METHOD)
- ret= Set( pDispParams->rgvarg[1], pDispParams->rgvarg[0]);
- if( FAILED( ret))
- ret= DISP_E_EXCEPTION;
- break;
- case 2:
- if( wFlags & DISPATCH_METHOD)
- ret= Get( pVarResult);
- if( FAILED( ret))
- ret= DISP_E_EXCEPTION;
- break;
- case 3:
- if( wFlags & DISPATCH_METHOD)
- ret= InitOutParam();
- if( FAILED( ret))
- ret= DISP_E_EXCEPTION;
- break;
- case 4:
- if( wFlags & DISPATCH_METHOD)
- ret= InitInOutParam( pDispParams->rgvarg[1], pDispParams->rgvarg[0]);
- if( FAILED( ret))
- ret= DISP_E_EXCEPTION;
- break;
- default:
- ret= DISP_E_MEMBERNOTFOUND;
- break;
- }
-
- return ret;
-}
-
-// JScriptValue, IScriptOutParam-----------------------
-STDMETHODIMP JScriptValue::Set( VARIANT type, VARIANT value)
-{
- Lock();
- HRESULT hr= S_OK;
- m_varValue.Clear();
- hr= VariantCopyInd( &m_varValue, &value);
- VARIANT var;
- VariantInit( &var);
- if( SUCCEEDED( hr= VariantChangeType( &var, &type, 0, VT_BSTR)))
- m_bstrType= var.bstrVal;
- Unlock();
- return hr;
-}
-// JScriptValue, IScriptOutParam-----------------------
-STDMETHODIMP JScriptValue::Get( VARIANT *val)
-{
- Lock();
- if( !val)
- return E_POINTER;
- HRESULT hr= VariantCopy( val, &m_varValue);
- Unlock();
- return hr;
-}
-
-STDMETHODIMP JScriptValue::InitOutParam()
-{
- Lock();
- m_varValue.Clear();
- m_bOutParam= true;
- m_bInOutParam= false;
- Unlock();
- return S_OK;
-}
-
-STDMETHODIMP JScriptValue::InitInOutParam( VARIANT type, VARIANT value)
-{
- Lock();
- m_bInOutParam= true;
- m_bOutParam= false;
- Unlock();
- return Set( type, value);
-}
-
-STDMETHODIMP JScriptValue::IsOutParam( VARIANT_BOOL * flag)
-{
- Lock();
- if( !flag)
- return E_POINTER;
- *flag= m_bOutParam ? VARIANT_TRUE : VARIANT_FALSE;
- Unlock();
- return S_OK;
-}
-
-STDMETHODIMP JScriptValue::IsInOutParam( VARIANT_BOOL * flag)
-{
- Lock();
- if( !flag)
- return E_POINTER;
- *flag= m_bInOutParam ? VARIANT_TRUE : VARIANT_FALSE;
- Unlock();
- return S_OK;
-}
-
-STDMETHODIMP JScriptValue::GetValue( BSTR* type, VARIANT *value)
-{
- Lock();
- if( !type || !value)
- return E_POINTER;
- HRESULT hr;
- if( SUCCEEDED( hr= m_bstrType.CopyTo( type)))
- hr= VariantCopy( value, &m_varValue);
- Unlock();
- return hr;
-}
-
-//##########################################################################################
-// JScriptOutValue
-//##########################################################################################
-
-JScriptOutParam::JScriptOutParam()
-{
-}
-
-JScriptOutParam::~JScriptOutParam()
-{
-}
-
-
-// JScriptOutParam, IDispatch --------------------------------------------
-STDMETHODIMP JScriptOutParam::GetTypeInfoCount(UINT* /*pctinfo*/)
-{
- return E_NOTIMPL;
-}
-
-// JScriptOutParam, IDispatch --------------------------------------------
-STDMETHODIMP JScriptOutParam::GetTypeInfo( UINT /*iTInfo*/,
- LCID /*lcid*/,
- ITypeInfo** /*ppTInfo*/)
-{
- return E_NOTIMPL;
-}
-
-// JScriptOutParam, IDispatch --------------------------------------------
-STDMETHODIMP JScriptOutParam::GetIDsOfNames( REFIID /*riid*/,
- LPOLESTR *rgszNames,
- UINT /*cNames*/,
- LCID /*lcid*/,
- DISPID *rgDispId)
-{
- if( !rgDispId)
- return E_POINTER;
-
-
- HRESULT ret= S_OK;
- CComBSTR name(*rgszNames);
- name.ToLower();
-
- if( name == CComBSTR( L"0") )
- *rgDispId= 1;
- else
- ret= DISP_E_UNKNOWNNAME;
-
- return ret;
-}
-
-// JScriptOutParam, IDispatch --------------------------------------------
-STDMETHODIMP JScriptOutParam::Invoke( DISPID dispIdMember,
- REFIID /*riid*/,
- LCID /*lcid*/,
- WORD wFlags,
- DISPPARAMS *pDispParams,
- VARIANT *pVarResult,
- EXCEPINFO* /*pExcepInfo*/,
- UINT* /*puArgErr*/)
-{
- HRESULT ret= S_OK;
- switch( dispIdMember)
- {
- case 0: // DISPID_VALUE
- if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
- {
- if( FAILED( VariantCopy( pVarResult, &m_varValue)))
- ret= E_FAIL;
- }
- else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF)
- {
- m_varValue.Clear();
- if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0])))
- ret= E_FAIL;
- }
- else
- ret= E_POINTER;
- break;
- case 1: //
- if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
- {
- if( FAILED( VariantCopy( pVarResult, &m_varValue)))
- ret= E_FAIL;
- }
- else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF)
- {
- m_varValue.Clear();
- if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0])))
- ret= E_FAIL;
- }
- else
- ret= E_POINTER;
- break;
-
- default:
- ret= DISP_E_MEMBERNOTFOUND;
- break;
- }
-
- return ret;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/jscriptclasses.hxx b/extensions/source/ole/jscriptclasses.hxx
deleted file mode 100644
index f19898e39..000000000
--- a/extensions/source/ole/jscriptclasses.hxx
+++ /dev/null
@@ -1,164 +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.
- *
- ************************************************************************/
-#ifndef __JSCRIPTCLASSES_HXX
-#define __JSCRIPTCLASSES_HXX
-
-
-#pragma warning (push,1)
-#pragma warning (disable:4548)
-
-#include <tools/presys.h>
-#define STRICT
-#define _WIN32_WINNT 0x0403
-#define _WIN32_DCOM
-#if OSL_DEBUG_LEVEL > 0
-//#define _ATL_DEBUG_INTERFACES
-#endif
-#include <atlbase.h>
-extern CComModule _Module;
-#include <atlcom.h>
-
-#pragma warning (pop)
-#pragma warning (disable:4505)
- // disable "unreferenced local function has been removed" globally
-
-#include "comifaces.hxx"
-
-
-
-// Sequences are represented by prepending "[]", e.g. []char, [][]byte, [][][]object, etc.
-
-// To make a JScriptValue object to an out parameter, call
-// "InitOutParam" and to make it a in/out parameter call
-// "InitInOutParam"
-
-// If the object represents an out parameter then the value can after the call
-// be retrived by "Get".
-
-// From JavaScript the functions Get, Set, InitOutParam and InitInOutParam are
-// used, that is they are accessible through IDispatch. The functions are used
-// by the bridge.
-
-class JScriptValue:
- public CComObjectRootEx<CComMultiThreadModel>,
- public IJScriptValueObject,
- public IDispatch
-{
-public:
- JScriptValue();
- virtual ~JScriptValue();
-
- BEGIN_COM_MAP(JScriptValue)
- COM_INTERFACE_ENTRY(IDispatch)
- COM_INTERFACE_ENTRY(IJScriptValueObject)
- END_COM_MAP()
-
- // IDispatch -------------------------------------------
- STDMETHOD( GetTypeInfoCount)(UINT *pctinfo);
-
- STDMETHOD( GetTypeInfo)( UINT iTInfo,
- LCID lcid,
- ITypeInfo **ppTInfo);
-
- STDMETHOD( GetIDsOfNames)( REFIID riid,
- LPOLESTR *rgszNames,
- UINT cNames,
- LCID lcid,
- DISPID *rgDispId);
-
- STDMETHOD( Invoke)( DISPID dispIdMember,
- REFIID riid,
- LCID lcid,
- WORD wFlags,
- DISPPARAMS *pDispParams,
- VARIANT *pVarResult,
- EXCEPINFO *pExcepInfo,
- UINT *puArgErr);
- // IJScriptOutParam --------------------------------------
-
- STDMETHOD( Set)( VARIANT type, VARIANT value);
- STDMETHOD( Get)( VARIANT *val);
- STDMETHOD( InitOutParam)();
- STDMETHOD( InitInOutParam)( VARIANT type, VARIANT value);
- STDMETHOD( IsOutParam)( VARIANT_BOOL * flag);
- STDMETHOD( IsInOutParam)( VARIANT_BOOL * flag);
- STDMETHOD( GetValue)( BSTR* type, VARIANT *value);
-
-
- CComVariant m_varValue;
- CComBSTR m_bstrType;
- unsigned m_bOutParam: 1;
- unsigned m_bInOutParam: 1;
-
-};
-
-// If a class is implemented in JScript, then its method
-class JScriptOutParam:
- public CComObjectRootEx<CComMultiThreadModel>,
- public IDispatch
-{
-public:
- JScriptOutParam();
- virtual ~JScriptOutParam();
-
- BEGIN_COM_MAP(JScriptOutParam)
- COM_INTERFACE_ENTRY(IDispatch)
- END_COM_MAP()
-
- // IDispatch -------------------------------------------
- STDMETHOD( GetTypeInfoCount)(UINT *pctinfo);
-
- STDMETHOD( GetTypeInfo)( UINT iTInfo,
- LCID lcid,
- ITypeInfo **ppTInfo);
-
- STDMETHOD( GetIDsOfNames)( REFIID riid,
- LPOLESTR *rgszNames,
- UINT cNames,
- LCID lcid,
- DISPID *rgDispId);
-
- STDMETHOD( Invoke)( DISPID dispIdMember,
- REFIID riid,
- LCID lcid,
- WORD wFlags,
- DISPPARAMS *pDispParams,
- VARIANT *pVarResult,
- EXCEPINFO *pExcepInfo,
- UINT *puArgErr);
-
-
-private:
- CComVariant m_varValue;
-};
-
-#include <tools/postsys.h>
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/makefile.mk b/extensions/source/ole/makefile.mk
deleted file mode 100644
index a9ff68118..000000000
--- a/extensions/source/ole/makefile.mk
+++ /dev/null
@@ -1,132 +0,0 @@
-#*************************************************************************
-#
-# 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.
-#
-#*************************************************************************
-PRJ=..$/..
-
-# -----------------------------------------------------------------
-
-PRJNAME=extensions
-TARGET=oleautobridge.uno
-TARGET2=oleautobridge2.uno
-
-ENABLE_EXCEPTIONS=TRUE
-
-.INCLUDE : $(PRJ)$/util$/makefile.pmk
-
-LIBTARGET=NO
-USE_DEFFILE=YES
-
-USE_DEFFILE=TRUE
-
-INCPRE+= $(foreach,i,$(ATL_INCLUDE) -I$(i))
-
-# --- Settings -----------------------------------------------------
-
-.IF "$(GUI)" == "WNT" && "$(DISABLE_ATL)"==""
-
-.IF "$(USE_DEBUG_RUNTIME)"!=""
-CDEFS+=-D_DEBUG
-.ENDIF # "$(USE_DEBUG_RUNTIME)"!=""
-
-SLOFILES= \
- $(SLO)$/servreg.obj \
- $(SLO)$/servprov.obj \
- $(SLO)$/unoobjw.obj \
- $(SLO)$/oleobjw.obj \
- $(SLO)$/olethread.obj \
- $(SLO)$/oledll.obj \
- $(SLO)$/jscriptclasses.obj \
- $(SLO)$/ole2uno.obj \
- $(SLO)$/windata.obj \
- $(SLO)$/unotypewrapper.obj
-
-SECOND_BUILD=OWNGUID
-OWNGUID_SLOFILES=$(SLOFILES)
-OWNGUIDCDEFS+= -DOWNGUID
-
-# the original library
-SHL1TARGET=$(TARGET)
-SHL1STDLIBS=\
- $(SALLIB) \
- $(CPPULIB) \
- $(CPPUHELPERLIB) \
- $(OLE32LIB) \
- $(UUIDLIB) \
- $(ADVAPI32LIB) \
- $(OLEAUT32LIB)
-
-.IF "$(COM)"=="MSC"
-.IF "$(USE_DEBUG_RUNTIME)" != ""
- SHL1STDLIBS+= $(ATL_LIB)$/atlsd.lib
-.ELSE
- SHL1STDLIBS+= $(ATL_LIB)$/atls.lib
-.ENDIF
-.ENDIF # "$(COM)"=="MSC"
-
-SHL1LIBS=
-SHL1OBJS=$(SLOFILES)
-
-DEF1NAME=$(SHL1TARGET)
-DEF1EXPORTFILE=$(SHL1TARGET).dxp
-
-# the second library
-SHL2TARGET=$(TARGET2)
-SHL2STDLIBS=\
- $(SALLIB) \
- $(CPPULIB) \
- $(CPPUHELPERLIB) \
- $(OLE32LIB) \
- $(UUIDLIB) \
- $(ADVAPI32LIB) \
- $(OLEAUT32LIB)
-
-.IF "$(COM)"=="MSC"
-.IF "$(USE_DEBUG_RUNTIME)" != ""
- SHL2STDLIBS+= $(ATL_LIB)$/atlsd.lib
-.ELSE
- SHL2STDLIBS+= $(ATL_LIB)$/atls.lib
-.ENDIF
-.ENDIF # "$(COM)"=="MSC"
-
-SHL2LIBS=
-SHL2OBJS=$(REAL_OWNGUID_SLOFILES)
-
-DEF2NAME=$(SHL2TARGET)
-DEF2EXPORTFILE=$(TARGET).dxp
-
-.ENDIF # "$(GUI)" == "WNT" && "$(DISABLE_ATL)"==""
-
-#----------------------------------------------------------------
-
-.INCLUDE : target.mk
-
-ALLTAR : $(MISC)/oleautobridge.component
-
-$(MISC)/oleautobridge.component .ERRREMOVE : \
- $(SOLARENV)/bin/createcomponent.xslt oleautobridge.component
- $(XSLTPROC) --nonet --stringparam uri \
- '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \
- $(SOLARENV)/bin/createcomponent.xslt oleautobridge.component
diff --git a/extensions/source/ole/ole2uno.cxx b/extensions/source/ole/ole2uno.cxx
deleted file mode 100644
index 741634e07..000000000
--- a/extensions/source/ole/ole2uno.cxx
+++ /dev/null
@@ -1,60 +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 "osl/getglobalmutex.hxx"
-#include "rtl/instance.hxx"
-#include "ole2uno.hxx"
-
-using namespace osl;
-namespace ole_adapter
-{
-
-struct MutexInit
-{
- Mutex * operator () ()
- {
- static Mutex aInstance;
- return &aInstance;
- }
-};
-
-
-Mutex * getBridgeMutex()
-{
- return rtl_Instance< Mutex, MutexInit, ::osl::MutexGuard,
- ::osl::GetGlobalMutex >::create(
- MutexInit(), ::osl::GetGlobalMutex());
-}
-
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/ole2uno.hxx b/extensions/source/ole/ole2uno.hxx
deleted file mode 100644
index ca902f4e8..000000000
--- a/extensions/source/ole/ole2uno.hxx
+++ /dev/null
@@ -1,144 +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.
- *
- ************************************************************************/
-
-#ifndef _OLE2UNO_HXX
-#define _OLE2UNO_HXX
-
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#define STRICT
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0400
-#endif
-
-#define _WIN32_DCOM
-#if OSL_DEBUG_LEVEL > 0
-//#define _ATL_DEBUG_INTERFACES
-#endif
-
-#pragma warning (push,1)
-#pragma warning (disable:4917)
-#pragma warning (disable:4005)
-#pragma warning (disable:4548)
-
-#include <tchar.h>
-#if (_MSC_VER >= 1200) || defined(__MINGW32__)
-#include <dispex.h>
-#endif
-
-#include <tools/presys.h>
-#include <list>
-#include <tools/postsys.h>
-
-#pragma warning (pop)
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/lang/XSingleServiceFactory.hpp>
-#include <com/sun/star/script/XInvocation.hpp>
-#include <com/sun/star/registry/XRegistryKey.hpp>
-#include <com/sun/star/bridge/XBridgeSupplier2.hpp>
-#include <com/sun/star/bridge/ModelDependent.hpp>
-#include <com/sun/star/reflection/InvocationTargetException.hpp>
-#include <com/sun/star/uno/Exception.hpp>
-#include <com/sun/star/beans/UnknownPropertyException.hpp>
-#include <cppuhelper/implbase2.hxx>
-#include <cppuhelper/implbase1.hxx>
-#include <cppuhelper/typeprovider.hxx>
-#include <cppuhelper/factory.hxx>
-#include <sal/types.h>
-#include <typelib/typeclass.h>
-#include <osl/diagnose.h>
-#include <osl/mutex.hxx>
-#include <com/sun/star/uno/Reference.h>
-#include <rtl/process.h>
-#include <rtl/uuid.h>
-
-#define UNO_2_OLE_EXCEPTIONCODE 1001
-#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
-using namespace com::sun::star::uno;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::script;
-using namespace com::sun::star::registry;
-using namespace com::sun::star::reflection;
-using namespace com::sun::star::beans;
-using namespace osl;
-using namespace std;
-
-using ::rtl::OUString;
-
-namespace ole_adapter
-{
-
-const VARTYPE getVarType( const Any& val);
-/* creates a Type object for a given type name.
-
- The function returns false if the name does not represent
- a valid type.
-*/
-bool getType( BSTR name, Type & type);
-void o2u_attachCurrentThread();
-
-struct equalOUString_Impl
-{
- bool operator()(const OUString & s1, const OUString & s2) const
- {
- return s1 == s2;
- }
-};
-
-struct hashOUString_Impl
-{
- size_t operator()(const OUString & rName) const
- {
- return rName.hashCode();
- }
-};
-
-
-class BridgeRuntimeError
-{
-public:
- BridgeRuntimeError(const OUString& sMessage)
- {
- message = sMessage;
- }
- OUString message;
-};
-
-
-Mutex* getBridgeMutex();
-
-} // end namespace
-
-
-
-#endif // _OLE2UNO_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/oleautobridge.component b/extensions/source/ole/oleautobridge.component
deleted file mode 100644
index 6f5309e42..000000000
--- a/extensions/source/ole/oleautobridge.component
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--**********************************************************************
-*
-* 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.
-*
-**********************************************************************-->
-
-<component loader="com.sun.star.loader.SharedLibrary"
- xmlns="http://openoffice.org/2010/uno-components">
- <implementation name="com.sun.star.comp.ole.OleClient">
- <service name="com.sun.star.bridge.OleObjectFactory"/>
- <service name="com.sun.star.bridge.oleautomation.Factory"/>
- </implementation>
- <implementation name="com.sun.star.comp.ole.OleConverter2">
- <service name="com.sun.star.bridge.OleBridgeSupplier2"/>
- <service name="com.sun.star.bridge.oleautomation.BridgeSupplier"/>
- </implementation>
- <implementation name="com.sun.star.comp.ole.OleConverterVar1">
- <service name="com.sun.star.bridge.OleBridgeSupplierVar1"/>
- </implementation>
- <implementation name="com.sun.star.comp.ole.OleServer">
- <service name="com.sun.star.bridge.OleApplicationRegistration"/>
- <service name="com.sun.star.bridge.oleautomation.ApplicationRegistration"/>
- </implementation>
-</component>
diff --git a/extensions/source/ole/oleautobridge.uno.dxp b/extensions/source/ole/oleautobridge.uno.dxp
deleted file mode 100644
index 843ff2fc3..000000000
--- a/extensions/source/ole/oleautobridge.uno.dxp
+++ /dev/null
@@ -1,2 +0,0 @@
-component_getFactory @101
-component_canUnload @103
diff --git a/extensions/source/ole/oledll.cxx b/extensions/source/ole/oledll.cxx
deleted file mode 100644
index b8f62768d..000000000
--- a/extensions/source/ole/oledll.cxx
+++ /dev/null
@@ -1,72 +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"
-
-#define STRICT
-#define _WIN32_WINNT 0x0403
-#define _WIN32_DCOM
-
-#pragma warning (push,1)
-#pragma warning (disable:4548)
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(_DEBUG_RUNTIME)
-#undef _DEBUG
-#endif
-#ifdef __MINGW32__
-#define _INIT_ATL_COMMON_VARS
-#endif
-#include <atlbase.h>
-CComModule _Module;
-#include <atlcom.h>
-
-#pragma warning (pop)
-
-BEGIN_OBJECT_MAP(ObjectMap)
-END_OBJECT_MAP()
-
-/////////////////////////////////////////////////////////////////////////////
-// DLL Entry Point
-
-extern "C"
-BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
-{
- if (dwReason == DLL_PROCESS_ATTACH)
- {
- _Module.Init(ObjectMap, hInstance, NULL);
- DisableThreadLibraryCalls(hInstance);
- }
- else if (dwReason == DLL_PROCESS_DETACH)
- {
- _Module.Term();
- }
- return TRUE; // ok
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/oleobjw.cxx b/extensions/source/ole/oleobjw.cxx
deleted file mode 100644
index dbc37ffae..000000000
--- a/extensions/source/ole/oleobjw.cxx
+++ /dev/null
@@ -1,2644 +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 "rtl/ustrbuf.hxx"
-
-
-#include "osl/diagnose.h"
-#include "osl/doublecheckedlocking.h"
-#include "osl/thread.h"
-
-#include "boost/scoped_array.hpp"
-#include <com/sun/star/script/FailReason.hpp>
-#include <com/sun/star/beans/XMaterialHolder.hpp>
-#include <com/sun/star/script/XTypeConverter.hpp>
-#include <com/sun/star/script/FinishEngineEvent.hpp>
-#include <com/sun/star/script/InterruptReason.hpp>
-#include <com/sun/star/script/XEngineListener.hpp>
-#include <com/sun/star/script/XDebugging.hpp>
-#include <com/sun/star/script/XInvocation.hpp>
-#include <com/sun/star/script/ContextInformation.hpp>
-#include <com/sun/star/script/FinishReason.hpp>
-#include <com/sun/star/script/XEngine.hpp>
-#include <com/sun/star/script/InterruptEngineEvent.hpp>
-#include <com/sun/star/script/XLibraryAccess.hpp>
-#include <com/sun/star/script/BasicErrorException.hpp>
-#include <com/sun/star/bridge/ModelDependent.hpp>
-
-#include "com/sun/star/bridge/oleautomation/NamedArgument.hpp"
-#include "com/sun/star/bridge/oleautomation/PropertyPutArgument.hpp"
-
-#include <typelib/typedescription.hxx>
-#include <rtl/uuid.h>
-#include <rtl/memory.h>
-#include <rtl/ustring.hxx>
-
-#include "jscriptclasses.hxx"
-
-#include "oleobjw.hxx"
-#include "unoobjw.hxx"
-#include <stdio.h>
-using namespace std;
-using namespace boost;
-using namespace osl;
-using namespace cppu;
-using namespace com::sun::star::script;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::bridge;
-using namespace com::sun::star::bridge::oleautomation;
-using namespace com::sun::star::bridge::ModelDependent;
-using namespace ::com::sun::star;
-
-using ::rtl::OUString;
-using ::rtl::OString;
-using ::rtl::OUStringBuffer;
-
-#define JSCRIPT_ID_PROPERTY L"_environment"
-#define JSCRIPT_ID L"jscript"
-namespace ole_adapter
-{
-
-
-// key: XInterface pointer created by Invocation Adapter Factory
-// value: XInterface pointer to the wrapper class.
-// Entries to the map are made within
-// Any createOleObjectWrapper(IUnknown* pUnknown, const Type& aType);
-// Entries are being deleted if the wrapper class's destructor has been
-// called.
-// Before UNO object is wrapped to COM object this map is checked
-// to see if the UNO object is already a wrapper.
-boost::unordered_map<sal_uInt32, sal_uInt32> AdapterToWrapperMap;
-// key: XInterface of the wrapper object.
-// value: XInterface of the Interface created by the Invocation Adapter Factory.
-// A COM wrapper is responsible for removing the corresponding entry
-// in AdapterToWrappperMap if it is being destroyed. Because the wrapper does not
-// know about its adapted interface it uses WrapperToAdapterMap to get the
-// adapted interface which is then used to locate the entry in AdapterToWrapperMap.
-boost::unordered_map<sal_uInt32,sal_uInt32> WrapperToAdapterMap;
-
-boost::unordered_map<sal_uInt32, WeakReference<XInterface> > ComPtrToWrapperMap;
-/*****************************************************************************
-
- class implementation IUnknownWrapper_Impl
-
-*****************************************************************************/
-
-IUnknownWrapper_Impl::IUnknownWrapper_Impl( Reference<XMultiServiceFactory>& xFactory,
- sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass):
- UnoConversionUtilities<IUnknownWrapper_Impl>( xFactory, unoWrapperClass, comWrapperClass),
- m_pxIdlClass( NULL), m_eJScript( JScriptUndefined),
- m_bComTlbIndexInit(false), m_bHasDfltMethod(false), m_bHasDfltProperty(false)
-{
-}
-
-
-IUnknownWrapper_Impl::~IUnknownWrapper_Impl()
-{
- o2u_attachCurrentThread();
- MutexGuard guard(getBridgeMutex());
- XInterface * xIntRoot = (OWeakObject *)this;
-#if OSL_DEBUG_LEVEL > 0
- acquire(); // make sure we don't delete us twice because of Reference
- OSL_ASSERT( Reference<XInterface>( static_cast<XWeak*>(this), UNO_QUERY).get() == xIntRoot );
-#endif
-
- // remove entries in global maps
- typedef boost::unordered_map<sal_uInt32, sal_uInt32>::iterator _IT;
- _IT it= WrapperToAdapterMap.find( (sal_uInt32) xIntRoot);
- if( it != WrapperToAdapterMap.end())
- {
- sal_uInt32 adapter= it->second;
-
- AdapterToWrapperMap.erase( adapter);
- WrapperToAdapterMap.erase( it);
- }
-
- IT_Com it_c= ComPtrToWrapperMap.find( (sal_uInt32) m_spUnknown.p);
- if(it_c != ComPtrToWrapperMap.end())
- ComPtrToWrapperMap.erase(it_c);
-
-#if OSL_DEBUG_LEVEL > 0
- fprintf(stderr,"[automation bridge] ComPtrToWrapperMap contains: %i \n",
- ComPtrToWrapperMap.size());
-#endif
-}
-
-Any IUnknownWrapper_Impl::queryInterface(const Type& t)
- throw (RuntimeException)
-{
- if (t == getCppuType(static_cast<Reference<XDefaultMethod>*>( 0)) && !m_bHasDfltMethod )
- return Any();
- if (t == getCppuType(static_cast<Reference<XDefaultProperty>*>( 0)) && !m_bHasDfltProperty )
- return Any();
- if ( ( t == getCppuType(static_cast<Reference<XInvocation>*>( 0)) || t == getCppuType(static_cast<Reference<XAutomationInvocation>*>( 0)) ) && !m_spDispatch)
- return Any();
- // XDirectInvocation seems to be an oracle replacement for XAutomationInvocation, however it is flawed esecially wrt. assumptions about whether to invoke a
- // Put or Get property, the implementation code has no business guessing that, it's up to the caller to decide that. Worse XDirectInvocation duplicates lots of code.
- // XAutomationInvocation provides seperate calls for put& get
- // properties. Note: Currently the basic runtime doesn't call put properties directly, it should... after all the basic runtime should know whether it is calling a put or get property.
- // For the moment for ease of merging we will let the XDirectInvoke and XAuthomationInvocation interfaces stay side by side ( and for the momemnt at least I would prefer the basic
- // runtime to call XAutomationInvocation instead of XDirectInvoke
- return WeakImplHelper8<XInvocation, XBridgeSupplier2,
- XInitialization, XAutomationObject, XDefaultProperty, XDefaultMethod, XDirectInvocation, XAutomationInvocation >::queryInterface(t);
-}
-
-Reference<XIntrospectionAccess> SAL_CALL IUnknownWrapper_Impl::getIntrospection(void)
- throw (RuntimeException )
-{
- Reference<XIntrospectionAccess> ret;
-
- return ret;
-}
-
-Any SAL_CALL IUnknownWrapper_Impl::invokeGetProperty( const OUString& aPropertyName, const Sequence< Any >& aParams, Sequence< sal_Int16 >& aOutParamIndex, Sequence< Any >& aOutParam )
-{
- Any aResult;
- try
- {
- o2u_attachCurrentThread();
- ITypeInfo * pInfo = getTypeInfo();
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(aPropertyName, & aDescGet, & aDescPut, & aVarDesc);
- if ( !aDescGet )
- {
- OUString msg(OUSTR("[automation bridge]Property \"") + aPropertyName +
- OUSTR("\" is not supported"));
- throw UnknownPropertyException(msg, Reference<XInterface>());
- }
- aResult = invokeWithDispIdComTlb( aDescGet, aPropertyName, aParams, aOutParamIndex, aOutParam );
- }
- catch ( Exception& e )
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::invokeGetProperty ! Message : \n") +
- e.Message, Reference<XInterface>());
- }
- return aResult;
-}
-
-Any SAL_CALL IUnknownWrapper_Impl::invokePutProperty( const OUString& aPropertyName, const Sequence< Any >& aParams, Sequence< sal_Int16 >& aOutParamIndex, Sequence< Any >& aOutParam )
-{
- Any aResult;
- try
- {
- o2u_attachCurrentThread();
- ITypeInfo * pInfo = getTypeInfo();
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(aPropertyName, & aDescGet, & aDescPut, & aVarDesc);
- if ( !aDescPut )
- {
- OUString msg(OUSTR("[automation bridge]Property \"") + aPropertyName +
- OUSTR("\" is not supported"));
- throw UnknownPropertyException(msg, Reference<XInterface>());
- }
- aResult = invokeWithDispIdComTlb( aDescPut, aPropertyName, aParams, aOutParamIndex, aOutParam );
- }
- catch ( Exception& e )
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::invokePutProperty ! Message : \n") +
- e.Message, Reference<XInterface>());
- }
- return aResult;
-}
-
-
-Any SAL_CALL IUnknownWrapper_Impl::invoke( const OUString& aFunctionName,
- const Sequence< Any >& aParams, Sequence< sal_Int16 >& aOutParamIndex,
- Sequence< Any >& aOutParam )
- throw(IllegalArgumentException, CannotConvertException, InvocationTargetException,
- RuntimeException)
-{
- if ( ! m_spDispatch )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] The object does not have an IDispatch interface"),
- Reference<XInterface>());
- }
-
- Any ret;
-
- try
- {
- o2u_attachCurrentThread();
-
- TypeDescription methodDesc;
- getMethodInfo(aFunctionName, methodDesc);
- if( methodDesc.is())
- {
- ret = invokeWithDispIdUnoTlb(aFunctionName,
- aParams,
- aOutParamIndex,
- aOutParam);
- }
- else
- {
- ret= invokeWithDispIdComTlb( aFunctionName,
- aParams,
- aOutParamIndex,
- aOutParam);
- }
- }
- catch (IllegalArgumentException &)
- {
- throw;
- }
- catch (CannotConvertException &)
- {
- throw;
- }
- catch (InvocationTargetException &)
- {
- throw;
- }
- catch (BridgeRuntimeError & e)
- {
- throw RuntimeException(e.message, Reference<XInterface>());
- }
- catch (Exception & e)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::invoke ! Message : \n") +
- e.Message, Reference<XInterface>());
-
- }
- catch(...)
- {
- throw RuntimeException(
- OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::Invoke !"), Reference<XInterface>());
- }
- return ret;
-}
-
-void SAL_CALL IUnknownWrapper_Impl::setValue( const OUString& aPropertyName,
- const Any& aValue )
- throw(UnknownPropertyException, CannotConvertException, InvocationTargetException,
- RuntimeException)
-{
- if ( ! m_spDispatch )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] The object does not have an IDispatch interface"),
- Reference<XInterface>());
- }
- try
- {
- o2u_attachCurrentThread();
-
- ITypeInfo * pInfo = getTypeInfo();
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(aPropertyName, & aDescGet, & aDescPut, & aVarDesc);
- //check if there is such a property at all or if it is read only
- if ( ! aDescPut && ! aDescGet && ! aVarDesc)
- {
- OUString msg(OUSTR("[automation bridge]Property \"") + aPropertyName +
- OUSTR("\" is not supported"));
- throw UnknownPropertyException(msg, Reference<XInterface>());
- }
-
- if ( (! aDescPut && aDescGet) || aVarDesc
- && aVarDesc->wVarFlags == VARFLAG_FREADONLY )
- {
- //read-only
- OUString msg(OUSTR("[automation bridge] Property ") + aPropertyName +
- OUSTR(" is read-only"));
- OString sMsg = OUStringToOString(msg, osl_getThreadTextEncoding());
- OSL_FAIL(sMsg.getStr());
- // ignore silently
- return;
- }
-
- HRESULT hr= S_OK;
- DISPPARAMS dispparams;
- CComVariant varArg;
- CComVariant varRefArg;
- CComVariant varResult;
- ExcepInfo excepinfo;
- unsigned int uArgErr;
-
- // converting UNO value to OLE variant
- DISPID dispidPut= DISPID_PROPERTYPUT;
- dispparams.rgdispidNamedArgs = &dispidPut;
- dispparams.cArgs = 1;
- dispparams.cNamedArgs = 1;
- dispparams.rgvarg = & varArg;
-
- OSL_ASSERT(aDescPut || aVarDesc);
-
- VARTYPE vt = 0;
- DISPID dispid = 0;
- INVOKEKIND invkind = INVOKE_PROPERTYPUT;
- //determine the expected type, dispid, invoke kind (DISPATCH_PROPERTYPUT,
- //DISPATCH_PROPERTYPUTREF)
- if (aDescPut)
- {
- vt = getElementTypeDesc(& aDescPut->lprgelemdescParam[0].tdesc);
- dispid = aDescPut->memid;
- invkind = aDescPut->invkind;
- }
- else
- {
- vt = getElementTypeDesc( & aVarDesc->elemdescVar.tdesc);
- dispid = aVarDesc->memid;
- if (vt == VT_UNKNOWN || vt == VT_DISPATCH ||
- (vt & VT_ARRAY) || (vt & VT_BYREF))
- {
- invkind = INVOKE_PROPERTYPUTREF;
- }
- }
-
- // convert the uno argument
- if (vt & VT_BYREF)
- {
- anyToVariant( & varRefArg, aValue, ::sal::static_int_cast< VARTYPE, int >( vt ^ VT_BYREF ) );
- varArg.vt = vt;
- if( (vt & VT_TYPEMASK) == VT_VARIANT)
- varArg.byref = & varRefArg;
- else if ((vt & VT_TYPEMASK) == VT_DECIMAL)
- varArg.byref = & varRefArg.decVal;
- else
- varArg.byref = & varRefArg.byref;
- }
- else
- {
- anyToVariant(& varArg, aValue, vt);
- }
- // call to IDispatch
- hr = m_spDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, ::sal::static_int_cast< WORD, INVOKEKIND >( invkind ),
- &dispparams, & varResult, & excepinfo, &uArgErr);
-
- // lookup error code
- switch (hr)
- {
- case S_OK:
- break;
- case DISP_E_BADPARAMCOUNT:
- throw RuntimeException();
- break;
- case DISP_E_BADVARTYPE:
- throw RuntimeException();
- break;
- case DISP_E_EXCEPTION:
- throw InvocationTargetException();
- break;
- case DISP_E_MEMBERNOTFOUND:
- throw UnknownPropertyException();
- break;
- case DISP_E_NONAMEDARGS:
- throw RuntimeException();
- break;
- case DISP_E_OVERFLOW:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")), static_cast<XInterface*>(
- static_cast<XWeak*>(this)), TypeClass_UNKNOWN, FailReason::OUT_OF_RANGE, uArgErr);
- break;
- case DISP_E_PARAMNOTFOUND:
- throw IllegalArgumentException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")), static_cast<XInterface*>(
- static_cast<XWeak*>(this)), ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr )) ;
- break;
- case DISP_E_TYPEMISMATCH:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")), static_cast<XInterface*>(
- static_cast<XWeak*>(this)), TypeClass_UNKNOWN, FailReason::UNKNOWN, ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr ));
- break;
- case DISP_E_UNKNOWNINTERFACE:
- throw RuntimeException();
- break;
- case DISP_E_UNKNOWNLCID:
- throw RuntimeException();
- break;
- case DISP_E_PARAMNOTOPTIONAL:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")),static_cast<XInterface*>(
- static_cast<XWeak*>(this)) , TypeClass_UNKNOWN, FailReason::NO_DEFAULT_AVAILABLE, uArgErr);
- break;
- default:
- throw RuntimeException();
- break;
- }
- }
- catch (CannotConvertException &)
- {
- throw;
- }
- catch (UnknownPropertyException &)
- {
- throw;
- }
- catch (BridgeRuntimeError& e)
- {
- throw RuntimeException(
- e.message, Reference<XInterface>());
- }
- catch (Exception & e)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::setValue ! Message : \n") +
- e.Message, Reference<XInterface>());
-
- }
- catch (...)
- {
- throw RuntimeException(
- OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::setValue !"), Reference<XInterface>());
- }
-}
-
-Any SAL_CALL IUnknownWrapper_Impl::getValue( const OUString& aPropertyName )
- throw(UnknownPropertyException, RuntimeException)
-{
- if ( ! m_spDispatch )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] The object does not have an IDispatch interface"),
- Reference<XInterface>());
- }
- Any ret;
- try
- {
- o2u_attachCurrentThread();
- ITypeInfo * pInfo = getTypeInfo();
- // I was going to implement an XServiceInfo interface to allow the type
- // of the automation object to be exposed.. but it seems
- // from looking at comments in the code that it is possible for
- // this object to actually wrap an UNO object ( I guess if automation is
- // used from MSO to create Openoffice objects ) Therefore, those objects
- // will more than likely already have their own XServiceInfo interface.
- // Instead here I chose a name that should be illegal both in COM and
- // UNO ( from an IDL point of view ) therefore I think this is a safe
- // hack
- if ( aPropertyName.equals( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("$GetTypeName")) ))
- {
- if ( pInfo && m_sTypeName.getLength() == 0 )
- {
- m_sTypeName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("IDispatch") );
- CComBSTR sName;
-
- if ( SUCCEEDED( pInfo->GetDocumentation( -1, &sName, NULL, NULL, NULL ) ) )
- {
- rtl::OUString sTmp( reinterpret_cast<const sal_Unicode*>(LPCOLESTR(sName)));
- if ( sTmp.indexOf('_') == 0 )
- sTmp = sTmp.copy(1);
- // do we own the memory for pTypeLib, msdn doco is vague
- // I'll assume we do
- CComPtr< ITypeLib > pTypeLib;
- unsigned int index;
- if ( SUCCEEDED( pInfo->GetContainingTypeLib( &pTypeLib.p, &index )) )
- {
- if ( SUCCEEDED( pTypeLib->GetDocumentation( -1, &sName, NULL, NULL, NULL ) ) )
- {
- rtl::OUString sLibName( reinterpret_cast<const sal_Unicode*>(LPCOLESTR(sName)));
- m_sTypeName = sLibName.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".") ) ).concat( sTmp );
-
- }
- }
- }
-
- }
- ret <<= m_sTypeName;
- return ret;
- }
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(aPropertyName, & aDescGet, & aDescPut, & aVarDesc);
- if ( ! aDescGet && ! aDescPut && ! aVarDesc)
- {
- //property not found
- OUString msg(OUSTR("[automation bridge]Property \"") + aPropertyName +
- OUSTR("\" is not supported"));
- throw UnknownPropertyException(msg, Reference<XInterface>());
- }
- // write-only should not be possible
- OSL_ASSERT( aDescGet || ! aDescPut);
-
- HRESULT hr;
- DISPPARAMS dispparams = {0, 0, 0, 0};
- CComVariant varResult;
- ExcepInfo excepinfo;
- unsigned int uArgErr;
- DISPID dispid;
- if (aDescGet)
- dispid = aDescGet->memid;
- else if (aVarDesc)
- dispid = aVarDesc->memid;
- else
- dispid = aDescPut->memid;
-
- hr = m_spDispatch->Invoke(dispid,
- IID_NULL,
- LOCALE_USER_DEFAULT,
- DISPATCH_PROPERTYGET,
- &dispparams,
- &varResult,
- &excepinfo,
- &uArgErr);
-
- // converting return value and out parameter back to UNO
- if (hr == S_OK)
- {
- // If the com object implements uno interfaces then we have
- // to convert the attribute into the expected type.
- TypeDescription attrInfo;
- getAttributeInfo(aPropertyName, attrInfo);
- if( attrInfo.is() )
- variantToAny( &varResult, ret, Type( attrInfo.get()->pWeakRef));
- else
- variantToAny(&varResult, ret);
- }
-
- // lookup error code
- switch (hr)
- {
- case S_OK:
- break;
- case DISP_E_BADPARAMCOUNT:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_BADVARTYPE:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_EXCEPTION:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_MEMBERNOTFOUND:
- throw UnknownPropertyException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_NONAMEDARGS:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_OVERFLOW:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_PARAMNOTFOUND:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_TYPEMISMATCH:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_UNKNOWNINTERFACE:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_UNKNOWNLCID:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- case DISP_E_PARAMNOTOPTIONAL:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- default:
- throw RuntimeException(OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription)),
- Reference<XInterface>());
- break;
- }
- }
- catch (UnknownPropertyException& )
- {
- throw;
- }
- catch (BridgeRuntimeError& e)
- {
- throw RuntimeException(
- e.message, Reference<XInterface>());
- }
- catch (Exception & e)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::getValue ! Message : \n") +
- e.Message, Reference<XInterface>());
- }
- catch (...)
- {
- throw RuntimeException(
- OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::getValue !"), Reference<XInterface>());
- }
- return ret;
-}
-
-sal_Bool SAL_CALL IUnknownWrapper_Impl::hasMethod( const OUString& aName )
- throw(RuntimeException)
-{
- if ( ! m_spDispatch )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] The object does not have an IDispatch interface"),
- Reference<XInterface>());
- }
- sal_Bool ret = sal_False;
-
- try
- {
- o2u_attachCurrentThread();
- ITypeInfo* pInfo = getTypeInfo();
- FuncDesc aDesc(pInfo);
- getFuncDesc(aName, & aDesc);
- // Automation properties can have arguments. Those are treated as methods and
- //are called through XInvocation::invoke.
- if ( ! aDesc)
- {
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc( aName, & aDescGet, & aDescPut, & aVarDesc);
- if (aDescGet && aDescGet->cParams > 0
- || aDescPut && aDescPut->cParams > 0)
- ret = sal_True;
- }
- else
- ret = sal_True;
- }
- catch (BridgeRuntimeError& e)
- {
- throw RuntimeException(e.message, Reference<XInterface>());
- }
- catch (Exception & e)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::hasMethod ! Message : \n") +
- e.Message, Reference<XInterface>());
- }
- catch (...)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::hasMethod !"), Reference<XInterface>());;
- }
- return ret;
-}
-
-sal_Bool SAL_CALL IUnknownWrapper_Impl::hasProperty( const OUString& aName )
- throw(RuntimeException)
-{
- if ( ! m_spDispatch )
- {
- throw RuntimeException(OUSTR("[automation bridge] The object does not have an "
- "IDispatch interface"), Reference<XInterface>());
- return sal_False;
- }
- sal_Bool ret = sal_False;
- try
- {
- o2u_attachCurrentThread();
-
- ITypeInfo * pInfo = getTypeInfo();
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(aName, & aDescGet, & aDescPut, & aVarDesc);
-
- // we should probably just check the funckind
- // basic has been modified to handle properties ( 'get' ) props at
- // least with paramaters
- // additionally you can call invoke(Get|Set)Property on the bridge
- // you can determine if a property has parameter is hasMethod
- // returns true for the name
- if (aVarDesc
- || aDescPut
- || aDescGet )
- {
- ret = sal_True;
- }
- }
- catch (BridgeRuntimeError& e)
- {
- throw RuntimeException(e.message, Reference<XInterface>());
- }
- catch (Exception & e)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::hasProperty ! Message : \n") +
- e.Message, Reference<XInterface>());
-
- }
- catch (...)
- {
- throw RuntimeException(OUSTR("[automation bridge] unexpected exception in "
- "IUnknownWrapper_Impl::hasProperty !"), Reference<XInterface>());
- }
- return ret;
-}
-
-Any SAL_CALL IUnknownWrapper_Impl::createBridge( const Any& modelDepObject,
- const Sequence< sal_Int8 >& /*aProcessId*/, sal_Int16 sourceModelType,
- sal_Int16 destModelType )
- throw( IllegalArgumentException, RuntimeException)
-{
- Any ret;
- o2u_attachCurrentThread();
-
- if (
- (sourceModelType == UNO) &&
- (destModelType == OLE) &&
- (modelDepObject.getValueTypeClass() == TypeClass_INTERFACE)
- )
- {
- Reference<XInterface> xInt( *(XInterface**) modelDepObject.getValue());
- Reference<XInterface> xSelf( (OWeakObject*)this);
-
- if (xInt == xSelf)
- {
- VARIANT* pVariant = (VARIANT*) CoTaskMemAlloc(sizeof(VARIANT));
-
- VariantInit(pVariant);
- if (m_bOriginalDispatch == sal_True)
- {
- pVariant->vt = VT_DISPATCH;
- pVariant->pdispVal = m_spDispatch;
- pVariant->pdispVal->AddRef();
- }
- else
- {
- pVariant->vt = VT_UNKNOWN;
- pVariant->punkVal = m_spUnknown;
- pVariant->punkVal->AddRef();
- }
-
- ret.setValue((void*)&pVariant, getCppuType( (sal_uInt32*) 0));
- }
- }
-
- return ret;
-}
-/** @internal
- @exception IllegalArgumentException
- @exception CannotConvertException
- @exception InvocationTargetException
- @RuntimeException
-*/
-Any IUnknownWrapper_Impl::invokeWithDispIdUnoTlb(const OUString& sFunctionName,
- const Sequence< Any >& Params,
- Sequence< sal_Int16 >& OutParamIndex,
- Sequence< Any >& OutParam)
-{
- Any ret;
- HRESULT hr= S_OK;
-
- sal_Int32 parameterCount= Params.getLength();
- sal_Int32 outParameterCount= 0;
- typelib_InterfaceMethodTypeDescription* pMethod= NULL;
- TypeDescription methodDesc;
- getMethodInfo(sFunctionName, methodDesc);
-
- // We need to know whether the IDispatch is from a JScript object.
- // Then out and in/out parameters have to be treated differently than
- // with common COM objects.
- sal_Bool bJScriptObject= isJScriptObject();
- scoped_array<CComVariant> sarParams;
- scoped_array<CComVariant> sarParamsRef;
- CComVariant *pVarParams= NULL;
- CComVariant *pVarParamsRef= NULL;
- sal_Bool bConvRet= sal_True;
-
- if( methodDesc.is())
- {
- pMethod = (typelib_InterfaceMethodTypeDescription* )methodDesc.get();
- parameterCount = pMethod->nParams;
- // Create the Array for the array being passed in DISPPARAMS
- // the array also contains the outparameter (but not the values)
- if( pMethod->nParams > 0)
- {
- sarParams.reset(new CComVariant[ parameterCount]);
- pVarParams = sarParams.get();
- }
-
- // Create the Array for the out an in/out parameter. These values
- // are referenced by the VT_BYREF VARIANTs in DISPPARAMS.
- // We need to find out the number of out and in/out parameter.
- for( sal_Int32 i=0; i < parameterCount; i++)
- {
- if( pMethod->pParams[i].bOut)
- outParameterCount++;
- }
-
- if( !bJScriptObject)
- {
- sarParamsRef.reset(new CComVariant[outParameterCount]);
- pVarParamsRef = sarParamsRef.get();
- // build up the parameters for IDispatch::Invoke
- sal_Int32 outParamIndex=0;
- int i = 0;
- try
- {
- for( i= 0; i < parameterCount; i++)
- {
- // In parameter
- if( pMethod->pParams[i].bIn == sal_True && ! pMethod->pParams[i].bOut)
- {
- anyToVariant( &pVarParams[parameterCount - i -1], Params.getConstArray()[i]);
- }
- // Out parameter + in/out parameter
- else if( pMethod->pParams[i].bOut == sal_True)
- {
- CComVariant var;
- if(pMethod->pParams[i].bIn)
- {
- anyToVariant( & var,Params[i]);
- pVarParamsRef[outParamIndex] = var;
- }
-
- switch( pMethod->pParams[i].pTypeRef->eTypeClass)
- {
- case TypeClass_INTERFACE:
- case TypeClass_STRUCT:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt= VT_DISPATCH;
- pVarParamsRef[ outParamIndex].pdispVal= 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_DISPATCH | VT_BYREF;
- pVarParams[parameterCount - i -1].ppdispVal= &pVarParamsRef[outParamIndex].pdispVal;
- break;
- case TypeClass_ENUM:
- case TypeClass_LONG:
- case TypeClass_UNSIGNED_LONG:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_I4;
- pVarParamsRef[ outParamIndex].lVal = 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_I4 | VT_BYREF;
- pVarParams[parameterCount - i -1].plVal= &pVarParamsRef[outParamIndex].lVal;
- break;
- case TypeClass_SEQUENCE:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_ARRAY| VT_VARIANT;
- pVarParamsRef[ outParamIndex].parray= NULL;
- }
- pVarParams[parameterCount - i -1].vt = VT_ARRAY| VT_BYREF | VT_VARIANT;
- pVarParams[parameterCount - i -1].pparray= &pVarParamsRef[outParamIndex].parray;
- break;
- case TypeClass_ANY:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_EMPTY;
- pVarParamsRef[ outParamIndex].lVal = 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_VARIANT | VT_BYREF;
- pVarParams[parameterCount - i -1].pvarVal = &pVarParamsRef[outParamIndex];
- break;
- case TypeClass_BOOLEAN:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_BOOL;
- pVarParamsRef[ outParamIndex].boolVal = 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_BOOL| VT_BYREF;
- pVarParams[parameterCount - i -1].pboolVal =
- & pVarParamsRef[outParamIndex].boolVal;
- break;
-
- case TypeClass_STRING:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_BSTR;
- pVarParamsRef[ outParamIndex].bstrVal= 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_BSTR| VT_BYREF;
- pVarParams[parameterCount - i -1].pbstrVal=
- & pVarParamsRef[outParamIndex].bstrVal;
- break;
-
- case TypeClass_FLOAT:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_R4;
- pVarParamsRef[ outParamIndex].fltVal= 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_R4| VT_BYREF;
- pVarParams[parameterCount - i -1].pfltVal =
- & pVarParamsRef[outParamIndex].fltVal;
- break;
- case TypeClass_DOUBLE:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_R8;
- pVarParamsRef[ outParamIndex].dblVal= 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_R8| VT_BYREF;
- pVarParams[parameterCount - i -1].pdblVal=
- & pVarParamsRef[outParamIndex].dblVal;
- break;
- case TypeClass_BYTE:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_UI1;
- pVarParamsRef[ outParamIndex].bVal= 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_UI1| VT_BYREF;
- pVarParams[parameterCount - i -1].pbVal=
- & pVarParamsRef[outParamIndex].bVal;
- break;
- case TypeClass_CHAR:
- case TypeClass_SHORT:
- case TypeClass_UNSIGNED_SHORT:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_I2;
- pVarParamsRef[ outParamIndex].iVal = 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_I2| VT_BYREF;
- pVarParams[parameterCount - i -1].piVal=
- & pVarParamsRef[outParamIndex].iVal;
- break;
-
- default:
- if( ! pMethod->pParams[i].bIn)
- {
- pVarParamsRef[ outParamIndex].vt = VT_EMPTY;
- pVarParamsRef[ outParamIndex].lVal = 0;
- }
- pVarParams[parameterCount - i -1].vt = VT_VARIANT | VT_BYREF;
- pVarParams[parameterCount - i -1].pvarVal =
- & pVarParamsRef[outParamIndex];
- }
- outParamIndex++;
- } // end else if
- } // end for
- }
- catch (IllegalArgumentException & e)
- {
- e.ArgumentPosition = ::sal::static_int_cast< sal_Int16, int >( i );
- throw;
- }
- catch (CannotConvertException & e)
- {
- e.ArgumentIndex = i;
- throw;
- }
- }
- else // it is an JScriptObject
- {
- int i = 0;
- try
- {
- for( ; i< parameterCount; i++)
- {
- // In parameter
- if( pMethod->pParams[i].bIn == sal_True && ! pMethod->pParams[i].bOut)
- {
- anyToVariant( &pVarParams[parameterCount - i -1], Params.getConstArray()[i]);
- }
- // Out parameter + in/out parameter
- else if( pMethod->pParams[i].bOut == sal_True)
- {
- CComObject<JScriptOutParam>* pParamObject;
- if( SUCCEEDED( CComObject<JScriptOutParam>::CreateInstance( &pParamObject)))
- {
- CComPtr<IUnknown> pUnk(pParamObject->GetUnknown());
-#ifdef __MINGW32__
- CComQIPtr<IDispatch, &__uuidof(IDispatch)> pDisp( pUnk);
-#else
- CComQIPtr<IDispatch> pDisp( pUnk);
-#endif
-
- pVarParams[ parameterCount - i -1].vt= VT_DISPATCH;
- pVarParams[ parameterCount - i -1].pdispVal= pDisp;
- pVarParams[ parameterCount - i -1].pdispVal->AddRef();
- // if the param is in/out then put the parameter on index 0
- if( pMethod->pParams[i].bIn == sal_True ) // in / out
- {
- CComVariant varParam;
- anyToVariant( &varParam, Params.getConstArray()[i]);
- CComDispatchDriver dispDriver( pDisp);
- if(FAILED( dispDriver.PutPropertyByName( L"0", &varParam)))
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]IUnknownWrapper_Impl::"
- "invokeWithDispIdUnoTlb\n"
- "Could not set property \"0\" for the in/out "
- "param!"));
-
- }
- }
- else
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]IUnknownWrapper_Impl::"
- "invokeWithDispIdUnoTlb\n"
- "Could not create out parameter at index: ") +
- OUString::valueOf((sal_Int32) i));
- }
-
- }
- }
- }
- catch (IllegalArgumentException & e)
- {
- e.ArgumentPosition = ::sal::static_int_cast< sal_Int16, int >( i );
- throw;
- }
- catch (CannotConvertException & e)
- {
- e.ArgumentIndex = i;
- throw;
- }
- }
- }
- // No type description Available, that is we have to deal with a COM component,
- // that does not implements UNO interfaces ( IDispatch based)
- else
- {
- //We should not run into this block, because invokeWithDispIdComTlb should
- //have been called instead.
- OSL_ASSERT(0);
- }
-
-
- CComVariant varResult;
- ExcepInfo excepinfo;
- unsigned int uArgErr;
- DISPPARAMS dispparams= { pVarParams, NULL, parameterCount, 0};
- // Get the DISPID
- FuncDesc aDesc(getTypeInfo());
- getFuncDesc(sFunctionName, & aDesc);
- // invoking OLE method
- hr = m_spDispatch->Invoke(aDesc->memid,
- IID_NULL,
- LOCALE_USER_DEFAULT,
- DISPATCH_METHOD,
- &dispparams,
- &varResult,
- &excepinfo,
- &uArgErr);
-
- // converting return value and out parameter back to UNO
- if (hr == S_OK)
- {
- if( outParameterCount && pMethod)
- {
- OutParamIndex.realloc( outParameterCount);
- OutParam.realloc( outParameterCount);
- sal_Int32 outIndex=0;
- int i = 0;
- try
- {
- for( ; i < parameterCount; i++)
- {
- if( pMethod->pParams[i].bOut )
- {
- OutParamIndex[outIndex]= (sal_Int16) i;
- Any outAny;
- if( !bJScriptObject)
- {
- variantToAny( &pVarParamsRef[outIndex], outAny,
- Type(pMethod->pParams[i].pTypeRef), sal_False);
- OutParam[outIndex++]= outAny;
- }
- else //JScriptObject
- {
- if( pVarParams[i].vt == VT_DISPATCH)
- {
- CComDispatchDriver pDisp( pVarParams[i].pdispVal);
- if( pDisp)
- {
- CComVariant varOut;
- if( SUCCEEDED( pDisp.GetPropertyByName( L"0", &varOut)))
- {
- variantToAny( &varOut, outAny,
- Type(pMethod->pParams[parameterCount - 1 - i].pTypeRef), sal_False);
- OutParam[outParameterCount - 1 - outIndex++]= outAny;
- }
- else
- bConvRet= sal_False;
- }
- else
- bConvRet= sal_False;
- }
- else
- bConvRet= sal_False;
- }
- }
- if( !bConvRet) break;
- }
- }
- catch(IllegalArgumentException & e)
- {
- e.ArgumentPosition = ::sal::static_int_cast< sal_Int16, int >( i );
- throw;
- }
- catch(CannotConvertException & e)
- {
- e.ArgumentIndex = i;
- throw;
- }
- }
- // return value, no type information available
- if ( bConvRet)
- {
- try
- {
- if( pMethod )
- variantToAny(&varResult, ret, Type( pMethod->pReturnTypeRef), sal_False);
- else
- variantToAny(&varResult, ret, sal_False);
- }
- catch (IllegalArgumentException & e)
- {
- e.Message =
- OUSTR("[automation bridge]IUnknownWrapper_Impl::invokeWithDispIdUnoTlb\n"
- "Could not convert return value! \n Message: \n") + e.Message;
- throw;
- }
- catch (CannotConvertException & e)
- {
- e.Message =
- OUSTR("[automation bridge]IUnknownWrapper_Impl::invokeWithDispIdUnoTlb\n"
- "Could not convert return value! \n Message: \n") + e.Message;
- throw;
- }
- }
- }
-
- if( !bConvRet) // conversion of return or out parameter failed
- throw CannotConvertException( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Call to COM object failed. Conversion of return or out value failed")),
- Reference<XInterface>( static_cast<XWeak*>(this), UNO_QUERY ), TypeClass_UNKNOWN,
- FailReason::UNKNOWN, 0);// lookup error code
- // conversion of return or out parameter failed
- switch (hr)
- {
- case S_OK:
- break;
- case DISP_E_BADPARAMCOUNT:
- throw IllegalArgumentException();
- break;
- case DISP_E_BADVARTYPE:
- throw RuntimeException();
- break;
- case DISP_E_EXCEPTION:
- throw InvocationTargetException();
- break;
- case DISP_E_MEMBERNOTFOUND:
- throw IllegalArgumentException();
- break;
- case DISP_E_NONAMEDARGS:
- throw IllegalArgumentException();
- break;
- case DISP_E_OVERFLOW:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")), static_cast<XInterface*>(
- static_cast<XWeak*>(this)), TypeClass_UNKNOWN, FailReason::OUT_OF_RANGE, uArgErr);
- break;
- case DISP_E_PARAMNOTFOUND:
- throw IllegalArgumentException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")), static_cast<XInterface*>(
- static_cast<XWeak*>(this)), ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr ));
- break;
- case DISP_E_TYPEMISMATCH:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")),static_cast<XInterface*>(
- static_cast<XWeak*>(this)) , TypeClass_UNKNOWN, FailReason::UNKNOWN, uArgErr);
- break;
- case DISP_E_UNKNOWNINTERFACE:
- throw RuntimeException() ;
- break;
- case DISP_E_UNKNOWNLCID:
- throw RuntimeException() ;
- break;
- case DISP_E_PARAMNOTOPTIONAL:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("call to OLE object failed")), static_cast<XInterface*>(
- static_cast<XWeak*>(this)), TypeClass_UNKNOWN, FailReason::NO_DEFAULT_AVAILABLE, uArgErr);
- break;
- default:
- throw RuntimeException();
- break;
- }
-
- return ret;
-}
-
-
-
-// --------------------------
-// XInitialization
-void SAL_CALL IUnknownWrapper_Impl::initialize( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException)
-{
- // 1.parameter is IUnknown
- // 2.parameter is a boolean which indicates if the the COM pointer was a IUnknown or IDispatch
- // 3.parameter is a Sequence<Type>
- o2u_attachCurrentThread();
- OSL_ASSERT(aArguments.getLength() == 3);
-
- m_spUnknown= *(IUnknown**) aArguments[0].getValue();
-#ifdef __MINGW32__
- m_spUnknown->QueryInterface(IID_IDispatch, reinterpret_cast<LPVOID*>( & m_spDispatch.p));
-#else
- m_spUnknown.QueryInterface( & m_spDispatch.p);
-#endif
-
- aArguments[1] >>= m_bOriginalDispatch;
- aArguments[2] >>= m_seqTypes;
-
- ITypeInfo* pType = NULL;
- try
- {
- // a COM object implementation that has no TypeInfo is still a legal COM object;
- // such objects can at least be transported through UNO using the bridge
- // so we should allow to create wrappers for them as well
- pType = getTypeInfo();
- }
- catch( BridgeRuntimeError& )
- {}
- catch( Exception& )
- {}
-
- if ( pType )
- {
- try
- {
- // Get Default member
- CComBSTR defaultMemberName;
- if ( SUCCEEDED( pType->GetDocumentation(0, &defaultMemberName, 0, 0, 0 ) ) )
- {
- OUString usName(reinterpret_cast<const sal_Unicode*>(LPCOLESTR(defaultMemberName)));
- FuncDesc aDescGet(pType);
- FuncDesc aDescPut(pType);
- VarDesc aVarDesc(pType);
- // see if this is a property first ( more likely to be a property then a method )
- getPropDesc( usName, & aDescGet, & aDescPut, & aVarDesc);
-
- if ( !aDescGet && !aDescPut )
- {
- getFuncDesc( usName, &aDescGet );
- if ( !aDescGet )
- throw BridgeRuntimeError( OUSTR("[automation bridge]IUnknownWrapper_Impl::initialize() Failed to get Function or Property desc. for " ) + usName );
- }
- // now for some funny heuristics to make basic understand what to do
- // a single aDescGet ( that doesn't take any params ) would be
- // a read only ( defaultmember ) property e.g. this object
- // should implement XDefaultProperty
- // a single aDescGet ( that *does* ) take params is basically a
- // default method e.g. implement XDefaultMethod
-
- // a DescPut ( I guess we only really support a default param with '1' param ) as a setValue ( but I guess we can leave it through, the object will fail if we don't get it right anyway )
- if ( aDescPut || ( aDescGet && aDescGet->cParams == 0 ) )
- m_bHasDfltProperty = true;
- if ( aDescGet->cParams > 0 )
- m_bHasDfltMethod = true;
- if ( m_bHasDfltProperty || m_bHasDfltMethod )
- m_sDefaultMember = usName;
- }
- }
- catch ( BridgeRuntimeError & e )
- {
- throw RuntimeException( e.message, Reference<XInterface>() );
- }
- catch( Exception& e )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] unexpected exception in IUnknownWrapper_Impl::initialiase() error message: \n") + e.Message,
- Reference<XInterface>() );
- }
- }
-}
-
-// --------------------------
-// XDirectInvocation
-uno::Any SAL_CALL IUnknownWrapper_Impl::directInvoke( const ::rtl::OUString& aName, const uno::Sequence< uno::Any >& aParams )
- throw (lang::IllegalArgumentException, script::CannotConvertException, reflection::InvocationTargetException, uno::RuntimeException)
-{
- Any aResult;
-
- if ( !m_spDispatch )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] The object does not have an IDispatch interface"),
- Reference<XInterface>());
- }
-
- o2u_attachCurrentThread();
- DISPID dispid;
- if ( !getDispid( aName, &dispid ) )
- throw IllegalArgumentException(
- OUSTR( "[automation bridge] The object does not have a function or property " )
- + aName, Reference<XInterface>(), 0);
-
- CComVariant varResult;
- ExcepInfo excepinfo;
- unsigned int uArgErr = 0;
- INVOKEKIND pInvkinds[2];
- pInvkinds[0] = INVOKE_FUNC;
- pInvkinds[1] = aParams.getLength() ? INVOKE_PROPERTYPUT : INVOKE_PROPERTYGET;
- HRESULT hInvRes = E_FAIL;
-
- // try Invoke first, if it does not work, try put/get property
- for ( sal_Int32 nStep = 0; FAILED( hInvRes ) && nStep < 2; nStep++ )
- {
- DISPPARAMS dispparams = {NULL, NULL, 0, 0};
-
- DISPID idPropertyPut = DISPID_PROPERTYPUT;
- scoped_array<DISPID> arDispidNamedArgs;
- scoped_array<CComVariant> ptrArgs;
- scoped_array<CComVariant> ptrRefArgs; // referenced arguments
- CComVariant * arArgs = NULL;
- CComVariant * arRefArgs = NULL;
-
- dispparams.cArgs = aParams.getLength();
-
- // Determine the number of named arguments
- for ( sal_Int32 nInd = 0; nInd < aParams.getLength(); nInd++ )
- if ( aParams[nInd].getValueType() == getCppuType((NamedArgument*) 0) )
- dispparams.cNamedArgs ++;
-
- // fill the named arguments
- if ( dispparams.cNamedArgs > 0
- && !( dispparams.cNamedArgs == 1 && pInvkinds[nStep] == INVOKE_PROPERTYPUT ) )
- {
- int nSizeAr = dispparams.cNamedArgs + 1;
- if ( pInvkinds[nStep] == INVOKE_PROPERTYPUT )
- nSizeAr = dispparams.cNamedArgs;
-
- scoped_array<OLECHAR*> saNames(new OLECHAR*[nSizeAr]);
- OLECHAR ** pNames = saNames.get();
- pNames[0] = const_cast<OLECHAR*>(reinterpret_cast<LPCOLESTR>(aName.getStr()));
-
- int cNamedArg = 0;
- for ( size_t nInd = 0; nInd < dispparams.cArgs; nInd++ )
- {
- if ( aParams[nInd].getValueType() == getCppuType((NamedArgument*) 0))
- {
- const NamedArgument& arg = *(NamedArgument const*)aParams[nInd].getValue();
-
- //We put the parameter names in reverse order into the array,
- //so we can use the DISPID array for DISPPARAMS::rgdispidNamedArgs
- //The first name in the array is the method name
- pNames[nSizeAr - 1 - cNamedArg++] = const_cast<OLECHAR*>(reinterpret_cast<LPCOLESTR>(arg.Name.getStr()));
- }
- }
-
- arDispidNamedArgs.reset( new DISPID[nSizeAr] );
- HRESULT hr = getTypeInfo()->GetIDsOfNames( pNames, nSizeAr, arDispidNamedArgs.get() );
- if ( hr == E_NOTIMPL )
- hr = m_spDispatch->GetIDsOfNames(IID_NULL, pNames, nSizeAr, LOCALE_USER_DEFAULT, arDispidNamedArgs.get() );
-
- if ( SUCCEEDED( hr ) )
- {
- if ( pInvkinds[nStep] == DISPATCH_PROPERTYPUT )
- {
- DISPID* arIDs = arDispidNamedArgs.get();
- arIDs[0] = DISPID_PROPERTYPUT;
- dispparams.rgdispidNamedArgs = arIDs;
- }
- else
- {
- DISPID* arIDs = arDispidNamedArgs.get();
- dispparams.rgdispidNamedArgs = & arIDs[1];
- }
- }
- else if (hr == DISP_E_UNKNOWNNAME)
- {
- throw IllegalArgumentException(
- OUSTR("[automation bridge]One of the named arguments is wrong!"),
- Reference<XInterface>(), 0);
- }
- else
- {
- throw InvocationTargetException(
- OUSTR("[automation bridge] ITypeInfo::GetIDsOfNames returned error ")
- + OUString::valueOf((sal_Int32) hr, 16), Reference<XInterface>(), Any());
- }
- }
-
- //Convert arguments
- ptrArgs.reset(new CComVariant[dispparams.cArgs]);
- ptrRefArgs.reset(new CComVariant[dispparams.cArgs]);
- arArgs = ptrArgs.get();
- arRefArgs = ptrRefArgs.get();
-
- sal_Int32 nInd = 0;
- try
- {
- sal_Int32 revIndex = 0;
- for ( nInd = 0; nInd < sal_Int32(dispparams.cArgs); nInd++)
- {
- revIndex = dispparams.cArgs - nInd - 1;
- arRefArgs[revIndex].byref = 0;
- Any anyArg;
- if ( nInd < aParams.getLength() )
- anyArg = aParams.getConstArray()[nInd];
-
- // Property Put arguments
- if ( anyArg.getValueType() == getCppuType((PropertyPutArgument*)0) )
- {
- PropertyPutArgument arg;
- anyArg >>= arg;
- anyArg <<= arg.Value;
- }
- // named argument
- if (anyArg.getValueType() == getCppuType((NamedArgument*) 0))
- {
- NamedArgument aNamedArgument;
- anyArg >>= aNamedArgument;
- anyArg <<= aNamedArgument.Value;
- }
-
- if ( nInd < aParams.getLength() && anyArg.getValueTypeClass() != TypeClass_VOID )
- {
- anyToVariant( &arArgs[revIndex], anyArg, VT_VARIANT );
- }
- else
- {
- arArgs[revIndex].vt = VT_ERROR;
- arArgs[revIndex].scode = DISP_E_PARAMNOTFOUND;
- }
- }
- }
- catch (IllegalArgumentException & e)
- {
- e.ArgumentPosition = ::sal::static_int_cast< sal_Int16, sal_Int32 >( nInd );
- throw;
- }
- catch (CannotConvertException & e)
- {
- e.ArgumentIndex = nInd;
- throw;
- }
-
- dispparams.rgvarg = arArgs;
- // invoking OLE method
- DWORD localeId = LOCALE_USER_DEFAULT;
- hInvRes = m_spDispatch->Invoke( dispid,
- IID_NULL,
- localeId,
- ::sal::static_int_cast< WORD, INVOKEKIND >( pInvkinds[nStep] ),
- &dispparams,
- &varResult,
- &excepinfo,
- &uArgErr);
- }
-
- // converting return value and out parameter back to UNO
- if ( SUCCEEDED( hInvRes ) )
- variantToAny( &varResult, aResult, sal_False );
- else
- {
- // map error codes to exceptions
- OUString message;
- switch ( hInvRes )
- {
- case S_OK:
- break;
- case DISP_E_BADPARAMCOUNT:
- throw IllegalArgumentException(OUSTR("[automation bridge] Wrong "
- "number of arguments. Object returned DISP_E_BADPARAMCOUNT."),
- 0, 0);
- break;
- case DISP_E_BADVARTYPE:
- throw RuntimeException(OUSTR("[automation bridge] One or more "
- "arguments have the wrong type. Object returned "
- "DISP_E_BADVARTYPE."), 0);
- break;
- case DISP_E_EXCEPTION:
- message = OUSTR("[automation bridge]: ");
- message += OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription),
- ::SysStringLen(excepinfo.bstrDescription));
- throw InvocationTargetException(message, Reference<XInterface>(), Any());
- break;
- case DISP_E_MEMBERNOTFOUND:
- message = OUSTR("[automation bridge]: A function with the name \"")
- + aName + OUSTR("\" is not supported. Object returned "
- "DISP_E_MEMBERNOTFOUND.");
- throw IllegalArgumentException(message, 0, 0);
- break;
- case DISP_E_NONAMEDARGS:
- throw IllegalArgumentException(OUSTR("[automation bridge] Object "
- "returned DISP_E_NONAMEDARGS"),0, ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr ));
- break;
- case DISP_E_OVERFLOW:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[automation bridge] Call failed.")),
- static_cast<XInterface*>(
- static_cast<XWeak*>(this)), TypeClass_UNKNOWN, FailReason::OUT_OF_RANGE, uArgErr);
- break;
- case DISP_E_PARAMNOTFOUND:
- throw IllegalArgumentException(OUSTR("[automation bridge]Call failed."
- "Object returned DISP_E_PARAMNOTFOUND."),
- 0, ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr ));
- break;
- case DISP_E_TYPEMISMATCH:
- throw CannotConvertException(OUSTR("[automation bridge] Call failed. "
- "Object returned DISP_E_TYPEMISMATCH"),
- static_cast<XInterface*>(
- static_cast<XWeak*>(this)) , TypeClass_UNKNOWN, FailReason::UNKNOWN, uArgErr);
- break;
- case DISP_E_UNKNOWNINTERFACE:
- throw RuntimeException(OUSTR("[automation bridge] Call failed. "
- "Object returned DISP_E_UNKNOWNINTERFACE."),0);
- break;
- case DISP_E_UNKNOWNLCID:
- throw RuntimeException(OUSTR("[automation bridge] Call failed. "
- "Object returned DISP_E_UNKNOWNLCID."),0);
- break;
- case DISP_E_PARAMNOTOPTIONAL:
- throw CannotConvertException(OUSTR("[automation bridge] Call failed."
- "Object returned DISP_E_PARAMNOTOPTIONAL"),
- static_cast<XInterface*>(static_cast<XWeak*>(this)),
- TypeClass_UNKNOWN, FailReason::NO_DEFAULT_AVAILABLE, uArgErr);
- break;
- default:
- throw RuntimeException();
- break;
- }
- }
-
- return aResult;
-}
-
-::sal_Bool SAL_CALL IUnknownWrapper_Impl::hasMember( const ::rtl::OUString& aName )
- throw (uno::RuntimeException)
-{
- if ( ! m_spDispatch )
- {
- throw RuntimeException(
- OUSTR("[automation bridge] The object does not have an IDispatch interface"),
- Reference<XInterface>());
- }
-
- o2u_attachCurrentThread();
- DISPID dispid;
- return getDispid( aName, &dispid );
-}
-
-
-// UnoConversionUtilities --------------------------------------------------------------------------------
-Reference< XInterface > IUnknownWrapper_Impl::createUnoWrapperInstance()
-{
- if( m_nUnoWrapperClass == INTERFACE_OLE_WRAPPER_IMPL)
- {
- Reference<XWeak> xWeak= static_cast<XWeak*>( new InterfaceOleWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
- }
- else if( m_nUnoWrapperClass == UNO_OBJECT_WRAPPER_REMOTE_OPT)
- {
- Reference<XWeak> xWeak= static_cast<XWeak*>( new UnoObjectWrapperRemoteOpt(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
- }
- else
- return Reference<XInterface>();
-}
-Reference<XInterface> IUnknownWrapper_Impl::createComWrapperInstance()
-{
- Reference<XWeak> xWeak= static_cast<XWeak*>( new IUnknownWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
-}
-
-
-
-void IUnknownWrapper_Impl::getMethodInfo(const OUString& sName, TypeDescription& methodInfo)
-{
- TypeDescription desc= getInterfaceMemberDescOfCurrentCall(sName);
- if( desc.is())
- {
- typelib_TypeDescription* pMember= desc.get();
- if( pMember->eTypeClass == TypeClass_INTERFACE_METHOD )
- methodInfo= pMember;
- }
-}
-
-void IUnknownWrapper_Impl::getAttributeInfo(const OUString& sName, TypeDescription& attributeInfo)
-{
- TypeDescription desc= getInterfaceMemberDescOfCurrentCall(sName);
- if( desc.is())
- {
- typelib_TypeDescription* pMember= desc.get();
- if( pMember->eTypeClass == TypeClass_INTERFACE_ATTRIBUTE )
- {
- attributeInfo= ((typelib_InterfaceAttributeTypeDescription*)pMember)->pAttributeTypeRef;
- }
- }
-}
-TypeDescription IUnknownWrapper_Impl::getInterfaceMemberDescOfCurrentCall(const OUString& sName)
-{
- TypeDescription ret;
-
- for( sal_Int32 i=0; i < m_seqTypes.getLength(); i++)
- {
- TypeDescription _curDesc( m_seqTypes[i]);
- _curDesc.makeComplete();
- typelib_InterfaceTypeDescription * pInterface= (typelib_InterfaceTypeDescription*) _curDesc.get();
- if( pInterface)
- {
- typelib_InterfaceMemberTypeDescription* pMember= NULL;
- //find the member description of the current call
- for( int i=0; i < pInterface->nAllMembers; i++)
- {
- typelib_TypeDescriptionReference* pTypeRefMember = pInterface->ppAllMembers[i];
- typelib_TypeDescription* pDescMember= NULL;
- TYPELIB_DANGER_GET( &pDescMember, pTypeRefMember)
-
- typelib_InterfaceMemberTypeDescription* pInterfaceMember=
- (typelib_InterfaceMemberTypeDescription*) pDescMember;
- if( OUString( pInterfaceMember->pMemberName) == sName)
- {
- pMember= pInterfaceMember;
- break;
- }
- TYPELIB_DANGER_RELEASE( pDescMember)
- }
-
- if( pMember)
- {
- ret= (typelib_TypeDescription*)pMember;
- TYPELIB_DANGER_RELEASE( (typelib_TypeDescription*)pMember);
- }
- }
- if( ret.is())
- break;
- }
- return ret;
-}
-
-sal_Bool IUnknownWrapper_Impl::isJScriptObject()
-{
- if( m_eJScript == JScriptUndefined)
- {
- CComDispatchDriver disp( m_spDispatch);
- if( disp)
- {
- CComVariant result;
- if( SUCCEEDED( disp.GetPropertyByName( JSCRIPT_ID_PROPERTY, &result)))
- {
- if(result.vt == VT_BSTR)
- {
- CComBSTR name( result.bstrVal);
- name.ToLower();
- if( name == CComBSTR(JSCRIPT_ID))
- m_eJScript= IsJScript;
- }
- }
- }
- if( m_eJScript == JScriptUndefined)
- m_eJScript= NoJScript;
- }
-
- return m_eJScript == NoJScript ? sal_False : sal_True;
-}
-
-
-
-/** @internal
- The function ultimately calls IDispatch::Invoke on the wrapped COM object.
- The COM object does not implement UNO Interfaces ( via IDispatch). This
- is the case when the OleObjectFactory service has been used to create a
- component.
- @exception IllegalArgumentException
- @exception CannotConvertException
- @InvocationTargetException
- @RuntimeException
- @BridgeRuntimeError
-*/
-Any IUnknownWrapper_Impl::invokeWithDispIdComTlb(const OUString& sFuncName,
- const Sequence< Any >& Params,
- Sequence< sal_Int16 >& OutParamIndex,
- Sequence< Any >& OutParam)
-{
- // Get type info for the call. It can be a method call or property put or
- // property get operation.
- FuncDesc aFuncDesc(getTypeInfo());
- getFuncDescForInvoke(sFuncName, Params, & aFuncDesc);
- return invokeWithDispIdComTlb( aFuncDesc, sFuncName, Params, OutParamIndex, OutParam );
-}
-
-Any IUnknownWrapper_Impl::invokeWithDispIdComTlb(FuncDesc& aFuncDesc,
- const OUString& sFuncName,
- const Sequence< Any >& Params,
- Sequence< sal_Int16 >& OutParamIndex,
- Sequence< Any >& OutParam)
-{
- Any ret;
- HRESULT result;
-
- DISPPARAMS dispparams = {NULL, NULL, 0, 0};
- CComVariant varResult;
- ExcepInfo excepinfo;
- unsigned int uArgErr;
- sal_Int32 i = 0;
- sal_Int32 nUnoArgs = Params.getLength();
- DISPID idPropertyPut = DISPID_PROPERTYPUT;
- scoped_array<DISPID> arDispidNamedArgs;
- scoped_array<CComVariant> ptrArgs;
- scoped_array<CComVariant> ptrRefArgs; // referenced arguments
- CComVariant * arArgs = NULL;
- CComVariant * arRefArgs = NULL;
- sal_Int32 revIndex = 0;
-
- //Set the array of DISPIDs for named args if it is a property put operation.
- //If there are other named arguments another array is set later on.
- if (aFuncDesc->invkind == INVOKE_PROPERTYPUT
- || aFuncDesc->invkind == INVOKE_PROPERTYPUTREF)
- dispparams.rgdispidNamedArgs = & idPropertyPut;
-
- //Determine the number of named arguments
- for (int iParam = 0; iParam < nUnoArgs; iParam ++)
- {
- const Any & curArg = Params[iParam];
- if (curArg.getValueType() == getCppuType((NamedArgument*) 0))
- dispparams.cNamedArgs ++;
- }
- //In a property put operation a property value is a named argument (DISPID_PROPERTYPUT).
- //Therefore the number of named arguments is increased by one.
- //Although named, the argument is not named in a actual language, such as Basic,
- //therefore it is never a com.sun.star.bridge.oleautomation.NamedArgument
- if (aFuncDesc->invkind == DISPATCH_PROPERTYPUT
- || aFuncDesc->invkind == DISPATCH_PROPERTYPUTREF)
- dispparams.cNamedArgs ++;
-
- //Determine the number of all arguments and named arguments
- if (aFuncDesc->cParamsOpt == -1)
- {
- //Attribute vararg is set on this method. "Unlimited" number of args
- //supported. There can be no optional or defaultvalue on any of the arguments.
- dispparams.cArgs = nUnoArgs;
- }
- else
- {
- //If there are namesd arguments, then the dispparams.cArgs
- //is the number of supplied args, otherwise it is the expected number.
- if (dispparams.cNamedArgs)
- dispparams.cArgs = nUnoArgs;
- else
- dispparams.cArgs = aFuncDesc->cParams;
- }
-
- //check if there are not to many arguments supplied
- if (::sal::static_int_cast< sal_uInt32, int >( nUnoArgs ) > dispparams.cArgs)
- {
- OUStringBuffer buf(256);
- buf.appendAscii("[automation bridge] There are too many arguments for this method");
- throw IllegalArgumentException( buf.makeStringAndClear(),
- Reference<XInterface>(), (sal_Int16) dispparams.cArgs);
- }
-
- //Set up the array of DISPIDs (DISPPARAMS::rgdispidNamedArgs)
- //for the named arguments.
- //If there is only one named arg and if it is because of a property put
- //operation, then we need not set up the DISPID array.
- if (dispparams.cNamedArgs > 0 &&
- ! (dispparams.cNamedArgs == 1 &&
- (aFuncDesc->invkind == INVOKE_PROPERTYPUT ||
- aFuncDesc->invkind == INVOKE_PROPERTYPUT)))
- {
- //set up an array containing the member and parameter names
- //which is then used in ITypeInfo::GetIDsOfNames
- //First determine the size of the array of names which is passed to
- //ITypeInfo::GetIDsOfNames. It must hold the method names + the named
- //args.
- int nSizeAr = dispparams.cNamedArgs + 1;
- if (aFuncDesc->invkind == INVOKE_PROPERTYPUT
- || aFuncDesc->invkind == INVOKE_PROPERTYPUTREF)
- {
- nSizeAr = dispparams.cNamedArgs; //counts the DISID_PROPERTYPUT
- }
-
- scoped_array<OLECHAR*> saNames(new OLECHAR*[nSizeAr]);
- OLECHAR ** arNames = saNames.get();
- arNames[0] = const_cast<OLECHAR*>(reinterpret_cast<LPCOLESTR>(sFuncName.getStr()));
-
- int cNamedArg = 0;
- for (size_t iParams = 0; iParams < dispparams.cArgs; iParams ++)
- {
- const Any & curArg = Params[iParams];
- if (curArg.getValueType() == getCppuType((NamedArgument*) 0))
- {
- const NamedArgument& arg = *(NamedArgument const*) curArg.getValue();
- //We put the parameter names in reverse order into the array,
- //so we can use the DISPID array for DISPPARAMS::rgdispidNamedArgs
- //The first name in the array is the method name
- arNames[nSizeAr - 1 - cNamedArg++] = const_cast<OLECHAR*>(reinterpret_cast<LPCOLESTR>(arg.Name.getStr()));
- }
- }
-
- //Prepare the array of DISPIDs for ITypeInfo::GetIDsOfNames
- //it must be big enough to contain the DISPIDs of the member + parameters
- arDispidNamedArgs.reset(new DISPID[nSizeAr]);
- HRESULT hr = getTypeInfo()->GetIDsOfNames(arNames, nSizeAr,
- arDispidNamedArgs.get());
- if ( hr == E_NOTIMPL )
- hr = m_spDispatch->GetIDsOfNames(IID_NULL, arNames, nSizeAr, LOCALE_USER_DEFAULT, arDispidNamedArgs.get() );
-
- if (hr == S_OK)
- {
- // In a "property put" operation, the property value is a named param with the
- //special DISPID DISPID_PROPERTYPUT
- if (aFuncDesc->invkind == DISPATCH_PROPERTYPUT
- || aFuncDesc->invkind == DISPATCH_PROPERTYPUTREF)
- {
- //Element at index 0 in the DISPID array must be DISPID_PROPERTYPUT
- //The first item in the array arDispidNamedArgs is the DISPID for
- //the method. We replace it with DISPID_PROPERTYPUT.
- DISPID* arIDs = arDispidNamedArgs.get();
- arIDs[0] = DISPID_PROPERTYPUT;
- dispparams.rgdispidNamedArgs = arIDs;
- }
- else
- {
- //The first item in the array arDispidNamedArgs is the DISPID for
- //the method. It must be removed
- DISPID* arIDs = arDispidNamedArgs.get();
- dispparams.rgdispidNamedArgs = & arIDs[1];
- }
- }
- else if (hr == DISP_E_UNKNOWNNAME)
- {
- throw IllegalArgumentException(
- OUSTR("[automation bridge]One of the named arguments is wrong!"),
- Reference<XInterface>(), 0);
- }
- else
- {
- throw InvocationTargetException(
- OUSTR("[automation bridge] ITypeInfo::GetIDsOfNames returned error ")
- + OUString::valueOf((sal_Int32) hr, 16), Reference<XInterface>(), Any());
- }
- }
-
- //Convert arguments
- ptrArgs.reset(new CComVariant[dispparams.cArgs]);
- ptrRefArgs.reset(new CComVariant[dispparams.cArgs]);
- arArgs = ptrArgs.get();
- arRefArgs = ptrRefArgs.get();
- try
- {
- for (i = 0; i < (sal_Int32) dispparams.cArgs; i++)
- {
- revIndex= dispparams.cArgs - i -1;
- arRefArgs[revIndex].byref=0;
- Any anyArg;
- if ( i < nUnoArgs)
- anyArg= Params.getConstArray()[i];
-
- unsigned short paramFlags = PARAMFLAG_FOPT | PARAMFLAG_FIN;
- VARTYPE varType = VT_VARIANT;
- if (aFuncDesc->cParamsOpt != -1 || aFuncDesc->cParams != (i + 1))
- {
- paramFlags = aFuncDesc->lprgelemdescParam[i].paramdesc.wParamFlags;
- varType = getElementTypeDesc(&aFuncDesc->lprgelemdescParam[i].tdesc);
- }
-
- // Make sure that there is a UNO parameter for every
- // expected parameter. If there is no UNO parameter where the
- // called function expects one, then it must be optional. Otherwise
- // its a UNO programming error.
- if (i >= nUnoArgs && !(paramFlags & PARAMFLAG_FOPT))
- {
- OUStringBuffer buf(256);
- buf.appendAscii("ole automation bridge: The called function expects an argument at"
- "position: "); //a different number of arguments")),
- buf.append(OUString::valueOf((sal_Int32) i));
- buf.appendAscii(" (index starting at 0).");
- throw IllegalArgumentException( buf.makeStringAndClear(),
- Reference<XInterface>(), (sal_Int16) i);
- }
-
- // Property Put arguments
- if (anyArg.getValueType() == getCppuType((PropertyPutArgument*)0))
- {
- PropertyPutArgument arg;
- anyArg >>= arg;
- anyArg <<= arg.Value;
- }
- // named argument
- if (anyArg.getValueType() == getCppuType((NamedArgument*) 0))
- {
- NamedArgument aNamedArgument;
- anyArg >>= aNamedArgument;
- anyArg <<= aNamedArgument.Value;
- }
- // out param
- if (paramFlags & PARAMFLAG_FOUT &&
- ! (paramFlags & PARAMFLAG_FIN) )
- {
- VARTYPE type = ::sal::static_int_cast< VARTYPE, int >( varType ^ VT_BYREF );
- if (i < nUnoArgs)
- {
- arRefArgs[revIndex].vt= type;
- }
- else
- {
- //optional arg
- arRefArgs[revIndex].vt = VT_ERROR;
- arRefArgs[revIndex].scode = DISP_E_PARAMNOTFOUND;
- }
- if( type == VT_VARIANT )
- {
- arArgs[revIndex].vt= VT_VARIANT | VT_BYREF;
- arArgs[revIndex].byref= &arRefArgs[revIndex];
- }
- else
- {
- arArgs[revIndex].vt= varType;
- if (type == VT_DECIMAL)
- arArgs[revIndex].byref= & arRefArgs[revIndex].decVal;
- else
- arArgs[revIndex].byref= & arRefArgs[revIndex].byref;
- }
- }
- // in/out + in byref params
- else if (varType & VT_BYREF)
- {
- VARTYPE type = ::sal::static_int_cast< VARTYPE, int >( varType ^ VT_BYREF );
- CComVariant var;
-
- if (i < nUnoArgs && anyArg.getValueTypeClass() != TypeClass_VOID)
- {
- anyToVariant( & arRefArgs[revIndex], anyArg, type);
- }
- else if (paramFlags & PARAMFLAG_FHASDEFAULT)
- {
- //optional arg with default
- VariantCopy( & arRefArgs[revIndex],
- & aFuncDesc->lprgelemdescParam[i].paramdesc.
- pparamdescex->varDefaultValue);
- }
- else
- {
- //optional arg
- //e.g: call func(x) in basic : func() ' no arg supplied
- OSL_ASSERT(paramFlags & PARAMFLAG_FOPT);
- arRefArgs[revIndex].vt = VT_ERROR;
- arRefArgs[revIndex].scode = DISP_E_PARAMNOTFOUND;
- }
-
- // Set the converted arguments in the array which will be
- // DISPPARAMS::rgvarg
- // byref arg VT_XXX |VT_BYREF
- arArgs[revIndex].vt = varType;
- if (revIndex == 0 && aFuncDesc->invkind == INVOKE_PROPERTYPUT)
- {
- arArgs[revIndex] = arRefArgs[revIndex];
- }
- else if (type == VT_DECIMAL)
- {
- arArgs[revIndex].byref= & arRefArgs[revIndex].decVal;
- }
- else if (type == VT_VARIANT)
- {
- if ( ! (paramFlags & PARAMFLAG_FOUT))
- arArgs[revIndex] = arRefArgs[revIndex];
- else
- arArgs[revIndex].byref = & arRefArgs[revIndex];
- }
- else
- {
- arArgs[revIndex].byref = & arRefArgs[revIndex].byref;
- arArgs[revIndex].vt = ::sal::static_int_cast< VARTYPE, int >( arRefArgs[revIndex].vt | VT_BYREF );
- }
-
- }
- // in parameter no VT_BYREF except for array, interfaces
- else
- { // void any stands for optional param
- if (i < nUnoArgs && anyArg.getValueTypeClass() != TypeClass_VOID)
- {
- anyToVariant( & arArgs[revIndex], anyArg, varType);
- }
- //optional arg but no void any supplied
- //Basic: obj.func() ' first parameter left out because it is optional
- else if (paramFlags & PARAMFLAG_FHASDEFAULT)
- {
- //optional arg with defaulteithter as direct arg : VT_XXX or
- VariantCopy( & arArgs[revIndex],
- & aFuncDesc->lprgelemdescParam[i].paramdesc.
- pparamdescex->varDefaultValue);
- }
- else if (paramFlags & PARAMFLAG_FOPT)
- {
- arArgs[revIndex].vt = VT_ERROR;
- arArgs[revIndex].scode = DISP_E_PARAMNOTFOUND;
- }
- else
- {
- arArgs[revIndex].vt = VT_EMPTY;
- arArgs[revIndex].lVal = 0;
- }
- }
- }
- }
- catch (IllegalArgumentException & e)
- {
- e.ArgumentPosition = ::sal::static_int_cast< sal_Int16, sal_Int32 >( i );
- throw;
- }
- catch (CannotConvertException & e)
- {
- e.ArgumentIndex = i;
- throw;
- }
- dispparams.rgvarg= arArgs;
- // invoking OLE method
- DWORD localeId = LOCALE_USER_DEFAULT;
- result = m_spDispatch->Invoke(aFuncDesc->memid,
- IID_NULL,
- localeId,
- ::sal::static_int_cast< WORD, INVOKEKIND >( aFuncDesc->invkind ),
- &dispparams,
- &varResult,
- &excepinfo,
- &uArgErr);
-
- // converting return value and out parameter back to UNO
- if (result == S_OK)
- {
-
- // allocate space for the out param Sequence and indices Sequence
- int outParamsCount= 0; // includes in/out parameter
- for (int i = 0; i < aFuncDesc->cParams; i++)
- {
- if (aFuncDesc->lprgelemdescParam[i].paramdesc.wParamFlags &
- PARAMFLAG_FOUT)
- outParamsCount++;
- }
-
- OutParamIndex.realloc(outParamsCount);
- OutParam.realloc(outParamsCount);
- // Convert out params
- if (outParamsCount)
- {
- int outParamIndex=0;
- for (int paramIndex = 0; paramIndex < nUnoArgs; paramIndex ++)
- {
- //Determine the index within the method sinature
- int realParamIndex = paramIndex;
- int revParamIndex = dispparams.cArgs - paramIndex - 1;
- if (Params[paramIndex].getValueType()
- == getCppuType((NamedArgument*) 0))
- {
- //dispparams.rgdispidNamedArgs contains the mapping from index
- //of named args list to index of parameter list
- realParamIndex = dispparams.rgdispidNamedArgs[revParamIndex];
- }
-
- // no named arg, always come before named args
- if (! (aFuncDesc->lprgelemdescParam[realParamIndex].paramdesc.wParamFlags
- & PARAMFLAG_FOUT))
- continue;
- Any outAny;
- // variantToAny is called with the "reduce range" parameter set to sal_False.
- // That causes VT_I4 values not to be converted down to a "lower" type. That
- // feature exist for JScript only because it only uses VT_I4 for integer types.
- try
- {
- variantToAny( & arRefArgs[revParamIndex], outAny, sal_False );
- }
- catch (IllegalArgumentException & e)
- {
- e.ArgumentPosition = (sal_Int16)paramIndex;
- throw;
- }
- catch (CannotConvertException & e)
- {
- e.ArgumentIndex = paramIndex;
- throw;
- }
- OutParam[outParamIndex] = outAny;
- OutParamIndex[outParamIndex] = ::sal::static_int_cast< sal_Int16, int >( paramIndex );
- outParamIndex++;
- }
- OutParam.realloc(outParamIndex);
- OutParamIndex.realloc(outParamIndex);
- }
- // Return value
- variantToAny(&varResult, ret, sal_False);
- }
-
- // map error codes to exceptions
- OUString message;
- switch (result)
- {
- case S_OK:
- break;
- case DISP_E_BADPARAMCOUNT:
- throw IllegalArgumentException(OUSTR("[automation bridge] Wrong "
- "number of arguments. Object returned DISP_E_BADPARAMCOUNT."),
- 0, 0);
- break;
- case DISP_E_BADVARTYPE:
- throw RuntimeException(OUSTR("[automation bridge] One or more "
- "arguments have the wrong type. Object returned "
- "DISP_E_BADVARTYPE."), 0);
- break;
- case DISP_E_EXCEPTION:
- {
- message = OUSTR("[automation bridge]: ");
- message += OUString(reinterpret_cast<const sal_Unicode*>(excepinfo.bstrDescription),
- ::SysStringLen(excepinfo.bstrDescription));
-
- // Add for VBA, to throw an exception with the correct error code and message.
- sal_Int32 nErrorCode = excepinfo.wCode;
- if ( nErrorCode == 0 )
- {
- // The low 16-bit of scode describing the error or warning.
- nErrorCode = ( excepinfo.scode & 0xFFFF );
- }
- BasicErrorException aBasicErrExp(message, Reference<XInterface>(), nErrorCode, message);
- throw InvocationTargetException(message, Reference<XInterface>(), makeAny(aBasicErrExp));
- // End add
-
- break;
- }
- case DISP_E_MEMBERNOTFOUND:
- message = OUSTR("[automation bridge]: A function with the name \"")
- + sFuncName + OUSTR("\" is not supported. Object returned "
- "DISP_E_MEMBERNOTFOUND.");
- throw IllegalArgumentException(message, 0, 0);
- break;
- case DISP_E_NONAMEDARGS:
- throw IllegalArgumentException(OUSTR("[automation bridge] Object "
- "returned DISP_E_NONAMEDARGS"),0, ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr ));
- break;
- case DISP_E_OVERFLOW:
- throw CannotConvertException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[automation bridge] Call failed.")),
- static_cast<XInterface*>(
- static_cast<XWeak*>(this)), TypeClass_UNKNOWN, FailReason::OUT_OF_RANGE, uArgErr);
- break;
- case DISP_E_PARAMNOTFOUND:
- throw IllegalArgumentException(OUSTR("[automation bridge]Call failed."
- "Object returned DISP_E_PARAMNOTFOUND."),
- 0, ::sal::static_int_cast< sal_Int16, unsigned int >( uArgErr ));
- break;
- case DISP_E_TYPEMISMATCH:
- throw CannotConvertException(OUSTR("[automation bridge] Call failed. "
- "Object returned DISP_E_TYPEMISMATCH"),
- static_cast<XInterface*>(
- static_cast<XWeak*>(this)) , TypeClass_UNKNOWN, FailReason::UNKNOWN, uArgErr);
- break;
- case DISP_E_UNKNOWNINTERFACE:
- throw RuntimeException(OUSTR("[automation bridge] Call failed. "
- "Object returned DISP_E_UNKNOWNINTERFACE."),0);
- break;
- case DISP_E_UNKNOWNLCID:
- throw RuntimeException(OUSTR("[automation bridge] Call failed. "
- "Object returned DISP_E_UNKNOWNLCID."),0);
- break;
- case DISP_E_PARAMNOTOPTIONAL:
- throw CannotConvertException(OUSTR("[automation bridge] Call failed."
- "Object returned DISP_E_PARAMNOTOPTIONAL"),
- static_cast<XInterface*>(static_cast<XWeak*>(this)),
- TypeClass_UNKNOWN, FailReason::NO_DEFAULT_AVAILABLE, uArgErr);
- break;
- default:
- throw RuntimeException();
- break;
- }
-
- return ret;
-}
-
-void IUnknownWrapper_Impl::getFuncDescForInvoke(const OUString & sFuncName,
- const Sequence<Any> & seqArgs,
- FUNCDESC** pFuncDesc)
-{
- int nUnoArgs = seqArgs.getLength();
- const Any * arArgs = seqArgs.getConstArray();
- ITypeInfo* pInfo = getTypeInfo();
-
- //If the last of the positional arguments is a PropertyPutArgument
- //then obtain the type info for the property put operation.
-
- //The property value is always the last argument, in a positional argument list
- //or in a list of named arguments. A PropertyPutArgument is actually a named argument
- //hence it must not be put in an extra NamedArgument structure
- if (nUnoArgs > 0 &&
- arArgs[nUnoArgs - 1].getValueType() == getCppuType((PropertyPutArgument*) 0))
- {
- // DISPATCH_PROPERTYPUT
- FuncDesc aDescGet(pInfo);
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(sFuncName, & aDescGet, & aDescPut, & aVarDesc);
- if ( ! aDescPut)
- {
- throw IllegalArgumentException(
- OUSTR("[automation bridge] The object does not have a writeable property: ")
- + sFuncName, Reference<XInterface>(), 0);
- }
- *pFuncDesc = aDescPut.Detach();
- }
- else
- { // DISPATCH_METHOD
- FuncDesc aFuncDesc(pInfo);
- getFuncDesc(sFuncName, & aFuncDesc);
- if ( ! aFuncDesc)
- {
- // Fallback: DISPATCH_PROPERTYGET can mostly be called as
- // DISPATCH_METHOD
- ITypeInfo * pInfo = getTypeInfo();
- FuncDesc aDescPut(pInfo);
- VarDesc aVarDesc(pInfo);
- getPropDesc(sFuncName, & aFuncDesc, & aDescPut, & aVarDesc);
- if ( ! aFuncDesc )
- {
- throw IllegalArgumentException(
- OUSTR("[automation bridge] The object does not have a function"
- "or readable property \"")
- + sFuncName, Reference<XInterface>(), 0);
- }
- }
- *pFuncDesc = aFuncDesc.Detach();
- }
-}
-bool IUnknownWrapper_Impl::getDispid(const OUString& sFuncName, DISPID * id)
-{
- OSL_ASSERT(m_spDispatch);
- LPOLESTR lpsz = const_cast<LPOLESTR> (reinterpret_cast<LPCOLESTR>(sFuncName.getStr()));
- HRESULT hr = m_spDispatch->GetIDsOfNames(IID_NULL, &lpsz, 1, LOCALE_USER_DEFAULT, id);
- return hr == S_OK ? true : false;
-}
-void IUnknownWrapper_Impl::getFuncDesc(const OUString & sFuncName, FUNCDESC ** pFuncDesc)
-
-{
- OSL_ASSERT( * pFuncDesc == 0);
- buildComTlbIndex();
- typedef TLBFuncIndexMap::const_iterator cit;
- typedef TLBFuncIndexMap::iterator it;
- //We assume there is only one entry with the function name. A property
- //would have two entries.
- cit itIndex= m_mapComFunc.find(sFuncName);
- if (itIndex == m_mapComFunc.end())
- {
- //try case insensive with IDispatch::GetIDsOfNames
- DISPID id;
- if (getDispid(sFuncName, &id))
- {
- CComBSTR memberName;
- unsigned int pcNames=0;
- // get the case sensitive name
- if( SUCCEEDED(getTypeInfo()->GetNames( id, & memberName, 1, &pcNames)))
- {
- //get the associated index and add an entry to the map
- //with the name sFuncName which differs in the casing of the letters to
- //the actual name as obtained from ITypeInfo
- OUString sRealName(reinterpret_cast<const sal_Unicode*>(LPCOLESTR(memberName)));
- cit itOrg = m_mapComFunc.find(sRealName);
- OSL_ASSERT(itOrg != m_mapComFunc.end());
- // maybe this is a property, if so we need
- // to store either both id's ( put/get ) or
- // just the get. Storing both is more consistent
- pair<cit, cit> pItems = m_mapComFunc.equal_range( sRealName );
- for ( ;pItems.first != pItems.second; ++pItems.first )
- m_mapComFunc.insert( TLBFuncIndexMap::value_type ( make_pair(sFuncName, pItems.first->second ) ));
- itIndex =
- m_mapComFunc.find( sFuncName );
- }
- }
- }
-
-#if OSL_DEBUG_LEVEL >= 1
- // There must only be one entry if sFuncName represents a function or two
- // if it is a property
- pair<cit, cit> p = m_mapComFunc.equal_range(sFuncName.toAsciiLowerCase());
- int numEntries = 0;
- for ( ;p.first != p.second; p.first ++, numEntries ++);
- OSL_ASSERT( ! (numEntries > 3) );
-#endif
- if( itIndex != m_mapComFunc.end())
- {
- ITypeInfo* pType= getTypeInfo();
- FUNCDESC * pDesc = NULL;
- if (SUCCEEDED(pType->GetFuncDesc(itIndex->second, & pDesc)))
- {
- if (pDesc->invkind == INVOKE_FUNC)
- {
- (*pFuncDesc) = pDesc;
- }
- else
- {
- pType->ReleaseFuncDesc(pDesc);
- }
- }
- else
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] Could not get "
- "FUNCDESC for ") + sFuncName);
- }
- }
- //else no entry found for sFuncName, pFuncDesc will not be filled in
-}
-
-void IUnknownWrapper_Impl::getPropDesc(const OUString & sFuncName, FUNCDESC ** pFuncDescGet,
- FUNCDESC** pFuncDescPut, VARDESC** pVarDesc)
-{
- OSL_ASSERT( * pFuncDescGet == 0 && * pFuncDescPut == 0);
- buildComTlbIndex();
- typedef TLBFuncIndexMap::const_iterator cit;
- pair<cit, cit> p = m_mapComFunc.equal_range(sFuncName);
- if (p.first == m_mapComFunc.end())
- {
- //try case insensive with IDispatch::GetIDsOfNames
- DISPID id;
- if (getDispid(sFuncName, &id))
- {
- CComBSTR memberName;
- unsigned int pcNames=0;
- // get the case sensitive name
- if( SUCCEEDED(getTypeInfo()->GetNames( id, & memberName, 1, &pcNames)))
- {
- //As opposed to getFuncDesc, we do not add the value because we would
- // need to find the get and set description for the property. This would
- //mean to iterate over all FUNCDESCs again.
- p = m_mapComFunc.equal_range(OUString(reinterpret_cast<const sal_Unicode*>(LPCOLESTR(memberName))));
- }
- }
- }
-
- for ( int i = 0 ;p.first != p.second; p.first ++, i ++)
- {
- // There are a maximum of two entries, property put and property get
- OSL_ASSERT( ! (i > 2) );
- ITypeInfo* pType= getTypeInfo();
- FUNCDESC * pFuncDesc = NULL;
- if (SUCCEEDED( pType->GetFuncDesc(p.first->second, & pFuncDesc)))
- {
- if (pFuncDesc->invkind == INVOKE_PROPERTYGET)
- {
- (*pFuncDescGet) = pFuncDesc;
- }
- else if (pFuncDesc->invkind == INVOKE_PROPERTYPUT ||
- pFuncDesc->invkind == INVOKE_PROPERTYPUTREF)
- {
- //a property can have 3 entries, put, put ref, get
- // If INVOKE_PROPERTYPUTREF or INVOKE_PROPERTYPUT is used
- //depends on what is found first.
- if ( * pFuncDescPut)
- {
- //we already have found one
- pType->ReleaseFuncDesc(pFuncDesc);
- }
- else
- {
- (*pFuncDescPut) = pFuncDesc;
- }
- }
- else
- {
- pType->ReleaseFuncDesc(pFuncDesc);
- }
- }
- //ITypeInfo::GetFuncDesc may even provide a funcdesc for a VARDESC
- // with invkind = INVOKE_FUNC. Since this function should only return
- //a value for a real property (XInvokation::hasMethod, ..::hasProperty
- //we need to make sure that sFuncName represents a real property.
- VARDESC * pVD = NULL;
- if (SUCCEEDED(pType->GetVarDesc(p.first->second, & pVD)))
- (*pVarDesc) = pVD;
- }
- //else no entry for sFuncName, pFuncDesc will not be filled in
-}
-
-VARTYPE IUnknownWrapper_Impl::getUserDefinedElementType( ITypeInfo* pTypeInfo, const DWORD nHrefType )
-{
- VARTYPE _type( VT_NULL );
- if ( pTypeInfo )
- {
- CComPtr<ITypeInfo> spRefInfo;
- pTypeInfo->GetRefTypeInfo( nHrefType, &spRefInfo.p );
- if ( spRefInfo )
- {
- TypeAttr attr( spRefInfo );
- spRefInfo->GetTypeAttr( &attr );
- if ( attr->typekind == TKIND_ENUM )
- {
- // We use the type of the first enum value.
- if ( attr->cVars == 0 )
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] Could not obtain type description"));
- }
- VarDesc var( spRefInfo );
- spRefInfo->GetVarDesc( 0, &var );
- _type = var->lpvarValue->vt;
- }
- else if ( attr->typekind == TKIND_INTERFACE )
- {
- _type = VT_UNKNOWN;
- }
- else if ( attr->typekind == TKIND_DISPATCH )
- {
- _type = VT_DISPATCH;
- }
- else if ( attr->typekind == TKIND_ALIAS )
- {
- // TKIND_ALIAS is a type that is an alias for another type. So get that alias type.
- _type = getUserDefinedElementType( pTypeInfo, attr->tdescAlias.hreftype );
- }
- else
- {
- throw BridgeRuntimeError( OUSTR("[automation bridge] Unhandled user defined type.") );
- }
- }
- }
- return _type;
-}
-
-VARTYPE IUnknownWrapper_Impl::getElementTypeDesc(const TYPEDESC *desc)
-{
- VARTYPE _type( VT_NULL );
-
- if (desc->vt == VT_PTR)
- {
- _type = getElementTypeDesc(desc->lptdesc);
- _type |= VT_BYREF;
- }
- else if (desc->vt == VT_SAFEARRAY)
- {
- _type = getElementTypeDesc(desc->lptdesc);
- _type |= VT_ARRAY;
- }
- else if (desc->vt == VT_USERDEFINED)
- {
- ITypeInfo* thisInfo = getTypeInfo(); //kept by this instance
- _type = getUserDefinedElementType( thisInfo, desc->hreftype );
- }
- else
- {
- _type = desc->vt;
- }
- return _type;
-}
-
-void IUnknownWrapper_Impl::buildComTlbIndex()
-{
- if ( ! m_bComTlbIndexInit)
- {
- MutexGuard guard(getBridgeMutex());
- {
- if ( ! m_bComTlbIndexInit)
- {
- OUString sError;
- ITypeInfo* pType= getTypeInfo();
- TypeAttr typeAttr(pType);
- if( SUCCEEDED( pType->GetTypeAttr( &typeAttr)))
- {
- for( long i= 0; i < typeAttr->cFuncs; i++)
- {
- FuncDesc funcDesc(pType);
- if( SUCCEEDED( pType->GetFuncDesc( i, &funcDesc)))
- {
- CComBSTR memberName;
- unsigned int pcNames=0;
- if( SUCCEEDED(pType->GetNames( funcDesc->memid, & memberName, 1, &pcNames)))
- {
- OUString usName(reinterpret_cast<const sal_Unicode*>(LPCOLESTR(memberName)));
- m_mapComFunc.insert( TLBFuncIndexMap::value_type( usName, i));
- }
- else
- {
- sError = OUSTR("[automation bridge] IUnknownWrapper_Impl::buildComTlbIndex, " \
- "ITypeInfo::GetNames failed.");
- }
- }
- else
- sError = OUSTR("[automation bridge] IUnknownWrapper_Impl::buildComTlbIndex, " \
- "ITypeInfo::GetFuncDesc failed.");
- }
-
- //If we create an Object in JScript and a a property then it
- //has VARDESC instead of FUNCDESC
- for (long i = 0; i < typeAttr->cVars; i++)
- {
- VarDesc varDesc(pType);
- if (SUCCEEDED(pType->GetVarDesc(i, & varDesc)))
- {
- CComBSTR memberName;
- unsigned int pcNames = 0;
- if (SUCCEEDED(pType->GetNames(varDesc->memid, & memberName, 1, &pcNames)))
- {
- if (varDesc->varkind == VAR_DISPATCH)
- {
- OUString usName(reinterpret_cast<const sal_Unicode*>(LPCOLESTR(memberName)));
- m_mapComFunc.insert(TLBFuncIndexMap::value_type(
- usName, i));
- }
- }
- else
- {
- sError = OUSTR("[automation bridge] IUnknownWrapper_Impl::buildComTlbIndex, " \
- "ITypeInfo::GetNames failed.");
- }
- }
- else
- sError = OUSTR("[automation bridge] IUnknownWrapper_Impl::buildComTlbIndex, " \
- "ITypeInfo::GetVarDesc failed.");
-
- }
- }
- else
- sError = OUSTR("[automation bridge] IUnknownWrapper_Impl::buildComTlbIndex, " \
- "ITypeInfo::GetTypeAttr failed.");
-
- if (sError.getLength())
- {
- throw BridgeRuntimeError(sError);
- }
-
- m_bComTlbIndexInit = true;
- }
- }
- }
-}
-
-ITypeInfo* IUnknownWrapper_Impl::getTypeInfo()
-{
- if( !m_spDispatch)
- {
- throw BridgeRuntimeError(OUSTR("The object has no IDispatch interface!"));
- }
-
- if( !m_spTypeInfo )
- {
- MutexGuard guard(getBridgeMutex());
- if( ! m_spTypeInfo)
- {
- CComPtr< ITypeInfo > spType;
- if( SUCCEEDED( m_spDispatch->GetTypeInfo( 0, LOCALE_USER_DEFAULT, &spType.p)))
-
- {
- OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
-
- //If this is a dual interface then TYPEATTR::typekind is usually TKIND_INTERFACE
- //We need to get the type description for TKIND_DISPATCH
- TypeAttr typeAttr(spType.p);
- if( SUCCEEDED(spType->GetTypeAttr( &typeAttr)))
- {
- if (typeAttr->typekind == TKIND_INTERFACE &&
- typeAttr->wTypeFlags & TYPEFLAG_FDUAL)
- {
- HREFTYPE refDispatch;
- if (SUCCEEDED(spType->GetRefTypeOfImplType(::sal::static_int_cast< UINT, int >( -1 ), &refDispatch)))
- {
- CComPtr<ITypeInfo> spTypeDisp;
- if (SUCCEEDED(spType->GetRefTypeInfo(refDispatch, & spTypeDisp)))
- m_spTypeInfo= spTypeDisp;
- }
- else
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] Could not obtain type information "
- "for dispatch interface." ));
- }
- }
- else if (typeAttr->typekind == TKIND_DISPATCH)
- {
- m_spTypeInfo= spType;
- }
- else
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] Automation object does not "
- "provide type information."));
- }
- }
- }
- else
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge]The dispatch object does not "
- "support ITypeInfo!"));
- }
- }
- }
- return m_spTypeInfo;
-}
-
-} // end namespace
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/oleobjw.hxx b/extensions/source/ole/oleobjw.hxx
deleted file mode 100644
index 387d91d60..000000000
--- a/extensions/source/ole/oleobjw.hxx
+++ /dev/null
@@ -1,295 +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.
- *
- ************************************************************************/
-
-#ifndef __OLEOBJW_HXX
-#define __OLEOBJW_HXX
-#include "ole2uno.hxx"
-
-#ifdef _MSC_VER
-#pragma warning (push,1)
-#pragma warning (disable:4548)
-#endif
-
-#include <tools/presys.h>
-#define _WIN32_WINNT 0x0403
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1300)
-#undef _DEBUG
-#endif
-#include <atlbase.h>
-#include <vector>
-#include <boost/unordered_map.hpp>
-#include <tools/postsys.h>
-
-#ifdef _MSC_VER
-#pragma warning (pop)
-#endif
-#include <cppuhelper/implbase3.hxx>
-#include <cppuhelper/implbase4.hxx>
-#include <cppuhelper/implbase8.hxx>
-
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/bridge/oleautomation/XAutomationObject.hpp>
-#include <com/sun/star/script//XAutomationInvocation.hpp>
-#include <rtl/ustring.hxx>
-
-#include <com/sun/star/script/XDefaultProperty.hpp>
-#include <com/sun/star/script/XDefaultMethod.hpp>
-#include <com/sun/star/script/XDirectInvocation.hpp>
-
-#include <typelib/typedescription.hxx>
-#include "unoconversionutilities.hxx"
-#include "windata.hxx"
-using namespace cppu;
-using namespace std;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::bridge;
-using namespace com::sun::star::bridge::oleautomation;
-
-using ::rtl::OUString;
-namespace ole_adapter
-{
-
-
-
-typedef boost::unordered_map<OUString, pair<DISPID, unsigned short>, hashOUString_Impl, equalOUString_Impl> DispIdMap;
-
-typedef boost::unordered_multimap<OUString, unsigned int, hashOUString_Impl, equalOUString_Impl> TLBFuncIndexMap;
-
-// This class wraps an IDispatch and maps XInvocation calls to IDispatch calls on the wrapped object.
-// If m_TypeDescription is set then this class represents an UNO interface implemented in a COM component.
-// The interface is not a real interface in terms of an abstract class but is realized through IDispatch.
-class IUnknownWrapper_Impl : public WeakImplHelper8< XInvocation, XBridgeSupplier2, XInitialization, XAutomationObject, XDefaultProperty, XDefaultMethod, XDirectInvocation, XAutomationInvocation >,
-
- public UnoConversionUtilities<IUnknownWrapper_Impl>
-
-{
-public:
- IUnknownWrapper_Impl(Reference<XMultiServiceFactory> &xFactory,
- sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass);
-
- ~IUnknownWrapper_Impl();
-
- //XInterface
- Any SAL_CALL queryInterface(const Type& t)
- throw (RuntimeException);
-
- // XInvokation
- virtual Reference< XIntrospectionAccess > SAL_CALL getIntrospection( )
- throw(RuntimeException);
- virtual Any SAL_CALL invoke( const OUString& aFunctionName,
- const Sequence< Any >& aParams,
- Sequence< sal_Int16 >& aOutParamIndex,
- Sequence< Any >& aOutParam )
- throw(IllegalArgumentException, CannotConvertException,
- InvocationTargetException, RuntimeException);
- virtual void SAL_CALL setValue( const OUString& aPropertyName,
- const Any& aValue )
- throw(UnknownPropertyException, CannotConvertException,
- InvocationTargetException, RuntimeException);
- virtual Any SAL_CALL getValue( const OUString& aPropertyName )
- throw(UnknownPropertyException, RuntimeException);
- virtual sal_Bool SAL_CALL hasMethod( const OUString& aName )
- throw(RuntimeException);
- virtual sal_Bool SAL_CALL hasProperty( const OUString& aName )
- throw(RuntimeException);
-
- // XBridgeSupplier2
- // This interface is implemented to provide a safe way to obtain the original
- // IUnknown or IDispatch within the function anyToVariant. The function asks
- // every UNO object for its XBridgeSupplier2 and if it is available uses it to convert
- // the object with its own supplier.
- virtual Any SAL_CALL createBridge( const Any& modelDepObject,
- const Sequence< sal_Int8 >& aProcessId,
- sal_Int16 sourceModelType,
- sal_Int16 destModelType )
- throw(IllegalArgumentException, RuntimeException);
-
- // XInitialization
- virtual void SAL_CALL initialize( const Sequence< Any >& aArguments )
- throw(Exception, RuntimeException);
-
- // XDefaultProperty
- virtual ::rtl::OUString SAL_CALL getDefaultPropertyName( ) throw (::com::sun::star::uno::RuntimeException) { return m_sDefaultMember; }
-
- // XDefaultMethod
- virtual ::rtl::OUString SAL_CALL getDefaultMethodName( ) throw (::com::sun::star::uno::RuntimeException) { return m_sDefaultMember; }
-
- virtual ::com::sun::star::uno::Any SAL_CALL invokeGetProperty( const ::rtl::OUString& aFunctionName, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aParams, ::com::sun::star::uno::Sequence< ::sal_Int16 >& aOutParamIndex, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aOutParam ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
- virtual ::com::sun::star::uno::Any SAL_CALL invokePutProperty( const ::rtl::OUString& aFunctionName, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aParams, ::com::sun::star::uno::Sequence< ::sal_Int16 >& aOutParamIndex, ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aOutParam ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
-
- // XDirectInvocation
- virtual ::com::sun::star::uno::Any SAL_CALL directInvoke( const ::rtl::OUString& aName, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aParams ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
- virtual ::sal_Bool SAL_CALL hasMember( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException);
-
-
- Any invokeWithDispIdComTlb(FuncDesc& aFuncDesc,
- const OUString& sFuncName,
- const Sequence< Any >& Params,
- Sequence< sal_Int16 >& OutParamIndex,
- Sequence< Any >& OutParam);
-
-
-protected:
- // ----------------------------------------------------------------------------
- virtual Any invokeWithDispIdUnoTlb(const OUString& sFunctionName,
- const Sequence< Any >& Params,
- Sequence<sal_Int16 >& OutParamIndex,
- Sequence< Any >& OutParam);
- // Is used for OleObjectFactory service
- virtual Any invokeWithDispIdComTlb(const OUString& sFuncName,
- const Sequence< Any >& Params,
- Sequence< sal_Int16 >& OutParamIndex,
- Sequence< Any >& OutParam);
-
-// virtual void setValueWithDispId(DISPID dispID, const Any& Value);
-
-// virtual Any getValueWithDispId(const OUString& sName, DISPID dispID);
-
-
- // UnoConversionUtilities -------------------------------------------------------------------------------
- virtual Reference<XInterface> createUnoWrapperInstance();
- virtual Reference<XInterface> createComWrapperInstance();
-
- /**Obtains a FUNCDESC structure for a function.
- Fills the FUNCDESC structure if ITypeInfo provides information for
- the function of name sFuncName or pFuncDesc will not be filled in.
- May throw a BridgeRuntimeError.
- */
- void getFuncDesc(const OUString & sFuncName, FUNCDESC ** pFuncDesc);
- /**Obtains a FUNCDESC structures or a VARDESC structure
- for a property. pFuncDescPut may also contain
- a structure for a "propertyputref" operation. If pFuncDesc contains a
- "put ref" or "put" FUNCDESC depends on what was found first in the type
- description.
- Fills the FUNCDESC structure if ITypeInfo provides information for
- the respective property functions or the structures will not be filled in.
- May throw a BridgeRuntimeError.
- */
- void getPropDesc(const OUString & sFuncName, FUNCDESC ** pFuncDescGet,
- FUNCDESC** pFuncDescPut, VARDESC ** pVarDesc);
- // These functions are for the case if an object of this class wraps an IDispatch
- // object that implements UNO interfaces. In that case the member m_seqTypes
- // is set through XInitialization::initialize.
- void getMethodInfo(const OUString& sName, TypeDescription& methodDescription);
- // After return attributInfo contains typelib_InterfaceAttributeTypeDescription::pAttributeTypeRef
- void getAttributeInfo(const OUString& sName, TypeDescription& attributeInfo);
- // used by get MethodInfo
- TypeDescription getInterfaceMemberDescOfCurrentCall(const OUString& sName);
- /** Returns alway a valid ITypeInfo interface or throws a BridgeRuntimeError.
- The returned interface does not need to be AddRef'ed as long as it is locally
- used. The interface is kept in the instance of this class.
- */
- ITypeInfo* getTypeInfo();
-
- /** Returns the DISPID for a function or property name. If true is returned then
- id contains a valid DISPID.
- */
-
- bool getDispid(const OUString& sFuncName, DISPID * id);
-
- VARTYPE getUserDefinedElementType( ITypeInfo* pTypeInfo, const DWORD nHrefType );
-
- /** Gets the element type in a VARIANT like style. E.g. if desc->lptdesc contains
- a VT_PTR than it is replaced by VT_BYREF and VT_SAFEARRAY is replaced by VT_ARRAY
- If the TYPEDESC describes an SAFEARRAY then varType is a combination of VT_ARRAY
- and the element type.
- The argument desc must be obtained from FUNCDESC::lprgelemdescParam[i].tdesc where
- FUNCDESC was obtained from the ITypeInfo belonging to wrapped IDispatch.
- */
- VARTYPE getElementTypeDesc( const TYPEDESC *desc);
- /** Iterates over all functions and put the names and indices into the map
- m_mapComFunc of type TLBFuncIndexMap.
- Call the function every time before accessing the map.
- Throws a BridgeRuntimeError on failure.
- */
- void buildComTlbIndex();
-
- /** Returns a FUNCDESC structure which contains type information about the
- current XInvocation::invoke call. The FUNCDESC either describes a method,
- a property put or a property get operation.
- It uses the types com.sun.star.bridge.oleautomation.PropertyPutArgument
- which can be
- contained in the sequence of in-arguments of invoke to determine if the call is
- a property put or property get operation.
- If no adequate FUNCDESC was found, an IllegalArgumentException is thrown.
- Therefore it is safe to assume that the returned FUNCDESC* is not NULL.
-
- @exception IllegalArgumentException
- Thrown if no adequate FUNCDESC could be found.
- */
- void getFuncDescForInvoke(const OUString & sFuncName,
- const Sequence<Any> & seqArgs, FUNCDESC** pFuncDesc);
-
- // Finds out wheter the wrapped IDispatch is an JScript Object. This is is
- // done by
- // asking for the property "_environment". If it has the value "JScript"
- // (case insensitive) then the IDispatch is considered a JScript object.
- sal_Bool isJScriptObject();
- // -------------------------------------------------------------------------------
-
- // If UNO interfaces are implemented in JScript objects, VB or C++ COM objects
- // and those are passed as parameter to a UNO interface function, then
- // the IDispatch* are wrapped by objects of this class. Assuming that the functions
- // implemented by the IDispatch object returns another UNO interface then
- // it has to be wrapped to this type. But this is only possible if an object of this
- // wrapper class knows what type it is represting. The member m_TypeDescription holds this
- // information.
- // m_TypeDescription is only useful when an object wraps an IDispatch object that implements
- // an UNO interface. The value is set during a call to XInitialization::initialize.
- Sequence<Type> m_seqTypes;
- CComPtr<IUnknown> m_spUnknown;
- CComPtr<IDispatch> m_spDispatch;
- rtl::OUString m_sTypeName; // is "" ( not initialised ), "IDispatch" ( we have no idea ) or "SomeLibrary.SomeTypeName" if we managed to get a type
- /** This value is set dureing XInitialization::initialize. It indicates that the COM interface
- was transported as VT_DISPATCH in a VARIANT rather then a VT_UNKNOWN
- */
- sal_Bool m_bOriginalDispatch;
- DispIdMap m_dispIdMap;
- Reference<XIdlClass>* m_pxIdlClass;
-
-
- // used by isJScriptObject
- enum JScriptDetermination{ JScriptUndefined=0, NoJScript, IsJScript};
- JScriptDetermination m_eJScript;
- // The map is filled by buildComTlbIndex
- // It maps Uno Function names to an index which is used in ITypeInfo::GetFuncDesc
- TLBFuncIndexMap m_mapComFunc;
- // used for synchroizing the computation of the content for m_mapComFunc
- bool m_bComTlbIndexInit;
- // Keeps the ITypeInfo obtained from IDispatch::GetTypeInfo
- CComPtr< ITypeInfo > m_spTypeInfo;
- rtl::OUString m_sDefaultMember;
- bool m_bHasDfltMethod;
- bool m_bHasDfltProperty;
-};
-
-} // end namespace
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/olethread.cxx b/extensions/source/ole/olethread.cxx
deleted file mode 100644
index bd6f5fbce..000000000
--- a/extensions/source/ole/olethread.cxx
+++ /dev/null
@@ -1,79 +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"
-#if defined _MSC_VER && ( _MSC_VER >= 1200 )
-#define _WIN32_WINNT 0x0400
-#endif
-
-#include "ole2uno.hxx"
-
-#include <tools/presys.h>
-#include <tools/postsys.h>
-
-#include <osl/thread.hxx>
-
-using namespace std;
-
-namespace ole_adapter
-{
-// CoInitializeEx *
-typedef DECLSPEC_IMPORT HRESULT (STDAPICALLTYPE *ptrCoInitEx)( LPVOID, DWORD);
-// CoInitialize *
-typedef DECLSPEC_IMPORT HRESULT (STDAPICALLTYPE *ptrCoInit)( LPVOID);
-
-void o2u_attachCurrentThread()
-{
- static osl::ThreadData oleThreadData;
-
- if ((sal_Bool)(sal_IntPtr)oleThreadData.getData() != sal_True)
- {
- HINSTANCE inst= LoadLibrary( _T("ole32.dll"));
- if( inst )
- {
- HRESULT hr;
- // Try DCOM
- ptrCoInitEx initFuncEx= (ptrCoInitEx)GetProcAddress( inst, _T("CoInitializeEx"));
- if( initFuncEx)
- hr= initFuncEx( NULL, COINIT_MULTITHREADED);
- // No DCOM, try COM
- else
- {
- ptrCoInit initFunc= (ptrCoInit)GetProcAddress( inst,_T("CoInitialize"));
- if( initFunc)
- hr= initFunc( NULL);
- }
- }
- oleThreadData.setData((void*)sal_True);
- }
-}
-
-} // end namespace
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/servprov.cxx b/extensions/source/ole/servprov.cxx
deleted file mode 100644
index d939927b4..000000000
--- a/extensions/source/ole/servprov.cxx
+++ /dev/null
@@ -1,754 +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 <vector>
-
-#ifdef __MINGW32__
-#define INITGUID
-#include <initguid.h>
-#else
-#include "ole2uno.hxx"
-#include "unoconversionutilities.hxx"
-#endif
-#include "servprov.hxx"
-#include "unoobjw.hxx"
-#include "oleobjw.hxx"
-#include <rtl/unload.h>
-
-#include <tools/presys.h>
-#define _WIN32_WINNT 0x0403
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1300)
-#undef _DEBUG
-#endif
-#include <atlbase.h>
-extern CComModule _Module;
-#include <atlcom.h>
-#include <tools/postsys.h>
-
-
-using namespace cppu;
-using namespace osl;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::bridge;
-using namespace com::sun::star::bridge::ModelDependent;
-
-using ::rtl::OUString;
-
-namespace ole_adapter
-{
-
-#include <initguid.h>
-
-#ifndef OWNGUID
-// GUID used since 5.2 ( src569 m)
-// {82154420-0FBF-11d4-8313-005004526AB4}
-DEFINE_GUID(OID_ServiceManager, 0x82154420, 0xfbf, 0x11d4, 0x83, 0x13, 0x0, 0x50, 0x4, 0x52, 0x6a, 0xb4);
-#else
-// Alternative GUID
-// {D9BB9D1D-BFA9-4357-9F11-9A2E9061F06E}
-DEFINE_GUID(OID_ServiceManager, 0xd9bb9d1d, 0xbfa9, 0x4357, 0x9f, 0x11, 0x9a, 0x2e, 0x90, 0x61, 0xf0, 0x6e);
-#endif
-
-extern rtl_StandardModuleCount globalModuleCount;
-
-/*****************************************************************************
-
- class implementation ProviderOleWrapper_Impl
-
-*****************************************************************************/
-
-ProviderOleWrapper_Impl::ProviderOleWrapper_Impl(const Reference<XMultiServiceFactory>& smgr,
- const Reference<XSingleServiceFactory>& xSFact, GUID* pGuid)
- : m_xSingleServiceFactory(xSFact),
- m_smgr( smgr)
-{
- m_guid = *pGuid;
-
- Reference<XInterface> xInt = smgr->createInstance(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.bridge.oleautomation.BridgeSupplier"));
-
- if (xInt.is())
- {
- Any a= xInt->queryInterface( ::getCppuType( reinterpret_cast<
- Reference< XBridgeSupplier2>* >(0)));
- a >>= m_bridgeSupplier;
-
- }
-}
-
-ProviderOleWrapper_Impl::~ProviderOleWrapper_Impl()
-{
-}
-
-sal_Bool ProviderOleWrapper_Impl::registerClass()
-{
- HRESULT hresult;
-
- o2u_attachCurrentThread();
-
- hresult = CoRegisterClassObject(
- m_guid,
- this,
- CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
- REGCLS_MULTIPLEUSE,
- &m_factoryHandle);
-
- return (hresult == NOERROR);
-}
-
-sal_Bool ProviderOleWrapper_Impl::deregisterClass()
-{
- HRESULT hresult = CoRevokeClassObject(m_factoryHandle);
-
- return (hresult == NOERROR);
-}
-
-STDMETHODIMP ProviderOleWrapper_Impl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
-{
- if(IsEqualIID(riid, IID_IUnknown))
- {
- AddRef();
- *ppv = (IUnknown*) (IClassFactory*) this;
- return NOERROR;
- }
- else if (IsEqualIID(riid, IID_IClassFactory))
- {
- AddRef();
- *ppv = (IClassFactory*) this;
- return NOERROR;
- }
-
- *ppv = NULL;
- return ResultFromScode(E_NOINTERFACE);
-}
-
-STDMETHODIMP_(ULONG) ProviderOleWrapper_Impl::AddRef()
-{
- return osl_incrementInterlockedCount( &m_refCount);
-}
-
-STDMETHODIMP_(ULONG) ProviderOleWrapper_Impl::Release()
-{
- MutexGuard aGuard( Mutex::getGlobalMutex());
- ULONG refCount = --m_refCount;
- if (m_refCount == 0)
- {
- delete this;
- }
-
- return refCount;
-}
-
-STDMETHODIMP ProviderOleWrapper_Impl::CreateInstance(IUnknown FAR* punkOuter,
- REFIID riid,
- void FAR* FAR* ppv)
-{
- HRESULT ret = ResultFromScode(E_UNEXPECTED);
- punkOuter = NULL;
-
- Reference<XInterface> xInstance;
-
- if (m_xSingleServiceFactory.is())
- {
- xInstance = m_xSingleServiceFactory->createInstance();
-
- if (xInstance.is())
- {
- Any usrAny(&xInstance, getCppuType( & xInstance));
-
- sal_uInt8 arId[16];
- rtl_getGlobalProcessId( arId );
- Any oleAny = m_bridgeSupplier->createBridge(usrAny,
- Sequence<sal_Int8>((sal_Int8*)arId, 16),
- UNO,
- OLE);
-
-
- if (oleAny.getValueTypeClass() == getCppuType( (sal_uInt32 *)0).getTypeClass())
- {
- VARIANT* pVariant = *(VARIANT**)oleAny.getValue();
-
- if (pVariant->vt == VT_DISPATCH)
- {
- ret = pVariant->pdispVal->QueryInterface(riid, ppv);
- }
-
- VariantClear(pVariant);
- CoTaskMemFree(pVariant);
- }
- }
- }
-
- return ret;
-}
-
-STDMETHODIMP ProviderOleWrapper_Impl::LockServer(int /*fLock*/)
-{
- return NOERROR;
-}
-
-/*****************************************************************************
-
- class implementation OneInstanceOleWrapper_Impl
-
-*****************************************************************************/
-
-OneInstanceOleWrapper_Impl::OneInstanceOleWrapper_Impl( const Reference<XMultiServiceFactory>& smgr,
- const Reference<XInterface>& xInst,
- GUID* pGuid,
- sal_Bool bAsApplication )
- : m_xInst(xInst), m_refCount(0),
- m_smgr( smgr),
- m_factoryHandle( 0 ),
- m_bAsApplication( bAsApplication ),
- m_nApplRegHandle( 0 )
-{
- m_guid = *pGuid;
-
- Reference<XInterface> xInt = m_smgr->createInstance(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.bridge.oleautomation.BridgeSupplier"));
-
- if (xInt.is())
- {
- Any a= xInt->queryInterface( getCppuType(
- reinterpret_cast< Reference<XBridgeSupplier2>*>(0)));
- a >>= m_bridgeSupplier;
- }
-}
-
-OneInstanceOleWrapper_Impl::~OneInstanceOleWrapper_Impl()
-{
-}
-
-sal_Bool OneInstanceOleWrapper_Impl::registerClass()
-{
- HRESULT hresult;
-
- o2u_attachCurrentThread();
-
- hresult = CoRegisterClassObject(
- m_guid,
- this,
- CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
- REGCLS_MULTIPLEUSE,
- &m_factoryHandle);
-
- if ( hresult == NOERROR && m_bAsApplication )
- hresult = RegisterActiveObject( this, m_guid, ACTIVEOBJECT_WEAK, &m_nApplRegHandle );
-
- return (hresult == NOERROR);
-}
-
-sal_Bool OneInstanceOleWrapper_Impl::deregisterClass()
-{
- HRESULT hresult1 = NOERROR;
- if ( m_bAsApplication )
- hresult1 = RevokeActiveObject( m_nApplRegHandle, NULL );
-
- HRESULT hresult2 = CoRevokeClassObject(m_factoryHandle);
-
- return (hresult1 == NOERROR && hresult2 == NOERROR);
-}
-
-STDMETHODIMP OneInstanceOleWrapper_Impl::QueryInterface(REFIID riid, void FAR* FAR* ppv)
-{
- if(IsEqualIID(riid, IID_IUnknown))
- {
- AddRef();
- *ppv = (IUnknown*) (IClassFactory*) this;
- return NOERROR;
- }
- else if (IsEqualIID(riid, IID_IClassFactory))
- {
- AddRef();
- *ppv = (IClassFactory*) this;
- return NOERROR;
- }
-
- *ppv = NULL;
- return ResultFromScode(E_NOINTERFACE);
-}
-
-STDMETHODIMP_(ULONG) OneInstanceOleWrapper_Impl::AddRef()
-{
- return osl_incrementInterlockedCount( &m_refCount);
-}
-
-STDMETHODIMP_(ULONG) OneInstanceOleWrapper_Impl::Release()
-{
- MutexGuard oGuard( Mutex::getGlobalMutex());
- ULONG refCount = --m_refCount;
- if ( m_refCount == 0)
- {
- delete this;
- }
-
- return refCount;
-}
-
-STDMETHODIMP OneInstanceOleWrapper_Impl::CreateInstance(IUnknown FAR* punkOuter,
- REFIID riid,
- void FAR* FAR* ppv)
-{
- HRESULT ret = ResultFromScode(E_UNEXPECTED);
- punkOuter = NULL;
-
- if (m_xInst.is())
- {
- Any usrAny(&m_xInst, getCppuType( &m_xInst));
- sal_uInt8 arId[16];
- rtl_getGlobalProcessId( arId);
- Any oleAny = m_bridgeSupplier->createBridge(usrAny,
- Sequence<sal_Int8>( (sal_Int8*)arId, 16),
- UNO,
- OLE);
-
-
- if (oleAny.getValueTypeClass() == TypeClass_UNSIGNED_LONG)
- {
- VARIANT* pVariant = *(VARIANT**)oleAny.getValue();
-
- if ((pVariant->vt == VT_UNKNOWN) || (pVariant->vt == VT_DISPATCH))
- {
- ret = pVariant->punkVal->QueryInterface(riid, ppv);
- }
-
- VariantClear(pVariant);
- CoTaskMemFree(pVariant);
- }
- }
-
- return ret;
-}
-
-STDMETHODIMP OneInstanceOleWrapper_Impl::LockServer(int /*fLock*/)
-{
- return NOERROR;
-}
-
-
-/*****************************************************************************
-
- class implementation OleConverter_Impl2
-
-*****************************************************************************/
-
-OleConverter_Impl2::OleConverter_Impl2( const Reference<XMultiServiceFactory> &smgr):
- UnoConversionUtilities<OleConverter_Impl2>( smgr)
-
-{
- // library unloading support
- globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt);
-}
-
-// The XMultiServiceFactory is later set by XInitialization
-OleConverter_Impl2::OleConverter_Impl2( const Reference<XMultiServiceFactory>& smgr, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass ):
- UnoConversionUtilities<OleConverter_Impl2>( smgr, unoWrapperClass, comWrapperClass )
-
-{
- //library unloading support
- globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt);
-}
-
-OleConverter_Impl2::~OleConverter_Impl2()
-{
- globalModuleCount.modCnt.release( &globalModuleCount.modCnt);
-}
-
-// XBridgeSupplier --------------------------------------------------------------
-Any SAL_CALL OleConverter_Impl2::createBridge(const Any& modelDepObject,
- const Sequence< sal_Int8 >& ProcessId,
- sal_Int16 sourceModelType,
- sal_Int16 destModelType)
- throw (IllegalArgumentException,
- RuntimeException )
-{
- Any ret;
- sal_uInt8 arId[16];
- rtl_getGlobalProcessId( arId );
-
- Sequence< sal_Int8 > seqProcessId( (sal_Int8*)arId, 16);
-
- if ( seqProcessId == ProcessId)
- {
- if (sourceModelType == UNO)
- {
- if (destModelType == UNO)
- {
- // same model -> copy value only
- ret = modelDepObject;
- }
- else if (destModelType == OLE)
- {
- // convert UNO any into variant
- VARIANT* pVariant = (VARIANT*) CoTaskMemAlloc(sizeof(VARIANT));
- VariantInit( pVariant);
- try
- {
- anyToVariant( pVariant, modelDepObject);
- }
- catch(...)
- {
- CoTaskMemFree(pVariant);
- throw IllegalArgumentException();
- }
- ret.setValue((void*) &pVariant, getCppuType((sal_uInt32*)0));
- }
- else
- throw IllegalArgumentException();
- }
- else if (sourceModelType == OLE)
- {
- if (modelDepObject.getValueType() != getCppuType((sal_uInt32*)0))
- {
- throw IllegalArgumentException();
- }
- else if (destModelType == OLE)
- {
- // same model -> copy value only
- VARIANT* pVariant = (VARIANT*) CoTaskMemAlloc(sizeof(VARIANT));
-
- if (NOERROR != VariantCopy(pVariant, *(VARIANT**)modelDepObject.getValue()))
- {
- CoTaskMemFree(pVariant);
- throw(IllegalArgumentException());
- }
- else
- {
- ret.setValue((void*) &pVariant, getCppuType((sal_uInt32*)0));
- }
- }
- else if (destModelType == UNO)
- {
- // convert variant into UNO any
- VARIANT* pVariant = *(VARIANT**)modelDepObject.getValue();
- try
- {
- variantToAny(pVariant, ret);
- }
- catch (CannotConvertException & e)
- {
- throw IllegalArgumentException(
- e.Message, 0, -1);
- }
- }
- else
- throw IllegalArgumentException();
-
- }
- else
- throw IllegalArgumentException();
- }
-
- return ret;
-}
-
-
-// XInitialize ------------------------------------------------------------------------------
-// the first argument is an XMultiServiceFactory if at all
-void SAL_CALL OleConverter_Impl2::initialize( const Sequence< Any >& aArguments )
- throw(Exception, RuntimeException)
-{
- if( aArguments.getLength() == 1 && aArguments[0].getValueTypeClass() == TypeClass_INTERFACE)
- {
- Reference < XInterface > xInt;
- aArguments[0] >>= xInt;
- Reference <XMultiServiceFactory> xMulti( xInt, UNO_QUERY);
- m_smgrRemote= xMulti;
- }
-}
-
-// UnoConversionUtilities -------------------------------------------------------------------
-Reference< XInterface > OleConverter_Impl2::createUnoWrapperInstance()
-{
- if( m_nUnoWrapperClass == INTERFACE_OLE_WRAPPER_IMPL)
- {
- Reference<XWeak> xWeak= static_cast<XWeak*>( new InterfaceOleWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
- }
- else if( m_nUnoWrapperClass == UNO_OBJECT_WRAPPER_REMOTE_OPT)
- {
- Reference<XWeak> xWeak= static_cast<XWeak*>( new UnoObjectWrapperRemoteOpt(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
- }
- else
- return Reference<XInterface>();
-}
-
-Reference< XInterface > OleConverter_Impl2::createComWrapperInstance()
-{
- Reference<XWeak> xWeak= static_cast<XWeak*>( new IUnknownWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
-}
-
-
-
-/*****************************************************************************
-
- class implementation OleClient_Impl
-
-*****************************************************************************/
-
-OleClient_Impl::OleClient_Impl( const Reference<XMultiServiceFactory>& smgr):
- UnoConversionUtilities<OleClient_Impl>( smgr)
-{
- // library unloading support
- globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt);
- Reference<XInterface> xInt;// = m_smgr->createInstance(L"com.sun.star.bridge.OleBridgeSupplier2");
-
- if (xInt.is())
- {
- Any a= xInt->queryInterface(getCppuType(
- reinterpret_cast<Reference<XBridgeSupplier2>*>(0)));
- a >>= m_bridgeSupplier;
- }
-}
-
-OleClient_Impl::~OleClient_Impl()
-{
- // library unloading support
- globalModuleCount.modCnt.release( &globalModuleCount.modCnt);
-}
-
-Sequence< OUString > SAL_CALL OleClient_Impl::getAvailableServiceNames() throw( RuntimeException )
-{
- Sequence< OUString > ret;
-
- return ret;
-}
-
-
-OUString OleClient_Impl::getImplementationName()
-{
- return OUString(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.comp.ole.OleClient"));
-}
-
-Reference<XInterface> SAL_CALL OleClient_Impl::createInstance(const OUString& ServiceSpecifier) throw (Exception, RuntimeException )
-{
- Reference<XInterface> ret;
- HRESULT result;
- IUnknown* pUnknown = NULL;
- CLSID classId;
-
- o2u_attachCurrentThread();
-
- result = CLSIDFromProgID(
- reinterpret_cast<LPCWSTR>(ServiceSpecifier.getStr()), //Pointer to the ProgID
- &classId); //Pointer to the CLSID
-
-
- if (result == NOERROR)
- {
- result = CoCreateInstance(
- classId, //Class identifier (CLSID) of the object
- NULL, //Pointer to whether object is or isn't part of an aggregate
- CLSCTX_SERVER, //Context for running executable code
- IID_IUnknown, //Reference to the identifier of the interface
- (void**)&pUnknown); //Address of output variable that receives
- // the interface pointer requested in riid
- }
-
- if (pUnknown != NULL)
- {
- Any any;
- CComVariant variant;
-
- V_VT(&variant) = VT_UNKNOWN;
- V_UNKNOWN(&variant) = pUnknown;
- // AddRef for Variant
- pUnknown->AddRef();
-
- // When the object is wrapped, then its refcount is increased
- variantToAny(&variant, any);
- if (any.getValueTypeClass() == TypeClass_INTERFACE)
- {
- any >>= ret;
- }
- pUnknown->Release(); // CoCreateInstance
- }
-
- return ret;
-}
-
-Reference<XInterface> SAL_CALL OleClient_Impl::createInstanceWithArguments(const OUString& ServiceSpecifier, const Sequence< Any >& /*Arguments*/) throw (Exception, RuntimeException)
-{
- return createInstance( ServiceSpecifier);
-}
-
-// UnoConversionUtilities -----------------------------------------------------------------------------
-Reference< XInterface > OleClient_Impl::createUnoWrapperInstance()
-{
- if( m_nUnoWrapperClass == INTERFACE_OLE_WRAPPER_IMPL)
- {
- Reference<XWeak> xWeak= static_cast<XWeak*>( new InterfaceOleWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
- }
- else if( m_nUnoWrapperClass == UNO_OBJECT_WRAPPER_REMOTE_OPT)
- {
- Reference<XWeak> xWeak= static_cast<XWeak*>( new UnoObjectWrapperRemoteOpt(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
- }
- else
- return Reference< XInterface>();
-}
-// UnoConversionUtilities -----------------------------------------------------------------------------
-Reference< XInterface > OleClient_Impl::createComWrapperInstance( )
-{
- Reference<XWeak> xWeak= static_cast<XWeak*>( new IUnknownWrapper_Impl(
- m_smgr, m_nUnoWrapperClass, m_nComWrapperClass));
- return Reference<XInterface>( xWeak, UNO_QUERY);
-}
-
-
-
-/*****************************************************************************
-
- class implementation OleServer_Impl
-
-*****************************************************************************/
-
-OleServer_Impl::OleServer_Impl( const Reference<XMultiServiceFactory>& smgr):
- m_smgr( smgr)
-{
- //library unloading support
- globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt);
- Reference<XInterface> xInt = m_smgr->createInstance(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.bridge.oleautomation.BridgeSupplier"));
-
- if (xInt.is())
- {
- Any a= xInt->queryInterface( getCppuType(
- reinterpret_cast< Reference<XBridgeSupplier2>*>(0)));
- a >>= m_bridgeSupplier;
- }
-
-#ifndef OWNGUID
- sal_Bool bOLERegister = sal_False;
-#else
- sal_Bool bOLERegister = sal_True;
-#endif
- sal_Bool ret = provideInstance( m_smgr, (GUID*)&OID_ServiceManager, bOLERegister );
- (void)ret;
-}
-
-OleServer_Impl::~OleServer_Impl()
-{
- while (!m_wrapperList.empty())
- {
- (*m_wrapperList.begin())->deregisterClass();
- (*m_wrapperList.begin())->Release();
- m_wrapperList.pop_front();
- }
- //library unloading support
- globalModuleCount.modCnt.release( &globalModuleCount.modCnt);
-}
-// XInterface --------------------------------------------------
-Any SAL_CALL OleServer_Impl::queryInterface( const Type& aType ) throw(RuntimeException)
-{
- Any a= ::cppu::queryInterface( aType, static_cast<XTypeProvider*>(this));
- if( a == Any())
- return OWeakObject::queryInterface( aType);
- else
- return a;
-}
-void SAL_CALL OleServer_Impl::acquire( ) throw()
-{
- OWeakObject::acquire();
-}
-void SAL_CALL OleServer_Impl::release( ) throw ()
-{
- OWeakObject::release();
-}
-
-
-// XTypeProvider --------------------------------------------------
-Sequence< Type > SAL_CALL OleServer_Impl::getTypes( ) throw(RuntimeException)
-{
- static OTypeCollection *pCollection = 0;
- if( ! pCollection )
- {
- MutexGuard guard( Mutex::getGlobalMutex() );
- if( ! pCollection )
- {
- static OTypeCollection collection(
- getCppuType(reinterpret_cast< Reference< XWeak>*>(0)),
- getCppuType(reinterpret_cast< Reference< XTypeProvider>*>(0)) );
- pCollection = &collection;
- }
- }
- return (*pCollection).getTypes();
-}
-Sequence< sal_Int8 > SAL_CALL OleServer_Impl::getImplementationId() throw(RuntimeException)
-{
- static OImplementationId *pId = 0;
- if( ! pId )
- {
- MutexGuard guard( Mutex::getGlobalMutex() );
- if( ! pId )
- {
- static OImplementationId id( sal_False );
- pId = &id;
- }
- }
- return (*pId).getImplementationId();
-}
-
-
-sal_Bool OleServer_Impl::provideService(const Reference<XSingleServiceFactory>& xSFact, GUID* guid)
-{
- IClassFactoryWrapper* pFac = new ProviderOleWrapper_Impl( m_smgr, xSFact, guid);
-
- pFac->AddRef();
-
- m_wrapperList.push_back(pFac);
-
- return pFac->registerClass();
-}
-
-sal_Bool OleServer_Impl::provideInstance(const Reference<XInterface>& xInst, GUID* guid, sal_Bool bAsApplication )
-{
- IClassFactoryWrapper* pFac = new OneInstanceOleWrapper_Impl( m_smgr, xInst, guid, bAsApplication );
-
- pFac->AddRef();
- m_wrapperList.push_back(pFac);
-
- return pFac->registerClass();
-}
-
-
-
-} // end namespace
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/servprov.hxx b/extensions/source/ole/servprov.hxx
deleted file mode 100644
index 9b4264fb4..000000000
--- a/extensions/source/ole/servprov.hxx
+++ /dev/null
@@ -1,276 +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.
- *
- ************************************************************************/
-
-#ifndef _SERVPROV_HXX
-#define _SERVPROV_HXX
-
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <cppuhelper/implbase2.hxx>
-
-#include "ole2uno.hxx"
-#include "unoconversionutilities.hxx"
-
-using namespace com::sun::star::bridge;
-using namespace cppu;
-using namespace std;
-
-namespace ole_adapter
-{
-Reference< XInterface> SAL_CALL ConverterProvider_CreateInstance( const Reference<XMultiServiceFactory> & xSMgr)
- throw( Exception);
-Reference< XInterface> SAL_CALL ConverterProvider_CreateInstance2( const Reference<XMultiServiceFactory> & xSMgr)
- throw( Exception);
-Reference< XInterface> SAL_CALL ConverterProvider_CreateInstanceVar1( const Reference<XMultiServiceFactory> & xSMgr)
- throw( Exception);
-Reference<XInterface> SAL_CALL OleClient_CreateInstance( const Reference<XMultiServiceFactory> & xSMgr)
- throw( Exception);
-Reference<XInterface> SAL_CALL OleServer_CreateInstance( const Reference<XMultiServiceFactory> & xSMgr)
- throw( Exception);
-/*****************************************************************************
-
- class declaration IClassFactoryWrapper
-
- Specify abstract helper methods on class factories, which provide
- UNO objects. These methods are used by objects of class OleServer_Impl,
- to handle the OLE registration of different class factories.
-
-*****************************************************************************/
-
-class IClassFactoryWrapper : public IClassFactory
-{
-public:
-
- virtual sal_Bool registerClass() = 0;
- virtual sal_Bool deregisterClass() = 0;
-};
-
-/*****************************************************************************
-
- class declaration ProviderOleWrapper_Impl
-
- Provides an UNO service provider as OLE class factory. Handle the
- OLE registration by overloading the abstract methods from
- IClassFactoryWrapper.
-
- Acts as a COM class factory. When IClassFactory::CreateInstance is being called
- then it creates an service by help of the XSingleServiceFactory member and maps
- maps it to a COM object.
-
-*****************************************************************************/
-
-class ProviderOleWrapper_Impl : public IClassFactoryWrapper
-{
-public:
-
- ProviderOleWrapper_Impl( const Reference<XMultiServiceFactory>& smgr,
- const Reference<XSingleServiceFactory>& xSFactory, GUID* pGuid);
- virtual ~ProviderOleWrapper_Impl();
-
- sal_Bool registerClass();
- sal_Bool deregisterClass();
-
- /* IUnknown methods */
- STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj);
- STDMETHOD_(ULONG, AddRef)();
- STDMETHOD_(ULONG, Release)();
-
- /* IClassFactory methods */
- STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
- STDMETHOD(LockServer)(int fLock);
-
-protected:
-
- oslInterlockedCount m_refCount;
- Reference<XSingleServiceFactory> m_xSingleServiceFactory;
- GUID m_guid;
- DWORD m_factoryHandle;
- Reference<XBridgeSupplier2> m_bridgeSupplier;
- Reference<XMultiServiceFactory> m_smgr;
-};
-
-/*****************************************************************************
-
- class declaration OneInstanceOleWrapper_Impl
-
- Provides an single UNO object as OLE object. Handle the
- OLE registration by overloading the abstract methods from
- IClassFactoryWrapper.
-
- Acts as a COM class factory. When IClassFactory::CreateInstance is being called
- then it maps the XInstance member it to a COM object.
-
-*****************************************************************************/
-
-class OneInstanceOleWrapper_Impl : public IClassFactoryWrapper
-{
-public:
-
- OneInstanceOleWrapper_Impl( const Reference<XMultiServiceFactory>& smgr, const Reference<XInterface>& xInst, GUID* pGuid, sal_Bool bAsApplication );
- virtual ~OneInstanceOleWrapper_Impl();
-
- sal_Bool registerClass();
- sal_Bool deregisterClass();
-
- /* IUnknown methods */
- STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj);
- STDMETHOD_(ULONG, AddRef)();
- STDMETHOD_(ULONG, Release)();
-
- /* IClassFactory methods */
- STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
- STDMETHOD(LockServer)(int fLock);
-
-protected:
-
- oslInterlockedCount m_refCount;
- Reference<XInterface> m_xInst;
- GUID m_guid;
- DWORD m_factoryHandle;
- Reference<XBridgeSupplier2> m_bridgeSupplier;
- Reference<XMultiServiceFactory> m_smgr;
- unsigned long m_nApplRegHandle;
- sal_Bool m_bAsApplication;
-};
-
-/*****************************************************************************
-
- class declaration OleConverter_Impl2
-
- Implementation of the UNO service com.sun.star.bridge.OleBridgeSupplier2.
-
-*****************************************************************************/
-
-// This class realizes the service com.sun.star.bridge.OleBridgeSupplier2 and
-// com.sun.star.bridge.OleBridgeSupplierVar1. The class implements XBridgeSupplier2
-// instead of XBridgeSuppplier as done by class OleConverter_Impl. The XBridgeSupplier2
-// interface does not need a Maschine Id in its createBridge function anymore,
-// If an UNO interface is to be converted then the member m_nUnoWrapperClass determines
-// what wrapper class is to be used. There are currently InterfaceOleWrapper_Impl and
-// UnoObjectWrapperRemoteOpt. The first is used for the OleBridgeSupplier2 and the
-// latter for OleBridgeSupplierVar1.
-// The m_nComWrapperClass specifies the class which is used as wrapper for COM interfaces.
-// Currently there is only one class available ( IUnknownWrapper_Impl).
-class OleConverter_Impl2 : public WeakImplHelper2<XBridgeSupplier2, XInitialization>,
- public UnoConversionUtilities<OleConverter_Impl2>
-{
-public:
- OleConverter_Impl2( const Reference<XMultiServiceFactory>& smgr);
- OleConverter_Impl2( const Reference<XMultiServiceFactory>& smgr, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass );
- virtual ~OleConverter_Impl2();
-
- // XBridgeSupplier2 ---------------------------------------------------
-
- virtual Any SAL_CALL createBridge(const Any& modelDepObject,
- const Sequence<sal_Int8>& ProcessId,
- sal_Int16 sourceModelType,
- sal_Int16 destModelType)
- throw (IllegalArgumentException, RuntimeException);
-
- // XInitialization
- virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException);
-
- // Abstract struct UnoConversionUtilities
- virtual Reference< XInterface > createUnoWrapperInstance();
- virtual Reference< XInterface > createComWrapperInstance();
-protected:
-
-};
-
-
-/*****************************************************************************
-
- class declaration OleClient_Impl
-
- Implementation of the UNO service com.sun.star.bridge.OleObjectFactory.
-
-*****************************************************************************/
-
-
-class OleClient_Impl : public WeakImplHelper1<XMultiServiceFactory>,
- public UnoConversionUtilities<OleClient_Impl>
-{
-public:
- OleClient_Impl( const Reference<XMultiServiceFactory>& smgr);
- ~OleClient_Impl();
-
- // XMultiServiceFactory
- virtual Reference<XInterface> SAL_CALL createInstance(const OUString& ServiceSpecifier) throw( Exception, RuntimeException);
- virtual Reference<XInterface> SAL_CALL createInstanceWithArguments(const OUString& ServiceSpecifier, const Sequence< Any >& Arguments) throw (Exception, RuntimeException);
- Sequence< OUString > SAL_CALL getAvailableServiceNames() throw (RuntimeException);
-
- // Abstract struct UnoConversionUtilities
- virtual Reference< XInterface > createUnoWrapperInstance();
- virtual Reference< XInterface > createComWrapperInstance();
-
-
- OUString getImplementationName();
-protected:
- Reference<XBridgeSupplier2> m_bridgeSupplier;
-};
-
-/*****************************************************************************
-
- class declaration OleServer_Impl
-
- Implementation of the UNO service com.sun.star.bridge.OleApplicationRegistration.
- Register the calling application as OLE automation server for
- standard OLE object. The objects will be registered while instanciating
- this implementation and deregistrated, if this implementation is destroyed.
-
-*****************************************************************************/
-
-class OleServer_Impl : public OWeakObject, XTypeProvider
-{
-public:
- OleServer_Impl( const Reference<XMultiServiceFactory> &smgr);
- ~OleServer_Impl();
-
- // XInterface
- virtual Any SAL_CALL queryInterface( const Type& aType ) throw(RuntimeException);
- virtual void SAL_CALL acquire( ) throw ();
- virtual void SAL_CALL release( ) throw ();
-
- // XTypeProvider
- virtual Sequence< Type > SAL_CALL getTypes( ) throw(RuntimeException);
- virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(RuntimeException);
-
-protected:
-
- sal_Bool provideService(const Reference<XSingleServiceFactory>& xMulFact, GUID* guid);
- sal_Bool provideInstance(const Reference<XInterface>& xInst, GUID* guid, sal_Bool bAsApplication );
-
- list< IClassFactoryWrapper* > m_wrapperList;
- Reference< XBridgeSupplier2 > m_bridgeSupplier;
-
- Reference<XMultiServiceFactory> m_smgr;
-};
-
-} // end namespace
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/servreg.cxx b/extensions/source/ole/servreg.cxx
deleted file mode 100644
index 5e49c5da8..000000000
--- a/extensions/source/ole/servreg.cxx
+++ /dev/null
@@ -1,128 +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 <rtl/unload.h>
-#include <osl/time.h>
-#include "ole2uno.hxx"
-#include "servprov.hxx"
-#include <rtl/ustring.hxx>
-#include <cppuhelper/factory.hxx>
-using namespace ole_adapter;
-using namespace cppu;
-
-using ::rtl::OUString;
-
-namespace ole_adapter
-{
-rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT;
-
-
-
-Reference<XInterface> SAL_CALL ConverterProvider_CreateInstance2( const Reference<XMultiServiceFactory> & xSMgr)
- throw(Exception)
-{
- Reference<XInterface> xService = *new OleConverter_Impl2( xSMgr);
- return xService;
-}
-
-Reference<XInterface> SAL_CALL ConverterProvider_CreateInstanceVar1( const Reference<XMultiServiceFactory> & xSMgr)
- throw(Exception)
-{
- Reference<XInterface> xService = *new OleConverter_Impl2( xSMgr, UNO_OBJECT_WRAPPER_REMOTE_OPT, IUNKNOWN_WRAPPER_IMPL);
- return xService;
-}
-
-Reference<XInterface> SAL_CALL OleClient_CreateInstance( const Reference<XMultiServiceFactory> & xSMgr)
- throw(Exception)
-{
- Reference<XInterface> xService = *new OleClient_Impl( xSMgr);
- return xService;
-}
-
-Reference<XInterface> SAL_CALL OleServer_CreateInstance( const Reference<XMultiServiceFactory> & xSMgr)
- throw (Exception)
-{
- Reference<XInterface > xService = *new OleServer_Impl(xSMgr);
- return xService;
-}
-} // end namespace
-
-extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
- const sal_Char * pImplName, void * pServiceManager, void * /*pRegistryKey*/ )
-{
- void * pRet = 0;
-
- OUString aImplName( OUString::createFromAscii( pImplName ) );
- Reference< XSingleServiceFactory > xFactory;
- Sequence<OUString> seqServiceNames;
- if (pServiceManager && aImplName.equals( reinterpret_cast<const sal_Unicode*>(L"com.sun.star.comp.ole.OleConverter2") ))
- {
- xFactory= createSingleFactory( reinterpret_cast< XMultiServiceFactory*>(pServiceManager),
- OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.ole.OleConverter2")),
- ConverterProvider_CreateInstance2, seqServiceNames,
- &globalModuleCount.modCnt );
- }
- else if (pServiceManager && aImplName.equals( reinterpret_cast<const sal_Unicode*>(L"com.sun.star.comp.ole.OleConverterVar1") ))
- {
- xFactory= createSingleFactory( reinterpret_cast<XMultiServiceFactory*>(pServiceManager),
- OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.ole.OleConverterVar1")),
- ConverterProvider_CreateInstanceVar1, seqServiceNames,
- &globalModuleCount.modCnt );
- }
- else if(pServiceManager && aImplName.equals(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.comp.ole.OleClient")))
- {
- xFactory= createSingleFactory( reinterpret_cast< XMultiServiceFactory*>(pServiceManager),
- OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.ole.OleClient")),
- OleClient_CreateInstance, seqServiceNames,
- &globalModuleCount.modCnt);
- }
- else if(pServiceManager && aImplName.equals(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.comp.ole.OleServer")))
- {
- xFactory= createOneInstanceFactory( reinterpret_cast< XMultiServiceFactory*>(pServiceManager),
- OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.ole.OleServer")),
- OleServer_CreateInstance, seqServiceNames,
- &globalModuleCount.modCnt);
- }
-
- if (xFactory.is())
- {
- xFactory->acquire();
- pRet = xFactory.get();
- }
-
- return pRet;
-}
-
-extern "C" sal_Bool component_canUnload( TimeValue* libUnused)
-{
- return globalModuleCount.canUnload( &globalModuleCount, libUnused);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/unoconversionutilities.hxx b/extensions/source/ole/unoconversionutilities.hxx
deleted file mode 100644
index 328fec41e..000000000
--- a/extensions/source/ole/unoconversionutilities.hxx
+++ /dev/null
@@ -1,2445 +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.
- *
- ************************************************************************/
-#ifndef _UNO_CONVERSION_UTILITIES
-#define _UNO_CONVERSION_UTILITIES
-
-#include "boost/scoped_array.hpp"
-#include "com/sun/star/script/XInvocationAdapterFactory.hpp"
-#include "com/sun/star/script/XInvocationAdapterFactory2.hpp"
-#include "com/sun/star/script/XTypeConverter.hpp"
-#include "com/sun/star/script/FailReason.hpp"
-#include "com/sun/star/bridge/oleautomation/Date.hpp"
-#include "com/sun/star/bridge/oleautomation/Currency.hpp"
-#include "com/sun/star/bridge/oleautomation/SCode.hpp"
-#include "com/sun/star/bridge/oleautomation/Decimal.hpp"
-#include "typelib/typedescription.hxx"
-#include "ole2uno.hxx"
-
-#include "unotypewrapper.hxx"
-#include <boost/unordered_map.hpp>
-
-// for some reason DECIMAL_NEG (wtypes.h) which contains BYTE is not resolved.
-typedef unsigned char BYTE;
-// classes for wrapping uno objects
-#define INTERFACE_OLE_WRAPPER_IMPL 1
-#define UNO_OBJECT_WRAPPER_REMOTE_OPT 2
-
-#define INVOCATION_SERVICE reinterpret_cast<const sal_Unicode*>(L"com.sun.star.script.Invocation")
-
-
-// classes for wrapping ole objects
-#define IUNKNOWN_WRAPPER_IMPL 1
-
-#define INTERFACE_ADAPTER_FACTORY reinterpret_cast<const sal_Unicode*>(L"com.sun.star.script.InvocationAdapterFactory")
-// COM or JScript objects implementing UNO interfaces have to implement this property
-#define SUPPORTED_INTERFACES_PROP L"_implementedInterfaces"
-// Second property without leading underscore for use in VB
-#define SUPPORTED_INTERFACES_PROP2 L"Bridge_ImplementedInterfaces"
-
-using namespace com::sun::star::script;
-using namespace com::sun::star::beans;
-using namespace com::sun::star::uno;
-#ifdef __MINGW32__
-using namespace com::sun::star::bridge;
-using namespace com::sun::star::bridge::ModelDependent;
-#endif
-using namespace com::sun::star::bridge::oleautomation;
-using namespace boost;
-namespace ole_adapter
-{
-extern boost::unordered_map<sal_uInt32, sal_uInt32> AdapterToWrapperMap;
-extern boost::unordered_map<sal_uInt32, sal_uInt32> WrapperToAdapterMap;
-typedef boost::unordered_map<sal_uInt32, sal_uInt32>::iterator IT_Wrap;
-typedef boost::unordered_map<sal_uInt32, sal_uInt32>::iterator CIT_Wrap;
-//Maps IUnknown pointers to a weak reference of the respective wrapper class (e.g.
-// IUnknownWrapperImpl. It is the responsibility of the wrapper to remove the entry when
-// it is being destroyed.
-// Used to ensure that an Automation object is always mapped to the same UNO objects.
-extern boost::unordered_map<sal_uInt32, WeakReference<XInterface> > ComPtrToWrapperMap;
-typedef boost::unordered_map<sal_uInt32, WeakReference<XInterface> >::iterator IT_Com;
-typedef boost::unordered_map<sal_uInt32, WeakReference<XInterface> >::const_iterator CIT_Com;
-
-// Maps XInterface pointers to a weak reference of its wrapper class (i.e.
-// InterfaceOleWrapper_Impl). It is the responsibility of the wrapper to remove the entry when
-// it is being destroyed. It is used to ensure the identity of objects. That is, an UNO interface
-// is mapped to IDispatch which is kept alive in the COM environment. If the same
-// UNO interface is mapped again to COM then the IDispach of the first mapped instance
-// must be returned.
-extern boost::unordered_map<sal_uInt32, WeakReference<XInterface> > UnoObjToWrapperMap;
-typedef boost::unordered_map<sal_uInt32, WeakReference<XInterface> >::iterator IT_Uno;
-typedef boost::unordered_map<sal_uInt32, WeakReference<XInterface> >::const_iterator CIT_Uno;
-#ifdef __MINGW32__
-inline void reduceRange( Any& any);
-#endif
-
-
-
-
-// createUnoObjectWrapper gets a wrapper instance by calling createUnoWrapperInstance
- // and initializes it via XInitialization. The wrapper object is required to implement
- // XBridgeSupplier so that it can convert itself to IDispatch.
- // class T: Deriving class ( must implement XInterface )
-/** All methods are allowed to throw at least a BridgeRuntimeError.
- */
-template< class >
-class UnoConversionUtilities
-{
-public:
- UnoConversionUtilities( const Reference<XMultiServiceFactory> & smgr):
- m_nUnoWrapperClass( INTERFACE_OLE_WRAPPER_IMPL),
- m_nComWrapperClass( IUNKNOWN_WRAPPER_IMPL),
- m_smgr( smgr)
- {}
-
- UnoConversionUtilities( const Reference<XMultiServiceFactory> & xFactory, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass )
- : m_smgr( xFactory), m_nComWrapperClass( comWrapperClass), m_nUnoWrapperClass( unoWrapperClass)
- {}
-
- virtual ~UnoConversionUtilities() {}
- /** converts only into oleautomation types, that is there is no VT_I1, VT_UI2, VT_UI4
- a sal_Unicode character is converted into a BSTR.
- @exception com.sun.star.lang.IllegalArgumentException
- If the any was inappropriate for conversion.
- @exception com.sun.star.script.CannotConvertException
- The any contains a type class for which no conversion is provided.
- */
- void anyToVariant(VARIANT* pVariant, const Any& rAny);
- void anyToVariant(VARIANT* pVariant, const Any& rAny, VARTYPE type);
-
- /** @exception com.sun.star.lang.IllegalArgumentException
- If rSeq does not contain a sequence then the exception is thrown.
- */
- SAFEARRAY* createUnoSequenceWrapper(const Any& rSeq);
- /** @exception com.sun.star.lang.IllegalArgumentException
- If rSeq does not contain a sequence or elemtype has no proper value
- then the exception is thrown.
- */
- SAFEARRAY* createUnoSequenceWrapper(const Any& rSeq, VARTYPE elemtype);
- /**
- @exception com.sun.star.lang.IllegalArgumentException
- If rObj does not contain a struct or interface
- */
- void createUnoObjectWrapper(const Any & rObj, VARIANT * pVar);
- /** @exception CannotConvertException
- Thrown if the VARIANT contains a type that cannot be coerced in the expected Any.
- ArgumentIndex is 0.
- @IllegalArgumentException
- Thrown if the VARIANT is inappropriate for conversion. ArgumentPosition is -1,
- */
- void variantToAny(const VARIANT* pVariant, Any& rAny, sal_Bool bReduceValueRange = sal_True);
- /** This method converts variants arguments in calls from COM -> UNO. Only then
- the expected UNO type is known.
- @exception CannotConvertException
- Thrown if the VARIANT contains a type that cannot be coerced in the expected Any.
- ArgumentIndex is 0.
- @IllegalArgumentException
- Thrown if the VARIANT is inappropriate for conversion. ArgumentPosition is -1,
- */
- void variantToAny( const VARIANTARG* pArg, Any& rAny, const Type& ptype, sal_Bool bReduceValueRange = sal_True);
-
- /**
- @exception IllegalArgumentException
- -if pVar does not contain VT_UNKNOWN or VT_DISPATCH or
- pVar is used for a particular UNO type which is not supported by pVar
- */
- Any createOleObjectWrapper(VARIANT* pVar, const Type& aType= Type());
-
- /*
- Return true means var contained a ValueObject, and it was successfully converted.
- The result is in any. It an error occurred a BridgeRuntimeError will be thrown.
- */
- bool convertValueObject( const VARIANTARG *var, Any& any);
- void dispatchExObject2Sequence( const VARIANTARG* pvar, Any& anySeq, const Type& type);
-
- Sequence<Any> createOleArrayWrapperOfDim(SAFEARRAY* pArray, unsigned int dimCount, unsigned int actDim, long* index,
- VARTYPE type, const Type& unotype);
- Sequence<Any> createOleArrayWrapper(SAFEARRAY* pArray, VARTYPE type, const Type& unotype= Type());
-
-
- VARTYPE mapTypeClassToVartype( TypeClass type);
- Reference< XSingleServiceFactory > getInvocationFactory(const Any& anyObject);
-
-
- virtual Reference< XInterface > createUnoWrapperInstance()=0;
- virtual Reference< XInterface > createComWrapperInstance()=0;
-
- static sal_Bool isJScriptArray(const VARIANT* pvar);
-
- Sequence<Type> getImplementedInterfaces(IUnknown* pUnk);
-
-protected:
- Reference<XInterface> createAdapter(const Sequence<Type>& types, const Reference<XInterface>& receiver);
-
- // helper function for Sequence conversion
- void getElementCountAndTypeOfSequence( const Any& rSeq, sal_Int32 dim, Sequence< sal_Int32 >& seqElementCounts, TypeDescription& typeDesc);
- // helper function for Sequence conversion
- sal_Bool incrementMultidimensionalIndex(sal_Int32 dimensions, const sal_Int32 * parDimensionLength,
- sal_Int32 * parMultidimensionalIndex);
- // helper function for Sequence conversion
- size_t getOleElementSize( VARTYPE type);
-
- Type getElementTypeOfSequence( const Type& seqType);
-
- //Provides a typeconverter
- Reference<XTypeConverter> getTypeConverter();
-
- // This member determines what class is used to convert a UNO object
- // or struct to a COM object. It is passed along to the o2u_anyToVariant
- // function in the createBridge function implementation
- sal_uInt8 m_nUnoWrapperClass;
- sal_uInt8 m_nComWrapperClass;
-
- // The servicemanager is either a local smgr or remote when the service
- // com.sun.star.bridge.OleBridgeSupplierVar1 is used. This service can be
- // created by createInstanceWithArguments where one can supply a service
- // manager that is to be used.
- // Local service manager as supplied by the loader when the creator function
- // of the service is being called.
- Reference<XMultiServiceFactory> m_smgr;
- // An explicitly supplied service manager when the service
- // com.sun.star.bridge.OleBridgeSupplierVar1 is used. That can be a remote
- // manager.
- Reference<XMultiServiceFactory> m_smgrRemote;
- Reference<XSingleServiceFactory> m_xInvocationFactoryLocal;
- Reference<XSingleServiceFactory> m_xInvocationFactoryRemote;
-
-private:
- // Holds the type converter which is used for sequence conversion etc.
- // Use the getTypeConverter function to obtain the interface.
- Reference<XTypeConverter> m_typeConverter;
-
-
-};
-
-// ask the object for XBridgeSupplier2 and on success bridges
-// the uno object to IUnknown or IDispatch.
-// return true the UNO object supports
-template < class T >
-bool convertSelfToCom( T& unoInterface, VARIANT * pVar)
-{
- bool ret = false;
- Reference< XInterface > xInt( unoInterface, UNO_QUERY);
- if( xInt.is())
- {
- Reference< XBridgeSupplier2 > xSupplier( xInt, UNO_QUERY);
- if( xSupplier.is())
- {
- sal_Int8 arId[16];
- rtl_getGlobalProcessId( (sal_uInt8*)arId);
- Sequence<sal_Int8> seqId( arId, 16);
- Any anySource;
- anySource <<= xInt;
- Any anyDisp= xSupplier->createBridge( anySource, seqId, UNO, OLE);
- if( anyDisp.getValueTypeClass() == TypeClass_UNSIGNED_LONG)
- {
- VARIANT* pvariant= *(VARIANT**)anyDisp.getValue();
- HRESULT hr;
- if (FAILED(hr = VariantCopy(pVar, pvariant)))
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] convertSelfToCom\n"
- "VariantCopy failed! Error: ") +
- OUString::valueOf(hr));
- VariantClear( pvariant);
- CoTaskMemFree( pvariant);
- ret = true;
- }
- }
- }
- return ret;
-}
-
-
-
-// Gets the invocation factory depending on the Type in the Any.
-// The factory can be created by a local or remote multi service factory.
-// In case there is a remote multi service factory available there are
-// some services or types for which the local factory is used. The exceptions
-// are: all structs.
-// Param anyObject - contains the object ( interface, struct) for what we need an invocation object.
-//
-template<class T>
-Reference< XSingleServiceFactory > UnoConversionUtilities<T>::getInvocationFactory(const Any& anyObject)
-{
- Reference< XSingleServiceFactory > retVal;
- MutexGuard guard( getBridgeMutex());
- if( anyObject.getValueTypeClass() != TypeClass_STRUCT &&
- m_smgrRemote.is() )
- {
- if( ! m_xInvocationFactoryRemote.is() )
- m_xInvocationFactoryRemote= Reference<XSingleServiceFactory>(
- m_smgrRemote->createInstance( INVOCATION_SERVICE), UNO_QUERY);
- retVal= m_xInvocationFactoryRemote;
- }
- else
- {
- if( ! m_xInvocationFactoryLocal.is() )
- m_xInvocationFactoryLocal= Reference<XSingleServiceFactory>(
- m_smgr->createInstance(INVOCATION_SERVICE ), UNO_QUERY);
- retVal= m_xInvocationFactoryLocal;
- }
- return retVal;
-}
-
-template<class T>
-void UnoConversionUtilities<T>::variantToAny( const VARIANTARG* pArg, Any& rAny, const Type& ptype, sal_Bool bReduceValueRange /* = sal_True */)
-{
- try
- {
- HRESULT hr;
- bool bFail = false;
- bool bCannotConvert = false;
- CComVariant var;
-
- // There is no need to support indirect values, since they're not supported by UNO
- if( FAILED(hr= VariantCopyInd( &var, const_cast<VARIANTARG*>(pArg)))) // remove VT_BYREF
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] UnoConversionUtilities<T>::variantToAny \n"
- "VariantCopyInd failed for reason : ") + OUString::valueOf(hr));
- bool bHandled = convertValueObject( & var, rAny);
- if( bHandled)
- OSL_ENSURE( rAny.getValueType() == ptype, "type in Value Object must match the type parameter");
-
- if( ! bHandled)
- {
- // convert into a variant type that is the equivalent to the type
- // the sequence expects. Thus variantToAny produces the correct type
- // E.g. An Array object contains VT_I4 and the sequence expects shorts
- // than the vartype must be changed. The reason is, you can't specify the
- // type in JavaScript and the script engine determines the type beeing used.
- switch( ptype.getTypeClass())
- {
- case TypeClass_CHAR: // could be: new Array( 12, 'w', "w")
- if( var.vt == VT_BSTR)
- {
- if(SUCCEEDED( hr= VariantChangeType( &var, &var, 0, VT_BSTR)))
- rAny.setValue( (void*)V_BSTR( &var), ptype);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- }
- else
- {
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_I2)))
- rAny.setValue((void*) & var.iVal, ptype);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- }
- break;
- case TypeClass_INTERFACE: // could also be an IUnknown
- case TypeClass_STRUCT:
- {
- rAny = createOleObjectWrapper( & var, ptype);
- break;
- }
- case TypeClass_ENUM:
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_I4)))
- rAny.setValue((void*) & var.lVal, ptype);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_SEQUENCE:
- // There are different ways of receiving a sequence:
- // 1: JScript, VARTYPE: VT_DISPATCH
- // 2. VBScript simple arraysVT_VARIANT|VT_BYREF the referenced VARIANT contains
- // a VT_ARRAY| <type>
- // 3. VBSrcript multi dimensional arrays: VT_ARRAY|VT_BYREF
- if( pArg->vt == VT_DISPATCH)
- {
- dispatchExObject2Sequence( pArg, rAny, ptype);
- }
- else
- {
- if ((var.vt & VT_ARRAY) != 0)
- {
- VARTYPE oleType = ::sal::static_int_cast< VARTYPE, int >( var.vt ^ VT_ARRAY );
- Sequence<Any> unoSeq = createOleArrayWrapper( var.parray, oleType, ptype);
- Reference<XTypeConverter> conv = getTypeConverter();
- if (conv.is())
- {
- try
- {
- Any anySeq = makeAny(unoSeq);
- Any convAny = conv->convertTo(anySeq, ptype);
- rAny = convAny;
- }
- catch (IllegalArgumentException& e)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]com.sun.star.lang.IllegalArgumentException "
- "in UnoConversionUtilities<T>::variantToAny! Message: ") +
- e.Message);
- }
- catch (CannotConvertException& e)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]com.sun.star.script.CannotConvertException "
- "in UnoConversionUtilities<T>::variantToAny! Message: ") +
- e.Message);
- }
- }
- }
- }
- break;
- case TypeClass_VOID:
- rAny.setValue(NULL,Type());
- break;
- case TypeClass_ANY: // Any
- // There could be a JScript Array that needs special handling
- // If an Any is expected and this Any must contain a Sequence
- // then we cannot figure out what element type is required.
- // Therefore we convert to Sequence< Any >
- if( pArg->vt == VT_DISPATCH && isJScriptArray( pArg))
- {
- dispatchExObject2Sequence( pArg, rAny,
- getCppuType((Sequence<Any>*) 0));
- }
- else if (pArg->vt == VT_DECIMAL)
- {
- //Decimal maps to hyper in calls from COM -> UNO
- // It does not matter if we create a sal_uInt64 or sal_Int64,
- // because the UNO object is called through invocation which
- //will do a type conversion if necessary
- if (var.decVal.sign == 0)
- {
- // positive value
- variantToAny( & var, rAny, getCppuType( (sal_uInt64*) 0),
- bReduceValueRange);
- }
- else
- {
- //negative value
- variantToAny( & var, rAny, getCppuType( (sal_Int64*) 0),
- bReduceValueRange);
- }
- }
- else
- {
- variantToAny( & var, rAny);
- }
- break;
- case TypeClass_BOOLEAN: // VARIANT could be VARIANT_BOOL or other
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_BOOL)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_STRING: // UString
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_BSTR)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_FLOAT: // float
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_R4)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_DOUBLE: // double
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_R8)))
- variantToAny(& var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_BYTE: // BYTE
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_I1)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_SHORT: // INT16
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_I2)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_LONG:
- if(SUCCEEDED(hr = VariantChangeType(& var, &var, 0, VT_I4)))
- variantToAny( & var, rAny, bReduceValueRange);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_HYPER:
- if(SUCCEEDED(hr = VariantChangeType(& var, &var, 0, VT_DECIMAL)))
- {
- if (var.decVal.Lo64 > SAL_CONST_UINT64(0x8000000000000000)
- || var.decVal.Hi32 > 0
- || var.decVal.scale > 0)
- {
- bFail = true;
- break;
- }
- sal_Int64 value = var.decVal.Lo64;
- if (var.decVal.sign == DECIMAL_NEG)
- value |= SAL_CONST_UINT64(0x8000000000000000);
- rAny <<= value;
- }
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_UNSIGNED_SHORT: // UINT16
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_UI2)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_UNSIGNED_LONG:
- if(SUCCEEDED(hr = VariantChangeType( & var, &var, 0, VT_UI4)))
- variantToAny( & var, rAny, bReduceValueRange);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_UNSIGNED_HYPER:
- if(SUCCEEDED(hr = VariantChangeType(& var, &var, 0, VT_DECIMAL)))
- {
- if (var.decVal.Hi32 > 0 || var.decVal.scale > 0)
- {
- bFail = true;
- break;
- }
- rAny <<= var.decVal.Lo64;
- }
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- case TypeClass_TYPE:
- if(SUCCEEDED(hr = VariantChangeType(& var, &var, 0, VT_UNKNOWN)))
- variantToAny( & var, rAny);
- else if (hr == DISP_E_TYPEMISMATCH)
- bCannotConvert = true;
- else
- bFail = true;
- break;
- default:
- bCannotConvert = true;
- break;
- }
- }
- if (bCannotConvert)
- throw CannotConvertException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::variantToAny \n"
- "Cannot convert the value of vartype :\"") +
- OUString::valueOf((sal_Int32) var.vt) +
- OUSTR("\" to the expected UNO type of type class: ") +
- OUString::valueOf((sal_Int32) ptype.getTypeClass()),
- 0, TypeClass_UNKNOWN, FailReason::TYPE_NOT_SUPPORTED,0);
-
- if (bFail)
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>:variantToAny\n"
- "The provided VARIANT of type\" ") + OUString::valueOf((sal_Int32) var.vt) +
- OUSTR("\" is unappropriate for conversion!"), Reference<XInterface>(), -1);
- }
- catch (CannotConvertException &)
- {
- throw;
- }
- catch (IllegalArgumentException &)
- {
- throw;
- }
- catch (BridgeRuntimeError &)
- {
- throw;
- }
- catch (Exception & e)
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::variantToAny ! Message : \n") +
- e.Message);
- }
- catch(...)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::variantToAny !"));
- }
-}
-
-// The function only converts Sequences to SAFEARRAYS with elements of the type
-// specified by the parameter type. Everything else is forwarded to
-// anyToVariant(VARIANT* pVariant, const Any& rAny)
-// Param type must not be VT_BYREF
-template<class T>
-void UnoConversionUtilities<T>::anyToVariant(VARIANT* pVariant, const Any& rAny, VARTYPE type)
-{
- try
- {
- HRESULT hr= S_OK;
-
- OSL_ASSERT( (type & VT_BYREF) == 0);
- if (type & VT_ARRAY)
- {
- type ^= VT_ARRAY;
- SAFEARRAY* ar= createUnoSequenceWrapper( rAny, type);
- if( ar)
- {
- VariantClear( pVariant);
- pVariant->vt= ::sal::static_int_cast< VARTYPE, int >( VT_ARRAY | type );
- pVariant->byref= ar;
- }
- }
- else if(type == VT_VARIANT)
- {
- anyToVariant(pVariant, rAny);
- }
- else
- {
- CComVariant var;
- anyToVariant( &var, rAny);
- if(FAILED(hr = VariantChangeType(&var, &var, 0, type)))
- {
- if (hr == DISP_E_TYPEMISMATCH)
- throw CannotConvertException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "Cannot convert the value of type :\"") +
- rAny.getValueTypeName() +
- OUSTR("\" to the expected Automation type of VARTYPE: ") +
- OUString::valueOf((sal_Int32)type),
- 0, TypeClass_UNKNOWN, FailReason::TYPE_NOT_SUPPORTED,0);
-
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "Conversion of any with ") +
- rAny.getValueType().getTypeName() +
- OUSTR(" to VARIANT with type: ") + OUString::valueOf((sal_Int32) type) +
- OUSTR(" failed! Error code: ") + OUString::valueOf(hr));
-
- }
- if(FAILED(hr = VariantCopy(pVariant, &var)))
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "VariantCopy failed for reason: ") + OUString::valueOf(hr));
- }
- }
- }
- catch (IllegalArgumentException &)
- {
- throw;
- }
- catch (CannotConvertException & )
- {
- throw;
- }
- catch (BridgeRuntimeError&)
- {
- throw;
- }
- catch(Exception & e)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "Unexpected exception occurred. Message: ") + e.Message);
- }
- catch(...)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "Unexpected exception occurred."));
- }
-}
-
-template<class T>
-void UnoConversionUtilities<T>::anyToVariant(VARIANT* pVariant, const Any& rAny)
-{
- bool bIllegal = false;
- try
- {
- switch (rAny.getValueTypeClass())
- {
- case TypeClass_INTERFACE:
- {
- Reference<XInterface> xInt;
- if (rAny >>= xInt)
- {
- createUnoObjectWrapper(rAny, pVariant);
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_STRUCT:
- {
- if (rAny.getValueType() == getCppuType((Date*)0))
- {
- Date d;
- if (rAny >>= d)
- {
- pVariant->vt = VT_DATE;
- pVariant->date = d.Value;
- }
- else
- {
- bIllegal = true;
- }
- }
- else if(rAny.getValueType() == getCppuType((Decimal*)0))
- {
- Decimal d;
- if (rAny >>= d)
- {
- pVariant->vt = VT_DECIMAL;
- pVariant->decVal.scale = d.Scale;
- pVariant->decVal.sign = d.Sign;
- pVariant->decVal.Lo32 = d.LowValue;
- pVariant->decVal.Mid32 = d.MiddleValue;
- pVariant->decVal.Hi32 = d.HighValue;
- }
- else
- {
- bIllegal = true;
- }
- }
- else if (rAny.getValueType() == getCppuType((Currency*)0))
- {
- Currency c;
- if (rAny >>= c)
- {
- pVariant->vt = VT_CY;
- pVariant->cyVal.int64 = c.Value;
- }
- else
- {
- bIllegal = true;
- }
- }
- else if(rAny.getValueType() == getCppuType((SCode*)0))
- {
- SCode s;
- if (rAny >>= s)
- {
- pVariant->vt = VT_ERROR;
- pVariant->scode = s.Value;
- }
- else
- {
- bIllegal = true;
- }
- }
- else
- {
- createUnoObjectWrapper(rAny, pVariant);
- }
- break;
- }
- case TypeClass_SEQUENCE: // sequence ??? SafeArray descriptor
- {
- SAFEARRAY* pArray = createUnoSequenceWrapper(rAny);
- if (pArray)
- {
- V_VT(pVariant) = VT_ARRAY | VT_VARIANT;
- V_ARRAY(pVariant) = pArray;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_VOID:
- {
- HRESULT hr = S_OK;
- if (FAILED(hr = VariantClear(pVariant)))
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant\n"
- "VariantClear failed with error:") + OUString::valueOf(hr));
- }
- break;
- }
- case TypeClass_BOOLEAN:
- {
- sal_Bool value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_BOOL;
- pVariant->boolVal = value == sal_True? VARIANT_TRUE: VARIANT_FALSE;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_CHAR:
- {
- // Because VT_UI2 does not conform to oleautomation we convert into VT_I2 instead
- sal_uInt16 value = *(sal_Unicode*) rAny.getValue();
- pVariant->vt = VT_I2;
- pVariant->iVal = value;
- break;
- }
- case TypeClass_STRING:
- {
- OUString value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_BSTR;
- pVariant->bstrVal = SysAllocString(reinterpret_cast<LPCOLESTR>(value.getStr()));
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_FLOAT:
- {
- float value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_R4;
- pVariant->fltVal = value;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_DOUBLE:
- {
- double value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_R8;
- pVariant->dblVal = value;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_BYTE:
- {
- // ole automation does not know a signed char but only unsigned char
- sal_Int8 value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_UI1;
- pVariant->bVal = value;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_SHORT: // INT16
- case TypeClass_UNSIGNED_SHORT: // UINT16
- {
- sal_Int16 value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_I2;
- pVariant->iVal = value;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_ENUM:
- {
- sal_Int32 value = *(sal_Int32*) rAny.getValue();
- pVariant->vt = VT_I4;
- pVariant->lVal= value;
- break;
- }
- case TypeClass_LONG:
- case TypeClass_UNSIGNED_LONG:
- {
- sal_Int32 value;
- if (rAny >>= value)
- {
- pVariant->vt = VT_I4;
- pVariant->lVal= value;
- }
- else
- {
- bIllegal = true;
- }
- break;
- }
- case TypeClass_HYPER:
- {
-
- pVariant->vt = VT_DECIMAL;
- pVariant->decVal.scale = 0;
- pVariant->decVal.sign = 0;
- pVariant->decVal.Hi32 = 0;
-
- sal_Int64 value;
- rAny >>= value;
-
- if (value & SAL_CONST_UINT64(0x8000000000000000))
- pVariant->decVal.sign = DECIMAL_NEG;
-
- pVariant->decVal.Lo64 = value;
- break;
- }
- case TypeClass_UNSIGNED_HYPER:
- {
- pVariant->vt = VT_DECIMAL;
- pVariant->decVal.scale = 0;
- pVariant->decVal.sign = 0;
- pVariant->decVal.Hi32 = 0;
-
- sal_uInt64 value;
- rAny >>= value;
- pVariant->decVal.Lo64 = value;
- break;
- }
- case TypeClass_TYPE:
- {
- Type type;
- rAny >>= type;
- CComVariant var;
- if (createUnoTypeWrapper(type.getTypeName(), & var) == false)
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] UnoConversionUtilities<T>::anyToVariant \n"
- "Error during conversion of UNO type to Automation object!"));
-
- if (FAILED(VariantCopy(pVariant, &var)))
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] UnoConversionUtilities<T>::anyToVariant \n"
- "Unexpected error!"));
- break;
- }
- default:
- //TypeClass_SERVICE:
- //TypeClass_EXCEPTION:
- //When a InvocationTargetException is thrown when calling XInvocation::invoke
- //on a UNO object, then the target exception is directly used to create a
- //EXEPINFO structure
- //TypeClass_TYPEDEF
- //TypeClass_ANY:
- //TypeClass_UNKNOWN:
- //TypeClass_UNSIGNED_OCTET:
- // TypeClass_UNION:
- // TypeClass_ARRAY:
- // TypeClass_UNSIGNED_INT:
- // TypeClass_UNSIGNED_BYTE:
- // TypeClass_MODULE:
- throw CannotConvertException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant\n"
- "There is no conversion for this UNO type to a Automation type."
- "The destination type class is the type class of the UNO "
- "argument which was to be converted."),
- Reference<XInterface>(), rAny.getValueTypeClass(),
- FailReason::TYPE_NOT_SUPPORTED, 0);
-
- break;
- }
- if (bIllegal)
- {
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant\n"
- "The provided any of type\" ") + rAny.getValueType().getTypeName() +
- OUSTR("\" is unappropriate for conversion!"), Reference<XInterface>(), -1);
-
- }
- }
- catch (CannotConvertException & )
- {
- throw;
- }
- catch (IllegalArgumentException & )
- {
- throw;
- }
- catch(BridgeRuntimeError&)
- {
- throw;
- }
- catch(Exception & e)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "Unexpected exception occurred. Message: ") + e.Message);
- }
- catch(...)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::anyToVariant \n"
- "Unexpected exception occurred. ") );
- }
-}
-
-// Creates an SAFEARRAY of the specified element and if necessary
-// creates a SAFEARRAY whith multiple dimensions.
-// Used by sal_Bool anyToVariant(VARIANT* pVariant, const Any& rAny, VARTYPE type);
-template<class T>
-SAFEARRAY* UnoConversionUtilities<T>::createUnoSequenceWrapper(const Any& rSeq, VARTYPE elemtype)
-{
- if (rSeq.getValueTypeClass() != TypeClass_SEQUENCE)
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createUnoSequenceWrapper \n"
- "The any does not contain a sequence!"), 0, 0);
- if (elemtype == VT_NULL || elemtype == VT_EMPTY)
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createUnoSequenceWrapper \n"
- "No element type supplied!"),0, -1);
- SAFEARRAY* pArray= NULL;
- // Get the dimensions. This is done by examining the type name string
- // The count of brackets determines the dimensions.
- OUString sTypeName= rSeq.getValueType().getTypeName();
- sal_Int32 dims=0;
- for(sal_Int32 lastIndex=0;(lastIndex= sTypeName.indexOf( L'[', lastIndex)) != -1; lastIndex++,dims++);
-
- //get the maximum number of elements per dimensions and the typedescription of the elements
- Sequence<sal_Int32> seqElementCounts( dims);
- TypeDescription elementTypeDesc;
- getElementCountAndTypeOfSequence( rSeq, 1, seqElementCounts, elementTypeDesc );
-
- if( elementTypeDesc.is() )
- {
- // set up the SAFEARRAY
- scoped_array<SAFEARRAYBOUND> sarSafeArrayBound(new SAFEARRAYBOUND[dims]);
- SAFEARRAYBOUND* prgsabound= sarSafeArrayBound.get();
- for( sal_Int32 i=0; i < dims; i++)
- {
- //prgsabound[0] is the right most dimension
- prgsabound[dims - i - 1].lLbound = 0;
- prgsabound[dims - i - 1].cElements = seqElementCounts[i];
- }
-
- typelib_TypeDescription* rawTypeDesc= elementTypeDesc.get();
- sal_Int32 elementSize= rawTypeDesc->nSize;
- size_t oleElementSize= getOleElementSize( elemtype);
- // SafeArrayCreate clears the memory for the data itself.
- pArray = SafeArrayCreate(elemtype, dims, prgsabound);
-
- // convert the Sequence's elements and populate the SAFEARRAY
- if( pArray)
- {
- // Iterate over every Sequence that contains the actual elements
- void* pSAData;
- if( SUCCEEDED( SafeArrayAccessData( pArray, &pSAData)))
- {
- const sal_Int32* parElementCount= seqElementCounts.getConstArray();
- uno_Sequence * pMultiSeq= *(uno_Sequence* const*) rSeq.getValue();
- sal_Int32 dimsSeq= dims - 1;
-
- // arDimSeqIndizes contains the current index of a block of data.
- // E.g. Sequence<Sequence<sal_Int32>> , the index would refer to Sequence<sal_Int32>
- // In this case arDimSeqIndices would have the size 1. That is the elements are not counted
- // but the Sequences that contain those elements.
- // The indices ar 0 based
- scoped_array<sal_Int32> sarDimsSeqIndices;
- sal_Int32* arDimsSeqIndices= NULL;
- if( dimsSeq > 0)
- {
- sarDimsSeqIndices.reset(new sal_Int32[dimsSeq]);
- arDimsSeqIndices = sarDimsSeqIndices.get();
- memset( arDimsSeqIndices, 0, sizeof( sal_Int32 ) * dimsSeq);
- }
-
- char* psaCurrentData= (char*)pSAData;
-
- do
- {
- // Get the Sequence at the current index , see arDimsSeqIndices
- uno_Sequence * pCurrentSeq= pMultiSeq;
- sal_Int32 curDim=1; // 1 based
- sal_Bool skipSeq= sal_False;
- while( curDim <= dimsSeq )
- {
- // get the Sequence at the index if valid
- if( pCurrentSeq->nElements > arDimsSeqIndices[ curDim - 1] ) // don't point to Nirvana
- {
- // size of Sequence is 4
- sal_Int32 offset= arDimsSeqIndices[ curDim - 1] * 4;
- pCurrentSeq= *(uno_Sequence**) &pCurrentSeq->elements[ offset];
- curDim++;
- }
- else
- {
- // There is no Sequence at this index, so skip this index
- skipSeq= sal_True;
- break;
- }
- }
-
- if( skipSeq)
- continue;
-
- // Calculate the current position within the datablock of the SAFEARRAY
- // for the next Sequence.
- sal_Int32 memOffset= 0;
- sal_Int32 dimWeight= parElementCount[ dims - 1]; // size of the rightmost dimension
- for(sal_Int16 idims=0; idims < dimsSeq; idims++ )
- {
- memOffset+= arDimsSeqIndices[dimsSeq - 1 - idims] * dimWeight;
- // now determine the weight of the dimension to the left of the current.
- if( dims - 2 - idims >=0)
- dimWeight*= parElementCount[dims - 2 - idims];
- }
- psaCurrentData= (char*)pSAData + memOffset * oleElementSize;
- // convert the Sequence and put the elements into the Safearray
- for( sal_Int32 i= 0; i < pCurrentSeq->nElements; i++)
- {
- Any unoElement( pCurrentSeq->elements + i * elementSize, rawTypeDesc );
- // The any is being converted into an VARIANT which value is then copied
- // to the SAFEARRAY's data block. When copying one has to follow the rules for
- // copying certain types, as are VT_DISPATCH, VT_UNKNOWN, VT_VARIANT, VT_BSTR.
- // To increase performance, we just do a memcpy of VARIANT::byref. This is possible
- // because anyToVariant has already followed the copying rules. To make this
- // work there must not be a VariantClear.
- // One Exception is VARIANT because I don't know how VariantCopy works.
-
- VARIANT var;
- VariantInit( &var);
- anyToVariant( &var, unoElement);
- if( elemtype == VT_VARIANT )
- {
- VariantCopy( ( VARIANT*)psaCurrentData, &var);
- VariantClear( &var);
- }
- else
- memcpy( psaCurrentData, &var.byref, oleElementSize);
-
- psaCurrentData+= oleElementSize;
- }
- }
- while( incrementMultidimensionalIndex( dimsSeq, parElementCount, arDimsSeqIndices));
-
- SafeArrayUnaccessData( pArray);
- }
- }
- }
- return pArray;
-}
-
-// Increments a multi dimensional index.
-// Returns true as long as the index has been successfully incremented, false otherwise.
-// False is also returned if an overflow of the most significant dimension occurs. E.g.
-// assume an array with the dimensions (2,2), then the lowest index is (0,0) and the highest
-// index is (1,1). If the function is being called with the index (1,1) then the overflow would
-// occur, with the result (0,0) and a sal_False as return value.
-// Param dimensions - number of dimensions
-// Param parDimensionsLength - The array contains the size of each dimension, that is the
-// size of the array equals the parameter dimensions.
-// The rightmost dimensions is the least significant one
-// ( parDimensionsLengths[ dimensions -1 ] ).
-// Param parMultiDimensionalIndex - The array contains the index. Each dimension index is
-// 0 based.
-template<class T>
-sal_Bool UnoConversionUtilities<T>::incrementMultidimensionalIndex(sal_Int32 dimensions,
- const sal_Int32 * parDimensionLengths,
- sal_Int32 * parMultidimensionalIndex)
-{
- if( dimensions < 1)
- return sal_False;
-
- sal_Bool ret= sal_True;
- sal_Bool carry= sal_True; // to get into the while loop
-
- sal_Int32 currentDimension= dimensions; //most significant is 1
- while( carry)
- {
- parMultidimensionalIndex[ currentDimension - 1]++;
- // if carryover, set index to 0 and handle carry on a level above
- if( parMultidimensionalIndex[ currentDimension - 1] > (parDimensionLengths[ currentDimension - 1] - 1))
- parMultidimensionalIndex[ currentDimension - 1]= 0;
- else
- carry= sal_False;
-
- currentDimension --;
- // if dimensions drops below 1 and carry is set than then all indices are 0 again
- // this is signalled by returning sal_False
- if( currentDimension < 1 && carry)
- {
- carry= sal_False;
- ret= sal_False;
- }
- }
- return ret;
-}
-
-// Determines the size of a certain OLE type. The function takes
-// only those types into account which are oleautomation types and
-// can have a value ( unless VT_NULL, VT_EMPTY, VT_ARRAY, VT_BYREF).
-// Currently used in createUnoSequenceWrapper to calculate addresses
-// for data within a SAFEARRAY.
-template<class T>
-size_t UnoConversionUtilities<T>::getOleElementSize( VARTYPE type)
-{
- size_t size;
- switch( type)
- {
- case VT_BOOL: size= sizeof( VARIANT_BOOL);break;
- case VT_UI1: size= sizeof( unsigned char);break;
- case VT_R8: size= sizeof( double);break;
- case VT_R4: size= sizeof( float);break;
- case VT_I2: size= sizeof( short);break;
- case VT_I4: size= sizeof( long);break;
- case VT_BSTR: size= sizeof( BSTR); break;
- case VT_ERROR: size= sizeof( SCODE); break;
- case VT_DISPATCH:
- case VT_UNKNOWN: size= sizeof( IUnknown*); break;
- case VT_VARIANT: size= sizeof( VARIANT);break;
- default: size= 0;
- }
- return size;
-}
-
-//If a Sequence is being converted into a SAFEARRAY then we possibly have
-// to create a SAFEARRAY with multiple dimensions. This is the case when a
-// Sequence contains Sequences ( Sequence< Sequence < XXX > > ). The leftmost
-// Sequence in the declaration is assumed to represent dimension 1. Because
-// all Sequence elements of a Sequence can have different length, we have to
-// determine the maximum length which is then the length of the respective
-// dimension.
-// getElementCountAndTypeOfSequence determines the length of each dimension and calls itself recursively
-// in the process.
-// param rSeq - an Any that has to contain a Sequence
-// param dim - the dimension for which the number of elements is being determined,
-// must be one.
-// param seqElementCounts - countains the maximum number of elements for each
-// dimension. Index 0 contains the number of dimension one.
-// After return the Sequence contains the maximum number of
-// elements for each dimension.
-// The length of the Sequence must equal the number of dimensions.
-// param typeClass - TypeClass of the element type that is no Sequence, e.g.
-// Sequence< Sequence <Sequence <sal_Int32> > > - type is sal_Int32)
-template<class T>
-void UnoConversionUtilities<T>::getElementCountAndTypeOfSequence( const Any& rSeq, sal_Int32 dim,
- Sequence< sal_Int32 >& seqElementCounts, TypeDescription& typeDesc)
-{
- sal_Int32 dimCount= (*(uno_Sequence* const *) rSeq.getValue())->nElements;
- if( dimCount > seqElementCounts[ dim-1])
- seqElementCounts[ dim-1]= dimCount;
-
- // we need the element type to construct the any that is
- // passed into getElementCountAndTypeOfSequence again
- typelib_TypeDescription* pSeqDesc= NULL;
- rSeq.getValueTypeDescription( &pSeqDesc);
- typelib_TypeDescriptionReference* pElementDescRef= ((typelib_IndirectTypeDescription*)pSeqDesc)->pType;
-
- // if the elements are Sequences than do recursion
- if( dim < seqElementCounts.getLength() )
- {
- uno_Sequence* pSeq = *(uno_Sequence* const*) rSeq.getValue();
- uno_Sequence** arSequences= (uno_Sequence**)pSeq->elements;
- for( sal_Int32 i=0; i < dimCount; i++)
- {
- uno_Sequence* arElement= arSequences[ i];
- getElementCountAndTypeOfSequence( Any( &arElement, pElementDescRef), dim + 1 , seqElementCounts, typeDesc);
- }
- }
- else
- {
- // determine the element type ( e.g. Sequence< Sequence <Sequence <sal_Int32> > > - type is sal_Int32)
- typeDesc= pElementDescRef;
- }
- typelib_typedescription_release( pSeqDesc);
-}
-
-
-template<class T>
-SAFEARRAY* UnoConversionUtilities<T>::createUnoSequenceWrapper(const Any& rSeq)
-{
- SAFEARRAY* pArray = NULL;
- sal_uInt32 n = 0;
-
- if( rSeq.getValueTypeClass() != TypeClass_SEQUENCE )
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createUnoSequenceWrapper\n"
- "The UNO argument is not a sequence"), 0, -1);
-
- uno_Sequence * punoSeq= *(uno_Sequence**) rSeq.getValue();
-
- typelib_TypeDescriptionReference* pSeqTypeRef= rSeq.getValueTypeRef();
- typelib_TypeDescription* pSeqType= NULL;
- TYPELIB_DANGER_GET( &pSeqType, pSeqTypeRef);
- typelib_IndirectTypeDescription * pSeqIndDec= (typelib_IndirectTypeDescription*) pSeqType;
-
-
- typelib_TypeDescriptionReference * pSeqElementTypeRef= pSeqIndDec->pType;
- TYPELIB_DANGER_RELEASE( pSeqType);
-
- typelib_TypeDescription* pSeqElementDesc= NULL;
- TYPELIB_DANGER_GET( &pSeqElementDesc, pSeqElementTypeRef);
-
- // try to find VARIANT type that is related to the UNO type of the sequence elements
- // the sequence as a sequence element should be handled in a special way
- VARTYPE eTargetElementType = VT_EMPTY;
- if ( pSeqElementDesc->eTypeClass != TypeClass_SEQUENCE )
- eTargetElementType = mapTypeClassToVartype( static_cast< TypeClass >( pSeqElementDesc->eTypeClass ) );
-
- if ( eTargetElementType != VT_EMPTY )
- pArray = createUnoSequenceWrapper( rSeq, eTargetElementType );
-
- if ( !pArray )
- {
- sal_Int32 nElementSize= pSeqElementDesc->nSize;
- n= punoSeq->nElements;
-
- SAFEARRAYBOUND rgsabound[1];
- rgsabound[0].lLbound = 0;
- rgsabound[0].cElements = n;
- VARIANT oleElement;
- long safeI[1];
-
- pArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
-
- Any unoElement;
- // sal_uInt8 * pSeqData= (sal_uInt8*) punoSeq->pElements;
- sal_uInt8 * pSeqData= (sal_uInt8*) punoSeq->elements;
-
- for (sal_uInt32 i = 0; i < n; i++)
- {
- unoElement.setValue( pSeqData + i * nElementSize, pSeqElementDesc);
- VariantInit(&oleElement);
-
- anyToVariant(&oleElement, unoElement);
-
- safeI[0] = i;
- SafeArrayPutElement(pArray, safeI, &oleElement);
-
- VariantClear(&oleElement);
- }
- }
-
- TYPELIB_DANGER_RELEASE( pSeqElementDesc);
-
- return pArray;
-}
-
-/* The argument rObj can contain
-- UNO struct
-- UNO interface
-- UNO interface created by this bridge (adapter factory)
-- UNO interface created by this bridge ( COM Wrapper)
-
-pVar must be initialized.
-*/
-template<class T>
-void UnoConversionUtilities<T>::createUnoObjectWrapper(const Any & rObj, VARIANT * pVar)
-{
- MutexGuard guard(getBridgeMutex());
-
- Reference<XInterface> xInt;
-
- TypeClass tc = rObj.getValueTypeClass();
- if (tc != TypeClass_INTERFACE && tc != TypeClass_STRUCT)
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createUnoObjectWrapper \n"
- "Cannot create an Automation interface for a UNO type which is not "
- "a struct or interface!"), 0, -1);
-
- if (rObj.getValueTypeClass() == TypeClass_INTERFACE)
- {
- if (! (rObj >>= xInt))
- throw IllegalArgumentException(
- OUSTR("[automation bridge] UnoConversionUtilities<T>::createUnoObjectWrapper\n "
- "Could not create wrapper object for UNO object!"), 0, -1);
- //If XInterface is NULL, which is a valid value, then simply return NULL.
- if ( ! xInt.is())
- {
- pVar->vt = VT_UNKNOWN;
- pVar->punkVal = NULL;
- return;
- }
- //make sure we have the main XInterface which is used with a map
- xInt = Reference<XInterface>(xInt, UNO_QUERY);
- //If there is already a wrapper for the UNO object then use it
-
- Reference<XInterface> xIntWrapper;
- // Does a UNO wrapper exist already ?
- IT_Uno it_uno = UnoObjToWrapperMap.find( (sal_uInt32) xInt.get());
- if(it_uno != UnoObjToWrapperMap.end())
- {
- xIntWrapper = it_uno->second;
- if (xIntWrapper.is())
- {
- convertSelfToCom(xIntWrapper, pVar);
- return;
- }
- }
- // Is the object a COM wrapper ( either XInvocation, or Adapter object)
- // or does it suppy an IDispatch by its own ?
- else
- {
- Reference<XInterface> xIntComWrapper = xInt;
- typedef boost::unordered_map<sal_uInt32,sal_uInt32>::iterator _IT;
- // Adapter? then get the COM wrapper to which the adapter delegates its calls
- _IT it= AdapterToWrapperMap.find( (sal_uInt32) xInt.get());
- if( it != AdapterToWrapperMap.end() )
- xIntComWrapper= reinterpret_cast<XInterface*>(it->second);
-
- if (convertSelfToCom(xIntComWrapper, pVar))
- return;
- }
- }
- // If we have no UNO wrapper nor the IDispatch yet then we have to create
- // a wrapper. For that we need an XInvocation from the UNO object.
-
- // get an XInvocation or create one using the invocation service
- Reference<XInvocation> xInv(xInt, UNO_QUERY);
- if ( ! xInv.is())
- {
- Reference<XSingleServiceFactory> xInvFactory= getInvocationFactory(rObj);
- if (xInvFactory.is())
- {
- Sequence<Any> params(1);
- params.getArray()[0] = rObj;
- Reference<XInterface> xInt = xInvFactory->createInstanceWithArguments(params);
- xInv= Reference<XInvocation>(xInt, UNO_QUERY);
- }
- }
-
- if (xInv.is())
- {
- Reference<XInterface> xNewWrapper = createUnoWrapperInstance();
- Reference<XInitialization> xInitWrapper(xNewWrapper, UNO_QUERY);
- if (xInitWrapper.is())
- {
- VARTYPE vartype= getVarType( rObj);
-
- if (xInt.is())
- {
- Any params[3];
- params[0] <<= xInv;
- params[1] <<= xInt;
- params[2] <<= vartype;
- xInitWrapper->initialize( Sequence<Any>(params, 3));
- }
- else
- {
- Any params[2];
- params[0] <<= xInv;
- params[1] <<= vartype;
- xInitWrapper->initialize( Sequence<Any>(params, 2));
- }
-
- // put the newly created object into a map. If the same object will
- // be mapped again and there is already a wrapper then the old wrapper
- // will be used.
- if(xInt.is()) // only interfaces
- UnoObjToWrapperMap[(sal_uInt32) xInt.get()]= xNewWrapper;
- convertSelfToCom(xNewWrapper, pVar);
- return;
- }
- }
-}
-
-template<class T>
-void UnoConversionUtilities<T>::variantToAny( const VARIANT* pVariant, Any& rAny,
- sal_Bool bReduceValueRange /* = sal_True */)
-{
- HRESULT hr = S_OK;
- try
- {
- CComVariant var;
-
- // There is no need to support indirect values, since they're not supported by UNO
- if( FAILED(hr= VariantCopyInd( &var, const_cast<VARIANTARG*>(pVariant)))) // remove VT_BYREF
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] UnoConversionUtilities<T>::variantToAny \n"
- "VariantCopyInd failed for reason : ") + OUString::valueOf(hr));
-
- if ( ! convertValueObject( & var, rAny))
- {
- if ((var.vt & VT_ARRAY) > 0)
- {
- VARTYPE oleTypeFlags = ::sal::static_int_cast< VARTYPE, int >( var.vt ^ VT_ARRAY );
-
- Sequence<Any> unoSeq = createOleArrayWrapper(var.parray, oleTypeFlags);
- rAny.setValue( &unoSeq, getCppuType( &unoSeq));
- }
- else
- {
- switch (var.vt)
- {
- case VT_EMPTY:
- rAny.setValue(NULL, Type());
- break;
- case VT_NULL:
- rAny.setValue(NULL, Type());
- break;
- case VT_I2:
- rAny.setValue( & var.iVal, getCppuType( (sal_Int16*)0));
- break;
- case VT_I4:
- rAny.setValue( & var.lVal, getCppuType( (sal_Int32*)0));
- // necessary for use in JavaScript ( see "reduceRange")
- if( bReduceValueRange)
- reduceRange(rAny);
- break;
- case VT_R4:
- rAny.setValue( & var.fltVal, getCppuType( (float*)0));
- break;
- case VT_R8:
- rAny.setValue(& var.dblVal, getCppuType( (double*)0));
- break;
- case VT_CY:
- {
- Currency cy(var.cyVal.int64);
- rAny <<= cy;
- break;
- }
- case VT_DATE:
- {
- Date d(var.date);
- rAny <<= d;
- break;
- }
- case VT_BSTR:
- {
- OUString b(reinterpret_cast<const sal_Unicode*>(var.bstrVal));
- rAny.setValue( &b, getCppuType( &b));
- break;
- }
- case VT_UNKNOWN:
- case VT_DISPATCH:
- {
- //check if it is a UNO type
-#ifdef __MINGW32__
- CComQIPtr<IUnoTypeWrapper, &__uuidof(IUnoTypeWrapper)> spType((IUnknown*) var.byref);
-#else
- CComQIPtr<IUnoTypeWrapper> spType((IUnknown*) var.byref);
-#endif
- if (spType)
- {
- CComBSTR sName;
- if (FAILED(spType->get_Name(&sName)))
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::variantToAny \n"
- "Failed to get the type name from a UnoTypeWrapper!"));
- Type type;
- if (getType(sName, type) == false)
- {
- throw CannotConvertException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::variantToAny \n"
- "A UNO type with the name: ") + OUString(reinterpret_cast<const sal_Unicode*>(LPCOLESTR(sName))) +
- OUSTR("does not exist!"),
- 0, TypeClass_UNKNOWN, FailReason::TYPE_NOT_SUPPORTED,0);
- }
- rAny <<= type;
- }
- else
- {
- rAny = createOleObjectWrapper( & var);
- }
- break;
- }
- case VT_ERROR:
- {
- SCode scode(var.scode);
- rAny <<= scode;
- break;
- }
- case VT_BOOL:
- {
- sal_Bool b= var.boolVal == VARIANT_TRUE;
- rAny.setValue( &b, getCppuType( &b));
- break;
- }
- case VT_I1:
- rAny.setValue( & var.cVal, getCppuType((sal_Int8*)0));
- break;
- case VT_UI1: // there is no unsigned char in UNO
- rAny.setValue( & var.bVal, getCppuType( (sal_Int8*)0));
- break;
- case VT_UI2:
- rAny.setValue( & var.uiVal, getCppuType( (sal_uInt16*)0));
- break;
- case VT_UI4:
- rAny.setValue( & var.ulVal, getCppuType( (sal_uInt32*)0));
- break;
- case VT_INT:
- rAny.setValue( & var.intVal, getCppuType( (sal_Int32*)0));
- break;
- case VT_UINT:
- rAny.setValue( & var.uintVal, getCppuType( (sal_uInt32*)0));
- break;
- case VT_VOID:
- rAny.setValue( NULL, Type());
- break;
- case VT_DECIMAL:
- {
- Decimal dec;
- dec.Scale = var.decVal.scale;
- dec.Sign = var.decVal.sign;
- dec.LowValue = var.decVal.Lo32;
- dec.MiddleValue = var.decVal.Mid32;
- dec.HighValue = var.decVal.Hi32;
- rAny <<= dec;
- break;
- }
-
- default:
- break;
- }
- }
- }
- }
- catch (IllegalArgumentException & )
- {
- throw;
- }
- catch (CannotConvertException &)
- {
- throw;
- }
- catch (BridgeRuntimeError & )
- {
- throw;
- }
- catch (Exception & e)
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::variantToAny ! Message : \n") +
- e.Message);
- }
- catch(...)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::variantToAny !"));
- }
-
-}
-// The function converts an IUnknown* into an UNO interface or struct. The
-// IUnknown pointer can constitute different kind of objects:
-// 1. a wrapper of an UNO struct (the wrapper was created by this bridge)
-// 2. a wrapper of an UNO interface (created by this bridge)
-// 3. a dispatch object that implements UNO interfaces
-// 4. a dispatch object.
-
-// If the parameter "aType" has a value then the COM object ( pUnknown) is supposed to
-// implement the interface described by "aType". Moreover it ( pUnknown) can implement
-// several other
-// UNO interfaces in which case it has to support the SUPPORTED_INTERFACES_PROP (see
-// #define) property. That property contains all names of interfaces.
-// "pUnknown" is wrapped by a COM wrapper object that implements XInvocation, e.g.
-// IUnknownWrapper_Impl. Additionally an object of type "aType" is created by help
-// of the INTERFACE_ADAPTER_FACTORY (see #define) service. The implementation of
-// "aType" calls on the COM wrapper's XInvocation::invoke. If the COM object supports
-// more then one UNO interfaces, as can be determined by the property
-// SUPPORTED_INTERFACES_PROP, then the INTERFACE_ADAPTER_FACTORY creates an object that
-// implements all these interfaces.
-// This is only done if "pUnknown" is not already a UNO wrapper,
-// that is it is actually NOT an UNO object that was converted to a COM object. If it is an
-// UNO wrapper than the original UNO object is being extracted, queried for "aType" (if
-// it is no struct) and returned.
-template<class T>
-#ifdef __MINGW32__
-Any UnoConversionUtilities<T>::createOleObjectWrapper(VARIANT* pVar, const Type& aType)
-#else
-Any UnoConversionUtilities<T>::createOleObjectWrapper(VARIANT* pVar, const Type& aType= Type())
-#endif
-{
- //To allow passing "Nothing" in VS 2008 we need to accept VT_EMPTY
- if (pVar->vt != VT_UNKNOWN && pVar->vt != VT_DISPATCH && pVar->vt != VT_EMPTY)
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createOleObjectWrapper \n"
- "The VARIANT does not contain an object type! "), 0, -1);
-
- MutexGuard guard( getBridgeMutex());
-
- CComPtr<IUnknown> spUnknown;
- CComPtr<IDispatch> spDispatch;
-
- if (pVar->vt == VT_UNKNOWN)
- {
- spUnknown = pVar->punkVal;
- if (spUnknown)
-#ifdef __MINGW32__
- spUnknown->QueryInterface( IID_IDispatch, reinterpret_cast<LPVOID*>( & spDispatch.p));
-#else
- spUnknown.QueryInterface( & spDispatch.p);
-#endif
- }
- else if (pVar->vt == VT_DISPATCH && pVar->pdispVal != NULL)
- {
- CComPtr<IDispatch> spDispatch(pVar->pdispVal);
- if (spDispatch)
-#ifdef __MINGW32__
- spDispatch->QueryInterface( IID_IUnknown, reinterpret_cast<LPVOID*>( & spUnknown.p));
-#else
- spDispatch.QueryInterface( & spUnknown.p);
-#endif
- }
-
- static Type VOID_TYPE= Type();
- Any ret;
- //If no Type is provided and pVar contains IUnknown then we return a XInterface.
- //If pVar contains an IDispatch then we return a XInvocation.
- Type desiredType = aType;
-
- if (aType == VOID_TYPE)
- {
- switch (pVar->vt)
- {
- case VT_EMPTY:
- case VT_UNKNOWN:
- desiredType = getCppuType((Reference<XInterface>*) 0);
- break;
- case VT_DISPATCH:
- desiredType = getCppuType((Reference<XInvocation>*) 0);
- break;
- default:
- desiredType = aType;
- }
- }
-
- // COM pointer are NULL, no wrapper required
- if (spUnknown == NULL)
- {
- Reference<XInterface> xInt;
- if( aType.getTypeClass() == TypeClass_INTERFACE)
- ret.setValue( &xInt, aType);
- else if( aType.getTypeClass() == TypeClass_STRUCT)
- ret.setValue( NULL, aType);
- else
- ret <<= xInt;
- return ret;
- }
-
-
- // Check if "spUnknown" is a UNO wrapper, that is an UNO object that has been
- // passed to COM. Then it supports IUnoObjectWrapper
- // and we extract the original UNO object.
-#ifdef __MINGW32__
- CComQIPtr<IUnoObjectWrapper, &__uuidof(IUnoObjectWrapper)> spUno( spUnknown);
-#else
- CComQIPtr<IUnoObjectWrapper> spUno( spUnknown);
-#endif
- if( spUno)
- { // it is a wrapper
- Reference<XInterface> xInt;
- if( SUCCEEDED( spUno->getOriginalUnoObject( &xInt)))
- {
- ret <<= xInt;
- }
- else
- {
- Any any;
- if( SUCCEEDED( spUno->getOriginalUnoStruct(&any)))
- ret= any;
- }
- return ret;
- }
-
- // "spUnknown" is a real COM object.
- // Before we create a new wrapper object we check if there is an existing wrapper
- // There can be two kinds of wrappers, those who wrap dispatch - UNO objects, and those who
- // wrap ordinary dispatch objects. The dispatch-UNO objects usually are adapted to represent
- // particular UNO interfaces.
- Reference<XInterface> xIntWrapper;
- CIT_Com cit_currWrapper= ComPtrToWrapperMap.find( reinterpret_cast<sal_uInt32>(spUnknown.p));
- if(cit_currWrapper != ComPtrToWrapperMap.end())
- xIntWrapper = cit_currWrapper->second;
- if (xIntWrapper.is())
- {
- //Try to find an adapter for the wrapper
- //find the proper Adapter. The pointer in the WrapperToAdapterMap are valid as long as
- //we get a pointer to the wrapper from ComPtrToWrapperMap, because the Adapter hold references
- //to the wrapper.
- CIT_Wrap it = WrapperToAdapterMap.find((sal_uInt32) xIntWrapper.get());
- if (it == WrapperToAdapterMap.end())
- {
- // No adapter available.
- //The COM component could be a UNO object. Then we need to provide
- // a proxy that implements all interfaces
- Sequence<Type> seqTypes= getImplementedInterfaces(spUnknown);
- Reference<XInterface> xIntAdapter;
- if (seqTypes.getLength() > 0)
- {
- //It is a COM UNO object
- xIntAdapter = createAdapter(seqTypes, xIntWrapper);
- }
- else
- {
- // Some ordinary COM object
- xIntAdapter = xIntWrapper;
- }
- // return the wrapper directly, return XInterface or XInvocation
- ret = xIntWrapper->queryInterface(desiredType);
- if ( ! ret.hasValue())
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createOleObjectWrapper \n"
- "The COM object is not suitable for the UNO type: ") +
- desiredType.getTypeName(), 0, -1);
- }
- else
- {
- //There is an adapter available
- Reference<XInterface> xIntAdapter((XInterface*) it->second);
- ret = xIntAdapter->queryInterface( desiredType);
- if ( ! ret.hasValue())
- throw IllegalArgumentException(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createOleObjectWrapper \n"
- "The COM object is not suitable for the UNO type: ") +
- desiredType.getTypeName(), 0, -1);
- }
-
- return ret;
- }
- // No existing wrapper. Therefore create a new proxy.
- // If the object implements UNO interfaces then get the types.
- Sequence<Type> seqTypes = getImplementedInterfaces(spUnknown);
- if (seqTypes.getLength() == 0 &&
- aType != VOID_TYPE && aType != getCppuType((Reference<XInvocation>*)0))
- {
- seqTypes = Sequence<Type>( & aType, 1);
- }
-
- //There is no existing wrapper, therefore we create one for the real COM object
- Reference<XInterface> xIntNewProxy= createComWrapperInstance();
- if ( ! xIntNewProxy.is())
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createOleObjectWrapper \n"
- "Could not create proxy object for COM object!"));
-
- // initialize the COM wrapper
- Reference<XInitialization> xInit( xIntNewProxy, UNO_QUERY);
- OSL_ASSERT( xInit.is());
-
- Any params[3];
-#ifdef __MINGW32__
- params[0] <<= reinterpret_cast<sal_uInt32>( spUnknown.p );
-#else
- params[0] <<= (sal_uInt32) spUnknown.p;
-#endif
- sal_Bool bDisp = pVar->vt == VT_DISPATCH ? sal_True : sal_False;
- params[1].setValue( & bDisp, getBooleanCppuType());
- params[2] <<= seqTypes;
-
- xInit->initialize( Sequence<Any>( params, 3));
-#ifdef __MINGW32__
- ComPtrToWrapperMap[reinterpret_cast<sal_uInt32>( spUnknown.p )]= xIntNewProxy;
-#else
- ComPtrToWrapperMap[reinterpret_cast<sal_uInt32>(spUnknown.p)]= xIntNewProxy;
-#endif
-
- // we have a wrapper object
- //The wrapper implements already XInvocation and XInterface. If
- //param aType is void then the object is supposed to have XInvocation.
- if (aType == getCppuType((Reference<XInvocation>*)0) ||
- (aType == VOID_TYPE && seqTypes.getLength() == 0 ))
- {
- ret = xIntNewProxy->queryInterface(desiredType);
- }
- else
- {
- Reference<XInterface> xIntAdapter =
- createAdapter(seqTypes, xIntNewProxy);
- ret = xIntAdapter->queryInterface(desiredType);
- }
- return ret;
-}
-template<class T>
-Reference<XInterface> UnoConversionUtilities<T>::createAdapter(const Sequence<Type>& seqTypes,
- const Reference<XInterface>& receiver)
-{
- Reference< XInterface> xIntAdapterFac;
- xIntAdapterFac= m_smgr->createInstance(INTERFACE_ADAPTER_FACTORY);
- // We create an adapter object that does not only implement the required type but also
- // all types that the COM object pretends to implement. An COM object must therefore
- // support the property "_implementedInterfaces".
- Reference<XInterface> xIntAdapted;
- Reference<XInvocation> xInv(receiver, UNO_QUERY);
- Reference<XInvocationAdapterFactory2> xAdapterFac( xIntAdapterFac, UNO_QUERY);
- if( xAdapterFac.is())
- xIntAdapted= xAdapterFac->createAdapter( xInv, seqTypes);
-
- if( xIntAdapted.is())
- {
- // Put the pointer to the wrapper object and the interface pointer of the adapted interface
- // in a global map. Thus we can determine in a call to createUnoObjectWrapper whether the UNO
- // object is a wrapped COM object. In that case we extract the original COM object rather than
- // creating a wrapper around the UNO object.
- typedef boost::unordered_map<sal_uInt32,sal_uInt32>::value_type VALUE;
- AdapterToWrapperMap.insert( VALUE( (sal_uInt32) xIntAdapted.get(), (sal_uInt32) receiver.get()));
- WrapperToAdapterMap.insert( VALUE( (sal_uInt32) receiver.get(), (sal_uInt32) xIntAdapted.get()));
- }
- else
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge]UnoConversionUtilities<T>::createOleObjectWrapper \n"
- "Could not create a proxy for COM object! Creation of adapter failed."));
- }
- return xIntAdapted;
-}
-// "convertValueObject" converts a JScriptValue object contained in "var" into
-// an any. The type contained in the any is stipulated by a "type value" thas
-// was set within the JScript script on the value object ( see JScriptValue).
-template<class T>
-bool UnoConversionUtilities<T>::convertValueObject( const VARIANTARG *var, Any& any)
-{
- bool ret = false;
- try
- {
- bool bFail = false;
- HRESULT hr= S_OK;
- CComVariant varDisp;
-
- if(SUCCEEDED(hr = varDisp.ChangeType( VT_DISPATCH, var)))
- {
- CComPtr <IJScriptValueObject> spValue;
- VARIANT_BOOL varBool;
- CComBSTR bstrType;
- CComVariant varValue;
- CComPtr<IDispatch> spDisp( varDisp.pdispVal);
- if(spDisp)
- {
- if(SUCCEEDED( spDisp->QueryInterface( __uuidof( IJScriptValueObject),
- reinterpret_cast<void**> (&spValue))))
- {
- ret = true; // is is a ValueObject
- //If it is an out - param then it does not need to be converted. In/out and
- // in params does so.
- if (SUCCEEDED(hr= spValue->IsOutParam( &varBool)))
- {
- // if varBool == true then no conversion needed because out param
- if (varBool == VARIANT_FALSE)
- {
- if(SUCCEEDED(hr = spValue->GetValue( & bstrType, & varValue)))
- {
- Type type;
- if (getType(bstrType, type))
- variantToAny( & varValue, any, type);
- else
- bFail = true;
- }
- else
- bFail = true;
- }
- }
- else
- bFail = true;;
- }
- }
- }
- else if( hr != DISP_E_TYPEMISMATCH && hr != E_NOINTERFACE)
- bFail = true;
-
- if (bFail)
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] Conversion of ValueObject failed "));
- }
- catch (BridgeRuntimeError &)
- {
- throw;
- }
- catch (Exception & e)
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::convertValueObject ! Message : \n") +
- e.Message);
- }
- catch(...)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::convertValueObject !"));
- }
- return ret;
-}
-
-template<class T>
-void UnoConversionUtilities<T>::dispatchExObject2Sequence( const VARIANTARG* pvar, Any& anySeq, const Type& type)
-{
- try
- {
- bool bFail = false;
- if( pvar->vt != VT_DISPATCH)
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
- IDispatchEx* pdispEx;
- HRESULT hr;
- if( FAILED( hr= pvar->pdispVal->QueryInterface( IID_IDispatchEx,
- reinterpret_cast<void**>( &pdispEx))))
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
-
- DISPID dispid;
- OUString sindex;
- DISPPARAMS param= {0,0,0,0};
- CComVariant result;
-
- OLECHAR* sLength= L"length";
-
- // Get the length of the array. Can also be obtained throu GetNextDispID. The
- // method only returns DISPIDs of the array data. Their names are like "0", "1" etc.
- if( FAILED( hr= pdispEx->GetIDsOfNames(IID_NULL, &sLength , 1, LOCALE_USER_DEFAULT, &dispid)))
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
- if( FAILED( hr= pdispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
- &param, &result, NULL, NULL)))
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
- if( FAILED( VariantChangeType( &result, &result, 0, VT_I4)))
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
- long length= result.lVal;
-
- result.Clear();
-
- // get a few basic facts about the sequence, and reallocate:
- // create the Sequences
- // get the size of the elements
- typelib_TypeDescription *pDesc= NULL;
- type.getDescription( &pDesc);
-
- typelib_IndirectTypeDescription *pSeqDesc= reinterpret_cast<typelib_IndirectTypeDescription*>(pDesc);
- typelib_TypeDescriptionReference *pSeqElemDescRef= pSeqDesc->pType; // type of the Sequence' elements
- Type elemType( pSeqElemDescRef);
- _typelib_TypeDescription* pSeqElemDesc=NULL;
- TYPELIB_DANGER_GET( &pSeqElemDesc, pSeqElemDescRef)
- sal_uInt32 nelementSize= pSeqElemDesc->nSize;
- TYPELIB_DANGER_RELEASE( pSeqElemDesc)
-
- uno_Sequence *p_uno_Seq;
- uno_sequence_construct( &p_uno_Seq, pDesc, NULL, length, cpp_acquire);
-
- typelib_TypeClass typeElement= pSeqDesc->pType->eTypeClass;
- char *pArray= p_uno_Seq->elements;
-
- // Get All properties in the object, convert their values to the expected type and
- // put them into the passed in sequence
- for( sal_Int32 i= 0; i< length; i++)
- {
- OUString ousIndex=OUString::valueOf( i);
- OLECHAR* sindex = (OLECHAR*)ousIndex.getStr();
-
- if( FAILED( hr= pdispEx->GetIDsOfNames(IID_NULL, &sindex , 1, LOCALE_USER_DEFAULT, &dispid)))
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
- }
- if( FAILED( hr= pdispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
- &param, &result, NULL, NULL)))
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence \n"
- "Conversion of dispatch object to Sequence failed!"));
- }
-
- // If the result is VT_DISPATCH than the Sequence's element type could be Sequence
- // Look that up in the CoreReflection to make clear.
- // That requires a recursiv conversion
- Any any;
- // Destination address within the out-Sequence "anySeq" where to copy the next converted element
- void* pDest= (void*)(pArray + (i * nelementSize));
-
- if( result.vt & VT_DISPATCH && typeElement == typelib_TypeClass_SEQUENCE)
- {
- variantToAny( &result, any, elemType, sal_False);
- // copy the converted VARIANT, that is a Sequence to the Sequence
- uno_Sequence * p_unoSeq= *(uno_Sequence**)any.getValue();
- // just copy the pointer of the uno_Sequence
- // nelementSize should be 4 !!!!
- memcpy( pDest, &p_unoSeq, nelementSize);
- osl_incrementInterlockedCount( &p_unoSeq->nRefCount);
- }
- else // Element type is no Sequence -> do one conversion
- {
- variantToAny( &result, any, elemType, sal_False);
- if( typeElement == typelib_TypeClass_ANY)
- {
- // copy the converted VARIANT to the Sequence
- uno_type_assignData( pDest, pSeqElemDescRef , &any, pSeqElemDescRef,cpp_queryInterface,
- cpp_acquire, cpp_release);
- }
- else
- {
- // type after conversion must be the element type of the sequence
- OSL_ENSURE( (any.getValueTypeClass() == typeElement), "wrong conversion");
- uno_type_assignData( pDest, pSeqElemDescRef,const_cast<void*>( any.getValue()), any.getValueTypeRef(),
- cpp_queryInterface, cpp_acquire, cpp_release);
- }
- }
- } // else
- result.Clear();
- anySeq.setValue( &p_uno_Seq, pDesc);
- uno_destructData( &p_uno_Seq, pDesc, cpp_release);
- typelib_typedescription_release( pDesc);
-
- if (bFail)
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] Conversion of ValueObject failed "));
- }
- catch (BridgeRuntimeError & )
- {
- throw;
- }
- catch (Exception & e)
- {
- throw BridgeRuntimeError(OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::convertValueObject ! Message : \n") +
- e.Message);
- }
- catch(...)
- {
- throw BridgeRuntimeError(
- OUSTR("[automation bridge] unexpected exception in "
- "UnoConversionUtilities<T>::convertValueObject !"));
- }
-}
-
-/* The argument unotype is the type that is expected by the currently called UNO function.
- For example: []long, [][]long. If the function calls itself recursively then the element type
- is passed on. For example a two dimensional SAFEARRAY of type VT_I4 is to be converted. Then
- unotype has to be either void or [][]long. When the function calls itself recursivly then
- it passes the element type which is []long.
-*/
-template<class T>
-Sequence<Any> UnoConversionUtilities<T>::createOleArrayWrapperOfDim(SAFEARRAY* pArray,
- unsigned int dimCount, unsigned int actDim, long* index, VARTYPE type, const Type& unotype)
-{
- HRESULT hr= S_OK;
- long lBound;
- long uBound;
- long nCountElements;
-
- SafeArrayGetLBound(pArray, actDim, &lBound);
- SafeArrayGetUBound(pArray, actDim, &uBound);
- nCountElements= uBound - lBound +1;
-
- Sequence<Any> anySeq(nCountElements);
- Any* pUnoArray = anySeq.getArray();
-
- for (index[actDim - 1] = lBound; index[actDim - 1] <= uBound; index[actDim - 1]++)
- {
- if (actDim > 1 )
- {
- Sequence<Any> element = createOleArrayWrapperOfDim(pArray, dimCount,
- actDim - 1, index, type, getElementTypeOfSequence(unotype));
-
- pUnoArray[index[actDim - 1] - lBound].setValue(&element, getCppuType(&element));
- }
- else
- {
- VARIANT variant;
-
- VariantInit(&variant);
-
- V_VT(&variant) = type;
-
- switch (type)
- {
- case VT_I2:
- SafeArrayGetElement(pArray, index, &V_I2(&variant));
- break;
- case VT_I4:
- SafeArrayGetElement(pArray, index, &V_I4(&variant));
- break;
- case VT_R4:
- SafeArrayGetElement(pArray, index, &V_R4(&variant));
- break;
- case VT_R8:
- SafeArrayGetElement(pArray, index, &V_R8(&variant));
- break;
- case VT_CY:
- SafeArrayGetElement(pArray, index, &V_CY(&variant));
- break;
- case VT_DATE:
- SafeArrayGetElement(pArray, index, &V_DATE(&variant));
- break;
- case VT_BSTR:
- hr= SafeArrayGetElement(pArray, index, &V_BSTR(&variant));
- break;
- case VT_DISPATCH:
- SafeArrayGetElement(pArray, index, &V_DISPATCH(&variant));
- break;
- case VT_ERROR:
- SafeArrayGetElement(pArray, index, &V_ERROR(&variant));
- break;
- case VT_BOOL:
- SafeArrayGetElement(pArray, index, &V_BOOL(&variant));
- break;
- case VT_VARIANT:
- SafeArrayGetElement(pArray, index, &variant);
- break;
- case VT_UNKNOWN:
- SafeArrayGetElement(pArray, index, &V_UNKNOWN(&variant));
- break;
- case VT_I1:
- SafeArrayGetElement(pArray, index, &V_I1(&variant));
- break;
- case VT_UI1:
- SafeArrayGetElement(pArray, index, &V_UI1(&variant));
- break;
- case VT_UI2:
- SafeArrayGetElement(pArray, index, &V_UI2(&variant));
- break;
- case VT_UI4:
- SafeArrayGetElement(pArray, index, &V_UI4(&variant));
- break;
- default:
- break;
- }
-
- if( unotype.getTypeClass() == TypeClass_VOID)
- // the function was called without specifying the destination type
- variantToAny(&variant, pUnoArray[index[actDim - 1] - lBound], sal_False);
- else
- variantToAny(&variant, pUnoArray[index[actDim - 1] - lBound],
- getElementTypeOfSequence(unotype), sal_False);
-
- VariantClear(&variant);
- }
- }
- return anySeq;
-}
-
-template<class T>
-Type UnoConversionUtilities<T>::getElementTypeOfSequence( const Type& seqType)
-{
- Type retValue;
- if( seqType.getTypeClass() != TypeClass_VOID)
- {
- OSL_ASSERT( seqType.getTypeClass() == TypeClass_SEQUENCE);
- typelib_IndirectTypeDescription* pDescSeq= NULL;
- seqType.getDescription((typelib_TypeDescription** ) & pDescSeq);
- retValue = Type(pDescSeq->pType);
- typelib_typedescription_release( (typelib_TypeDescription*) pDescSeq);
- }
- return retValue;
-}
-template<class T>
-Sequence<Any> UnoConversionUtilities<T>::createOleArrayWrapper(SAFEARRAY* pArray, VARTYPE type, const Type& unoType)
-{
- sal_uInt32 dim = SafeArrayGetDim(pArray);
-
- Sequence<Any> ret;
-
- if (dim > 0)
- {
- scoped_array<long> sarIndex(new long[dim]);
- long * index = sarIndex.get();
-
- for (unsigned int i = 0; i < dim; i++)
- {
- index[i] = 0;
- }
-
- ret = createOleArrayWrapperOfDim(pArray, dim, dim, index, type, unoType);
- }
-
- return ret;
-}
-
-// If an VARIANT has the type VT_DISPATCH it can either be an JScript Array
-// or some other object. This function finds out if it is such an array or
-// not. Currently there's no way to make sure it's an array
-// so we assume that when the object has a property "0" then it is an Array.
-// An JScript has property like "0", "1", "2" etc. which represent the
-// value at the corresponding index of the array
-template<class T>
-sal_Bool UnoConversionUtilities<T>::isJScriptArray(const VARIANT* rvar)
-{
- OSL_ENSURE( rvar->vt == VT_DISPATCH, "param is not a VT_DISPATCH");
- HRESULT hr;
- OLECHAR* sindex= L"0";
- DISPID id;
- if ( rvar->vt == VT_DISPATCH && rvar->pdispVal )
- {
- hr= rvar->pdispVal->GetIDsOfNames( IID_NULL, &sindex, 1,
- LOCALE_USER_DEFAULT, &id);
-
- if( SUCCEEDED ( hr) )
- return sal_True;
- }
-
- return sal_False;
-}
-
-template<class T>
-VARTYPE UnoConversionUtilities<T>::mapTypeClassToVartype( TypeClass type)
-{
- VARTYPE ret;
- switch( type)
- {
- case TypeClass_INTERFACE: ret= VT_DISPATCH;
- break;
- case TypeClass_STRUCT: ret= VT_DISPATCH;
- break;
- case TypeClass_ENUM: ret= VT_I4;
- break;
- case TypeClass_SEQUENCE: ret= VT_ARRAY;
- break;
- case TypeClass_ANY: ret= VT_VARIANT;
- break;
- case TypeClass_BOOLEAN: ret= VT_BOOL;
- break;
- case TypeClass_CHAR: ret= VT_I2;
- break;
- case TypeClass_STRING: ret= VT_BSTR;
- break;
- case TypeClass_FLOAT: ret= VT_R4;
- break;
- case TypeClass_DOUBLE: ret= VT_R8;
- break;
- case TypeClass_BYTE: ret= VT_UI1;
- break;
- case TypeClass_SHORT: ret= VT_I2;
- break;
- case TypeClass_LONG: ret= VT_I4;
- break;
- case TypeClass_UNSIGNED_SHORT: ret= VT_UI2;
- break;
- case TypeClass_UNSIGNED_LONG: ret= VT_UI4;
- break;
- default:
- ret= VT_EMPTY;
- }
- return ret;
-}
-
-template<class T>
-Sequence<Type> UnoConversionUtilities<T>::getImplementedInterfaces(IUnknown* pUnk)
-{
- Sequence<Type> seqTypes;
- CComDispatchDriver disp( pUnk);
- if( disp)
- {
- CComVariant var;
- HRESULT hr= S_OK;
- // There are two different property names possible.
- if( FAILED( hr= disp.GetPropertyByName( SUPPORTED_INTERFACES_PROP, &var)))
- {
- hr= disp.GetPropertyByName( SUPPORTED_INTERFACES_PROP2, &var);
- }
- if (SUCCEEDED( hr))
- {
- // we exspect an array( SafeArray or IDispatch) of Strings.
- Any anyNames;
- variantToAny( &var, anyNames, getCppuType( (Sequence<Any>*) 0));
- Sequence<Any> seqAny;
- if( anyNames >>= seqAny)
- {
- seqTypes.realloc( seqAny.getLength());
- for( sal_Int32 i=0; i < seqAny.getLength(); i++)
- {
- OUString typeName;
- seqAny[i] >>= typeName;
- seqTypes[i]= Type( TypeClass_INTERFACE, typeName);
- }
- }
- }
- }
- return seqTypes;
-}
-template<class T>
-Reference<XTypeConverter> UnoConversionUtilities<T>::getTypeConverter()
-{
- if ( ! m_typeConverter.is())
- {
- MutexGuard guard(getBridgeMutex());
- if ( ! m_typeConverter.is())
- {
- Reference<XInterface> xIntConverter =
- m_smgr->createInstance(OUSTR("com.sun.star.script.Converter"));
- if (xIntConverter.is())
- m_typeConverter = Reference<XTypeConverter>(xIntConverter, UNO_QUERY);
- }
- }
- return m_typeConverter;
-}
-
-// This function tries to the change the type of a value (contained in the Any)
-// to the smallest possible that can hold the value. This is actually done only
-// for types of VT_I4 (see o2u_variantToAny). The reason is the following:
-// JavaScript passes integer values always as VT_I4. If there is a parameter or
-// property of type any then the bridge converts the any's content according
-// to "o2u_variantToAny". Because the VARTYPE is VT_I4 the value would be converted
-// to TypeClass_LONG. Say the method XPropertySet::setPropertyValue( string name, any value)
-// would be called on an object and the property actually is of TypeClass_SHORT.
-// After conversion of the VARIANT parameter the Any would contain type
-// TypeClass_LONG. Because the corereflection does not cast from long to short
-// the "setPropertValue" would fail as the value has not the right type.
-
-// The corereflection does convert small integer types to bigger types.
-// Therefore we can reduce the type if possible and avoid the above mentioned
-// problem.
-
-// The function is not used when elements are to be converted for Sequences.
-
-#ifndef _REDUCE_RANGE
-#define _REDUCE_RANGE
-inline void reduceRange( Any& any)
-{
- OSL_ASSERT( any.getValueTypeClass() == TypeClass_LONG);
-
- sal_Int32 value= *(sal_Int32*)any.getValue();
- if( value <= 0x7f && value >= -0x80)
- {// -128 bis 127
- sal_Int8 charVal= static_cast<sal_Int8>( value);
- any.setValue( &charVal, getCppuType( (sal_Int8*)0));
- }
- else if( value <= 0x7fff && value >= -0x8000)
- {// -32768 bis 32767
- sal_Int16 shortVal= static_cast<sal_Int16>( value);
- any.setValue( &shortVal, getCppuType( (sal_Int16*)0));
- }
-}
-#endif
-
-
-
-} // end namespace
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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: */
diff --git a/extensions/source/ole/unoobjw.hxx b/extensions/source/ole/unoobjw.hxx
deleted file mode 100644
index 7d7bca7c4..000000000
--- a/extensions/source/ole/unoobjw.hxx
+++ /dev/null
@@ -1,297 +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.
- *
- ************************************************************************/
-
-#ifndef _UNOOBJW_HXX
-#define _UNOOBJW_HXX
-
-#include <com/sun/star/bridge/XBridgeSupplier2.hpp>
-#include <com/sun/star/beans/XExactName.hpp>
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/script/InvocationInfo.hpp>
-#include <salhelper/simplereferenceobject.hxx>
-
-#include "comifaces.hxx"
-#include "ole2uno.hxx"
-#include "unoconversionutilities.hxx"
-
-//#define INVOCATION_SERVICE L"com.sun.star.script.Invocation"
-#define JSCRIPT_VALUE_FUNC L"_GetValueObject"
-#define GET_STRUCT_FUNC L"_GetStruct"
-#define BRIDGE_VALUE_FUNC L"Bridge_GetValueObject"
-#define BRIDGE_GET_STRUCT_FUNC L"Bridge_GetStruct"
-#define BRIDGE_CREATE_TYPE_FUNC L"Bridge_CreateType"
-
-#define DISPID_JSCRIPT_VALUE_FUNC -10l
-#define DISPID_GET_STRUCT_FUNC -102
-#define DISPID_CREATE_TYPE_FUNC -103
-
-using namespace std;
-using namespace cppu;
-using namespace com::sun::star::bridge;
-using namespace com::sun::star::script;
-namespace ole_adapter
-{
-
-
-
-struct hash_IUnknown_Impl
-{
- size_t operator()(const IUnknown* p) const
- {
- return (size_t)p;
- }
-};
-
-struct equal_to_IUnknown_Impl
-{
- bool operator()(const IUnknown* s1, const IUnknown* s2) const
- {
- return s1 == s2;
- }
-};
-
-
-
-struct MemberInfo
-{
- MemberInfo() : flags(0), name() {}
- MemberInfo(WORD f, const OUString& n) : flags(f), name(n) {}
-
- WORD flags;
- OUString name;
-};
-
-typedef boost::unordered_map
-<
- OUString,
- DISPID,
- hashOUString_Impl,
- equalOUString_Impl
-> NameToIdMap;
-
-typedef boost::unordered_map
-<
- OUString,
- sal_Bool,
- hashOUString_Impl,
- equalOUString_Impl
-> BadNameMap;
-
-typedef boost::unordered_map
-<
- DISPID,
- MemberInfo
-> IdToMemberInfoMap;
-
-/*****************************************************************************
-
- class declaration: InterfaceOleWrapper_Impl
-
-*****************************************************************************/
-
-class InterfaceOleWrapper_Impl : public WeakImplHelper2<XBridgeSupplier2, XInitialization>,
- public IDispatchEx,
- public UnoConversionUtilities<InterfaceOleWrapper_Impl>,
- public IUnoObjectWrapper
-{
-public:
-
-
- InterfaceOleWrapper_Impl(Reference<XMultiServiceFactory>& xFactory, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass);
- ~InterfaceOleWrapper_Impl();
-
- /* IUnknown methods */
- STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj);
- STDMETHOD_(ULONG, AddRef)();
- STDMETHOD_(ULONG, Release)();
-
- /* IDispatch methods */
- STDMETHOD( GetTypeInfoCount )( unsigned int * pctinfo );
- STDMETHOD( GetTypeInfo )( unsigned int itinfo, LCID lcid, ITypeInfo ** pptinfo );
- STDMETHOD( GetIDsOfNames )( REFIID riid, OLECHAR ** rgszNames, unsigned int cNames,
- LCID lcid, DISPID * rgdispid );
- STDMETHOD( Invoke )( DISPID dispidMember, REFIID riid, LCID lcid, unsigned short wFlags,
- DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
- unsigned int * puArgErr );
-
- /* IDispatchEx methods */
-
- virtual HRESULT STDMETHODCALLTYPE GetDispID(
- /* [in] */ BSTR bstrName,
- /* [in] */ DWORD grfdex,
- /* [out] */ DISPID __RPC_FAR *pid);
-
- virtual /* [local] */ HRESULT STDMETHODCALLTYPE 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);
-
- virtual HRESULT STDMETHODCALLTYPE DeleteMemberByName(
- /* [in] */ BSTR bstr,
- /* [in] */ DWORD grfdex);
-
- virtual HRESULT STDMETHODCALLTYPE DeleteMemberByDispID(
- /* [in] */ DISPID id);
-
- virtual HRESULT STDMETHODCALLTYPE GetMemberProperties(
- /* [in] */ DISPID id,
- /* [in] */ DWORD grfdexFetch,
- /* [out] */ DWORD __RPC_FAR *pgrfdex);
-
- virtual HRESULT STDMETHODCALLTYPE GetMemberName(
- /* [in] */ DISPID id,
- /* [out] */ BSTR __RPC_FAR *pbstrName);
-
- virtual HRESULT STDMETHODCALLTYPE GetNextDispID(
- /* [in] */ DWORD grfdex,
- /* [in] */ DISPID id,
- /* [out] */ DISPID __RPC_FAR *pid);
-
- virtual HRESULT STDMETHODCALLTYPE GetNameSpaceParent(
- /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk);
-
- // XBridgeSupplier2 ---------------------------------------------------
- virtual Any SAL_CALL createBridge(const Any& modelDepObject,
- const Sequence<sal_Int8>& ProcessId,
- sal_Int16 sourceModelType,
- sal_Int16 destModelType)
- throw (IllegalArgumentException, RuntimeException);
-
- //XInitialization -----------------------------------------------------
- virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException);
-
- // IUnoObjectWrapper
- STDMETHOD( getWrapperXInterface)( Reference<XInterface>* pXInt);
- STDMETHOD( getOriginalUnoObject)( Reference<XInterface>* pXInt);
- STDMETHOD( getOriginalUnoStruct)( Any * pStruct);
-
- // UnoConversionUtility
- virtual Reference< XInterface > createUnoWrapperInstance();
- virtual Reference< XInterface > createComWrapperInstance();
-
-
-protected:
- virtual HRESULT doInvoke( DISPPARAMS * pdispparams, VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo, unsigned int * puArgErr, OUString & name, Sequence<Any>& params);
-
- virtual HRESULT doGetProperty( DISPPARAMS * pdispparams, VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo, OUString & name );
-
- virtual HRESULT doSetProperty( DISPPARAMS * pdispparams, VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo, unsigned int * puArgErr, OUString & name, Sequence<Any> params);
-
- virtual HRESULT InvokeGeneral( DISPID dispidMember, unsigned short wFlags,
- DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
- unsigned int * puArgErr, sal_Bool& bHandled);
-
- void convertDispparamsArgs( DISPID id, unsigned short wFlags, DISPPARAMS* pdispparams,
- Sequence<Any>& rSeq);
-
- sal_Bool getInvocationInfoForCall(DISPID id, InvocationInfo& info);
-
- Reference<XInvocation> m_xInvocation;
- Reference<XExactName> m_xExactName;
- Reference<XInterface> m_xOrigin;
- NameToIdMap m_nameToDispIdMap;
- vector<MemberInfo> m_MemberInfos;
- // This member is used to determine the default value
- // denoted by DISPID_VALUE (0). For proper results in JavaScript
- // we have to return the default value when we write an object
- // as out parameter. That is, we get an JScript Array as parameter
- // and put a wrapped object on index null. The array object tries
- // to detect the default value. The wrapped object must then return
- // its own IDispatch* otherwise we cannot access it within the script.
- // see InterfaceOleWrapper_Impl::Invoke
- VARTYPE m_defaultValueType;
-
-};
-
-/*****************************************************************************
-
- class declaration: UnoObjectWrapperRemoteOpt
- ( Uno Object Wrapper Remote Optimized)
- This is the UNO wrapper used in the service com.sun.star.bridge.OleBridgeSupplierVar1.
- Key features:
- DISPIDs are passed out blindly. That is in GetIDsOfNames is no name checking carried out.
- Only if Invoke fails the name is being checked. Moreover Invoke tries to figure out
- if a call is made to a property or method if the flags are DISPATCH_METHOD | DISPATCH_PROPERTYPUT.
- If something has been found out about a property or member than it is saved
- in a MemberInfo structure hold by a IdToMemberInfoMap stl map.
-
-*****************************************************************************/
-class UnoObjectWrapperRemoteOpt: public InterfaceOleWrapper_Impl
-{
-public:
- UnoObjectWrapperRemoteOpt( Reference<XMultiServiceFactory>& aFactory, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass);
- ~UnoObjectWrapperRemoteOpt();
-
- STDMETHOD( GetIDsOfNames )( REFIID riid, OLECHAR ** rgszNames, unsigned int cNames,
- LCID lcid, DISPID * rgdispid );
- STDMETHOD( Invoke )( DISPID dispidMember, REFIID riid, LCID lcid, unsigned short wFlags,
- DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
- unsigned int * puArgErr );
-
- // UnoConversionUtility
- // If UNO interfaces are converted in methods of this class then
- // they are always wrapped with instances of this class
- virtual Reference< XInterface > createUnoWrapperInstance();
-
-protected:
-
- HRESULT methodInvoke( DISPID dispidMember, DISPPARAMS * pdispparams, VARIANT * pvarResult,
- EXCEPINFO * pexcepinfo, unsigned int * puArgErr, Sequence<Any> params);
- // In GetIDsOfNames are blindly passed out, that is without verifying
- // the name. If two names are passed in during different calls to
- // GetIDsOfNames and the names differ only in their cases then different
- // id's are passed out ( e.g. "doSomethingMethod" or "dosomethingmethod").
- // In Invoke the DISPID is remapped to the name passed to GetIDsOfNames
- // and the name is used as parameter for XInvocation::invoke. If invoke
- // fails because of a wrong name, then m_xExactName ( XExactName) is used
- // to verify the name. The correct name is then inserted to m_MemberInfos
- // ( vector<MemberInfo> ). During the next call to Invoke the right name
- // is used. .
-
-
- BadNameMap m_badNameMap;
-
- IdToMemberInfoMap m_idToMemberInfoMap;
-
- DISPID m_currentId;
-
-
-};
-
-} // end namespace
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/unotypewrapper.cxx b/extensions/source/ole/unotypewrapper.cxx
deleted file mode 100644
index 7461d7d0e..000000000
--- a/extensions/source/ole/unotypewrapper.cxx
+++ /dev/null
@@ -1,181 +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 "unotypewrapper.hxx"
-#include "rtl/ustring.hxx"
-
-
-bool createUnoTypeWrapper(BSTR sTypeName, VARIANT * pVar)
-{
- bool ret = false;
- OSL_ASSERT(sTypeName && pVar);
- CComObject< UnoTypeWrapper>* pObj;
- VariantClear(pVar);
- if( SUCCEEDED( CComObject<UnoTypeWrapper>::CreateInstance( &pObj)))
- {
- pObj->AddRef();
- pVar->vt= VT_DISPATCH;
-#ifdef __MINGW32__
- pVar->pdispVal= CComQIPtr<IDispatch, &__uuidof(IDispatch)>(pObj->GetUnknown());
-#else
- pVar->pdispVal= CComQIPtr<IDispatch>(pObj->GetUnknown());
-#endif
- //now set the value, e.i. the name of the type
-#ifdef __MINGW32__
- CComQIPtr<IUnoTypeWrapper, &__uuidof(IUnoTypeWrapper)> spType(pVar->pdispVal);
-#else
- CComQIPtr<IUnoTypeWrapper> spType(pVar->pdispVal);
-#endif
- OSL_ASSERT(spType);
- if (SUCCEEDED(spType->put_Name(sTypeName)))
- {
- ret = true;
- }
- }
- return ret;
-}
-
-
-bool createUnoTypeWrapper(const rtl::OUString& sTypeName, VARIANT * pVar)
-{
- CComBSTR bstr(reinterpret_cast<LPCOLESTR>(sTypeName.getStr()));
- return createUnoTypeWrapper(bstr, pVar);
-}
-
-UnoTypeWrapper::UnoTypeWrapper()
-{
-}
-
-UnoTypeWrapper::~UnoTypeWrapper()
-{
-}
-
-
-// UnoTypeWrapper, IDispatch --------------------------------------------
-STDMETHODIMP UnoTypeWrapper::GetTypeInfoCount(UINT* /*pctinfo*/)
-{
- return E_NOTIMPL;
-}
-
-// UnoTypeWrapper, IDispatch --------------------------------------------
-STDMETHODIMP UnoTypeWrapper::GetTypeInfo( UINT /*iTInfo*/,
- LCID /*lcid*/,
- ITypeInfo** /*ppTInfo*/)
-{
- return E_NOTIMPL;
-}
-
-// UnoTypeWrapper, IDispatch --------------------------------------------
-STDMETHODIMP UnoTypeWrapper::GetIDsOfNames( REFIID /*riid*/,
- LPOLESTR *rgszNames,
- UINT /*cNames*/,
- LCID /*lcid*/,
- DISPID *rgDispId)
-{
- if( !rgDispId)
- return E_POINTER;
-
- HRESULT ret= S_OK;
- CComBSTR name(*rgszNames);
- name.ToLower();
-
- if( name == CComBSTR( L"name") )
- *rgDispId= DISPID_VALUE;
- else
- ret= DISP_E_UNKNOWNNAME;
-
- return ret;
-}
-
-// UnoTypeWrapper, IDispatch --------------------------------------------
-STDMETHODIMP UnoTypeWrapper::Invoke( DISPID dispIdMember,
- REFIID /*riid*/,
- LCID /*lcid*/,
- WORD wFlags,
- DISPPARAMS *pDispParams,
- VARIANT *pVarResult,
- EXCEPINFO* /*pExcepInfo*/,
- UINT* /*puArgErr*/)
-{
- if (pDispParams == NULL)
- return DISP_E_EXCEPTION;
-
- if( pDispParams->cNamedArgs)
- return DISP_E_NONAMEDARGS;
-
-
- HRESULT ret= S_OK;
- switch( dispIdMember)
- {
- case DISPID_VALUE: // DISPID_VALUE
- if (wFlags & DISPATCH_PROPERTYGET)
- {
- if (pVarResult == NULL)
- {
- ret = E_POINTER;
- break;
- }
- get_Name( & pVarResult->bstrVal);
- pVarResult->vt = VT_BSTR;
- }
- break;
- default:
- ret= DISP_E_MEMBERNOTFOUND;
- break;
- }
-
- return ret;
-}
-
-// IUnoTypeWrapper-----------------------
-STDMETHODIMP UnoTypeWrapper::put_Name(BSTR val)
-{
- Lock();
- HRESULT hr = S_OK;
- m_sName = val;
- Unlock();
- return hr;
-}
-
-// (UnoTypeWrapper-----------------------
-STDMETHODIMP UnoTypeWrapper::get_Name(BSTR *pVal)
-{
- Lock();
- HRESULT hr = S_OK;
- if( !pVal)
- return E_POINTER;
- *pVal = m_sName.Copy();
- Unlock();
- return hr;
-}
-
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/unotypewrapper.hxx b/extensions/source/ole/unotypewrapper.hxx
deleted file mode 100644
index 141aa3641..000000000
--- a/extensions/source/ole/unotypewrapper.hxx
+++ /dev/null
@@ -1,105 +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.
- *
- ************************************************************************/
-#ifndef UNO_TYPE_WRAPPER_HXX
-#define UNO_TYPE_WRAPPER_HXX
-
-#pragma warning (push,1)
-#pragma warning (disable:4548)
-
-#include <tools/presys.h>
-#define STRICT
-#define _WIN32_WINNT 0x0403
-#define _WIN32_DCOM
-#if OSL_DEBUG_LEVEL > 1
-#define _ATL_DEBUG_INTERFACES
-#endif
-#include <atlbase.h>
-extern CComModule _Module;
-#include <atlcom.h>
-
-#pragma warning (pop)
-#pragma warning (disable:4505)
- // disable "unreferenced local function has been removed" globally
-
-#include "comifaces.hxx"
-
-/* creates an UnoTypWrapper and sets the Name property to the value
- specified by sTypeName.
- Returns true if the object could be created and initialized.
- */
-bool createUnoTypeWrapper(BSTR sTypeName, VARIANT * pVariant);
-bool createUnoTypeWrapper(const rtl::OUString& sTypeName, VARIANT * pVar);
-
-class UnoTypeWrapper:
- public CComObjectRootEx<CComMultiThreadModel>,
- public IUnoTypeWrapper,
- public IDispatch
-{
-public:
- UnoTypeWrapper();
- virtual ~UnoTypeWrapper();
-
- BEGIN_COM_MAP(UnoTypeWrapper)
- COM_INTERFACE_ENTRY(IDispatch)
- COM_INTERFACE_ENTRY(IUnoTypeWrapper)
- END_COM_MAP()
-
- // IDispatch -------------------------------------------
- STDMETHOD( GetTypeInfoCount)(UINT *pctinfo);
-
- STDMETHOD( GetTypeInfo)( UINT iTInfo,
- LCID lcid,
- ITypeInfo **ppTInfo);
-
- STDMETHOD( GetIDsOfNames)( REFIID riid,
- LPOLESTR *rgszNames,
- UINT cNames,
- LCID lcid,
- DISPID *rgDispId);
-
- STDMETHOD( Invoke)( DISPID dispIdMember,
- REFIID riid,
- LCID lcid,
- WORD wFlags,
- DISPPARAMS *pDispParams,
- VARIANT *pVarResult,
- EXCEPINFO *pExcepInfo,
- UINT *puArgErr);
- // IUnoTypeWrapper --------------------------------------
- STDMETHOD(put_Name)(BSTR val);
- STDMETHOD(get_Name)(BSTR* pVal);
-
- CComBSTR m_sName;
-};
-
-// This here so that WIN_ULONG is used also in the magic macros above
-#include <tools/postsys.h>
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/windata.cxx b/extensions/source/ole/windata.cxx
deleted file mode 100644
index e4047e3b1..000000000
--- a/extensions/source/ole/windata.cxx
+++ /dev/null
@@ -1,42 +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 "windata.hxx"
-
-
-namespace ole_adapter
-{
-
-
-
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/ole/windata.hxx b/extensions/source/ole/windata.hxx
deleted file mode 100644
index fce3d4af5..000000000
--- a/extensions/source/ole/windata.hxx
+++ /dev/null
@@ -1,201 +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.
- *
- ************************************************************************/
-#ifndef AUTOMATION_BRIDGE_WINDATA_HXX
-#define AUTOMATION_BRIDGE_WINDATA_HXX
-
-#pragma warning (push,1)
-#pragma warning (disable:4668)
-#pragma warning (disable:4548)
-#include "oleidl.h"
-
-#include <atlbase.h>
-#pragma warning (pop)
-#include "osl/diagnose.h"
-
-namespace ole_adapter
-{
-//Wrapper for VARDESC
-class VarDesc
-{
- VARDESC* operator = (const VarDesc*);
- VarDesc(const VarDesc&);
-// Construction
-public:
- CComPtr< ITypeInfo > m_pTypeInfo;
- VARDESC* m_pVarDesc;
-
- VarDesc(ITypeInfo* pTypeInfo) :
- m_pVarDesc(NULL),
- m_pTypeInfo(pTypeInfo)
- {
- OSL_ASSERT(pTypeInfo);
- }
- ~VarDesc()
- {
- if (m_pVarDesc != NULL)
- {
- m_pTypeInfo->ReleaseVarDesc(m_pVarDesc);
- }
- }
-
- VARDESC* operator->()
- {
- return m_pVarDesc;
- }
-
- VARDESC** operator&()
- {
- return &m_pVarDesc;
- }
-
- operator VARDESC* ()
- {
- return m_pVarDesc;
- }
-};
-
-//Wrapper for FUNCDESC structure
-class FuncDesc
-{
- FUNCDESC* operator = (const FuncDesc &);
- FuncDesc(const FuncDesc&);
- CComPtr<ITypeInfo> m_pTypeInfo;
- FUNCDESC * m_pFuncDesc;
-
-public:
-
- FuncDesc(ITypeInfo * pTypeInfo) :
- m_pFuncDesc(NULL),
- m_pTypeInfo(pTypeInfo)
- {
- OSL_ASSERT(pTypeInfo);
- }
- ~FuncDesc()
- {
- ReleaseFUNCDESC();
- }
-
- FUNCDESC* operator -> ()
- {
- return m_pFuncDesc;
- }
-
- FUNCDESC** operator & ()
- {
- return & m_pFuncDesc;
- }
-
- operator FUNCDESC* ()
- {
- return m_pFuncDesc;
- }
-
- FUNCDESC* operator = (FUNCDESC* pDesc)
- {
- ReleaseFUNCDESC();
- m_pFuncDesc = pDesc;
- return m_pFuncDesc;
- }
- FUNCDESC* Detach()
- {
- FUNCDESC* pDesc = m_pFuncDesc;
- m_pFuncDesc = NULL;
- return pDesc;
- }
-
- void ReleaseFUNCDESC()
- {
- if (m_pFuncDesc != NULL)
- {
- m_pTypeInfo->ReleaseFuncDesc(m_pFuncDesc);
- }
- m_pFuncDesc = NULL;
- }
-};
-//Wrapper for EXCEPINFO structure
-class ExcepInfo : public EXCEPINFO
-{
- EXCEPINFO* operator = (const ExcepInfo& );
- ExcepInfo(const ExcepInfo &);
-public:
- ExcepInfo()
- {
- memset(this, 0, sizeof(ExcepInfo));
- }
- ~ExcepInfo()
- {
- if (bstrSource != NULL)
- ::SysFreeString(bstrSource);
- if (bstrDescription != NULL)
- ::SysFreeString(bstrDescription);
- if (bstrHelpFile != NULL)
- ::SysFreeString(bstrHelpFile);
- }
-};
-
-//Wrapper for TYPEATTR
-class TypeAttr
-{
- TYPEATTR* operator = (const TypeAttr &);
- TypeAttr(const TypeAttr &);
-public:
- CComPtr< ITypeInfo > m_pTypeInfo;
- TYPEATTR* m_pTypeAttr;
-
- TypeAttr(ITypeInfo* pTypeInfo) :
- m_pTypeAttr( NULL ),
- m_pTypeInfo( pTypeInfo )
- {
- OSL_ASSERT(pTypeInfo);
- }
- ~TypeAttr() throw()
- {
- if (m_pTypeAttr != NULL)
- {
- m_pTypeInfo->ReleaseTypeAttr(m_pTypeAttr);
- }
- }
-
- TYPEATTR** operator&() throw()
- {
- return &m_pTypeAttr;
- }
-
- TYPEATTR* operator->() throw()
- {
- return m_pTypeAttr;
- }
-};
-
-
-
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */