| 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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 } | 113 } |
| 114 } | 114 } |
| 115 } | 115 } |
| 116 | 116 |
| 117 bool get readyRead => _handle.readyRead; | 117 bool get readyRead => _handle.readyRead; |
| 118 bool get readyWrite => _handle.readyWrite; | 118 bool get readyWrite => _handle.readyWrite; |
| 119 | 119 |
| 120 String toString() => "$_handle"; | 120 String toString() => "$_handle"; |
| 121 } | 121 } |
| 122 | 122 |
| 123 abstract class Listener { | 123 typedef void ErrorHandler(); |
| 124 StreamSubscription<List<int>> listen({Function onClosed}); | |
| 125 } | |
| 126 | 124 |
| 127 class MojoEventStreamListener { | 125 class MojoEventStreamListener { |
| 128 MojoMessagePipeEndpoint _endpoint; | 126 MojoMessagePipeEndpoint _endpoint; |
| 129 MojoEventStream _eventStream; | 127 MojoEventStream _eventStream; |
| 130 bool _isOpen = false; | 128 bool _isOpen = false; |
| 131 bool _isInHandler = false; | 129 bool _isInHandler = false; |
| 132 StreamSubscription subscription; | 130 StreamSubscription subscription; |
| 131 ErrorHandler onError; |
| 133 | 132 |
| 134 MojoEventStreamListener.fromEndpoint(MojoMessagePipeEndpoint endpoint, | 133 MojoEventStreamListener.fromEndpoint(MojoMessagePipeEndpoint endpoint) |
| 135 {bool doListen: true, Function onClosed}) | |
| 136 : _endpoint = endpoint, | 134 : _endpoint = endpoint, |
| 137 _eventStream = new MojoEventStream(endpoint.handle), | 135 _eventStream = new MojoEventStream(endpoint.handle), |
| 138 _isOpen = false { | 136 _isOpen = false { |
| 139 if (doListen) { | 137 listen(); |
| 140 listen(onClosed: onClosed); | |
| 141 } | |
| 142 } | 138 } |
| 143 | 139 |
| 144 MojoEventStreamListener.fromHandle(MojoHandle handle, | 140 MojoEventStreamListener.fromHandle(MojoHandle handle) { |
| 145 {bool doListen: true, Function onClosed}) { | |
| 146 _endpoint = new MojoMessagePipeEndpoint(handle); | 141 _endpoint = new MojoMessagePipeEndpoint(handle); |
| 147 _eventStream = new MojoEventStream(handle); | 142 _eventStream = new MojoEventStream(handle); |
| 148 _isOpen = false; | 143 _isOpen = false; |
| 149 if (doListen) { | 144 listen(); |
| 150 listen(onClosed: onClosed); | |
| 151 } | |
| 152 } | 145 } |
| 153 | 146 |
| 154 MojoEventStreamListener.unbound() | 147 MojoEventStreamListener.unbound() |
| 155 : _endpoint = null, | 148 : _endpoint = null, |
| 156 _eventStream = null, | 149 _eventStream = null, |
| 157 _isOpen = false; | 150 _isOpen = false; |
| 158 | 151 |
| 159 void bind(MojoMessagePipeEndpoint endpoint) { | 152 void bind(MojoMessagePipeEndpoint endpoint) { |
| 160 assert(!isBound); | 153 assert(!isBound); |
| 161 _endpoint = endpoint; | 154 _endpoint = endpoint; |
| 162 _eventStream = new MojoEventStream(endpoint.handle); | 155 _eventStream = new MojoEventStream(endpoint.handle); |
| 163 _isOpen = false; | 156 _isOpen = false; |
| 164 } | 157 } |
| 165 | 158 |
| 166 void bindFromHandle(MojoHandle handle) { | 159 void bindFromHandle(MojoHandle handle) { |
| 167 assert(!isBound); | 160 assert(!isBound); |
| 168 _endpoint = new MojoMessagePipeEndpoint(handle); | 161 _endpoint = new MojoMessagePipeEndpoint(handle); |
| 169 _eventStream = new MojoEventStream(handle); | 162 _eventStream = new MojoEventStream(handle); |
| 170 _isOpen = false; | 163 _isOpen = false; |
| 171 } | 164 } |
| 172 | 165 |
| 173 StreamSubscription<List<int>> listen({Function onClosed}) { | 166 StreamSubscription<List<int>> listen() { |
| 174 assert(isBound && (subscription == null)); | 167 assert(isBound && (subscription == null)); |
| 175 _isOpen = true; | 168 _isOpen = true; |
| 176 subscription = _eventStream.listen((List<int> event) { | 169 subscription = _eventStream.listen((List<int> event) { |
| 177 var signalsWatched = new MojoHandleSignals(event[0]); | 170 var signalsWatched = new MojoHandleSignals(event[0]); |
| 178 var signalsReceived = new MojoHandleSignals(event[1]); | 171 var signalsReceived = new MojoHandleSignals(event[1]); |
| 179 _isInHandler = true; | 172 _isInHandler = true; |
| 180 if (signalsReceived.isReadable) { | 173 if (signalsReceived.isReadable) { |
| 181 assert(_eventStream.readyRead); | 174 assert(_eventStream.readyRead); |
| 182 handleRead(); | 175 handleRead(); |
| 183 } | 176 } |
| 184 if (signalsReceived.isWritable) { | 177 if (signalsReceived.isWritable) { |
| 185 assert(_eventStream.readyWrite); | 178 assert(_eventStream.readyWrite); |
| 186 handleWrite(); | 179 handleWrite(); |
| 187 } | 180 } |
| 188 if (_isOpen) { | 181 if (_isOpen) { |
| 189 _eventStream.enableSignals(signalsWatched); | 182 _eventStream.enableSignals(signalsWatched); |
| 190 } | 183 } |
| 191 _isInHandler = false; | 184 _isInHandler = false; |
| 192 if (signalsReceived.isPeerClosed) { | 185 if (signalsReceived.isPeerClosed) { |
| 193 if (onClosed != null) onClosed(); | 186 if (onError != null) onError(); |
| 194 close(); | 187 close(); |
| 195 // The peer being closed obviates any other signal we might | 188 // The peer being closed obviates any other signal we might |
| 196 // have received since we won't be able to read or write the handle. | 189 // have received since we won't be able to read or write the handle. |
| 197 // Thus, we just return before invoking other handlers. | 190 // Thus, we just return before invoking other handlers. |
| 198 return; | 191 return; |
| 199 } | 192 } |
| 200 }, onDone: close); | 193 }, onDone: close); |
| 201 return subscription; | 194 return subscription; |
| 202 } | 195 } |
| 203 | 196 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 215 void handleWrite() {} | 208 void handleWrite() {} |
| 216 | 209 |
| 217 MojoMessagePipeEndpoint get endpoint => _endpoint; | 210 MojoMessagePipeEndpoint get endpoint => _endpoint; |
| 218 bool get isOpen => _isOpen; | 211 bool get isOpen => _isOpen; |
| 219 bool get isInHandler => _isInHandler; | 212 bool get isInHandler => _isInHandler; |
| 220 bool get isBound => _endpoint != null; | 213 bool get isBound => _endpoint != null; |
| 221 | 214 |
| 222 String toString() => "MojoEventStreamListener(" | 215 String toString() => "MojoEventStreamListener(" |
| 223 "isOpen: $isOpen, isBound: $isBound, endpoint: $_endpoint)"; | 216 "isOpen: $isOpen, isBound: $isBound, endpoint: $_endpoint)"; |
| 224 } | 217 } |
| OLD | NEW |