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

Side by Side Diff: mojo/public/dart/src/event_stream.dart

Issue 982673002: Dart: Removes need to call listen(). (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Don't pile up callbacks Created 5 years, 9 months 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
« no previous file with comments | « mojo/public/dart/src/codec.dart ('k') | mojo/public/dart/src/proxy.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 part of core; 5 part of core;
6 6
7 class MojoEventStream extends Stream<List<int>> { 7 class MojoEventStream extends Stream<List<int>> {
8 // The underlying Mojo handle. 8 // The underlying Mojo handle.
9 MojoHandle _handle; 9 MojoHandle _handle;
10 10
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 } 116 }
117 } 117 }
118 } 118 }
119 119
120 bool get readyRead => _handle.readyRead; 120 bool get readyRead => _handle.readyRead;
121 bool get readyWrite => _handle.readyWrite; 121 bool get readyWrite => _handle.readyWrite;
122 122
123 String toString() => "$_handle"; 123 String toString() => "$_handle";
124 } 124 }
125 125
126 abstract class Listener { 126 typedef void ErrorHandler();
127 StreamSubscription<List<int>> listen({Function onClosed});
128 }
129 127
130 class MojoEventStreamListener { 128 class MojoEventStreamListener {
131 MojoMessagePipeEndpoint _endpoint; 129 MojoMessagePipeEndpoint _endpoint;
132 MojoEventStream _eventStream; 130 MojoEventStream _eventStream;
133 bool _isOpen = false; 131 bool _isOpen = false;
134 bool _isInHandler = false; 132 bool _isInHandler = false;
135 StreamSubscription subscription; 133 StreamSubscription subscription;
134 ErrorHandler onError;
136 135
137 MojoEventStreamListener.fromEndpoint(MojoMessagePipeEndpoint endpoint, 136 MojoEventStreamListener.fromEndpoint(MojoMessagePipeEndpoint endpoint)
hansmuller1 2015/03/06 17:12:38 We've run into the need for |doListen: false| when
zra 2015/03/06 21:12:00 Scott pointed out that it is okay to wait to set i
138 {bool doListen: true, Function onClosed})
139 : _endpoint = endpoint, 137 : _endpoint = endpoint,
140 _eventStream = new MojoEventStream(endpoint.handle), 138 _eventStream = new MojoEventStream(endpoint.handle),
141 _isOpen = false { 139 _isOpen = false {
142 if (doListen) { 140 listen();
143 listen(onClosed: onClosed);
144 }
145 } 141 }
146 142
147 MojoEventStreamListener.fromHandle(MojoHandle handle, {bool doListen: true, 143 MojoEventStreamListener.fromHandle(MojoHandle handle) {
148 Function onClosed}) {
149 _endpoint = new MojoMessagePipeEndpoint(handle); 144 _endpoint = new MojoMessagePipeEndpoint(handle);
150 _eventStream = new MojoEventStream(handle); 145 _eventStream = new MojoEventStream(handle);
151 _isOpen = false; 146 _isOpen = false;
152 if (doListen) { 147 listen();
153 listen(onClosed: onClosed);
154 }
155 } 148 }
156 149
157 MojoEventStreamListener.unbound() 150 MojoEventStreamListener.unbound()
158 : _endpoint = null, 151 : _endpoint = null,
159 _eventStream = null, 152 _eventStream = null,
160 _isOpen = false; 153 _isOpen = false;
161 154
162 void bind(MojoMessagePipeEndpoint endpoint) { 155 void bind(MojoMessagePipeEndpoint endpoint) {
163 assert(!isBound); 156 assert(!isBound);
164 _endpoint = endpoint; 157 _endpoint = endpoint;
165 _eventStream = new MojoEventStream(endpoint.handle); 158 _eventStream = new MojoEventStream(endpoint.handle);
166 _isOpen = false; 159 _isOpen = false;
167 } 160 }
168 161
169 void bindFromHandle(MojoHandle handle) { 162 void bindFromHandle(MojoHandle handle) {
170 assert(!isBound); 163 assert(!isBound);
171 _endpoint = new MojoMessagePipeEndpoint(handle); 164 _endpoint = new MojoMessagePipeEndpoint(handle);
172 _eventStream = new MojoEventStream(handle); 165 _eventStream = new MojoEventStream(handle);
173 _isOpen = false; 166 _isOpen = false;
174 } 167 }
175 168
176 StreamSubscription<List<int>> listen({Function onClosed}) { 169 StreamSubscription<List<int>> listen() {
177 assert(isBound && (subscription == null)); 170 assert(isBound && (subscription == null));
178 _isOpen = true; 171 _isOpen = true;
179 subscription = _eventStream.listen((List<int> event) { 172 subscription = _eventStream.listen((List<int> event) {
180 var signalsWatched = new MojoHandleSignals(event[0]); 173 var signalsWatched = new MojoHandleSignals(event[0]);
181 var signalsReceived = new MojoHandleSignals(event[1]); 174 var signalsReceived = new MojoHandleSignals(event[1]);
182 _isInHandler = true; 175 _isInHandler = true;
183 if (signalsReceived.isReadable) { 176 if (signalsReceived.isReadable) {
184 assert(_eventStream.readyRead); 177 assert(_eventStream.readyRead);
185 handleRead(); 178 handleRead();
186 } 179 }
187 if (signalsReceived.isWritable) { 180 if (signalsReceived.isWritable) {
188 assert(_eventStream.readyWrite); 181 assert(_eventStream.readyWrite);
189 handleWrite(); 182 handleWrite();
190 } 183 }
191 if (_isOpen) { 184 if (_isOpen) {
192 _eventStream.enableSignals(signalsWatched); 185 _eventStream.enableSignals(signalsWatched);
193 } 186 }
194 _isInHandler = false; 187 _isInHandler = false;
195 if (signalsReceived.isPeerClosed) { 188 if (signalsReceived.isPeerClosed) {
196 if (onClosed != null) onClosed(); 189 if (onError != null) onError();
197 close(); 190 close();
198 // The peer being closed obviates any other signal we might 191 // The peer being closed obviates any other signal we might
199 // have received since we won't be able to read or write the handle. 192 // have received since we won't be able to read or write the handle.
200 // Thus, we just return before invoking other handlers. 193 // Thus, we just return before invoking other handlers.
201 return; 194 return;
202 } 195 }
203 }, onDone: close); 196 }, onDone: close);
204 return subscription; 197 return subscription;
205 } 198 }
206 199
207 void close() { 200 void close() {
208 _isOpen = false; 201 _isOpen = false;
209 _endpoint = null; 202 _endpoint = null;
210 subscription = null; 203 subscription = null;
211 if (_eventStream != null) { 204 if (_eventStream != null) {
212 _eventStream.close(); 205 _eventStream.close();
213 _eventStream = null; 206 _eventStream = null;
214 } 207 }
215 } 208 }
216 209
217 void handleRead() {} 210 void handleRead() {}
218 void handleWrite() {} 211 void handleWrite() {}
219 212
220 MojoMessagePipeEndpoint get endpoint => _endpoint; 213 MojoMessagePipeEndpoint get endpoint => _endpoint;
221 bool get isOpen => _isOpen; 214 bool get isOpen => _isOpen;
222 bool get isInHandler => _isInHandler; 215 bool get isInHandler => _isInHandler;
223 bool get isBound => _endpoint != null; 216 bool get isBound => _endpoint != null;
224 } 217 }
OLDNEW
« no previous file with comments | « mojo/public/dart/src/codec.dart ('k') | mojo/public/dart/src/proxy.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698