//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: ROSTMFIL.CXX // // Contents: // // Classes: Implements the CReadOnlyStreamFile class. // // Functions: // // History: 03-02-96 JoeS (Joe Souza) Created // //---------------------------------------------------------------------------- #include #ifndef unix #include "..\trans\transact.hxx" #else #include "../trans/transact.hxx" #endif /* unix */ #include "rostmdir.hxx" #include "rostmfil.hxx" //+--------------------------------------------------------------------------- // // Method: CReadOnlyStreamFile::GetFileName // // Synopsis: // // Arguments: (none) // // Returns: // // History: 7-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- LPWSTR CReadOnlyStreamFile::GetFileName() { DEBUG_ENTER((DBG_STORAGE, String, "CReadOnlyStreamFile::GetFileName", "this=%#x", this )); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::GetFileName\n", this)); LPWSTR pwzDupname = NULL; if (_pszFileName) { pwzDupname = DupA2W(_pszFileName); } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::GetFileName (Filename:%ws)\n", this, pwzDupname)); DEBUG_LEAVE(pwzDupname); return pwzDupname; } HRESULT CReadOnlyStreamFile::Create(LPSTR pszFileName, CReadOnlyStreamFile **ppCRoStm, LPCWSTR pwzURL) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::Create", "%.80q, %#x, %.80wq", pszFileName, ppCRoStm, pwzURL )); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::Create (pszFileName:%s)\n", NULL,pszFileName)); HRESULT hr = NOERROR; *ppCRoStm = NULL; if (pszFileName == NULL) { hr = E_INVALIDARG; } else { LPSTR pszStr = new CHAR [strlen(pszFileName) + 1]; if (pszStr == NULL) { hr = E_OUTOFMEMORY; } else { HANDLE handle = CreateFileA(pszFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (handle == INVALID_HANDLE_VALUE) { delete pszStr; hr = E_FAIL; } else { LPWSTR pwzStr = NULL; if (pwzURL) { pwzStr = OLESTRDuplicate(pwzURL); } strcpy(pszStr, pszFileName); CReadOnlyStreamFile *pCRoStm = new CReadOnlyStreamFile(pszStr, handle, pwzStr); if (pCRoStm == NULL) { delete pszStr; } else { *ppCRoStm = pCRoStm; } } } } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::Create (hr:%lx)\n", *ppCRoStm, hr)); DEBUG_LEAVE(hr); return hr; } CReadOnlyStreamFile::CReadOnlyStreamFile(LPSTR pszFileName, HANDLE handle, LPWSTR pwzURL) : CReadOnlyStreamDirect(NULL, 0, TRUE) { DEBUG_ENTER((DBG_STORAGE, None, "CReadOnlyStreamFile::CReadOnlyStreamFile", "this=%#x, %.80q, %#x, %.80wq", this, pszFileName, handle, pwzURL )); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::CReadOnlyStreamFile (pszFileName:%s)\n", NULL,pszFileName)); _hFileHandle = handle; _pszFileName = pszFileName; _fDataFullyAvailable = FALSE; _hWinInetLockHandle = NULL; _pwzURL = pwzURL; _fDeleteFile = FALSE; UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::CReadOnlyStreamFile \n", this)); DEBUG_LEAVE(0); } CReadOnlyStreamFile::~CReadOnlyStreamFile(void) { DEBUG_ENTER((DBG_STORAGE, None, "CReadOnlyStreamFile::~CReadOnlyStreamFile", "this=%#x", this )); UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::~CReadOnlyStreamFile (_pszFileName:%s)\n", this,_pszFileName)); if (_hFileHandle != INVALID_HANDLE_VALUE) { CloseHandle(_hFileHandle); } if (_pwzURL) { if (_fDeleteFile) { DeleteUrlCacheEntryW(_pwzURL); } delete [] _pwzURL; } if (_hWinInetLockHandle) { InternetUnlockRequestFile(_hWinInetLockHandle); _hWinInetLockHandle = NULL; } if (_pszFileName) { delete _pszFileName; } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::~CReadOnlyStreamFile\n", this)); DEBUG_LEAVE(0); } HRESULT CReadOnlyStreamFile::Read(THIS_ VOID HUGEP *pv, ULONG cb, ULONG FAR *pcbRead) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IStream::Read", "this=%#x, %#x, %x, %#x", this, pv, cb, pcbRead )); HRESULT hresult = NOERROR; UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::Read (cbBuffer:%lx)\n", this,cb)); DWORD dwRead = 0; if (!ReadFile(_hFileHandle, pv, cb, &dwRead, NULL)) { if (GetLastError() == ERROR_LOCK_VIOLATION) { hresult = STG_E_ACCESSDENIED; } else { hresult = E_FAIL; } if (pcbRead) { *pcbRead = 0; } } else { if (pcbRead) { *pcbRead = dwRead; } if (dwRead == 0) { hresult = (_fDataFullyAvailable) ? S_FALSE : E_PENDING; } } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::Read (hr:%lx, cdRead:%lx)\n", this, hresult, dwRead)); DEBUG_LEAVE(hresult); return(hresult); } HRESULT CReadOnlyStreamFile::Seek(THIS_ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER FAR *plibNewPosition) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IStream::Seek", "this=%#x, %#x, %x, %#x", this, dlibMove, dwOrigin, plibNewPosition )); HRESULT hresult = NOERROR; DWORD offslow, offshigh; UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::Seek\n", this)); offshigh = dlibMove.HighPart; offslow = dlibMove.LowPart; offslow = SetFilePointer(_hFileHandle, offslow, (LONG *)&offshigh, dwOrigin); if (offslow == -1 && GetLastError() != NO_ERROR) { hresult = E_FAIL; } else if (plibNewPosition) { plibNewPosition->HighPart = offshigh; plibNewPosition->LowPart = offslow; } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::Seek\n", this)); DEBUG_LEAVE(hresult); return(hresult); } HRESULT CReadOnlyStreamFile::CopyTo(THIS_ LPSTREAM pStm, ULARGE_INTEGER cb, ULARGE_INTEGER FAR *pcbRead, ULARGE_INTEGER FAR *pcbWritten) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::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 CReadOnlyStreamFile::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) { if (!ReadFile(_hFileHandle, memptr, cb.LowPart, &readcount, NULL)) { if (GetLastError() == ERROR_LOCK_VIOLATION) { hresult = STG_E_ACCESSDENIED; } else { hresult = E_FAIL; } 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 CReadOnlyStreamFile::CopyTo\n", this)); DEBUG_LEAVE(hresult); return(hresult); } HRESULT CReadOnlyStreamFile::LockRegion(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IStream::LockRegion", "this=%#x, %#x, %x, %x", this, libOffset, cb, dwLockType )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamFile::LockRegion (NoOp)\n", this)); DEBUG_LEAVE(E_NOTIMPL); return(E_NOTIMPL); } HRESULT CReadOnlyStreamFile::UnlockRegion(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IStream::UnlockRegion", "this=%#x, %#x, %x, %x", this, libOffset, cb, dwLockType )); UrlMkDebugOut((DEB_ISTREAM, "%p CReadOnlyStreamFile::UnlockRegion (NoOp)\n", this)); DEBUG_LEAVE(E_NOTIMPL); return(E_NOTIMPL); } HRESULT CReadOnlyStreamFile::Stat(THIS_ STATSTG FAR *pStatStg, DWORD grfStatFlag) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IStream::Stat", "this=%#x, %#x, %x", this, pStatStg, grfStatFlag )); HRESULT hresult = E_FAIL; DWORD sizelow, sizehigh; UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::Stat\n", this)); if (pStatStg) { memset(pStatStg, 0, sizeof(STATSTG)); pStatStg->type = STGTY_STREAM; pStatStg->clsid = IID_IStream; sizelow = GetFileSize(_hFileHandle, &sizehigh); if (sizelow == -1 && GetLastError() != NOERROR) { goto StatExit; } pStatStg->cbSize.HighPart = sizehigh; pStatStg->cbSize.LowPart = sizelow; pStatStg->pwcsName = GetFileName(); if (GetFileTime(_hFileHandle, &pStatStg->ctime, &pStatStg->atime, &pStatStg->mtime)) { pStatStg->grfMode = GENERIC_READ; pStatStg->grfLocksSupported = 0; pStatStg->clsid = IID_IStream; pStatStg->grfStateBits = 0; hresult = NOERROR; } } StatExit: UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::Stat\n", this)); DEBUG_LEAVE(hresult); return(hresult); } HRESULT CReadOnlyStreamFile::Clone(THIS_ LPSTREAM FAR *ppStm) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IStream::Clone", "this=%#x, %#x", this, ppStm )); HRESULT hr = NOERROR; CReadOnlyStreamFile *pCRoStm; UrlMkDebugOut((DEB_ISTREAM, "%p IN CReadOnlyStreamFile::Clone\n", this)); hr = Create(_pszFileName, &pCRoStm, _pwzURL); if (hr == NOERROR) { *ppStm = pCRoStm; } else { *ppStm = NULL; } UrlMkDebugOut((DEB_ISTREAM, "%p OUT CReadOnlyStreamFile::Clone (hr:%lx)\n", this, hr)); DEBUG_LEAVE(hr); return hr; } HRESULT CReadOnlyStreamFile::SetHandleForUnlock(THIS_ DWORD_PTR hWinInetLockHandle, DWORD_PTR dwReserved) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IWinInetFileStream::SetHandleForUnlock", "this=%#x, handle=%#x", this, hWinInetLockHandle )); HRESULT hr = E_FAIL; if (hWinInetLockHandle) { _hWinInetLockHandle = (HANDLE)hWinInetLockHandle; hr = S_OK; } DEBUG_LEAVE(hr); return hr; } HRESULT CReadOnlyStreamFile::SetDeleteFile(THIS_ DWORD_PTR dwReserved) { DEBUG_ENTER((DBG_STORAGE, Hresult, "CReadOnlyStreamFile::IWinInetFileStream::SetDeleteFile", "this=%#x, URL=%.80wq", this, _pwzURL )); _fDeleteFile = TRUE; DEBUG_LEAVE(S_OK); return S_OK; }