|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: ROSTMDIR.CXX
//
// Contents:
//
// Classes: Implements the CReadOnlyStreamDirect class.
//
// Functions:
//
// History: 12-21-95 JoeS (Joe Souza) Created
//
//----------------------------------------------------------------------------
#include <urlint.h>
#ifndef unix
#include "..\trans\transact.hxx"
#else
#include "../trans/transact.hxx"
#endif /* unix */
#include "rostmdir.hxx"
CReadOnlyStreamDirect::CReadOnlyStreamDirect(CTransData *pCTransData, DWORD grfBindF, BOOL fFile) : _CRefs() { DEBUG_ENTER((DBG_STORAGE, None, "CReadOnlyStreamDirect::CReadOnlyStreamDirect", "this=%#x, %#x, %#x", this, pCTransData, grfBindF )); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::CReadOnlyStreamDirect (pCTransData:%p)\n", NULL,pCTransData));
_pCTransData = pCTransData; _grfBindF = grfBindF; _fFile = fFile;
if (_pCTransData) { _pCTransData->AddRef(); }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::CReadOnlyStreamDirect \n", this));
DEBUG_LEAVE(0); }
CReadOnlyStreamDirect::~CReadOnlyStreamDirect() { DEBUG_ENTER((DBG_STORAGE, None, "CReadOnlyStreamDirect::~CReadOnlyStreamDirect", "this=%#x", this )); UrlMkDebugOut((DEB_ISTREAM, "%p IN/OUT CReadOnlyStreamDirect::~CReadOnlyStreamDirect\n", this)); if (_pCTransData) { _pCTransData->Release(); }
DEBUG_LEAVE(0); }
//+---------------------------------------------------------------------------
//
// Method: CReadOnlyStreamDirect::GetFileName
//
// Synopsis:
//
// Arguments: (none)
//
// Returns:
//
// History: 7-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
LPWSTR CReadOnlyStreamDirect::GetFileName() { DEBUG_ENTER((DBG_STORAGE, String, "CReadOnlyStreamDirect::GetFileName", "this=%#x", this )); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::GetFileName\n", this));
LPWSTR pwzFilename = NULL; LPWSTR pwzDupname = NULL;
if (_pCTransData) { pwzFilename = _pCTransData->GetFileName(); }
if (pwzFilename) { pwzDupname = OLESTRDuplicate(pwzFilename); }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::GetFileName (Filename:%ws)\n", this, pwzDupname));
DEBUG_LEAVE(pwzDupname); return pwzDupname; }
STDMETHODIMP CReadOnlyStreamDirect::QueryInterface (REFIID riid, LPVOID FAR* ppvObj) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IUnknown::QueryInterface", "this=%#x, %#x, %#x", this, &riid, ppvObj )); VDATETHIS(this); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::QueryInterface\n", this));
HRESULT hresult = NOERROR;
if ( IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IStream) ) { *ppvObj = this; AddRef(); } else if (_fFile && IsEqualIID(riid, IID_IWinInetFileStream)) { *ppvObj = (void *)(IWinInetFileStream *)this; AddRef(); } else { *ppvObj = NULL; hresult = E_NOINTERFACE; }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::QueryInterface\n", this));
DEBUG_LEAVE(hresult); return hresult; }
STDMETHODIMP_(ULONG) CReadOnlyStreamDirect::AddRef(void) { DEBUG_ENTER((DBG_STORAGE, Dword, "CReadOnlyStreamDirect::IUnknown::AddRef", "this=%#x", this )); GEN_VDATEPTRIN(this,ULONG,0L); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::AddRef\n", this));
LONG lRet = ++_CRefs;
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::::AddRef (%ld)\n", this, lRet));
DEBUG_LEAVE(lRet); return lRet; }
STDMETHODIMP_(ULONG) CReadOnlyStreamDirect::Release(void) { DEBUG_ENTER((DBG_STORAGE, Dword, "CReadOnlyStreamDirect::IUnknown::Release", "this=%#x", this )); GEN_VDATEPTRIN(this,ULONG,0L); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::Release\n", this)); UrlMkAssert((_CRefs > 0));
LONG lRet = --_CRefs; if (_CRefs == 0) { delete this; }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::Release (%ld)\n", this, lRet));
DEBUG_LEAVE(lRet); return lRet; }
HRESULT CReadOnlyStreamDirect::Read(THIS_ VOID HUGEP *pv, ULONG cb, ULONG FAR *pcbRead) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Read", "this=%#x, %#x, %#x, %#x", this, pv, cb, pcbRead )); HRESULT hresult = NOERROR; DWORD dwRead = 0;
UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::Read\n", this));
if( _pCTransData ) { hresult = _pCTransData->ReadHere((LPBYTE) pv, cb, &dwRead); if( hresult != S_OK && hresult != E_PENDING ) { // break connection with CTransData
CTransData *pCTD = _pCTransData; _pCTransData = 0; pCTD->Release(); } } else { hresult = S_FALSE; dwRead = 0; }
if (pcbRead) { *pcbRead = dwRead; }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::Read\n", this));
DEBUG_LEAVE(hresult); return(hresult); }
HRESULT CReadOnlyStreamDirect::Write(THIS_ VOID const HUGEP *pv, ULONG cb, ULONG FAR *pcbWritten) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Write", "this=%#x, %#x, %#x, %#x", this, pv, cb, pcbWritten )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::Write (NoOp)\n", this));
DEBUG_LEAVE(STG_E_ACCESSDENIED); return(STG_E_ACCESSDENIED); }
HRESULT CReadOnlyStreamDirect::Seek(THIS_ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER FAR *plibNewPosition) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Seek", "this=%#x, %#x, %#x, %#x", this, dlibMove, dwOrigin, plibNewPosition )); HRESULT hresult = NOERROR; UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::Seek (NoOp)\n", this)); // This is a true stream, and thus seeking is not possible.
if( _pCTransData ) { hresult = _pCTransData->Seek(dlibMove, dwOrigin, plibNewPosition); } else { hresult = S_FALSE; }
DEBUG_LEAVE(hresult); return hresult; }
HRESULT CReadOnlyStreamDirect::SetSize(THIS_ ULARGE_INTEGER libNewSize) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::SetSize", "this=%#x, %#x", this, libNewSize )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::SetSize (NoOp)\n", this));
// BUGBUG: Should we just return S_OK here?
DEBUG_LEAVE(E_FAIL); return(E_FAIL); }
HRESULT CReadOnlyStreamDirect::CopyTo(THIS_ LPSTREAM pStm, ULARGE_INTEGER cb, ULARGE_INTEGER FAR *pcbRead, ULARGE_INTEGER FAR *pcbWritten) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::CopyTo", "this=%#x, %#x, %#x, %#x, %#x", this, pStm, cb, pcbRead, pcbWritten )); HRESULT hresult = STG_E_INSUFFICIENTMEMORY; LPVOID memptr = NULL; DWORD readcount, writecount;
UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::CopyTo\n", this));
if (cb.HighPart || (pStm == NULL)) { hresult = E_INVALIDARG; goto CopyToExit; }
// do not need to copy to ourself
if (pStm == this) { hresult = NOERROR; goto CopyToExit; }
memptr = new BYTE [cb.LowPart];
if (memptr) { hresult = Read((LPBYTE) memptr, cb.LowPart, &readcount); if (hresult) { goto CopyToExit; }
if (pcbRead) { pcbRead->HighPart = 0; pcbRead->LowPart = readcount; }
hresult = pStm->Write(memptr, readcount, &writecount);
if (pcbWritten && !hresult) { pcbWritten->HighPart = 0; pcbWritten->LowPart = writecount; } }
CopyToExit:
if (memptr) { delete memptr; }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::CopyTo\n", this));
DEBUG_LEAVE(hresult); return(hresult); }
HRESULT CReadOnlyStreamDirect::Commit(THIS_ DWORD dwCommitFlags) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Commit", "this=%#x, %#x", this, dwCommitFlags )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::Commit (NoOp)\n", this));
// This is a read-only stream, so nothing to commit.
DEBUG_LEAVE(E_NOTIMPL); return(E_NOTIMPL); }
HRESULT CReadOnlyStreamDirect::Revert(THIS) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Revert", "this=%#x", this )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::Revert (NoOp)\n", this));
DEBUG_LEAVE(E_NOTIMPL); return(E_NOTIMPL); }
HRESULT CReadOnlyStreamDirect::LockRegion(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::LockRegion", "this=%#x, %#x, %#x, %#x", this, libOffset, cb, dwLockType )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::LockRegion (NoOp)\n", this));
DEBUG_LEAVE(E_NOTIMPL); return(E_NOTIMPL); }
HRESULT CReadOnlyStreamDirect::UnlockRegion(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::UnlockRegion", "this=%#x, %#x, %#x, %#x", this, libOffset, cb, dwLockType )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamDirect::UnlockRegion (NoOp)\n", this));
DEBUG_LEAVE(E_NOTIMPL); return(E_NOTIMPL); }
HRESULT CReadOnlyStreamDirect::Stat(THIS_ STATSTG FAR *pStatStg, DWORD grfStatFlag) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Stat", "this=%#x, %#x, %#x", this, pStatStg, grfStatFlag )); HRESULT hresult = E_FAIL;
UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::Stat\n", this));
if (pStatStg) { memset(pStatStg, 0, sizeof(STATSTG));
pStatStg->type = STGTY_STREAM; pStatStg->clsid = IID_IStream; pStatStg->pwcsName = GetFileName();
hresult = NOERROR; }
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::Stat\n", this));
DEBUG_LEAVE(hresult); return(hresult); }
HRESULT CReadOnlyStreamDirect::Clone(THIS_ LPSTREAM FAR *ppStm) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IStream::Clone", "this=%#x, %#x", this, ppStm )); HRESULT hresult = NOERROR;
UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamDirect::Clone\n", this));
if (!(*ppStm = new CReadOnlyStreamDirect(_pCTransData, _grfBindF))) hresult = E_OUTOFMEMORY;
UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamDirect::Clone\n", this));
DEBUG_LEAVE(hresult); return(hresult); }
HRESULT CReadOnlyStreamDirect::SetHandleForUnlock(THIS_ DWORD_PTR hWinInetLockHandle, DWORD_PTR dwReserved) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IWinInetFileStream::SetHandleForUnlock", "this=%#x, handle=%#x", this, hWinInetLockHandle ));
DEBUG_LEAVE(E_NOTIMPL); return E_NOTIMPL; }
HRESULT CReadOnlyStreamDirect::SetDeleteFile(THIS_ DWORD_PTR dwReserved) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamDirect::IWinInetFileStream::SetDeleteFile", "this=%#x", this ));
DEBUG_LEAVE(E_NOTIMPL); return E_NOTIMPL; }
|