| Index: pkg/utf/lib/utf_stream.dart
|
| diff --git a/pkg/utf/lib/utf_stream.dart b/pkg/utf/lib/utf_stream.dart
|
| index cfc57b902fedbe793cb7030ad42ba7d42ae918ee..bb36dca22368ca4f9e83a0ddbebb78813b085431 100644
|
| --- a/pkg/utf/lib/utf_stream.dart
|
| +++ b/pkg/utf/lib/utf_stream.dart
|
| @@ -4,15 +4,30 @@
|
|
|
| part of utf;
|
|
|
| +// TODO(floitsch): make this transformer reusable.
|
| abstract class _StringDecoder
|
| - extends StreamEventTransformer<List<int>, String> {
|
| + implements StreamTransformer<List<int>, String>, EventSink<List<int>> {
|
| List<int> _carry;
|
| List<int> _buffer;
|
| int _replacementChar;
|
|
|
| + EventSink<String> _outSink;
|
| +
|
| _StringDecoder(int this._replacementChar);
|
|
|
| - void handleData(List<int> bytes, EventSink<String> sink) {
|
| + Stream<String> bind(Stream<List<int>> stream) {
|
| + return new Stream.eventTransformed(
|
| + stream,
|
| + (EventSink<String> sink) {
|
| + if (_outSink != null) {
|
| + throw new StateError("String decoder already used");
|
| + }
|
| + _outSink = sink;
|
| + return this;
|
| + });
|
| + }
|
| +
|
| + void add(List<int> bytes) {
|
| try {
|
| _buffer = <int>[];
|
| List<int> carry = _carry;
|
| @@ -55,24 +70,28 @@ abstract class _StringDecoder
|
| }
|
| if (_buffer.length > 0) {
|
| // Limit to 'goodChars', if lower than actual charCodes in the buffer.
|
| - sink.add(new String.fromCharCodes(_buffer));
|
| + _outSink.add(new String.fromCharCodes(_buffer));
|
| }
|
| _buffer = null;
|
| - } catch (e) {
|
| - sink.addError(e);
|
| + } catch (e, stackTrace) {
|
| + _outSink.addError(e, stackTrace);
|
| }
|
| }
|
|
|
| - void handleDone(EventSink<String> sink) {
|
| + void addError(Object error, [StackTrace stackTrace]) {
|
| + _outSink.addError(error, stackTrace);
|
| + }
|
| +
|
| + void close() {
|
| if (_carry != null) {
|
| if (_replacementChar != null) {
|
| - sink.add(new String.fromCharCodes(
|
| + _outSink.add(new String.fromCharCodes(
|
| new List.filled(_carry.length, _replacementChar)));
|
| } else {
|
| throw new ArgumentError('Invalid codepoint');
|
| }
|
| }
|
| - sink.close();
|
| + _outSink.close();
|
| }
|
|
|
| int _processBytes(int getNext());
|
| @@ -150,12 +169,32 @@ class Utf8DecoderTransformer extends _StringDecoder {
|
|
|
|
|
| abstract class _StringEncoder
|
| - extends StreamEventTransformer<String, List<int>> {
|
| + implements StreamTransformer<String, List<int>>, EventSink<String> {
|
| +
|
| + EventSink<List<int>> _outSink;
|
|
|
| - void handleData(String data, EventSink<List<int>> sink) {
|
| - sink.add(_processString(data));
|
| + Stream<List<int>> bind(Stream<String> stream) {
|
| + return new Stream.eventTransformed(
|
| + stream,
|
| + (EventSink<List<int>> sink) {
|
| + if (_outSink != null) {
|
| + throw new StateError("String encoder already used");
|
| + }
|
| + _outSink = sink;
|
| + return this;
|
| + });
|
| + }
|
| +
|
| + void add(String data) {
|
| + _outSink.add(_processString(data));
|
| }
|
|
|
| + void addError(Object error, [StackTrace stackTrace]) {
|
| + _outSink.addError(error, stackTrace);
|
| + }
|
| +
|
| + void close() { _outSink.close(); }
|
| +
|
| List<int> _processString(String string);
|
| }
|
|
|
|
|