public override void Write(byte[] buffer, int offset, int count)
{
while (count > 0)
{
// check for end of stream.
if (m_currentBuffer.Array == null)
{
if (m_bufferManager == null)
{
throw new IOException("Attempt to write past end of stream.");
}
byte[] newBuffer = m_bufferManager.TakeBuffer(m_bufferSize, "ArraySegmentStream.Write");
m_buffers.Add(new ArraySegment<byte>(newBuffer, m_start, m_count));
m_endOfLastBuffer = 0;
SetCurrentBuffer(m_buffers.Count-1);
}
int bytesLeft = m_currentBuffer.Count - m_currentPosition;
// copy the bytes requested.
if (bytesLeft >= count)
{
Array.Copy(buffer, offset, m_currentBuffer.Array, m_currentPosition + m_currentBuffer.Offset, count);
m_currentPosition += count;
if (m_bufferIndex == m_buffers.Count-1)
{
if (m_endOfLastBuffer < m_currentPosition)
{
m_endOfLastBuffer = m_currentPosition;
}
}
return;
}
// copy the bytes available and move to next buffer.
Array.Copy(buffer, offset, m_currentBuffer.Array, m_currentPosition + m_currentBuffer.Offset, bytesLeft);
offset += bytesLeft;
count -= bytesLeft;
// move to next buffer.
SetCurrentBuffer(m_bufferIndex+1);
}
}
#endregion