public void Enqueue( byte[] buffer, int offset, int size ) {
if ( buffer == null ) {
throw new ArgumentNullException( "buffer" );
} else if ( offset < 0 ) {
throw new ArgumentOutOfRangeException( "offset" );
} else if ( size < 0 ) {
throw new ArgumentOutOfRangeException( "size" );
} else if ( ( buffer.Length - offset ) < size ) {
throw new ArgumentException();
}
position += size;
while ( size > 0 ) {
if ( buffered.buffer == null ) { // nothing yet buffered
buffered.buffer = bufferPool.AcquireBuffer();
}
byte[] page = buffered.buffer; // buffer page
int pageSpace = page.Length - buffered.length; // available bytes in page
int byteCount = ( size > pageSpace ? pageSpace : size ); // how many bytes we can copy over
Buffer.BlockCopy( buffer, offset, page, buffered.length, byteCount );
buffered.length += byteCount;
offset += byteCount;
size -= byteCount;
if ( buffered.length == page.Length ) { // page full
Append( buffered );
buffered.buffer = null;
buffered.length = 0;
}
}
}
}