//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: memstm.h // // Contents: class declarations and API's for memory streams // // Classes: MEMSTM (struct) // CMemStm // CMemBytes // CMarshalMemStm // CMarshalMemBytes // // Functions: // // History: dd-mmm-yy Author Comment // 31-Jan-95 t-ScottH added Dump methods to CMemStm and CMemBytes // (_DEBUG only) // 24-Jan-94 alexgo first pass converting to Cairo style // memory allocation // 09-Nov-93 alexgo 32bit port, added API declarations // 02-Dec-93 alexgo finished commenting and converting // to cairo standards //-------------------------------------------------------------------------- #if !defined( _MEMSTM_H_ ) #define _MEMSTM_H_ #include // CMutexSem #include #ifdef _DEBUG #include "dbgexts.h" #endif // _DEBUG /* * MemStm APIs */ STDAPI_(LPSTREAM) CreateMemStm(DWORD cb, LPHANDLE phMem); STDAPI_(LPSTREAM) CloneMemStm(HANDLE hMem); STDAPI_(void) ReleaseMemStm(LPHANDLE phMem, BOOL fInternalOnly); STDAPI CreateStreamOnHGlobal(HANDLE hGlobal, BOOL fDeleteOnRelease, LPSTREAM FAR * ppstm); STDAPI GetHGlobalFromStream(LPSTREAM pstm, HGLOBAL FAR *phglobal); STDAPI_(IUnknown FAR*) CMemStmUnMarshal(void); STDAPI_(IUnknown FAR*) CMemBytesUnMarshal(void); class FAR CMarshalMemStm; class FAR CMarshalMemBytes; //+------------------------------------------------------------------------- // // Class: MEMSTM // // Purpose: A structure to describe the global memroy // // Interface: // // History: dd-mmm-yy Author Comment // 09-Nov-93 alexgo 32bit port // // Notes: // // cRef counts all CMemStm pointers to this MEMSTM plus the number of times // a hMem handle to MEMSTM had been returned // //-------------------------------------------------------------------------- struct MEMSTM { // Data in shared memory DWORD cb; // Size of hGlobal DWORD cRef; // See below #ifdef NOTSHARED HANDLE hGlobal; // The data #else BYTE * m_pBuf; HANDLE hGlobal; #endif BOOL fDeleteOnRelease; }; #define STREAM_SIG (0x4d525453L) //+------------------------------------------------------------------------- // // Class: CRefMutexSem // // Purpose: A class that provides a refcounted CMutexSem object // // Interface: // // History: dd-mmm-yy Author Comment // 20-Sep-2000 mfeingol Created // // Notes: // class CRefMutexSem { protected: LONG m_lRefs; CMutexSem2 m_mxs; CRefMutexSem(); BOOL FInit(); public: static CRefMutexSem* CreateInstance(); ULONG STDMETHODCALLTYPE AddRef(); ULONG STDMETHODCALLTYPE Release(); void RequestCS(); void ReleaseCS(); const CMutexSem2* GetMutexSem(); }; // Autolock class for CRefMutexSem class CRefMutexAutoLock INHERIT_UNWIND_IF_CAIRO { EXPORTDEF DECLARE_UNWIND protected: CRefMutexSem* m_pmxs; public: CRefMutexAutoLock (CRefMutexSem* pmxs); ~CRefMutexAutoLock(); }; //+------------------------------------------------------------------------- // // Class: CMemStm // // Purpose: IStream on memory (shared mem for win16) // // Interface: IStream // // History: dd-mmm-yy Author Comment // 02-Dec-93 alexgo 32bit port // // Notes: // // CMemStm is a stream implementation on top of global shared memory MEMSTM // // CMemStm // +---------+ // + pvtf + Shared memory // +---------+ +--------------+ // + m_pMem +-->|cb | // +---------+ |cRef | // |hGlobal |--->+--------------+ // +--------------+ | Actual Data | // CMemStm MEMSTM +--------------+ //-------------------------------------------------------------------------- class FAR CMemStm : public IStream, public CPrivAlloc { public: STDMETHOD(QueryInterface) (REFIID iidInterface, void **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 *pcbWritten); STDMETHOD(Seek) (LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition); STDMETHOD(SetSize) (ULARGE_INTEGER cb); STDMETHOD(CopyTo) (IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *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 *pstatstg, DWORD statflag); STDMETHOD(Clone)(IStream **ppstm); STDSTATIC_(CMemStm FAR*) Create(HANDLE hMem, CRefMutexSem* pmxs); #ifdef _DEBUG HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel); friend DEBUG_EXTENSION_API(dump_cmemstm); #endif // _DEBUG ~CMemStm(); private: CMemStm(); DWORD m_dwSig; // Signature indicating this is our // implementation of // IStream: STREAM_SIG ULONG m_refs; // Number of references to this CmemStm ULONG m_pos; // Seek pointer for Read/Write HANDLE m_hMem; // Memory Handle passed on creation MEMSTM FAR* m_pData; // Pointer to that memroy CRefMutexSem* m_pmxs; // mutex for MultiThread protection friend HRESULT STDAPICALLTYPE GetHGlobalFromStream(LPSTREAM, HGLOBAL *); friend LPSTREAM STDAPICALLTYPE CreateMemStm(DWORD, LPHANDLE); friend class CMarshalMemStm; }; #define LOCKBYTE_SIG (0x0046574A) //+------------------------------------------------------------------------- // // Class: CMemBytes // // Purpose: an ILockBytes implementation atop (global shared in win16) // memory MEMSTM // // Interface: ILockBytes // // History: dd-mmm-yy Author Comment // 02-Dec-93 alexgo 32bit port // // Notes: // // CMemBytes // +---------+ // + pvtf + Shared memory // +---------+ +--------------+ // + m_pData +-->| cb | // +---------+ | cRef | // | hGlobal |--->+-------------+ // +--------------+ | Actual data | // CMemBytes MEMSTM +-------------+ // // cRef counts all CMemBytes pointers to this MEMSTM. // It and fDeleteOnRelease control the GlobalFree'ing of the hGlobal. // //-------------------------------------------------------------------------- class FAR CMemBytes : public ILockBytes, public CPrivAlloc { public: STDMETHOD(QueryInterface) (REFIID iidInterface, void FAR* FAR* ppvObj); STDMETHOD_(ULONG,AddRef) (void); STDMETHOD_(ULONG,Release) (void); STDMETHOD(ReadAt) (ULARGE_INTEGER ulOffset, VOID HUGEP *pv, ULONG cb, ULONG FAR *pcbRead); STDMETHOD(WriteAt) (ULARGE_INTEGER ulOffset, VOID const HUGEP *pv, ULONG cb, ULONG FAR *pcbWritten); STDMETHOD(Flush) (void); STDMETHOD(SetSize) (ULARGE_INTEGER cb); STDMETHOD(LockRegion) (ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); STDMETHOD(UnlockRegion) (ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); STDMETHOD(Stat) (THIS_ STATSTG FAR *pstatstg, DWORD statflag); STDSTATIC_(CMemBytes FAR*) Create(HANDLE hMem); #ifdef _DEBUG HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel); friend DEBUG_EXTENSION_API(dump_membytes); #endif // _DEBUG ctor_dtor: CMemBytes() { GET_A5(); m_hMem = NULL; m_pData = NULL; m_refs = 0; } ~CMemBytes() { // empty body } private: DWORD m_dwSig; // Signature indicating this // is our implementation of // ILockBytes: LOCKBYTE_SIG ULONG m_refs; // Normal reference count HANDLE m_hMem; // Handle for bookeeping info // (MEMSTM) MEMSTM FAR* m_pData; // Pointer to that memory friend HRESULT STDAPICALLTYPE GetHGlobalFromILockBytes(LPLOCKBYTES, HGLOBAL FAR*); friend class CMarshalMemBytes; SET_A5; }; #ifndef WIN32 // // THE MARSHALLING CLASSES BELOW ARE ONLY IN 16BIT OLE!!!! // //+------------------------------------------------------------------------- // // Class: CMarshalMemStm // // Purpose: provides marshalling for CMemStm's // // Interface: IMarshal // // History: dd-mmm-yy Author Comment // 02-Dec-93 alexgo 32bit port // 05-Dec-93 alexgo removed m_clsid // // Notes: // // CMarshalMemStm can Marshal, Unmarshal CMemStm. It is impletented as // a seperate object accessible from CMemStm, CMemBytes: QueryIntreface of // IMarshal on CMemStm's IStream will return an IMarshal pointer to // CMarshalMemStm, but QueryInterface of IStream on that IMarshal will // fail. // Also QueryInterface of IUnknown on IMarshal will not return the same value // As QueryInterface of IUnkown on the original IStream. // //-------------------------------------------------------------------------- class FAR CMarshalMemStm : public IMarshal { public: STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj); STDMETHOD_(ULONG,AddRef) (void); STDMETHOD_(ULONG,Release) (void); STDMETHOD(GetUnmarshalClass)(THIS_ REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPCLSID pCid); STDMETHOD(GetMarshalSizeMax)(THIS_ REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPDWORD pSize); STDMETHOD(MarshalInterface)(THIS_ IStream FAR* pStm, REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags); STDMETHOD(UnmarshalInterface)(THIS_ IStream FAR* pStm, REFIID riid, LPVOID FAR* ppv); STDMETHOD(ReleaseMarshalData)(THIS_ IStream FAR* pStm); STDMETHOD(DisconnectObject)(THIS_ DWORD dwReserved); STDSTATIC_(CMarshalMemStm FAR*) Create(CMemStm FAR* pMemStm); ctor_dtor: CMarshalMemStm() { GET_A5(); m_pMemStm = NULL; m_refs = 0; } ~CMarshalMemStm() { // empty body } private: ULONG m_refs; // Number of references to this CmemStm CMemStm FAR* m_pMemStm; // Pointer to object [Un]Marshalled SET_A5; }; //+------------------------------------------------------------------------- // // Class: CMarshalMemBytes // // Purpose: provides marshalling for CMemBytes // // Interface: IMarshal // // History: dd-mmm-yy Author Comment // 02-Dec-93 alexgo 32bit port // 05-Dec-93 alexgo removed m_clsid // // Notes: // // CMarshalMemBytes can Marshal, Unmarshal CMemBytes. It is impletented as // a seperate object accessible from CMemBytes, CMemBytes: QueryIntreface of // IMarshal on CMemBytes's ILocBytes will return an IMarshal pointer to // CMarshalMemBytes, but QueryInterface of ILockBytes on that IMarshal will // fail. // Also QueryInterface of IUnknown on IMarshal will not return the same value // As QueryInterface of IUnkown on the original ILockBytes. // //-------------------------------------------------------------------------- class FAR CMarshalMemBytes : public IMarshal { public: STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj); STDMETHOD_(ULONG,AddRef) (void); STDMETHOD_(ULONG,Release) (void); STDMETHOD(GetUnmarshalClass)(THIS_ REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPCLSID pCid); STDMETHOD(GetMarshalSizeMax)(THIS_ REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPDWORD pSize); STDMETHOD(MarshalInterface)(THIS_ IStream FAR* pStm, REFIID riid, LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags); STDMETHOD(UnmarshalInterface)(THIS_ IStream FAR* pStm, REFIID riid, LPVOID FAR* ppv); STDMETHOD(ReleaseMarshalData)(THIS_ IStream FAR* pStm); STDMETHOD(DisconnectObject)(THIS_ DWORD dwReserved); STDSTATIC_(CMarshalMemBytes FAR*) Create(CMemBytes FAR* pMemBytes); ctor_dtor: CMarshalMemBytes() { GET_A5(); m_pMemBytes = NULL; m_refs = 0; } ~CMarshalMemBytes() { // empty body } private: ULONG m_refs; // Number of references to // this CMemBytes CMemBytes FAR* m_pMemBytes; // Pointer to object // [Un]Marshalled SET_A5; }; #endif // !WIN32 #endif // _MemBytes_H