diff options
Diffstat (limited to 'private/ole32/ole232/inc/memstm.h')
-rw-r--r-- | private/ole32/ole232/inc/memstm.h | 390 |
1 files changed, 390 insertions, 0 deletions
diff --git a/private/ole32/ole232/inc/memstm.h b/private/ole32/ole232/inc/memstm.h new file mode 100644 index 000000000..0b4483c41 --- /dev/null +++ b/private/ole32/ole232/inc/memstm.h @@ -0,0 +1,390 @@ + +//+------------------------------------------------------------------------- +// +// 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 <sem.hxx> // CMutexSem + +#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: 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); + + #ifdef _DEBUG + + HRESULT Dump(char **ppszDump, ULONG ulFlag, int nIndentLevel); + + friend DEBUG_EXTENSION_API(dump_cmemstm); + + #endif // _DEBUG + + CMemStm(); + ~CMemStm(); + +private: + 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 + CMutexSem m_mxs; // 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 |