122 lines
2.3 KiB
C++
122 lines
2.3 KiB
C++
// IOStream.cpp -- Implementation for class CIOStream
|
|
|
|
#include "stdafx.h"
|
|
#include "IOStream.h"
|
|
|
|
CIOStream *CIOStream::NewIOStream(CUnbufferedIO *puio)
|
|
{
|
|
ASSERT(puio);
|
|
|
|
CIOStream *pios= NULL;
|
|
|
|
__try
|
|
{
|
|
pios= New CIOStream;
|
|
|
|
pios->InitialIOStream(puio);
|
|
}
|
|
__finally
|
|
{
|
|
if (_abnormal_termination() && pios)
|
|
{
|
|
delete pios; pios= NULL;
|
|
}
|
|
}
|
|
|
|
return pios;
|
|
}
|
|
|
|
CIOStream::CIOStream()
|
|
{
|
|
m_cdw = 0;
|
|
m_cBlocks = 0;
|
|
m_ibFileNextLow = 0;
|
|
m_ibFileNextHigh = 0;
|
|
}
|
|
|
|
CIOStream::~CIOStream()
|
|
{
|
|
if (Writable()) FlushOutput(TRUE);
|
|
}
|
|
|
|
BOOL CIOStream::InitialIOStream(CUnbufferedIO *puio)
|
|
{
|
|
ASSERT(puio);
|
|
|
|
if (!InitialIOQueue(puio)) return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CIOStream::AttachStream(BOOL fOut, UINT cdwStream,
|
|
UINT ibFileLow, UINT ibFileHigh
|
|
)
|
|
{
|
|
ASSERT(Initialed());
|
|
|
|
if (Writable()) FlushOutput(TRUE);
|
|
|
|
ASSERT(fOut || cdwStream);
|
|
|
|
if (fOut) m_cdw= 0;
|
|
else
|
|
{
|
|
m_cdw = cdwStream;
|
|
m_cBlocks = BlocksFor(cdwStream * sizeof(UINT), CbBlockSize());
|
|
}
|
|
|
|
m_ibFileNextLow = ibFileLow;
|
|
m_ibFileNextHigh = ibFileHigh;
|
|
|
|
EnableStream(fOut);
|
|
}
|
|
|
|
|
|
BOOL CIOStream::NextFileAddress(PUINT pibFileLow, PUINT pibFileHigh, PUINT pcdw)
|
|
{
|
|
if (*pcdw > CbBlockSize() / sizeof(UINT))
|
|
*pcdw = CbBlockSize() / sizeof(UINT);
|
|
|
|
ASSERT(!(m_ibFileNextLow % CbBlockSize()));
|
|
ASSERT(! m_ibFileNextHigh);
|
|
|
|
*pibFileLow = m_ibFileNextLow;
|
|
*pibFileHigh = m_ibFileNextHigh;
|
|
|
|
if (Writable())
|
|
{
|
|
m_cdw += *pcdw;
|
|
m_ibFileNextLow += (*pcdw) * sizeof(UINT);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
if (!m_cBlocks)
|
|
{
|
|
*pcdw= 0; return TRUE;
|
|
}
|
|
|
|
if (--m_cBlocks)
|
|
{
|
|
*pcdw = CbBlockSize() / sizeof(UINT);
|
|
m_cdw -= CbBlockSize() / sizeof(UINT);
|
|
|
|
m_ibFileNextLow += *pcdw * sizeof(UINT);
|
|
|
|
return FALSE;
|
|
}
|
|
else // The last block won't necessarily be full.
|
|
{
|
|
*pcdw= m_cdw; m_cdw= 0;
|
|
|
|
m_ibFileNextLow += *pcdw * sizeof(UINT);
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
void CIOStream::ReleaseFileBlock(UINT ibFileLow, UINT ibFileHigh)
|
|
{
|
|
ASSERT(!ibFileHigh);
|
|
}
|