windows-nt/Source/XPSP1/NT/multimedia/directx/dxvb/dx8vb/filestrm.cpp
2020-09-26 16:20:57 +08:00

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;
}