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 |