| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class _ChunkedInputStream implements ChunkedInputStream { | 5 class _ChunkedInputStream implements ChunkedInputStream { |
| 6 _ChunkedInputStream(InputStream this._input, int this._chunkSize) | 6 _ChunkedInputStream(InputStream this._input, int this._chunkSize) |
| 7 : _bufferList = new _BufferList() { | 7 : _bufferList = new _BufferList() { |
| 8 _input.onClosed = _onClosed; | 8 _input.onClosed = _onClosed; |
| 9 } | 9 } |
| 10 | 10 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 void set onClosed(void callback()) { | 44 void set onClosed(void callback()) { |
| 45 _clientCloseHandler = callback; | 45 _clientCloseHandler = callback; |
| 46 } | 46 } |
| 47 | 47 |
| 48 void set onError(void callback(e)) { | 48 void set onError(void callback(e)) { |
| 49 _input.onError = callback; | 49 _input.onError = callback; |
| 50 } | 50 } |
| 51 | 51 |
| 52 void _onData() { | 52 void _onData() { |
| 53 _readData(); | 53 _readData(); |
| 54 if (_bufferList.length >= _chunkSize && _clientDataHandler !== null) { | 54 if (_bufferList.length >= _chunkSize && _clientDataHandler != null) { |
| 55 _clientDataHandler(); | 55 _clientDataHandler(); |
| 56 } | 56 } |
| 57 _checkScheduleCallback(); | 57 _checkScheduleCallback(); |
| 58 _checkInstallDataHandler(); | 58 _checkInstallDataHandler(); |
| 59 } | 59 } |
| 60 | 60 |
| 61 void _readData() { | 61 void _readData() { |
| 62 List<int> data = _input.read(); | 62 List<int> data = _input.read(); |
| 63 if (data !== null) { | 63 if (data != null) { |
| 64 _bufferList.add(data); | 64 _bufferList.add(data); |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 | 67 |
| 68 void _onClosed() { | 68 void _onClosed() { |
| 69 _inputClosed = true; | 69 _inputClosed = true; |
| 70 if (_bufferList.length == 0 && _clientCloseHandler !== null) { | 70 if (_bufferList.length == 0 && _clientCloseHandler != null) { |
| 71 _clientCloseHandler(); | 71 _clientCloseHandler(); |
| 72 _closed = true; | 72 _closed = true; |
| 73 } else { | 73 } else { |
| 74 _checkScheduleCallback(); | 74 _checkScheduleCallback(); |
| 75 } | 75 } |
| 76 } | 76 } |
| 77 | 77 |
| 78 void _checkInstallDataHandler() { | 78 void _checkInstallDataHandler() { |
| 79 if (_clientDataHandler === null) { | 79 if (_clientDataHandler == null) { |
| 80 _input.onData = null; | 80 _input.onData = null; |
| 81 } else { | 81 } else { |
| 82 if (_bufferList.length < _chunkSize && !_inputClosed) { | 82 if (_bufferList.length < _chunkSize && !_inputClosed) { |
| 83 _input.onData = _onData; | 83 _input.onData = _onData; |
| 84 } else { | 84 } else { |
| 85 _input.onData = null; | 85 _input.onData = null; |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 void _checkScheduleCallback() { | 90 void _checkScheduleCallback() { |
| 91 // TODO(sgjesse): Find a better way of scheduling callbacks from | 91 // TODO(sgjesse): Find a better way of scheduling callbacks from |
| 92 // the event loop. | 92 // the event loop. |
| 93 void issueDataCallback(Timer timer) { | 93 void issueDataCallback(Timer timer) { |
| 94 _scheduledDataCallback = null; | 94 _scheduledDataCallback = null; |
| 95 if (_clientDataHandler !== null) { | 95 if (_clientDataHandler != null) { |
| 96 _clientDataHandler(); | 96 _clientDataHandler(); |
| 97 _checkScheduleCallback(); | 97 _checkScheduleCallback(); |
| 98 } | 98 } |
| 99 } | 99 } |
| 100 | 100 |
| 101 void issueCloseCallback(Timer timer) { | 101 void issueCloseCallback(Timer timer) { |
| 102 _scheduledCloseCallback = null; | 102 _scheduledCloseCallback = null; |
| 103 if (!_closed) { | 103 if (!_closed) { |
| 104 if (_clientCloseHandler !== null) _clientCloseHandler(); | 104 if (_clientCloseHandler != null) _clientCloseHandler(); |
| 105 _closed = true; | 105 _closed = true; |
| 106 } | 106 } |
| 107 } | 107 } |
| 108 | 108 |
| 109 // Schedule data callback if enough data in buffer. | 109 // Schedule data callback if enough data in buffer. |
| 110 if ((_bufferList.length >= _chunkSize || | 110 if ((_bufferList.length >= _chunkSize || |
| 111 (_bufferList.length > 0 && _inputClosed)) && | 111 (_bufferList.length > 0 && _inputClosed)) && |
| 112 _clientDataHandler !== null && | 112 _clientDataHandler != null && |
| 113 _scheduledDataCallback == null) { | 113 _scheduledDataCallback == null) { |
| 114 _scheduledDataCallback = new Timer(0, issueDataCallback); | 114 _scheduledDataCallback = new Timer(0, issueDataCallback); |
| 115 } | 115 } |
| 116 | 116 |
| 117 // Schedule close callback if no more data and input is closed. | 117 // Schedule close callback if no more data and input is closed. |
| 118 if (_bufferList.length == 0 && | 118 if (_bufferList.length == 0 && |
| 119 _inputClosed && | 119 _inputClosed && |
| 120 !_closed && | 120 !_closed && |
| 121 _scheduledCloseCallback == null) { | 121 _scheduledCloseCallback == null) { |
| 122 if (_scheduledDataCallback != null) { | 122 if (_scheduledDataCallback != null) { |
| 123 _scheduledDataCallback.cancel(); | 123 _scheduledDataCallback.cancel(); |
| 124 } | 124 } |
| 125 _scheduledCloseCallback = new Timer(0, issueCloseCallback); | 125 _scheduledCloseCallback = new Timer(0, issueCloseCallback); |
| 126 } | 126 } |
| 127 } | 127 } |
| 128 | 128 |
| 129 InputStream _input; | 129 InputStream _input; |
| 130 _BufferList _bufferList; | 130 _BufferList _bufferList; |
| 131 int _chunkSize; | 131 int _chunkSize; |
| 132 bool _inputClosed = false; // Is the underlying input stream closed? | 132 bool _inputClosed = false; // Is the underlying input stream closed? |
| 133 bool _closed = false; // Has the close handler been called?. | 133 bool _closed = false; // Has the close handler been called?. |
| 134 Timer _scheduledDataCallback; | 134 Timer _scheduledDataCallback; |
| 135 Timer _scheduledCloseCallback; | 135 Timer _scheduledCloseCallback; |
| 136 Function _clientDataHandler; | 136 Function _clientDataHandler; |
| 137 Function _clientCloseHandler; | 137 Function _clientCloseHandler; |
| 138 } | 138 } |
| OLD | NEW |