Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Side by Side Diff: sdk/lib/io/chunked_stream.dart

Issue 11361190: a === b -> identical(a, b) (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/crypto/crypto_utils.dart ('k') | sdk/lib/io/file_impl.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « sdk/lib/crypto/crypto_utils.dart ('k') | sdk/lib/io/file_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698