public long CopyUpToSequence(Stream OutputStream, byte[] Sequence, long MaxReaded = long.MaxValue)
{
int TempBufferReaded;
byte[] ConsumedBytes;
long TotalCopied = 0;
Action<int> Consume = delegate(int Length)
{
if (Length > 0)
{
ConsumedBytes = this.Buffer.Consume(Length);
if (OutputStream != null)
{
OutputStream.Write(ConsumedBytes, 0, ConsumedBytes.Length);
}
TotalCopied += ConsumedBytes.Length;
}
};
while (true)
{
TempBufferReaded = InputStream.Read(TempBuffer, 0, (int)Math.Min(TempBuffer.Length, MaxReaded - TotalCopied));
if (TempBufferReaded > 0)
{
this.Buffer.Produce(TempBuffer, 0, TempBufferReaded);
}
if (this.Buffer.ConsumeRemaining <= Sequence.Length) break;
int FoundIndex = this.Buffer.IndexOf(Sequence);
// Not Found
if (FoundIndex == -1)
{
Consume(this.Buffer.ConsumeRemaining - Sequence.Length);
}
// Found!
else
{
Consume(FoundIndex);
// Remove Sequence.
this.Buffer.Consume(Sequence.Length);
return TotalCopied;
}
}
Consume(this.Buffer.ConsumeRemaining);
return TotalCopied;
}
}