windows-nt/Source/XPSP1/NT/com/ole32/oleprx32/proxy/remunkps.hxx

256 lines
5.8 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------
//
// File: remunkps.hxx
//
// Contents: IRemoteUnnknown custom proxy/stub
//
// Classes: CRemUnknownFactory
// CRemUnknownSyncP
// CRemUnknownAsyncP
//
// History: 15-Dec-97 MattSmit Created
//
//--------------------------------------------------------------------
#include <remunk.h>
#include <odeth.h>
HRESULT RemUnkPSGetClassObject(REFIID riid, LPVOID * ppv);
//+-------------------------------------------------------------------
//
// Class: CRemUnknownFactory
//
// Synopsis: Custom factory for the proxy/stub for IRemUnknown.
//
//--------------------------------------------------------------------
class CRemUnknownFactory : public IPSFactoryBuffer
{
public:
CRemUnknownFactory() :
_cRefs(0)
{}
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, PVOID *pv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IPSFactoryBuffer
STDMETHOD(CreateProxy)(IUnknown *pUnkOuter,
REFIID riid,
IRpcProxyBuffer **ppProxy,
void **ppv);
STDMETHOD(CreateStub)(REFIID riid,
IUnknown *pUnkServer,
IRpcStubBuffer **ppStub);
private:
ULONG _cRefs; // ref count
};
//+-------------------------------------------------------------------
//
// Class: CRemUnknownSyncP
//
// Synopsis: Synchronous proxy for IRemUknown
//
//--------------------------------------------------------------------
class CRemUnknownSyncP : public ICallFactory
{
public:
class CRpcProxyBuffer : public IRpcProxyBuffer
{
public:
//+-------------------------------------------------------------------
//
// Class: CRemUnknownSyncP::CRpcProxyBuffer
//
// Synopsis: Internal Unknown and IRpcProxyBuffer implementation
// for CRemUnknownSyncP
//
//--------------------------------------------------------------------
CRpcProxyBuffer():
_cRefs(1)
{}
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, PVOID *pv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IRpcProxyBuffer
STDMETHOD(Connect)(IRpcChannelBuffer *pRpcChannelBuffer);
STDMETHOD_(void,Disconnect)(void);
private:
ULONG _cRefs;
};
CRemUnknownSyncP() :
_pCtrlUnk(NULL),
_pPrx(NULL)
{}
~CRemUnknownSyncP() ;
HRESULT Init(IUnknown *pUnkOuter,
REFIID riid,
IRpcProxyBuffer **ppProxy,
void **ppv);
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, PVOID *pv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// ICallFactory
STDMETHOD(CreateCall)(REFIID riid,
IUnknown *pCtrlUnk,
REFIID riid2,
IUnknown **ppv );
CRpcProxyBuffer _IntUnk; // inner unknown
IUnknown *_pCtrlUnk; // controlling unknown
IRpcProxyBuffer *_pPrx; // MIDL proxy for delegation
};
//+-------------------------------------------------------------------
//
// Class: CRemUnknownAsyncCallP
//
// Synopsis: Asynchronous proxy call objectfor IRemUknown
//
//--------------------------------------------------------------------
class CRemUnknownAsyncCallP : public AsyncIRemUnknown2
{
public:
class CRpcProxyBuffer : public IRpcProxyBuffer
{
public:
CRpcProxyBuffer() :
_cRefs(1)
{
}
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, PVOID *pv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IRpcProxyBuffer
STDMETHOD(Connect)(IRpcChannelBuffer *pRpcChannelBuffer);
STDMETHOD_(void,Disconnect)(void);
private:
ULONG _cRefs;
};
CRemUnknownAsyncCallP(IUnknown *pUnkOuter):
_pCtrlUnk(pUnkOuter),
_pChnl(NULL),
_hr(S_OK),
_cIids(0)
{
Win4Assert(_pCtrlUnk);
}
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, PVOID *pv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// AsyncIRemUnknown2
STDMETHOD(Begin_RemQueryInterface)
(
REFIPID ripid,
unsigned long cRefs,
unsigned short cIids,
IID *iids
);
STDMETHOD(Finish_RemQueryInterface)
(
REMQIRESULT **ppQIResults
);
STDMETHOD(Begin_RemAddRef)
(
unsigned short cInterfaceRefs,
REMINTERFACEREF InterfaceRefs[]
);
STDMETHOD(Finish_RemAddRef)
(
HRESULT *pResults
);
STDMETHOD(Begin_RemRelease)
(
unsigned short cInterfaceRefs,
REMINTERFACEREF InterfaceRefs[]
);
STDMETHOD(Finish_RemRelease)();
STDMETHOD(Begin_RemQueryInterface2)
(
REFIPID ripid,
unsigned short cIids,
IID *iids
);
STDMETHOD(Finish_RemQueryInterface2)
(
HRESULT *phr,
MInterfacePointer **ppMIF
);
CRpcProxyBuffer _IntUnk; // inner unknown
IUnknown *_pCtrlUnk; // conrtrolling unknown
IAsyncRpcChannelBuffer *_pChnl; // channel
RPCOLEMESSAGE _msg; // current message
DWORD _hr; // hr saved for Finish
unsigned short _cIids; // IID count cloned for Finish
};