139 lines
4.1 KiB
C++
139 lines
4.1 KiB
C++
//
|
|
// Common stuff between RPC16.CXX and CPKT.CXX
|
|
//
|
|
|
|
typedef unsigned long RPCOLEDATAREP16;
|
|
|
|
#define RPCFLG_ASYNCHRONOUS 0x40000000
|
|
#define RPCFLG_INPUT_SYNCHRONOUS 0x20000000
|
|
|
|
typedef struct tagRPCOLEMESSAGE16
|
|
{
|
|
LPVOID reserved1;
|
|
RPCOLEDATAREP16 dataRepresentation;
|
|
LPVOID Buffer;
|
|
ULONG cbBuffer;
|
|
ULONG iMethod;
|
|
LPVOID reserved2[5];
|
|
ULONG rpcFlags;
|
|
} RPCOLEMESSAGE16, FAR *LPRPCOLEMESSAGE16;
|
|
|
|
typedef struct tagOTHERPKTDATA
|
|
{
|
|
IID iid;
|
|
ULONG cbSize;
|
|
} OTHERPKTDATA, FAR *LPOTHERPKTDATA;
|
|
|
|
interface IRpcChannelBuffer : public IUnknown
|
|
{
|
|
public:
|
|
virtual HRESULT STDMETHODCALLTYPE GetBuffer
|
|
(
|
|
RPCOLEMESSAGE16 *pMessage,
|
|
REFIID riid
|
|
) = 0;
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE SendReceive
|
|
(
|
|
RPCOLEMESSAGE16 *pMessage,
|
|
ULONG *pStatus
|
|
) = 0;
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE FreeBuffer
|
|
(
|
|
RPCOLEMESSAGE16 *pMessage
|
|
) = 0;
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE GetDestCtx
|
|
(
|
|
DWORD *pdwDestContext,
|
|
void **ppvDestContext
|
|
) = 0;
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE IsConnected
|
|
(
|
|
void
|
|
) = 0;
|
|
|
|
};
|
|
|
|
//
|
|
// 16-bit IRpcChannelBuffer interface, buffer-based
|
|
//
|
|
// This is the interface that will be seen by the 32-bit proxy implementations
|
|
//
|
|
class CRpcChannelBuffer : public IRpcChannelBuffer
|
|
{
|
|
public:
|
|
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,void **ppvObject);
|
|
ULONG STDMETHODCALLTYPE AddRef(void);
|
|
ULONG STDMETHODCALLTYPE Release(void);
|
|
|
|
HRESULT STDMETHODCALLTYPE GetBuffer(RPCOLEMESSAGE16 *pMessage,REFIID riid);
|
|
HRESULT STDMETHODCALLTYPE SendReceive(RPCOLEMESSAGE16 *pMessage,ULONG *pStatus);
|
|
HRESULT STDMETHODCALLTYPE FreeBuffer(RPCOLEMESSAGE16 *pMessage);
|
|
HRESULT STDMETHODCALLTYPE GetDestCtx(DWORD *pdwDestContext,void **ppvDestContext);
|
|
HRESULT STDMETHODCALLTYPE IsConnected( void);
|
|
private:
|
|
|
|
};
|
|
|
|
#define IID_CPkt IID_NULL
|
|
|
|
class FAR CPkt : public IStream // Passed between client, server
|
|
{
|
|
public:
|
|
STDMETHOD(QueryInterface) (REFIID iidInterface, void FAR* FAR* ppvObj);
|
|
STDMETHOD_(ULONG,AddRef) (void);
|
|
STDMETHOD_(ULONG,Release) (void);
|
|
STDMETHOD(Read) (VOID HUGEP* pv, ULONG cb, ULONG FAR* pcbRead);
|
|
STDMETHOD(Write) (VOID const HUGEP* pv, ULONG cb, ULONG FAR* pcbWritten);
|
|
STDMETHOD(Seek) (LARGE_INTEGER dlibMove, DWORD dwOrigin,
|
|
ULARGE_INTEGER FAR* plibNewPosition);
|
|
STDMETHOD(SetSize) (ULARGE_INTEGER cb);
|
|
STDMETHOD(CopyTo) (IStream FAR* pstm, ULARGE_INTEGER cb,
|
|
ULARGE_INTEGER FAR* pcbRead,
|
|
ULARGE_INTEGER FAR* pcbWritten);
|
|
STDMETHOD(Commit) (DWORD grfCommitFlags);
|
|
STDMETHOD(Revert) (void);
|
|
STDMETHOD(LockRegion) (ULARGE_INTEGER libOffset, ULARGE_INTEGER cb,
|
|
DWORD dwLockType);
|
|
STDMETHOD(UnlockRegion) (ULARGE_INTEGER libOffset, ULARGE_INTEGER cb,
|
|
DWORD dwLockType);
|
|
STDMETHOD(Stat) (STATSTG FAR* pstatstg, DWORD statflag);
|
|
STDMETHOD(Clone)(IStream FAR * FAR *ppstm);
|
|
|
|
STDMETHOD(SetRpcChannelBuffer) ( CRpcChannelBuffer FAR *pRpcCB );
|
|
STDMETHOD(CallRpcChannelBuffer) ( void );
|
|
|
|
static CPkt FAR* CreateForCall(IUnknown FAR *pUnk, REFIID iid,
|
|
int iMethod, BOOL fSend, BOOL fAsync,
|
|
DWORD size);
|
|
|
|
~CPkt() {}
|
|
|
|
ctor_dtor:
|
|
CPkt()
|
|
{
|
|
m_refs = 1;
|
|
m_pos = 0;
|
|
m_prcb = NULL;
|
|
|
|
memset( &m_rom16, 0, sizeof(m_rom16)); // Zero out RPCOLEMESSAGE16
|
|
memset( &m_opd, 0, sizeof(m_opd)); // Zero out OTHERPKTDATA
|
|
}
|
|
|
|
private:
|
|
ULONG m_refs; // Number of references to this CPkt
|
|
ULONG m_pos; // Seek pointer for Read/Write
|
|
|
|
CRpcChannelBuffer FAR * m_prcb; // IRpcChannelBuffer to call
|
|
|
|
RPCOLEMESSAGE16 m_rom16; // For IRpcChannelBuffer transportability
|
|
OTHERPKTDATA m_opd; // Saving of other info
|
|
|
|
|
|
// uninitialized CPkt
|
|
static CPkt FAR* Create(IUnknown FAR *pUnk, DWORD cbExt);
|
|
};
|