// // 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); };