1 // InBuffer.cs 2 3 namespace SevenZip.Buffer 4 { 5 public class InBuffer 6 { 7 byte[] m_Buffer; 8 uint m_Pos; 9 uint m_Limit; 10 uint m_BufferSize; 11 System.IO.Stream m_Stream; 12 bool m_StreamWasExhausted; 13 ulong m_ProcessedSize; 14 InBuffer(uint bufferSize)15 public InBuffer(uint bufferSize) 16 { 17 m_Buffer = new byte[bufferSize]; 18 m_BufferSize = bufferSize; 19 } 20 Init(System.IO.Stream stream)21 public void Init(System.IO.Stream stream) 22 { 23 m_Stream = stream; 24 m_ProcessedSize = 0; 25 m_Limit = 0; 26 m_Pos = 0; 27 m_StreamWasExhausted = false; 28 } 29 ReadBlock()30 public bool ReadBlock() 31 { 32 if (m_StreamWasExhausted) 33 return false; 34 m_ProcessedSize += m_Pos; 35 int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize); 36 m_Pos = 0; 37 m_Limit = (uint)aNumProcessedBytes; 38 m_StreamWasExhausted = (aNumProcessedBytes == 0); 39 return (!m_StreamWasExhausted); 40 } 41 42 ReleaseStream()43 public void ReleaseStream() 44 { 45 // m_Stream.Close(); 46 m_Stream = null; 47 } 48 ReadByte(byte b)49 public bool ReadByte(byte b) // check it 50 { 51 if (m_Pos >= m_Limit) 52 if (!ReadBlock()) 53 return false; 54 b = m_Buffer[m_Pos++]; 55 return true; 56 } 57 ReadByte()58 public byte ReadByte() 59 { 60 // return (byte)m_Stream.ReadByte(); 61 if (m_Pos >= m_Limit) 62 if (!ReadBlock()) 63 return 0xFF; 64 return m_Buffer[m_Pos++]; 65 } 66 GetProcessedSize()67 public ulong GetProcessedSize() 68 { 69 return m_ProcessedSize + m_Pos; 70 } 71 } 72 } 73