diff --git a/lib/core.dart b/lib/core.dart index 0027a6c..c88fa8e 100644 --- a/lib/core.dart +++ b/lib/core.dart @@ -34,7 +34,32 @@ class ZModemCore { final ZModemTextHandler? onPlainText; + bool _findSubSeq(Uint8List origin, Uint8List subSeq) { + // 如果 b 是空数组,直接返回 true + if (subSeq.isEmpty) return true; + + // 如果 a 的长度小于 b 的长度,直接返回 false + if (origin.length < subSeq.length) return false; + + // 遍历 a 数组,检查是否存在连续的子序列与 b 相等 + for (int i = 0; i <= origin.length - subSeq.length; i++) { + bool match = true; + for (int j = 0; j < subSeq.length; j++) { + if (origin[i + j] != subSeq[j]) { + match = false; + break; + } + } + if (match) return true; + } + + return false; + } + Iterable receive(Uint8List data) sync* { + if (_findSubSeq(data, ZModemAbortSequence.abortSequence)) { + yield ZSessionAbortedEvent(); + } _parser.addData(data); // print('data: ${data.map((e) => e.toRadixString(16)).toList()}'); diff --git a/lib/src/zmodem_event.dart b/lib/src/zmodem_event.dart index db6e927..53be6d8 100644 --- a/lib/src/zmodem_event.dart +++ b/lib/src/zmodem_event.dart @@ -46,6 +46,13 @@ class ZSessionFinishedEvent implements ZModemEvent { return 'ZSessionFinishedEvent()'; } } +/// The event fired when the ZModem aborted +class ZSessionAbortedEvent implements ZModemEvent { + @override + String toString() { + return 'ZSessionAbortedEvent()'; + } +} /// The other side is ready to receive a file. class ZReadyToSendEvent implements ZModemEvent { diff --git a/lib/src/zmodem_parser.dart b/lib/src/zmodem_parser.dart index 2d4ec10..b0eb1d2 100644 --- a/lib/src/zmodem_parser.dart +++ b/lib/src/zmodem_parser.dart @@ -55,7 +55,6 @@ class ZModemParser implements Iterator { /// and it's impossible to distinguish between plain text and a data subpacket /// without this prompt.... void expectDataSubpacket() { - print('expectDataSubpacket'); _expectDataSubpacket = true; }