Chromium Code Reviews| Index: sdk/lib/io/io_sink.dart |
| diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart |
| index ace6f92f696f5e1e56ae1c01f18cf24d8269aed7..b5b1b1683ab485a3722a4bdaf01f0d82a4493ddc 100644 |
| --- a/sdk/lib/io/io_sink.dart |
| +++ b/sdk/lib/io/io_sink.dart |
| @@ -5,18 +5,25 @@ |
| part of dart.io; |
| /** |
| - * Helper class to wrap a [StreamConsumer<List<int>, T>] and provide utility |
| - * functions for writing to the StreamConsumer directly. The [IOSink] |
| - * buffers the input given by [add] and [addString] and will delay a [consume] |
| - * or [addStream] until the buffer is flushed. |
| + * Helper class to wrap a [StreamConsumer<List<int>, T>] and provide |
| + * utility functions for writing to the StreamConsumer directly. The |
| + * [IOSink] buffers the input given by [write], [writeAll], [writeln], |
| + * [writeCharCode] and [writeBytes] and will delay a [consume] or |
| + * [addStream] until the buffer is flushed. |
| * |
| * When the [IOSink] is bound to a stream (through either [consume] |
| * or [addStream]) any call to the [IOSink] will throw a |
| * [StateError]. |
| */ |
| -abstract class IOSink<T> implements StreamConsumer<List<int>, T> { |
| - factory IOSink(StreamConsumer<List<int>, T> target) |
| - => new _IOSinkImpl(target); |
| +abstract class IOSink<T> implements StreamConsumer<List<int>, T>, StringSink { |
| + factory IOSink(StreamConsumer<List<int>, T> target, Encoding encoding) |
|
nweiz
2013/03/06 20:31:51
It looks like you're almost always initializing IO
Søren Gjesse
2013/03/07 16:28:47
Changed encoding to be optional with a default val
|
| + => new _IOSinkImpl(target, encoding); |
| + |
| + Encoding encoding; |
|
nweiz
2013/03/06 20:31:51
Either mention here or in the http documentation t
Søren Gjesse
2013/03/07 16:28:47
Added documentation to IOSink, HttpClientRequest a
|
| + |
| + void writeBytes(List<int> data); |
| + |
| + Future<T> writeStream(Stream<List<int>> stream) => addStream(stream); |
| /** |
| * Provide functionality for piping to the [IOSink]. |
| @@ -30,12 +37,18 @@ abstract class IOSink<T> implements StreamConsumer<List<int>, T> { |
| /** |
| * Write a list of bytes to the target. |
| + * |
| + * *Deprecated*. Use [writeBytes] instead. |
| */ |
| + @deprecated |
|
Anders Johnsen
2013/03/07 08:48:44
Can't we just remote them now? They ain't part of
Søren Gjesse
2013/03/07 16:28:47
Done.
|
| void add(List<int> data); |
| /** |
| * Write a String to the target. |
| + * |
| + * *Deprecated*. Use [write] instead. |
| */ |
| + @deprecated |
| void addString(String string, [Encoding encoding = Encoding.UTF_8]); |
| /** |
| @@ -58,32 +71,76 @@ class _IOSinkImpl<T> implements IOSink<T> { |
| Future<T> _pipeFuture; |
| StreamSubscription<List<int>> _bindSubscription; |
| bool _paused = true; |
| + bool _encodingMutable = true; |
| - _IOSinkImpl(StreamConsumer<List<int>, T> target) : _target = target; |
| + _IOSinkImpl(StreamConsumer<List<int>, T> this._target, Encoding encoding) |
| + : _encoding = encoding; |
| - Future<T> consume(Stream<List<int>> stream) { |
| + Encoding _encoding; |
| + |
| + Encoding get encoding => _encoding; |
| + void set encoding(Encoding value) { |
| + if (!_encodingMutable) { |
| + throw new StateError("IOSink encoding is not mutable"); |
| + } |
| + _encoding = value; |
| + } |
| + |
| + void write(Object obj) { |
| + // This comment is copied from runtime/lib/string_buffer_patch.dart. |
| + // TODO(srdjan): The following four lines could be replaced by |
| + // '$obj', but apparently this is too slow on the Dart VM. |
| + String string; |
| + if (obj is String) { |
| + string = obj; |
| + } else { |
| + string = obj.toString(); |
| + if (string is! String) { |
| + throw new ArgumentError('toString() did not return a string'); |
| + } |
| + } |
| + if (string.isEmpty) return; |
| + writeBytes(_encodeString(string, _encoding)); |
| + } |
| + |
| + void writeAll(Iterable objects) { |
| + for (Object obj in objects) write(obj); |
| + } |
| + |
| + void writeln(Object obj) { |
| + write(obj); |
| + write("\n"); |
| + } |
| + |
| + void writeCharCode(int charCode) { |
| + write(new String.fromCharCode(charCode)); |
| + } |
| + |
| + void writeBytes(List<int> data) { |
| if (_isBound) { |
| throw new StateError("IOSink is already bound to a stream"); |
| } |
| - return _fillFromStream(stream); |
| + _controller.add(data); |
| } |
| - Future<T> addStream(Stream<List<int>> stream) { |
| + Future<T> consume(Stream<List<int>> stream) { |
| if (_isBound) { |
| throw new StateError("IOSink is already bound to a stream"); |
| } |
| - return _fillFromStream(stream, unbind: true); |
| + return _fillFromStream(stream); |
| } |
| - void add(List<int> data) { |
| + Future<T> addStream(Stream<List<int>> stream) { |
| if (_isBound) { |
| throw new StateError("IOSink is already bound to a stream"); |
| } |
| - _controller.add(data); |
| + return _fillFromStream(stream, unbind: true); |
| } |
| + void add(List<int> data) => writeBytes(data); |
| + |
| void addString(String string, [Encoding encoding = Encoding.UTF_8]) { |
| - add(_encodeString(string, encoding)); |
| + writeBytes(_encodeString(string, encoding)); |
| } |
| void close() { |