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