Chromium Code Reviews| Index: lib/src/line_decoder.dart |
| diff --git a/lib/src/line_decoder.dart b/lib/src/line_decoder.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5a50a8c69f2281b82c54cce3a8861bc7eef4adc3 |
| --- /dev/null |
| +++ b/lib/src/line_decoder.dart |
| @@ -0,0 +1,60 @@ |
| +// Copyright 2017 Google Inc. All Rights Reserved. |
|
zra
2017/04/19 17:46:13
Please use the usual copyright header.
bkonyi
2017/04/19 21:29:50
Done.
|
| +// |
| +// Licensed under the Apache License, Version 2.0 (the "License"); |
| +// you may not use this file except in compliance with the License. |
| +// You may obtain a copy of the License at |
| +// |
| +// http://www.apache.org/licenses/LICENSE-2.0 |
| +// |
| +// Unless required by applicable law or agreed to in writing, software |
| +// distributed under the License is distributed on an "AS IS" BASIS, |
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| +// See the License for the specific language governing permissions and |
| +// limitations under the License. |
| + |
| +part of sync.http; |
| + |
| +// '\n' character |
| +const int _LINE_TERMINATOR = 10; |
|
zra
2017/04/19 17:46:13
See the Dart style guide for the correct formattin
bkonyi
2017/04/19 21:29:50
Done.
|
| + |
| +typedef void _LineDecoderCallback( |
| + String line, int bytesRead, _LineDecoder decoder); |
| + |
| +class _LineDecoder { |
| + BytesBuilder _unprocessedBytes = new BytesBuilder(); |
| + |
| + int expectedByteCount = -1; |
| + |
| + final _LineDecoderCallback _callback; |
| + |
| + _LineDecoder.withCallback(this._callback); |
| + |
| + void add(List<int> chunk) { |
| + while (chunk.isNotEmpty) { |
| + int splitIndex = -1; |
| + |
| + if (expectedByteCount > 0) { |
| + splitIndex = expectedByteCount - _unprocessedBytes.length; |
| + } else { |
| + splitIndex = chunk.indexOf(_LINE_TERMINATOR) + 1; |
| + } |
| + |
| + if (splitIndex > 0 && splitIndex <= chunk.length) { |
| + _unprocessedBytes.add(chunk.sublist(0, splitIndex)); |
| + chunk = chunk.sublist(splitIndex); |
| + expectedByteCount = -1; |
| + _process(_unprocessedBytes.takeBytes()); |
| + } else { |
| + _unprocessedBytes.add(chunk); |
| + chunk = []; |
| + } |
| + } |
| + } |
| + |
| + void _process(List<int> line) => |
| + _callback(UTF8.decoder.convert(line), line.length, this); |
| + |
| + int get bufferedBytes => _unprocessedBytes.length; |
| + |
| + void close() => _process(_unprocessedBytes.takeBytes()); |
| +} |