| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the 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 <vos/refernce.hxx> |
| |
| #include <tools/presys.h> |
| #include "comifaces.hxx" |
| #include <tools/postsys.h> |
| |
| #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 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: 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); |
| |
| // vos::ORefCount m_refCount; |
| 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 |