OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 patch class ServerSocket { | 5 patch class ServerSocket { |
6 /* patch */ factory ServerSocket(String bindAddress, int port, int backlog) { | 6 /* patch */ factory ServerSocket(String bindAddress, int port, int backlog) { |
7 return new _ServerSocket(bindAddress, port, backlog); | 7 return new _ServerSocket(bindAddress, port, backlog); |
8 } | 8 } |
9 } | 9 } |
10 | 10 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 } else { | 130 } else { |
131 if (_closedRead) { data &= ~(1 << _IN_EVENT); } | 131 if (_closedRead) { data &= ~(1 << _IN_EVENT); } |
132 if (_closedWrite) { data &= ~(1 << _OUT_EVENT); } | 132 if (_closedWrite) { data &= ~(1 << _OUT_EVENT); } |
133 if (_isPipe()) data |= (1 << _PIPE); | 133 if (_isPipe()) data |= (1 << _PIPE); |
134 } | 134 } |
135 _sendToEventHandler(data); | 135 _sendToEventHandler(data); |
136 } | 136 } |
137 } | 137 } |
138 | 138 |
139 int get port { | 139 int get port { |
140 if (_port === null) { | 140 if (_port == null) { |
141 _port = _getPort(); | 141 _port = _getPort(); |
142 } | 142 } |
143 return _port; | 143 return _port; |
144 } | 144 } |
145 | 145 |
146 void close([bool halfClose = false]) { | 146 void close([bool halfClose = false]) { |
147 if (!_closed) { | 147 if (!_closed) { |
148 if (halfClose) { | 148 if (halfClose) { |
149 _closeWrite(); | 149 _closeWrite(); |
150 } else { | 150 } else { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 void _close() { | 183 void _close() { |
184 if (!_closed) { | 184 if (!_closed) { |
185 _sendToEventHandler(1 << _CLOSE_COMMAND); | 185 _sendToEventHandler(1 << _CLOSE_COMMAND); |
186 _handler.close(); | 186 _handler.close(); |
187 _handler = null; | 187 _handler = null; |
188 _closed = true; | 188 _closed = true; |
189 } | 189 } |
190 } | 190 } |
191 | 191 |
192 void _sendToEventHandler(int data) { | 192 void _sendToEventHandler(int data) { |
193 if (_handler === null) { | 193 if (_handler == null) { |
194 _handler = new ReceivePort(); | 194 _handler = new ReceivePort(); |
195 _handler.receive((var message, ignored) { _multiplex(message); }); | 195 _handler.receive((var message, ignored) { _multiplex(message); }); |
196 } | 196 } |
197 assert(!_closed); | 197 assert(!_closed); |
198 _EventHandler._sendData(this, _handler, data); | 198 _EventHandler._sendData(this, _handler, data); |
199 } | 199 } |
200 | 200 |
201 bool _reportError(error, String message) { | 201 bool _reportError(error, String message) { |
202 void doReportError(Exception e) { | 202 void doReportError(Exception e) { |
203 // Invoke the socket error callback if any. | 203 // Invoke the socket error callback if any. |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 "Cannot set close handler when input stream is used"); | 488 "Cannot set close handler when input stream is used"); |
489 _onClosed = callback; | 489 _onClosed = callback; |
490 } | 490 } |
491 | 491 |
492 bool _isListenSocket() => false; | 492 bool _isListenSocket() => false; |
493 | 493 |
494 bool _isPipe() => _pipe; | 494 bool _isPipe() => _pipe; |
495 | 495 |
496 InputStream get inputStream { | 496 InputStream get inputStream { |
497 if (_inputStream == null) { | 497 if (_inputStream == null) { |
498 if (_handlerMap[_SocketBase._IN_EVENT] !== null || | 498 if (_handlerMap[_SocketBase._IN_EVENT] != null || |
499 _handlerMap[_SocketBase._CLOSE_EVENT] !== null) { | 499 _handlerMap[_SocketBase._CLOSE_EVENT] != null) { |
500 throw new StreamException( | 500 throw new StreamException( |
501 "Cannot get input stream when socket handlers are used"); | 501 "Cannot get input stream when socket handlers are used"); |
502 } | 502 } |
503 _inputStream = new _SocketInputStream(this); | 503 _inputStream = new _SocketInputStream(this); |
504 } | 504 } |
505 return _inputStream; | 505 return _inputStream; |
506 } | 506 } |
507 | 507 |
508 OutputStream get outputStream { | 508 OutputStream get outputStream { |
509 if (_outputStream == null) { | 509 if (_outputStream == null) { |
510 if (_handlerMap[_SocketBase._OUT_EVENT] !== null) { | 510 if (_handlerMap[_SocketBase._OUT_EVENT] != null) { |
511 throw new StreamException( | 511 throw new StreamException( |
512 "Cannot get input stream when socket handlers are used"); | 512 "Cannot get input stream when socket handlers are used"); |
513 } | 513 } |
514 _outputStream = new _SocketOutputStream(this); | 514 _outputStream = new _SocketOutputStream(this); |
515 } | 515 } |
516 return _outputStream; | 516 return _outputStream; |
517 } | 517 } |
518 | 518 |
519 void set _onWrite(void callback()) { | 519 void set _onWrite(void callback()) { |
520 _setHandler(_SocketBase._OUT_EVENT, callback); | 520 _setHandler(_SocketBase._OUT_EVENT, callback); |
(...skipping 20 matching lines...) Expand all Loading... |
541 | 541 |
542 void _updateOutHandler() { | 542 void _updateOutHandler() { |
543 void firstWriteHandler() { | 543 void firstWriteHandler() { |
544 assert(!_seenFirstOutEvent); | 544 assert(!_seenFirstOutEvent); |
545 _seenFirstOutEvent = true; | 545 _seenFirstOutEvent = true; |
546 | 546 |
547 // From now on the write handler is only the client write | 547 // From now on the write handler is only the client write |
548 // handler (connect handler cannot be called again). Change this | 548 // handler (connect handler cannot be called again). Change this |
549 // before calling any handlers as handlers can change the | 549 // before calling any handlers as handlers can change the |
550 // handlers. | 550 // handlers. |
551 if (_clientWriteHandler === null) _onWrite = _clientWriteHandler; | 551 if (_clientWriteHandler == null) _onWrite = _clientWriteHandler; |
552 | 552 |
553 // First out event is socket connected event. | 553 // First out event is socket connected event. |
554 if (_clientConnectHandler !== null) _clientConnectHandler(); | 554 if (_clientConnectHandler != null) _clientConnectHandler(); |
555 _clientConnectHandler = null; | 555 _clientConnectHandler = null; |
556 | 556 |
557 // Always (even for the first out event) call the write handler. | 557 // Always (even for the first out event) call the write handler. |
558 if (_clientWriteHandler !== null) _clientWriteHandler(); | 558 if (_clientWriteHandler != null) _clientWriteHandler(); |
559 } | 559 } |
560 | 560 |
561 if (_clientConnectHandler === null && _clientWriteHandler === null) { | 561 if (_clientConnectHandler == null && _clientWriteHandler == null) { |
562 _onWrite = null; | 562 _onWrite = null; |
563 } else { | 563 } else { |
564 if (_seenFirstOutEvent) { | 564 if (_seenFirstOutEvent) { |
565 _onWrite = _clientWriteHandler; | 565 _onWrite = _clientWriteHandler; |
566 } else { | 566 } else { |
567 _onWrite = firstWriteHandler; | 567 _onWrite = firstWriteHandler; |
568 } | 568 } |
569 } | 569 } |
570 } | 570 } |
571 | 571 |
572 int get remotePort { | 572 int get remotePort { |
573 if (_remotePort === null) { | 573 if (_remotePort == null) { |
574 remoteHost; | 574 remoteHost; |
575 } | 575 } |
576 return _remotePort; | 576 return _remotePort; |
577 } | 577 } |
578 | 578 |
579 String get remoteHost { | 579 String get remoteHost { |
580 if (_remoteHost === null) { | 580 if (_remoteHost == null) { |
581 List peer = _getRemotePeer(); | 581 List peer = _getRemotePeer(); |
582 _remoteHost = peer[0]; | 582 _remoteHost = peer[0]; |
583 _remotePort = peer[1]; | 583 _remotePort = peer[1]; |
584 } | 584 } |
585 return _remoteHost; | 585 return _remoteHost; |
586 } | 586 } |
587 | 587 |
588 List _getRemotePeer() native "Socket_GetRemotePeer"; | 588 List _getRemotePeer() native "Socket_GetRemotePeer"; |
589 | 589 |
590 static SendPort _newServicePort() native "Socket_NewServicePort"; | 590 static SendPort _newServicePort() native "Socket_NewServicePort"; |
591 | 591 |
592 static void _ensureSocketService() { | 592 static void _ensureSocketService() { |
593 if (_socketService == null) { | 593 if (_socketService == null) { |
594 _socketService = _Socket._newServicePort(); | 594 _socketService = _Socket._newServicePort(); |
595 } | 595 } |
596 } | 596 } |
597 | 597 |
598 bool _seenFirstOutEvent = false; | 598 bool _seenFirstOutEvent = false; |
599 bool _pipe = false; | 599 bool _pipe = false; |
600 Function _clientConnectHandler; | 600 Function _clientConnectHandler; |
601 Function _clientWriteHandler; | 601 Function _clientWriteHandler; |
602 _SocketInputStream _inputStream; | 602 _SocketInputStream _inputStream; |
603 _SocketOutputStream _outputStream; | 603 _SocketOutputStream _outputStream; |
604 String _remoteHost; | 604 String _remoteHost; |
605 int _remotePort; | 605 int _remotePort; |
606 static SendPort _socketService; | 606 static SendPort _socketService; |
607 } | 607 } |
OLD | NEW |