add method
Adds a data event
to the sink.
Must not be called on a closed sink.
Implementation
@override
void add(List<int> bytes) {
try {
_buffer = <int>[];
var carry = _carry;
_carry = null;
var pos = 0;
var available = bytes.length;
// If we have carry-over data, start from negative index, indicating carry
// index.
var goodChars = 0;
if (carry != null) pos = -carry.length;
while (pos < available) {
var currentPos = pos;
int? getNext() {
if (pos < 0) {
return carry![pos++ + carry.length];
} else if (pos < available) {
return bytes[pos++];
}
return null;
}
var consumed = _processBytes(getNext);
if (consumed > 0) {
goodChars = _buffer!.length;
} else if (consumed == 0) {
_buffer!.length = goodChars;
if (currentPos < 0) {
_carry = [];
_carry!.addAll(carry!);
_carry!.addAll(bytes);
} else {
_carry = bytes.sublist(currentPos);
}
break;
} else {
// Invalid byte at position pos - 1
_buffer!.length = goodChars;
_addChar(-1);
goodChars = _buffer!.length;
}
}
if (_buffer!.isNotEmpty) {
// Limit to 'goodChars', if lower than actual charCodes in the buffer.
_outSink!.add(String.fromCharCodes(_buffer!));
}
_buffer = null;
} catch (e, stackTrace) {
_outSink!.addError(e, stackTrace);
}
}