2025-04-27 07:49:33 -04:00

154 lines
2.8 KiB
C++

#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <objbase.h>
#include "filestr.h"
CFileStream::CFileStream():m_cRef(1)
{
m_pFile = NULL;
}
CFileStream::~CFileStream()
{
if(m_pFile)
fclose(m_pFile);
}
HRESULT CFileStream::QueryInterface(REFIID iid,void ** ppvObject)
{
if(iid == IID_IUnknown)
{
*ppvObject = (IUnknown *)this;
AddRef();
return S_OK;
}
else
{
if(iid == IID_IStream)
{
*ppvObject = (IStream*)this;
AddRef();
return S_OK;
}
}
return E_NOTIMPL;
}
ULONG CFileStream::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
ULONG CFileStream::Release()
{
if(InterlockedDecrement(&m_cRef)==0)
delete this;
return m_cRef;
}
HRESULT CFileStream::Read(void *pv,ULONG cb,ULONG *pcbRead)
{
HRESULT hr = S_OK;
*pcbRead = fread(pv, 1, cb, m_pFile);
return hr;
}
HRESULT CFileStream::Write(void const *pv,ULONG cb,ULONG *pcbWritten)
{
return E_FAIL;
}
HRESULT CFileStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
// We're in no position to fill in the last argument
if(plibNewPosition != NULL)
return E_FAIL;
// Map the IStream seek arguments to FILE seek argument
int origin = SEEK_SET;
switch(dwOrigin)
{
case STREAM_SEEK_SET:
origin = SEEK_SET; break;
case STREAM_SEEK_CUR:
origin = SEEK_CUR; break;
case STREAM_SEEK_END:
origin = SEEK_END; break;
}
// fseek return 0 if it succeeds
if(fseek(m_pFile, (long)dlibMove.LowPart, origin) == 0)
return S_OK;
return E_FAIL;
}
HRESULT CFileStream::SetSize(ULARGE_INTEGER libNewSize)
{
return E_FAIL;
}
HRESULT CFileStream::CopyTo(IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten)
{
return E_FAIL;
}
HRESULT CFileStream::Commit(DWORD grfCommitFlags)
{
return E_FAIL;
}
HRESULT CFileStream::Revert(void)
{
return E_FAIL;
}
HRESULT CFileStream::LockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)
{
return E_FAIL;
}
HRESULT CFileStream::UnlockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)
{
return E_FAIL;
}
HRESULT CFileStream::Stat(STATSTG *pstatstg,DWORD grfStatFlag)
{
// Get the file Handle
int hFile = _fileno(m_pFile);
// Get the length of the file
long lFileLength = 0;
if((lFileLength = _filelength(hFile)) == -1L)
return E_FAIL;
// Fill in the STATSTG structure
(pstatstg->cbSize).LowPart = lFileLength;
return S_OK;
}
HRESULT CFileStream::Clone(IStream **ppstm)
{
return E_FAIL;
}
HRESULT CFileStream::Initialize(LPCWSTR pszFileName)
{
HRESULT hr = E_FAIL;
if(m_pFile)
{
fclose(m_pFile);
m_pFile = NULL;
}
if(m_pFile = _wfopen(pszFileName, L"r"))
hr = S_OK;
return hr;
}