add method

  1. @override
void add(
  1. List<int> bytes
)
inherited

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);
  }
}