// InBuffer.cs | |
namespace SevenZip.Buffer | |
{ | |
public class InBuffer | |
{ | |
byte[] m_Buffer; | |
uint m_Pos; | |
uint m_Limit; | |
uint m_BufferSize; | |
System.IO.Stream m_Stream; | |
bool m_StreamWasExhausted; | |
ulong m_ProcessedSize; | |
public InBuffer(uint bufferSize) | |
{ | |
m_Buffer = new byte[bufferSize]; | |
m_BufferSize = bufferSize; | |
} | |
public void Init(System.IO.Stream stream) | |
{ | |
m_Stream = stream; | |
m_ProcessedSize = 0; | |
m_Limit = 0; | |
m_Pos = 0; | |
m_StreamWasExhausted = false; | |
} | |
public bool ReadBlock() | |
{ | |
if (m_StreamWasExhausted) | |
return false; | |
m_ProcessedSize += m_Pos; | |
int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize); | |
m_Pos = 0; | |
m_Limit = (uint)aNumProcessedBytes; | |
m_StreamWasExhausted = (aNumProcessedBytes == 0); | |
return (!m_StreamWasExhausted); | |
} | |
public void ReleaseStream() | |
{ | |
// m_Stream.Close(); | |
m_Stream = null; | |
} | |
public bool ReadByte(byte b) // check it | |
{ | |
if (m_Pos >= m_Limit) | |
if (!ReadBlock()) | |
return false; | |
b = m_Buffer[m_Pos++]; | |
return true; | |
} | |
public byte ReadByte() | |
{ | |
// return (byte)m_Stream.ReadByte(); | |
if (m_Pos >= m_Limit) | |
if (!ReadBlock()) | |
return 0xFF; | |
return m_Buffer[m_Pos++]; | |
} | |
public ulong GetProcessedSize() | |
{ | |
return m_ProcessedSize + m_Pos; | |
} | |
} | |
} |