FilterStatus IResponseFilter.Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten) {
dataOutWritten = 0;
if (dataIn == null) {
dataInRead = 0;
return FilterStatus.Done;
}
dataInRead = dataIn.Length;
if (_overflow.Count > 0) {
WriteOverflow(dataOut, ref dataOutWritten);
}
for (var i = 0; i < dataInRead; ++i) {
var readByte = (byte)dataIn.ReadByte();
if (readByte != _find[_findMatchOffset]) {
if (_findMatchOffset > 0) {
WriteBytes(_find, _findMatchOffset, dataOut, ref dataOutWritten);
_findMatchOffset = 0;
}
WriteSingleByte(readByte, dataOut, ref dataOutWritten);
} else if (++_findMatchOffset == _find.Length) {
WriteBytes(_replacement, _replacement.Length, dataOut, ref dataOutWritten);
_findMatchOffset = 0;
}
}
return _overflow.Count > 0 ? FilterStatus.NeedMoreData :
_findMatchOffset > 0 ? FilterStatus.NeedMoreData : FilterStatus.Done;
}