140 lines
2.9 KiB
C++
140 lines
2.9 KiB
C++
|
/*//////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// File: filestrm.cpp
|
||
|
//
|
||
|
// Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// @@BEGIN_MSINTERNAL
|
||
|
//
|
||
|
// History:
|
||
|
// -@- (craigp) - created
|
||
|
// -@- 09/23/99 (mikemarr) - copyright, started history
|
||
|
// -@- 07/15/00 (andrewke) - replicated in DXVB dir
|
||
|
//
|
||
|
// @@END_MSINTERNAL
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////*/
|
||
|
|
||
|
#include "Filestrm.h"
|
||
|
|
||
|
CFileStream::CFileStream(LPCTSTR filename, BOOL bRead, BOOL bTruncate, HRESULT *error)
|
||
|
{
|
||
|
m_hfile = CreateFile(filename, bRead ? GENERIC_READ : GENERIC_WRITE, 0, NULL,
|
||
|
(bTruncate ? CREATE_ALWAYS : OPEN_EXISTING), FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
if (error)
|
||
|
{
|
||
|
ULONG foo = GetLastError();
|
||
|
if (m_hfile == INVALID_HANDLE_VALUE)
|
||
|
*error = E_FAIL;
|
||
|
else
|
||
|
*error = NOERROR;
|
||
|
}
|
||
|
m_cRef = 1;
|
||
|
}
|
||
|
|
||
|
CFileStream::~CFileStream()
|
||
|
{
|
||
|
CloseHandle(m_hfile);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CFileStream::AddRef(void)
|
||
|
{
|
||
|
return m_cRef++;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CFileStream::Release(void)
|
||
|
{
|
||
|
if (--m_cRef != 0)
|
||
|
return m_cRef;
|
||
|
|
||
|
delete this;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CFileStream::QueryInterface(REFIID riid, LPVOID FAR *ppv)
|
||
|
{
|
||
|
*ppv=NULL;
|
||
|
if (riid == IID_IUnknown)
|
||
|
*ppv=(IUnknown*)this;
|
||
|
else if (riid == IID_IStream)
|
||
|
*ppv=(IStream*)this;
|
||
|
else
|
||
|
return E_NOINTERFACE;
|
||
|
((LPUNKNOWN)*ppv)->AddRef();
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CFileStream::Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead)
|
||
|
{
|
||
|
DWORD read;
|
||
|
BOOL result = ReadFile(m_hfile, pv, cb, &read, NULL);
|
||
|
if (pcbRead)
|
||
|
*pcbRead = read;
|
||
|
if (result)
|
||
|
return S_OK;
|
||
|
else
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CFileStream::Write(const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten)
|
||
|
{
|
||
|
DWORD written;
|
||
|
BOOL result = WriteFile(m_hfile, pv, cb, &written, NULL);
|
||
|
if (pcbWritten)
|
||
|
*pcbWritten = written;
|
||
|
if (result)
|
||
|
return S_OK;
|
||
|
else
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CFileStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition)
|
||
|
{
|
||
|
LONG movelow;
|
||
|
LONG movehigh;
|
||
|
|
||
|
movelow = dlibMove.LowPart;
|
||
|
movehigh = dlibMove.HighPart;
|
||
|
|
||
|
DWORD moveMethod;
|
||
|
switch (dwOrigin)
|
||
|
{
|
||
|
case STREAM_SEEK_SET: moveMethod = FILE_BEGIN; break;
|
||
|
case STREAM_SEEK_CUR: moveMethod = FILE_CURRENT; break;
|
||
|
case STREAM_SEEK_END: moveMethod = FILE_END; break;
|
||
|
default: return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
DWORD result = SetFilePointer(m_hfile, movelow, &movehigh, moveMethod);
|
||
|
|
||
|
if (plibNewPosition)
|
||
|
{
|
||
|
plibNewPosition->LowPart = result;
|
||
|
plibNewPosition->HighPart = movehigh;
|
||
|
}
|
||
|
|
||
|
if (result != -1)
|
||
|
return NOERROR;
|
||
|
else
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CFileStream::Stat(STATSTG __RPC_FAR *pstatstg, DWORD grfStatFlag)
|
||
|
{
|
||
|
memset(pstatstg, 0, sizeof(STATSTG));
|
||
|
|
||
|
pstatstg->pwcsName = NULL;
|
||
|
pstatstg->type = STGTY_STREAM;
|
||
|
|
||
|
pstatstg->cbSize.LowPart = GetFileSize(m_hfile, &pstatstg->cbSize.HighPart);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|