1// InBuffer.cs
2
3namespace 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
15		public InBuffer(uint bufferSize)
16		{
17			m_Buffer = new byte[bufferSize];
18			m_BufferSize = bufferSize;
19		}
20
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
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
43		public void ReleaseStream()
44		{
45			// m_Stream.Close();
46			m_Stream = null;
47		}
48
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
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
67		public ulong GetProcessedSize()
68		{
69			return m_ProcessedSize + m_Pos;
70		}
71	}
72}
73