//+------------------------------------------------------------------- // // File: actstrm.hxx // // Contents: code for providing a stream with an IBuffer interface // as well as providing marshalled interface data for // RPC. // // Classes: ActivationStream // // Functions: None. // // History: 04-Feb-98 Vinaykr ActivationStream // //-------------------------------------------------------------------- #ifndef __ACTSTRM_HXX__ #define __ACTSTRM_HXX__ #include // InterfaceData #include #define ActMemAlloc(cb) MIDL_user_allocate(cb) #define ActMemFree(pv) MIDL_user_free(pv) //+------------------------------------------------------------------- // // Class: ActivationStream // // Purpose: Stream wrapper for an InterfaceData structure, // the construct that is transmitted by Rpc in place of an // interface pointer. // // History: 30-Jan-93 Ricksa Created // // Notes: // //-------------------------------------------------------------------- class ActivationStream : public IStream, public IBuffer { public: ActivationStream(void); ActivationStream(ULONG ulMaxSize); ActivationStream(InterfaceData *pOIR); ~ActivationStream(void); 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); ActivationStream *Clone(); // Methods for IBuffer STDMETHOD(GetOrCreateBuffer)(DWORD dwReq, DWORD *pdwLen, BYTE **ppBuff); STDMETHOD(GetBuffer)(DWORD *pdwLength, BYTE **ppBuff); STDMETHOD(GetLength)(DWORD *pdwLength); STDMETHOD(GetCopy)(BYTE *ppBuff); STDMETHOD(SetPosition)(DWORD dwLenFromEnd, DWORD dwPosFromStart); STDMETHOD(SetBuffer)(DWORD dwLength, BYTE *pBuff); STDMETHOD(SetCopyAlignment)(DWORD alignment); void AssignSerializedInterface(InterfaceData **ppIFD); private: LONG _clRefs; // reference count LONG _lOffset; // current ptr LONG _cSize; // number of bytes written ULONG _cbData; // size of data InterfaceData *_pifData; // ptr to data BOOL _fFree; // TRUE - destructor frees data DWORD _copyAlignment; }; inline ActivationStream::ActivationStream(void) : _clRefs(1), _lOffset(0), _cSize(0), _pifData(NULL), _cbData(0), _fFree(TRUE), _copyAlignment(1) { _pifData = (InterfaceData *) ActMemAlloc(sizeof(DWORD) + 512); _cbData = _pifData == NULL ? 0 : 512; } inline ActivationStream::ActivationStream(ULONG ulMaxSize) : _clRefs(1), _lOffset(0), _cSize(0), _pifData(NULL), _cbData(0), _fFree(TRUE), _copyAlignment(1) { _pifData = (InterfaceData *) ActMemAlloc(sizeof(DWORD) + ulMaxSize); _cbData = _pifData == NULL ? 0 : ulMaxSize; } inline ActivationStream::ActivationStream(InterfaceData *pIFD) : _clRefs(1), _lOffset(0), _cSize(0), _pifData(pIFD), _fFree(FALSE), _copyAlignment(1) { _cbData = _pifData == NULL ? 0 : pIFD->ulCntData; } inline ActivationStream::~ActivationStream(void) { if (_fFree) { ActMemFree(_pifData); } } inline void ActivationStream::AssignSerializedInterface(InterfaceData **ppIFD) { // Offset of next byte to be written is assumed // to be size of the buffer since all writing s/b // sequential. *ppIFD = _pifData; if (_cSize) (*ppIFD)->ulCntData = _cSize; else (*ppIFD)->ulCntData = _cbData; // Tell destructor not to free this buffer as some one // else owns the destruction now. _fFree = FALSE; } extern HRESULT GetActivationStreamCF(REFIID riid, void** ppv); #endif // __ACTSTRM_HXX__