WindowsXP-SP1/enduser/stuff/hhctrl/cstream.h

65 lines
1.8 KiB
C++

#ifndef _CSTREAM_INCLUDED
#define _CSTREAM_INCLUDED
static const UINT CSTREAM_BUF_SIZE = (64 * 1024);
static const UINT HFILE_NOTREAD = ((UINT) -2);
static const UINT DUAL_CSTREAM_BUF_SIZE = (8 * 1024);
#define chEOF ((unsigned char) 255)
class CStream
{
public:
CStream(PCSTR pszFileName);
~CStream(void);
int STDCALL seek(int pos, SEEK_TYPE seek = SK_SET);
int Remaining() { return (int)(pEndBuf - pCurBuf); };
#ifndef _DEBUG
char cget() {
if (pCurBuf < pEndBuf)
return (char) *pCurBuf++;
else if (pEndBuf < pbuf + cbBuf) {
m_fEndOfFile = TRUE;
return chEOF; // WARNING! check m_fEndOfFile to confirm return of chEOF is valid
}
else
return ReadBuf();
};
#else
char cget();
#endif
int tell(void) const { return lFileBuf + (int)(pCurBuf - pbuf); };
BOOL STDCALL doRead(void* pbDst, int cbBytes) {
return (read(pbDst, cbBytes) == (UINT) cbBytes);
}
UINT STDCALL read(void* pbDst, int cbBytes);
char ReadBuf(void);
friend DWORD WINAPI ReadAhead(LPVOID pv);
void Cleanup(void);
BOOL fInitialized;
PBYTE pCurBuf; // current position in the buffer
PBYTE pEndBuf; // last position in buffer
BOOL m_fEndOfFile;
HFILE hfile; // file handle
protected:
void WaitForReadAhead(void);
int lFilePos; // position in the file
int lFileBuf; // file position at first of buffer
PBYTE pbuf; // address of allocated buffer
PSTR pszFile; // copy of the filename
int cbBuf; // buffer size
int cThrdRead; // result from read-ahead thread
HANDLE hthrd;
DWORD idThrd;
BOOL fDualCPU;
};
#endif // _CSTREAM_INCLUDED