receive method

Iterable<ZModemEvent> receive(
  1. Uint8List data
)

Implementation

Iterable<ZModemEvent> receive(Uint8List data) sync* {
  _parser.addData(data);
  _parser.metrics = metrics; // share metrics reference

  while (_parser.moveNext()) {
    final frame = _parser.current;
    onTrace?.call('<- $frame');
    final m = metrics;
    if (m != null) {
      m.stateTransitions++;
    }

    if (!frame.crcValid && frame.format == ZFrameFormat.dataSubpacket) {
      yield ZCrcErrorEvent(frame);
      continue;
    }

    final event = _handleFrame(frame);
    if (event != null) {
      if (event is ZFileDataEvent) {
        metrics?.totalDataBytesReceived += event.data.length;
      }
      if (event is ZFileOfferedEvent) {
        metrics?.fileTransfers++;
      }
      if (event is ZTimeoutEvent) {
        metrics?.timeoutsFired++;
      }
      yield event;
    }
  }

  if (_cancelled) {
    _cancelled = false;
    yield ZSessionCancelledEvent();
  }
}