Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 } |
| OLD | NEW |