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