//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: CSTREAM.CXX // // Contents: // // Classes: Implements the IStream class. // // Functions: // // History: 12-01-95 JoeS (Joe Souza) Created // //---------------------------------------------------------------------------- #include #include #include "cstream.hxx" CStream::CStream(IStream *pStr) : _CRefs() { _pStream = pStr; } STDMETHODIMP CStream::QueryInterface (REFIID riid, LPVOID FAR* ppvObj) { VDATETHIS(this); UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::QueryInterface\n", this)); HRESULT hresult = NOERROR; if ( IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IStream) ) { *ppvObj = this; AddRef(); } else { *ppvObj = NULL; hresult = E_NOINTERFACE; } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::QueryInterface\n", this)); return hresult; } STDMETHODIMP_(ULONG) CStream::AddRef(void) { VDATETHIS(this); UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::AddRef\n", this)); LONG lRet = ++_CRefs; if (_pStream) _pStream->AddRef(); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::AddRef\n", this)); return lRet; } STDMETHODIMP_(ULONG) CStream::Release(void) { VDATETHIS(this); UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Release\n", this)); UrlMkAssert((_CRefs > 0)); LONG lRet = --_CRefs; if (_pStream) _pStream->Release(); if (_CRefs == 0) { delete this; } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Release\n", this)); return lRet; } HRESULT CStream::Read(THIS_ VOID HUGEP *pv, ULONG cb, ULONG FAR *pcbRead) { HRESULT hresult = E_FAIL; ULONG readcount; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Read\n", this)); if (_pStream) { #if 0 while (TRUE) { #endif hresult = _pStream->Read(pv, cb, &readcount); if (pcbRead) *pcbRead = readcount; #if 0 if (hresult != NOERROR) break; if (readcount == cb) break; hresult = BlockOnIFillLockBytes(this); // BUGBUG: if (hresult != S_OK) break; } #endif } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Read\n", this)); return(hresult); } HRESULT CStream::Write(THIS_ VOID const HUGEP *pv, ULONG cb, ULONG FAR *pcbWritten) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Write\n", this)); if (_pStream) hresult = _pStream->Write(pv, cb, pcbWritten); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Write\n", this)); return(hresult); } HRESULT CStream::Seek(THIS_ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER FAR *plibNewPosition) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Seek\n", this)); if (_pStream) hresult = _pStream->Seek(dlibMove, dwOrigin, plibNewPosition); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Seek\n", this)); return(hresult); } HRESULT CStream::SetSize(THIS_ ULARGE_INTEGER libNewSize) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::SetSize\n", this)); if (_pStream) hresult = _pStream->SetSize(libNewSize); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::SetSize\n", this)); return(hresult); } HRESULT CStream::CopyTo(THIS_ LPSTREAM pStm, ULARGE_INTEGER cb, ULARGE_INTEGER FAR *pcbRead, ULARGE_INTEGER FAR *pcbWritten) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::CopyTo\n", this)); if (_pStream) hresult = _pStream->CopyTo(pStm, cb, pcbRead, pcbWritten); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::CopyTo\n", this)); return(hresult); } HRESULT CStream::Commit(THIS_ DWORD dwCommitFlags) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Commit\n", this)); if (_pStream) hresult = _pStream->Commit(dwCommitFlags); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Commit\n", this)); return(hresult); } HRESULT CStream::Revert(THIS) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Revert\n", this)); if (_pStream) hresult = _pStream->Revert(); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Revert\n", this)); return(hresult); } HRESULT CStream::LockRegion(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::LockRegion\n", this)); if (_pStream) hresult = _pStream->LockRegion(libOffset, cb, dwLockType); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::LockRegion\n", this)); return(hresult); } HRESULT CStream::UnlockRegion(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::UnlockRegion\n", this)); if (_pStream) hresult = _pStream->UnlockRegion(libOffset, cb, dwLockType); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::UnlockRegion\n", this)); return(hresult); } HRESULT CStream::Stat(THIS_ STATSTG FAR *pStatStg, DWORD grfStatFlag) { HRESULT hresult = E_FAIL; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Stat\n", this)); if (_pStream) hresult = _pStream->Stat(pStatStg, grfStatFlag); UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Stat\n", this)); return(hresult); } HRESULT CStream::Clone(THIS_ LPSTREAM FAR *ppStm) { HRESULT hresult = E_FAIL; IStream *pStr, *pStrTop; UrlMkDebugOut((DEB_ISTREAM, "%p IN CStream::Clone\n", this)); *ppStm = NULL; if (_pStream) { hresult = _pStream->Clone(&pStr); if (hresult == S_OK) { if (!(pStrTop = new CStream(pStr))) { // BUGBUG: Delete pStr here! hresult = E_OUTOFMEMORY; goto CloneExit; } *ppStm = pStrTop; } } CloneExit: UrlMkDebugOut((DEB_ISTREAM, "%p OUT CStream::Clone\n", this)); return(hresult); }