summaryrefslogtreecommitdiffstats
path: root/private/oleauto/src/dispatch/dispps.h
blob: 84017ccc8d5bb9bc546edb0c362a0518ab581f39 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
/*** 
*dispps.h - IDispatch Proxy and Stub object header.
*
*  Copyright (C) 1992, Microsoft Corporation.  All Rights Reserved.
*  Information Contained Herein Is Proprietary and Confidential.
*
*Purpose:
*  This file describes the following IDispatch Proxy and Stub objects.
*
*  CProxDisp     -- the IDispatch proxy class
*    CPDUnkImpl	 -   CProxDisp implementation of IUnknown
*    CPDProxImpl -   CProxDisp implementation of IRpcProxy
*    CPDDispImpl -   CProxDisp implementation of IDispatch
*
*  CStubDisp     -- the IDispatch stub class
*
*Revision History:
*
* [00]	24-Sep-92 bradlo: Created.
*
*Implementation Notes:
*
*****************************************************************************/
#ifndef __dispps_h__
#define __dispps_h__


#pragma warning(4:4355)

// forward declarations
class FAR CProxDisp;
class FAR CStubDisp;


// IDispatch proxy class' IUnknown implementation
class FAR CPDUnkImpl : public IUnknown
{
public:
    
    STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
    STDMETHOD_(unsigned long, AddRef)(void);
    STDMETHOD_(unsigned long, Release)(void);
    
    CPDUnkImpl(CProxDisp FAR* pproxdisp);
    ~CPDUnkImpl();    
    
private:
    CProxDisp FAR* m_pproxdisp;
};

// IDispatch proxy class IRpcProxy implementation
class FAR CPDProxImpl : public IPROXY
{
public:
    CPDProxImpl(CProxDisp FAR* pproxdisp);
    ~CPDProxImpl();

    STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
    STDMETHOD_(unsigned long, AddRef)(void);
    STDMETHOD_(unsigned long, Release)(void);

    STDMETHOD(Connect)(ICHANNEL FAR* plrpc);
    STDMETHOD_(void, Disconnect)(void);

private:
    CProxDisp FAR* m_pproxdisp;
};

// IDispatch proxy class IDispatch implementation
class FAR CPDDispImpl : public IDispatch
{
public:

    CPDDispImpl(CProxDisp FAR* pproxdisp);
    ~CPDDispImpl();
	
    // IUnknown methods
    STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
    STDMETHOD_(unsigned long, AddRef)(void);
    STDMETHOD_(unsigned long, Release)(void);

    // IDispatch methods
    STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo);

    STDMETHOD(GetTypeInfo)(
      unsigned int itinfo,
      LCID lcid,
      ITypeInfo FAR* FAR* pptinfo);

    STDMETHOD(GetIDsOfNames)(
      REFIID riid,
      OLECHAR FAR* FAR* rgszNames,
      unsigned int cNames,
      LCID lcid,
      DISPID FAR* rgdispid);

    STDMETHOD(Invoke)(
      DISPID dispidMember,
      REFIID riid,
      LCID lcid,
      unsigned short wFlags,
      DISPPARAMS FAR* pdispparams,
      VARIANT FAR* pvarResult,
      EXCEPINFO FAR* pexcepinfo,
      unsigned int FAR* puArgErr);

    STDMETHOD(SysKind)();

private:
    CProxDisp FAR* m_pproxdisp;
    SYSKIND m_syskindStub;
};

// the IDispatch Proxy Class
class FAR CProxDisp
{
public:
    static IUnknown FAR* Create(IUnknown FAR* punkOuter, REFIID riid); 

private:
    CProxDisp(IUnknown FAR* punkOuter, REFIID riid);
    ~CProxDisp();

    friend CPDUnkImpl;
    friend CPDProxImpl;
    friend CPDDispImpl;

    CPDUnkImpl m_unk;
    CPDProxImpl m_proxy;
    CPDDispImpl m_disp;
    GUID m_dispInterface;

private:
    unsigned long m_refs;
    ICHANNEL FAR* m_plrpc;
    IUnknown FAR* m_punkOuter;
};

// IDispatch Stub Class
//
class FAR CStubDisp : public ISTUB
{
public:
    static HRESULT Create(IUnknown FAR* punkServer,
#if (defined(WIN32) || defined(WOW))
			  REFIID riid,
#endif
			  ISTUB FAR* FAR* ppstub);
	
    // IUnknown methods
    //
    STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
    STDMETHOD_(unsigned long, AddRef)(void);
    STDMETHOD_(unsigned long, Release)(void);
	
    // IRpcStub methods
    //
#if (OE_WIN32 || defined(WOW))
    STDMETHOD(Connect)(IUnknown FAR* pUnk);
    STDMETHOD_(void, Disconnect)(void);
    STDMETHOD(Invoke)(RPCOLEMESSAGE FAR* pRpcMsg, 
	      IRpcChannelBuffer FAR* pRpcChannel);
    STDMETHOD_(IRpcStubBuffer *, IsIIDSupported)(REFIID iid);
    STDMETHOD_(ULONG, CountRefs)(void);
    STDMETHOD(DebugServerQueryInterface)(void FAR* FAR* ppv);
    STDMETHOD_(void, DebugServerRelease)(void FAR* pv);
#else
    STDMETHOD(Connect)(IUnknown FAR* punkObject);
    STDMETHOD_(void, Disconnect)(void);              
    STDMETHOD(Invoke)(
      REFIID riid,
      int imeth,
      IStream FAR* pstm,
      unsigned long dwDestCtx,
      void FAR* pvDestCtx);
#if OE_MAC
    STDMETHOD_(unsigned long, IsIIDSupported)(REFIID riid);
#else
    STDMETHOD_(BOOL, IsIIDSupported)(REFIID riid);
#endif
    STDMETHOD_(unsigned long, CountRefs)(void);
#endif

private:	
    CStubDisp(void);
    ~CStubDisp(void);

    unsigned long m_refs;
    IUnknown FAR* m_punkObj;
    IDispatch FAR* m_pdispObj;
#if (defined(WIN32) || defined(WOW))
    IID m_iid;
#endif
};


// IDispatch method indices
//
#define IMETH_QUERYINTERFACE	0	/* Placeholder */
#define IMETH_ADDREF		1	/* Placeholder */
#define	IMETH_RELEASE		2	/* Placeholder */
#define IMETH_GETTYPEINFOCOUNT	3
#define IMETH_GETTYPEINFO	4
#define IMETH_GETIDSOFNAMES	5
#define IMETH_INVOKE		6
#define IMETH_SYSKIND		7


// the following structure is used to marshal the parameters
// for IDispatch::Invoke().
//
typedef struct tagMARSHAL_INVOKE MARSHAL_INVOKE;
struct tagMARSHAL_INVOKE {
    DISPID dispidMember;
    LCID lcid;
    unsigned long cArgs;
    unsigned long cNamedArgs;
    unsigned short wFlags;
    unsigned char flags;
};

#define MARSHAL_INVOKE_fHasResult    0x02
#define MARSHAL_INVOKE_fHasExcepinfo 0x04
#define MARSHAL_INVOKE_fHasArgErr    0x08


// IDispatch proxy routines -
// used by both the IDispatch proxy class and the Universal proxy class

HRESULT ProxyGetTypeInfoCount(ICHANNEL FAR* plrpc,
			      SYSKIND syskindStub,
			      unsigned int FAR* pctinfo);

HRESULT ProxyGetTypeInfo(ICHANNEL FAR* plrpc,
		         SYSKIND syskindStub,
			 unsigned int itinfo,
		         LCID lcid,
		         ITypeInfo FAR* FAR* pptinfo);

HRESULT ProxyGetIDsOfNames(ICHANNEL FAR* plrpc,
			   SYSKIND syskindStub,
			   REFIID riid,
			   OLECHAR FAR* FAR* rgszNames,
			   unsigned int cNames,
			   LCID lcid,
			   DISPID FAR* rgdispid);

HRESULT ProxyInvoke(ICHANNEL FAR* plrpc,
		    SYSKIND syskindStub,
		    DISPID dispidMember,
		    REFIID riid,
		    LCID lcid,
		    unsigned short wFlags,
		    DISPPARAMS FAR* pdispparams,
		    VARIANT FAR* pvarResult,
		    EXCEPINFO FAR* pexcepinfo,
		    unsigned int FAR* puArgErr);

// IDispatch Stub routines - 
// Used by both the IDispatch stub class, and the Universal stub class

HRESULT StubGetTypeInfoCount(IDispatch FAR* pdisp, IStream FAR* pstm);
HRESULT StubGetTypeInfo(IDispatch FAR* pdisp, IStream FAR* pstm);
HRESULT StubGetIDsOfNames(IDispatch FAR* pdisp, IStream FAR* pstm);
HRESULT StubInvoke(IDispatch FAR* pdisp, IStream FAR* pstm);

#endif __dispps_h__