diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2000-09-18 15:18:56 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2000-09-18 15:18:56 +0000 |
commit | 95117e7fefa9ae82431dcdffd1e58495730f6f54 (patch) | |
tree | 158386e9f19cda5c69023d678c4d3313435a206d /extensions/source/ole/unoobjw.hxx |
initial import
Diffstat (limited to 'extensions/source/ole/unoobjw.hxx')
-rw-r--r-- | extensions/source/ole/unoobjw.hxx | 505 |
1 files changed, 505 insertions, 0 deletions
diff --git a/extensions/source/ole/unoobjw.hxx b/extensions/source/ole/unoobjw.hxx new file mode 100644 index 000000000000..cd8d6ee929b9 --- /dev/null +++ b/extensions/source/ole/unoobjw.hxx @@ -0,0 +1,505 @@ +/************************************************************************* + * + * $RCSfile: unoobjw.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 16:16:41 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _UNOOBJW_HXX +#define _UNOOBJW_HXX + +#include <com/sun/star/script/XAllListener.hpp> +#include <com/sun/star/script/XEventAttacher.hpp> +#include <com/sun/star/bridge/XBridgeSupplier2.hpp> +#include <com/sun/star/beans/XExactName.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <vos/refernce.hxx> +#include <tools/presys.h> +#include "stdafx.h" +#include "comifaces.hxx" +#include <tools/postsys.h> + +#include "ole2uno.hxx" +#include "unoconversionutilities.hxx" + + +using namespace std; +using namespace cppu; +using namespace com::sun::star::bridge; +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; + } +}; + +typedef hash_map +< + IUnknown*, + Reference<XInterface>, + hash_IUnknown_Impl, + equal_to_IUnknown_Impl +> WrapperMap; + +typedef hash_map +< + DWORD, + OleRef<IDispatch>, + hash<DWORD>, + equal_to<DWORD> +> ConnectionMap; + +struct GenListenerData +{ + Any helper; + OUString listenerType; + OUString addListenerParam; + Reference<XEventListener> xGenListener; +}; + +typedef vector<GenListenerData> GenListenerDataList; + +struct MemberInfo +{ + MemberInfo() : flags(0), name() {} + MemberInfo(WORD f, const OUString& n) : flags(f), name(n) {} + + WORD flags; + OUString name; +}; + +typedef hash_map +< + OUString, + DISPID, + hashOUString_Impl, + equalOUString_Impl +> NameToIdMap; + +typedef hash_map +< + OUString, + sal_Bool, + hashOUString_Impl, + equalOUString_Impl +> BadNameMap; + +typedef hash_map +< + DISPID, + MemberInfo +> IdToMemberInfoMap; +/***************************************************************************** + + class declaration: EnumConnections_Impl + +*****************************************************************************/ + +//class EnumConnections_Impl : public IEnumConnections +//{ +//public: +// +// EnumConnections_Impl(CONNECTDATA* pConnection, ULONG numOfConn); +// ~EnumConnections_Impl(); +// +// /* IUnknown methods */ +// STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); +// STDMETHOD_(ULONG, AddRef)(); +// STDMETHOD_(ULONG, Release)(); +// +// /* IEnumConnections */ +// virtual /* [local] */ HRESULT STDMETHODCALLTYPE Next( +// /* [in] */ ULONG cConnections, +// /* [out] */ CONNECTDATA __RPC_FAR *rgcd, +// /* [out] */ ULONG __RPC_FAR *lpcFetched); +// +// virtual HRESULT STDMETHODCALLTYPE Skip( +// /* [in] */ ULONG cConnections); +// +// virtual HRESULT STDMETHODCALLTYPE Reset(void); +// +// virtual HRESULT STDMETHODCALLTYPE Clone( +// /* [out] */ IEnumConnections __RPC_FAR *__RPC_FAR *ppEnum); +// +//protected: +// +// vos::ORefCount m_refCount; +// CONNECTDATA* m_pConnection; +// ULONG m_numOfConn; +// ULONG m_index; +//}; + + +/***************************************************************************** + + class declaration: ConnectionPoint_Impl + +*****************************************************************************/ + + +//class ConnectionPoint_Impl : public IConnectionPoint +// , public WeakImplHelper1<XAllListener> +//{ +//public: +// +// ConnectionPoint_Impl(const Reference<XInvocation>& xInv, +// const Reference<XInterface>& xOrigin, +// const Reference<XEventAttacher>& xEventAttacher, +// IConnectionPointContainer* pContainer); +// +// ~ConnectionPoint_Impl(); +// +// /* IUnknown methods */ +// STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); +// STDMETHOD_(ULONG, AddRef)(); +// STDMETHOD_(ULONG, Release)(); +// +// /* IConnectionPoint */ +// virtual HRESULT STDMETHODCALLTYPE GetConnectionInterface( +// /* [out] */ IID __RPC_FAR *piid); +// +// virtual HRESULT STDMETHODCALLTYPE GetConnectionPointContainer( +// /* [out] */ IConnectionPointContainer __RPC_FAR *__RPC_FAR *ppCPC); +// +// virtual HRESULT STDMETHODCALLTYPE Advise( +// /* [in] */ IUnknown __RPC_FAR *pUnkSink, +// /* [out] */ DWORD __RPC_FAR *pdwCookie); +// +// virtual HRESULT STDMETHODCALLTYPE Unadvise( +// /* [in] */ DWORD dwCookie); +// +// virtual HRESULT STDMETHODCALLTYPE EnumConnections( +// /* [out] */ IEnumConnections __RPC_FAR *__RPC_FAR *ppEnum); +// +// +// +// /* XEventListener */ +// virtual void SAL_CALL disposing( const EventObject& Source ) throw(RuntimeException); +// +// /* XAllListener */ +// virtual void SAL_CALL firing( const AllEventObject& iaEvent ) throw(RuntimeException); +// virtual Any SAL_CALL approveFiring( const AllEventObject& aEvent ) throw(InvocationTargetException, RuntimeException); +// +// +//protected: +// +// void registerListener(); +// void unregisterListener(); +// +// vos::ORefCount m_refCount; +// Reference<XInvocation> m_xInvocation; +// Reference<XInterface> m_xOrigin; +// OleRef<IConnectionPointContainer> m_rContainer; +// ConnectionMap m_connection; +// DWORD m_nextCookie; +// Reference<XEventAttacher> m_xEventAttacher; +// GenListenerDataList m_xGenListenerList; +//}; + +/***************************************************************************** + + class declaration: EnumConnectionPoints_Impl + +*****************************************************************************/ + +//class EnumConnectionPoints_Impl : public IEnumConnectionPoints +//{ +//public: +// +// EnumConnectionPoints_Impl(OleRef<IConnectionPoint>* pPoints, ULONG numOfPoints); +// ~EnumConnectionPoints_Impl(); +// +// /* IUnknown methods */ +// STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); +// STDMETHOD_(ULONG, AddRef)(); +// STDMETHOD_(ULONG, Release)(); +// +// /* IEnumConnectionPoints */ +// virtual /* [local] */ HRESULT STDMETHODCALLTYPE Next( +// /* [in] */ ULONG cConnections, +// /* [out] */ IConnectionPoint __RPC_FAR *__RPC_FAR *rgpcn, +// /* [out] */ ULONG __RPC_FAR *lpcFetched); +// +// virtual HRESULT STDMETHODCALLTYPE Skip( +// /* [in] */ ULONG cConnections); +// +// virtual HRESULT STDMETHODCALLTYPE Reset(void); +// +// virtual HRESULT STDMETHODCALLTYPE Clone( +// /* [out] */ IEnumConnectionPoints __RPC_FAR *__RPC_FAR *ppEnum); +// +//protected: +// +// vos::ORefCount m_refCount; +// OleRef<IConnectionPoint>* m_pPoints; +// ULONG m_numOfPoints; +// ULONG m_index; +//}; + +/***************************************************************************** + + class declaration: InterfaceOleWrapper_Impl + +*****************************************************************************/ + +class InterfaceOleWrapper_Impl : public WeakImplHelper2<XBridgeSupplier2, XInitialization>, + public IDispatchEx, +// public IConnectionPointContainer, + 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); + + /* IConnectionPointContainer */ +// virtual HRESULT STDMETHODCALLTYPE EnumConnectionPoints( +// /* [out] */ IEnumConnectionPoints __RPC_FAR *__RPC_FAR *ppEnum); +// +// virtual HRESULT STDMETHODCALLTYPE FindConnectionPoint( +// /* [in] */ REFIID riid, +// /* [out] */ IConnectionPoint __RPC_FAR *__RPC_FAR *ppCP); + + //XInterface ---------------------------------------------------------- + void SAL_CALL InterfaceOleWrapper_Impl::acquire( ) throw(); + void SAL_CALL InterfaceOleWrapper_Impl::release( ) throw(); + + // 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< XSingleServiceFactory > getInvocationFactory(); + 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); + + sal_Bool convertVARIANTARGS( DISPID id, unsigned short wFlags, DISPPARAMS* pdispparams, + Sequence<Any>& rSeq); + + vos::ORefCount m_refCount; + Reference<XInvocation> m_xInvocation; + Reference<XExactName> m_xExactName; + Reference<XInterface> m_xOrigin; + Reference<XEventAttacher> m_xEventAttacher; + NameToIdMap m_nameToDispIdMap; + vector<MemberInfo> m_MemberInfos; + OleRef<IConnectionPoint> m_rConnectionPoint; + // 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; + +}; + + + +} // end namespace + +#endif |