xref: /AOO41X/main/extensions/source/ole/unoobjw.hxx (revision 46dbaceef8c12a09e4905feda473ecab36e10d03)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _UNOOBJW_HXX
25 #define _UNOOBJW_HXX
26 
27 #include <com/sun/star/bridge/XBridgeSupplier2.hpp>
28 #include <com/sun/star/beans/XExactName.hpp>
29 #include <com/sun/star/lang/XInitialization.hpp>
30 #include <com/sun/star/script/InvocationInfo.hpp>
31 #include <vos/refernce.hxx>
32 
33 #include <tools/presys.h>
34 #include "comifaces.hxx"
35 #include <tools/postsys.h>
36 
37 #include "ole2uno.hxx"
38 #include "unoconversionutilities.hxx"
39 
40 //#define INVOCATION_SERVICE    L"com.sun.star.script.Invocation"
41 #define JSCRIPT_VALUE_FUNC  L"_GetValueObject"
42 #define GET_STRUCT_FUNC     L"_GetStruct"
43 #define BRIDGE_VALUE_FUNC L"Bridge_GetValueObject"
44 #define BRIDGE_GET_STRUCT_FUNC L"Bridge_GetStruct"
45 #define BRIDGE_CREATE_TYPE_FUNC L"Bridge_CreateType"
46 
47 #define DISPID_JSCRIPT_VALUE_FUNC   -10l
48 #define DISPID_GET_STRUCT_FUNC      -102
49 #define DISPID_CREATE_TYPE_FUNC     -103
50 
51 using namespace std;
52 using namespace cppu;
53 using namespace com::sun::star::bridge;
54 using namespace com::sun::star::script;
55 namespace ole_adapter
56 {
57 
58 
59 
60 struct hash_IUnknown_Impl
61 {
operator ()ole_adapter::hash_IUnknown_Impl62     size_t operator()(const IUnknown* p) const
63     {
64         return (size_t)p;
65     }
66 };
67 
68 struct equal_to_IUnknown_Impl
69 {
operator ()ole_adapter::equal_to_IUnknown_Impl70     bool operator()(const IUnknown* s1, const IUnknown* s2) const
71     {
72         return s1 == s2;
73     }
74 };
75 
76 
77 
78 struct MemberInfo
79 {
MemberInfoole_adapter::MemberInfo80     MemberInfo() : flags(0), name() {}
MemberInfoole_adapter::MemberInfo81     MemberInfo(WORD f, const OUString& n) : flags(f), name(n) {}
82 
83     WORD    flags;
84     OUString name;
85 };
86 
87 typedef hash_map
88 <
89     OUString,
90     DISPID,
91     hashOUString_Impl,
92     equalOUString_Impl
93 > NameToIdMap;
94 
95 typedef hash_map
96 <
97     OUString,
98     sal_Bool,
99     hashOUString_Impl,
100     equalOUString_Impl
101 > BadNameMap;
102 
103 typedef hash_map
104 <
105     DISPID,
106     MemberInfo
107 > IdToMemberInfoMap;
108 
109 /*****************************************************************************
110 
111     class declaration: InterfaceOleWrapper_Impl
112 
113 *****************************************************************************/
114 
115 class InterfaceOleWrapper_Impl : public WeakImplHelper2<XBridgeSupplier2, XInitialization>,
116                                  public IDispatchEx,
117                                  public UnoConversionUtilities<InterfaceOleWrapper_Impl>,
118                                  public IUnoObjectWrapper
119 {
120 public:
121 
122 
123     InterfaceOleWrapper_Impl(Reference<XMultiServiceFactory>& xFactory, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass);
124     ~InterfaceOleWrapper_Impl();
125 
126     /* IUnknown methods */
127     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj);
128     STDMETHOD_(ULONG, AddRef)();
129     STDMETHOD_(ULONG, Release)();
130 
131     /* IDispatch methods */
132     STDMETHOD( GetTypeInfoCount )( unsigned int * pctinfo );
133     STDMETHOD( GetTypeInfo )( unsigned int itinfo, LCID lcid, ITypeInfo ** pptinfo );
134     STDMETHOD( GetIDsOfNames )( REFIID riid, OLECHAR ** rgszNames, unsigned int cNames,
135                                 LCID lcid, DISPID * rgdispid );
136     STDMETHOD( Invoke )( DISPID dispidMember, REFIID riid, LCID lcid, unsigned short wFlags,
137                          DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
138                          unsigned int * puArgErr );
139 
140     /* IDispatchEx methods */
141 
142     virtual HRESULT STDMETHODCALLTYPE GetDispID(
143         /* [in] */ BSTR bstrName,
144         /* [in] */ DWORD grfdex,
145         /* [out] */ DISPID __RPC_FAR *pid);
146 
147     virtual /* [local] */ HRESULT STDMETHODCALLTYPE InvokeEx(
148         /* [in] */ DISPID id,
149         /* [in] */ LCID lcid,
150         /* [in] */ WORD wFlags,
151         /* [in] */ DISPPARAMS __RPC_FAR *pdp,
152         /* [out] */ VARIANT __RPC_FAR *pvarRes,
153         /* [out] */ EXCEPINFO __RPC_FAR *pei,
154         /* [unique][in] */ IServiceProvider __RPC_FAR *pspCaller);
155 
156     virtual HRESULT STDMETHODCALLTYPE DeleteMemberByName(
157         /* [in] */ BSTR bstr,
158         /* [in] */ DWORD grfdex);
159 
160     virtual HRESULT STDMETHODCALLTYPE DeleteMemberByDispID(
161         /* [in] */ DISPID id);
162 
163     virtual HRESULT STDMETHODCALLTYPE GetMemberProperties(
164         /* [in] */ DISPID id,
165         /* [in] */ DWORD grfdexFetch,
166         /* [out] */ DWORD __RPC_FAR *pgrfdex);
167 
168     virtual HRESULT STDMETHODCALLTYPE GetMemberName(
169         /* [in] */ DISPID id,
170         /* [out] */ BSTR __RPC_FAR *pbstrName);
171 
172     virtual HRESULT STDMETHODCALLTYPE GetNextDispID(
173         /* [in] */ DWORD grfdex,
174         /* [in] */ DISPID id,
175         /* [out] */ DISPID __RPC_FAR *pid);
176 
177     virtual HRESULT STDMETHODCALLTYPE GetNameSpaceParent(
178         /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk);
179 
180     // XBridgeSupplier2 ---------------------------------------------------
181     virtual Any SAL_CALL createBridge(const Any& modelDepObject,
182                                 const Sequence<sal_Int8>& ProcessId,
183                                 sal_Int16 sourceModelType,
184                                 sal_Int16 destModelType)
185             throw (IllegalArgumentException, RuntimeException);
186 
187     //XInitialization -----------------------------------------------------
188     virtual void SAL_CALL initialize( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException);
189 
190     // IUnoObjectWrapper
191     STDMETHOD( getWrapperXInterface)( Reference<XInterface>* pXInt);
192     STDMETHOD( getOriginalUnoObject)( Reference<XInterface>* pXInt);
193     STDMETHOD( getOriginalUnoStruct)( Any * pStruct);
194 
195     // UnoConversionUtility
196     virtual Reference< XInterface > createUnoWrapperInstance();
197     virtual Reference< XInterface > createComWrapperInstance();
198 
199 
200 protected:
201     virtual HRESULT doInvoke( DISPPARAMS * pdispparams, VARIANT * pvarResult,
202                               EXCEPINFO * pexcepinfo, unsigned int * puArgErr, OUString & name, Sequence<Any>& params);
203 
204     virtual HRESULT doGetProperty( DISPPARAMS * pdispparams, VARIANT * pvarResult,
205                                         EXCEPINFO * pexcepinfo, OUString & name );
206 
207     virtual HRESULT doSetProperty( DISPPARAMS * pdispparams, VARIANT * pvarResult,
208                                         EXCEPINFO * pexcepinfo, unsigned int * puArgErr, OUString & name, Sequence<Any> params);
209 
210     virtual HRESULT InvokeGeneral( DISPID dispidMember, unsigned short wFlags,
211                          DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
212                          unsigned int * puArgErr, sal_Bool& bHandled);
213 
214     void convertDispparamsArgs( DISPID id, unsigned short wFlags, DISPPARAMS* pdispparams,
215                             Sequence<Any>& rSeq);
216 
217     sal_Bool getInvocationInfoForCall(DISPID id, InvocationInfo& info);
218 
219 //  vos::ORefCount                      m_refCount;
220     Reference<XInvocation>                  m_xInvocation;
221     Reference<XExactName>                   m_xExactName;
222     Reference<XInterface>                   m_xOrigin;
223     NameToIdMap                     m_nameToDispIdMap;
224     vector<MemberInfo>              m_MemberInfos;
225     // This member is used to determine the default value
226     // denoted by DISPID_VALUE (0). For proper results in JavaScript
227     // we have to return the default value when we write an object
228     // as out parameter. That is, we get an JScript Array as parameter
229     // and put a wrapped object on index null. The array object tries
230     // to detect the default value. The wrapped object must then return
231     // its own IDispatch* otherwise we cannot access it within the script.
232     // see InterfaceOleWrapper_Impl::Invoke
233     VARTYPE                         m_defaultValueType;
234 
235 };
236 
237 /*****************************************************************************
238 
239     class declaration: UnoObjectWrapperRemoteOpt
240     ( Uno Object Wrapper Remote Optimized)
241     This is the UNO wrapper used in the service com.sun.star.bridge.OleBridgeSupplierVar1.
242     Key features:
243     DISPIDs are passed out blindly. That is in GetIDsOfNames is no name checking carried out.
244     Only if Invoke fails the name is being checked. Moreover Invoke tries to figure out
245     if a call is made to a property or method if the flags are DISPATCH_METHOD | DISPATCH_PROPERTYPUT.
246     If something has been found out about a property or member than it is saved
247     in a MemberInfo structure hold by a IdToMemberInfoMap stl map.
248 
249 *****************************************************************************/
250 class UnoObjectWrapperRemoteOpt: public InterfaceOleWrapper_Impl
251 {
252 public:
253     UnoObjectWrapperRemoteOpt( Reference<XMultiServiceFactory>& aFactory, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass);
254     ~UnoObjectWrapperRemoteOpt();
255 
256     STDMETHOD( GetIDsOfNames )( REFIID riid, OLECHAR ** rgszNames, unsigned int cNames,
257                                 LCID lcid, DISPID * rgdispid );
258     STDMETHOD( Invoke )( DISPID dispidMember, REFIID riid, LCID lcid, unsigned short wFlags,
259                          DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
260                          unsigned int * puArgErr );
261 
262     // UnoConversionUtility
263     // If UNO interfaces are converted in methods of this class then
264     // they are always wrapped with instances of this class
265     virtual Reference< XInterface > createUnoWrapperInstance();
266 
267 protected:
268 
269         HRESULT methodInvoke( DISPID dispidMember, DISPPARAMS * pdispparams, VARIANT * pvarResult,
270                               EXCEPINFO * pexcepinfo, unsigned int * puArgErr, Sequence<Any> params);
271     // In GetIDsOfNames are blindly passed out, that is without verifying
272     // the name. If two names are passed in during different calls to
273     // GetIDsOfNames and the names differ only in their cases then different
274     // id's are passed out ( e.g. "doSomethingMethod" or "dosomethingmethod").
275     // In Invoke the DISPID is remapped to the name passed to GetIDsOfNames
276     // and the name is used as parameter for XInvocation::invoke. If invoke
277     // fails because of a wrong name, then m_xExactName ( XExactName) is used
278     // to verify the name. The correct name is then inserted to m_MemberInfos
279     // ( vector<MemberInfo> ). During the next call to Invoke the right name
280     // is used.         .
281 
282 
283     BadNameMap m_badNameMap;
284 
285     IdToMemberInfoMap m_idToMemberInfoMap;
286 
287     DISPID m_currentId;
288 
289 
290 };
291 
292 
293 
294 } // end namespace
295 
296 #endif
297