| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // Interface for decoders decoding binary data into objects of type T. | 5 // Interface for decoders decoding binary data into objects of type T. |
| 6 interface _Decoder<T> { | 6 interface _Decoder<T> { |
| 7 // Add more binary data to be decoded. The ownership of the buffer | 7 // Add more binary data to be decoded. The ownership of the buffer |
| 8 // is transfered to the decoder and the caller most not modify it any more. | 8 // is transfered to the decoder and the caller most not modify it any more. |
| 9 int write(List<int> buffer); | 9 int write(List<int> buffer); |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 String toString() => "DecoderException: $message"; | 21 String toString() => "DecoderException: $message"; |
| 22 final String message; | 22 final String message; |
| 23 } | 23 } |
| 24 | 24 |
| 25 | 25 |
| 26 // Utility class for decoding UTF-8 from data delivered as a stream of | 26 // Utility class for decoding UTF-8 from data delivered as a stream of |
| 27 // bytes. | 27 // bytes. |
| 28 class _StringDecoderBase implements _Decoder<String> { | 28 class _StringDecoderBase implements _Decoder<String> { |
| 29 _StringDecoderBase() | 29 _StringDecoderBase() |
| 30 : _bufferList = new _BufferList(), | 30 : _bufferList = new _BufferList(), |
| 31 _result = new StringBuffer(); | 31 _result = new List<int>(); |
| 32 | 32 |
| 33 // Add UTF-8 encoded data. | 33 // Add UTF-8 encoded data. |
| 34 int write(List<int> buffer) { | 34 int write(List<int> buffer) { |
| 35 _bufferList.add(buffer); | 35 _bufferList.add(buffer); |
| 36 // Decode as many bytes into characters as possible. | 36 // Decode as many bytes into characters as possible. |
| 37 while (_bufferList.length > 0) { | 37 while (_bufferList.length > 0) { |
| 38 if (!_processNext()) { | 38 if (!_processNext()) { |
| 39 break; | 39 break; |
| 40 } | 40 } |
| 41 } | 41 } |
| 42 return buffer.length; | 42 return buffer.length; |
| 43 } | 43 } |
| 44 | 44 |
| 45 // Check if any characters have been decoded since the last call to decode. | 45 // Check if any characters have been decoded since the last call to decode. |
| 46 bool isEmpty() { | 46 bool isEmpty() { |
| 47 return _result.isEmpty(); | 47 return _result.isEmpty(); |
| 48 } | 48 } |
| 49 | 49 |
| 50 // Return the string decoded since the last call to decode. | 50 // Return the string decoded since the last call to decode. |
| 51 String get decoded() { | 51 String get decoded() { |
| 52 if (isEmpty()) { | 52 if (isEmpty()) { |
| 53 return null; | 53 return null; |
| 54 } else { | 54 } else { |
| 55 String result = _result.toString(); | 55 String result = new String.fromCharCodes(_result); |
| 56 _result = new StringBuffer(); | 56 _result = new List<int>(); |
| 57 return result; | 57 return result; |
| 58 } | 58 } |
| 59 } | 59 } |
| 60 | 60 |
| 61 abstract bool _processNext(); | 61 abstract bool _processNext(); |
| 62 | 62 |
| 63 _BufferList _bufferList; | 63 _BufferList _bufferList; |
| 64 StringBuffer _result; | 64 List<int> _result; |
| 65 } | 65 } |
| 66 | 66 |
| 67 | 67 |
| 68 // Utility class for decoding ascii data delivered as a stream of | 68 // Utility class for decoding ascii data delivered as a stream of |
| 69 // bytes. | 69 // bytes. |
| 70 class _AsciiDecoder extends _StringDecoderBase { | 70 class _AsciiDecoder extends _StringDecoderBase { |
| 71 // Process the next ascii encoded character. | 71 // Process the next ascii encoded character. |
| 72 bool _processNext() { | 72 bool _processNext() { |
| 73 while (_bufferList.length > 0) { | 73 while (_bufferList.length > 0) { |
| 74 int byte = _bufferList.next(); | 74 int byte = _bufferList.next(); |
| 75 if (byte > 127) { | 75 if (byte > 127) { |
| 76 throw new DecoderException("Illegal ASCII character $byte"); | 76 throw new DecoderException("Illegal ASCII character $byte"); |
| 77 } | 77 } |
| 78 _result.addCharCode(byte); | 78 _result.add(byte); |
| 79 } | 79 } |
| 80 return true; | 80 return true; |
| 81 } | 81 } |
| 82 } | 82 } |
| 83 | 83 |
| 84 | 84 |
| 85 // Utility class for decoding Latin-1 data delivered as a stream of | 85 // Utility class for decoding Latin-1 data delivered as a stream of |
| 86 // bytes. | 86 // bytes. |
| 87 class _Latin1Decoder extends _StringDecoderBase { | 87 class _Latin1Decoder extends _StringDecoderBase { |
| 88 // Process the next Latin-1 encoded character. | 88 // Process the next Latin-1 encoded character. |
| 89 bool _processNext() { | 89 bool _processNext() { |
| 90 while (_bufferList.length > 0) { | 90 while (_bufferList.length > 0) { |
| 91 int byte = _bufferList.next(); | 91 int byte = _bufferList.next(); |
| 92 _result.addCharCode(byte); | 92 _result.add(byte); |
| 93 } | 93 } |
| 94 return true; | 94 return true; |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 | 98 |
| 99 // Utility class for decoding UTF-8 from data delivered as a stream of | 99 // Utility class for decoding UTF-8 from data delivered as a stream of |
| 100 // bytes. | 100 // bytes. |
| 101 class _UTF8Decoder extends _StringDecoderBase { | 101 class _UTF8Decoder extends _StringDecoderBase { |
| 102 // Process the next UTF-8 encoded character. | 102 // Process the next UTF-8 encoded character. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 124 // Remove the value peeked from the buffer list. | 124 // Remove the value peeked from the buffer list. |
| 125 _bufferList.next(); | 125 _bufferList.next(); |
| 126 for (int i = 0; i < additionalBytes; i++) { | 126 for (int i = 0; i < additionalBytes; i++) { |
| 127 int byte = _bufferList.next(); | 127 int byte = _bufferList.next(); |
| 128 value = value << 6 | (byte & 0x3F); | 128 value = value << 6 | (byte & 0x3F); |
| 129 } | 129 } |
| 130 } else { | 130 } else { |
| 131 // Remove the value peeked from the buffer list. | 131 // Remove the value peeked from the buffer list. |
| 132 _bufferList.next(); | 132 _bufferList.next(); |
| 133 } | 133 } |
| 134 _result.addCharCode(value); | 134 _result.add(value); |
| 135 return true; | 135 return true; |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 | 138 |
| 139 | 139 |
| 140 class _StringInputStream implements StringInputStream { | 140 class _StringInputStream implements StringInputStream { |
| 141 _StringInputStream(InputStream this._input, [String this._encoding]) { | 141 _StringInputStream(InputStream this._input, [String this._encoding]) { |
| 142 if (_encoding === null) { | 142 if (_encoding === null) { |
| 143 _encoding = "UTF-8"; | 143 _encoding = "UTF-8"; |
| 144 } | 144 } |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 String _encoding; | 313 String _encoding; |
| 314 _Decoder _decoder; | 314 _Decoder _decoder; |
| 315 String _buffer; // String can be buffered here if readLine is used. | 315 String _buffer; // String can be buffered here if readLine is used. |
| 316 int _bufferLineStart; // Current offset into _buffer if any. | 316 int _bufferLineStart; // Current offset into _buffer if any. |
| 317 bool _inputClosed = false; // Is the underlying input stream closed? | 317 bool _inputClosed = false; // Is the underlying input stream closed? |
| 318 bool _closed = false; // Is this stream closed. | 318 bool _closed = false; // Is this stream closed. |
| 319 bool _eof = false; // Has all data been read from the decoder? | 319 bool _eof = false; // Has all data been read from the decoder? |
| 320 var _clientDataHandler; | 320 var _clientDataHandler; |
| 321 var _clientCloseHandler; | 321 var _clientCloseHandler; |
| 322 } | 322 } |
| OLD | NEW |