232 lines
6.5 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
#ifndef _FILESTREAM_HXX
#define _FILESTREAM_HXX
#include <stdio.h>
#include "unknown.h"
class _FileStream : public _simpleunknown<IStream>
{
public:
_FileStream()
{
hFile = NULL;
read = true;
AddRef();
}
~_FileStream()
{
::CloseHandle(hFile);
}
bool open(LPTSTR name, bool read = true)
{
this->read = read;
if (read)
{
hFile = ::CreateFile(
name,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
else
{
hFile = ::CreateFile(
name,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
return (hFile == INVALID_HANDLE_VALUE) ? false : true;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Read(
/* [out] */ void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbRead)
{
if (!read) return E_FAIL;
DWORD len;
BOOL rc = ReadFile(
hFile, // handle of file to read
pv, // address of buffer that receives data
cb, // number of bytes to read
&len, // address of number of bytes read
NULL // address of structure for data
);
if (pcbRead)
*pcbRead = len;
return (rc) ? S_OK : E_FAIL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Write(
/* [size_is][in] */ const void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbWritten)
{
if (read) return E_FAIL;
BOOL rc = WriteFile(
hFile, // handle of file to write
pv, // address of buffer that contains data
cb, // number of bytes to write
pcbWritten, // address of number of bytes written
NULL // address of structure for overlapped I/O
);
return (rc) ? S_OK : E_FAIL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Seek(
/* [in] */ LARGE_INTEGER dlibMove,
/* [in] */ DWORD dwOrigin,
/* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE SetSize(
/* [in] */ ULARGE_INTEGER libNewSize) { return E_FAIL; }
virtual /* [local] */ HRESULT STDMETHODCALLTYPE CopyTo(
/* [unique][in] */ IStream __RPC_FAR *pstm,
/* [in] */ ULARGE_INTEGER cb,
/* [out] */ ULARGE_INTEGER __RPC_FAR *pcbRead,
/* [out] */ ULARGE_INTEGER __RPC_FAR *pcbWritten) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Commit(
/* [in] */ DWORD grfCommitFlags) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Revert( void) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE LockRegion(
/* [in] */ ULARGE_INTEGER libOffset,
/* [in] */ ULARGE_INTEGER cb,
/* [in] */ DWORD dwLockType) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE UnlockRegion(
/* [in] */ ULARGE_INTEGER libOffset,
/* [in] */ ULARGE_INTEGER cb,
/* [in] */ DWORD dwLockType) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Stat(
/* [out] */ STATSTG __RPC_FAR *pstatstg,
/* [in] */ DWORD grfStatFlag) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Clone(
/* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm) { return E_FAIL; }
private:
HANDLE hFile;
bool read;
};
class _MemoryStream : public _simpleunknown <IStream>
{
public:
_MemoryStream(LPBYTE pData, DWORD dwSize)
{
m_pBase=pData;
m_pData=m_pBase;
m_dwSize=dwSize;
m_dwLoc=0;
read = true;
AddRef();
}
~_MemoryStream()
{
}
bool open(LPTSTR name, bool read = true)
{
return FALSE;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Read(
/* [out] */ void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbRead)
{
if (!read) return E_FAIL;
#ifdef _VERY_DEBUG
TCHAR szText[1024];
wsprintf(szText,TEXT("Reading %d bytes, we have %d"), cb, m_dwSize-m_dwLoc);
MessageBox(NULL, szText, TEXT("Reading"), MB_OK);
#endif
if( m_dwLoc == m_dwSize )
return S_FALSE ;
ULONG free=m_dwSize-m_dwLoc;
if( cb > free )
cb = free;
*pcbRead=cb;
CopyMemory( pv, m_pData, cb );
m_pData+=cb;
m_dwLoc+=cb;
return S_OK;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Write(
/* [size_is][in] */ const void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbWritten)
{
if (read) return E_FAIL;
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Seek(
/* [in] */ LARGE_INTEGER dlibMove,
/* [in] */ DWORD dwOrigin,
/* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE SetSize(
/* [in] */ ULARGE_INTEGER libNewSize) { return E_FAIL; }
virtual /* [local] */ HRESULT STDMETHODCALLTYPE CopyTo(
/* [unique][in] */ IStream __RPC_FAR *pstm,
/* [in] */ ULARGE_INTEGER cb,
/* [out] */ ULARGE_INTEGER __RPC_FAR *pcbRead,
/* [out] */ ULARGE_INTEGER __RPC_FAR *pcbWritten) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Commit(
/* [in] */ DWORD grfCommitFlags) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Revert( void) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE LockRegion(
/* [in] */ ULARGE_INTEGER libOffset,
/* [in] */ ULARGE_INTEGER cb,
/* [in] */ DWORD dwLockType) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE UnlockRegion(
/* [in] */ ULARGE_INTEGER libOffset,
/* [in] */ ULARGE_INTEGER cb,
/* [in] */ DWORD dwLockType) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Stat(
/* [out] */ STATSTG __RPC_FAR *pstatstg,
/* [in] */ DWORD grfStatFlag) { return E_FAIL; }
virtual HRESULT STDMETHODCALLTYPE Clone(
/* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm) { return E_FAIL; }
private:
LPBYTE m_pBase;
LPBYTE m_pData;
bool read;
ULONG m_dwSize;
ULONG m_dwLoc;
};
#endif // _FILESTREAM_HXX