| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of dart.io; | 5 part of dart.io; |
| 6 | 6 |
| 7 // Interface for decoders decoding binary data into string data. The | 7 // Interface for decoders decoding binary data into string data. The |
| 8 // decoder keeps track of line breaks during decoding. | 8 // decoder keeps track of line breaks during decoding. |
| 9 abstract class _StringDecoder { | 9 abstract class _StringDecoder { |
| 10 // Add more binary data to be decoded. The ownership of the buffer | 10 // Add more binary data to be decoded. The ownership of the buffer |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 _input.onData = _onData; | 518 _input.onData = _onData; |
| 519 } else { | 519 } else { |
| 520 _input.onData = null; | 520 _input.onData = null; |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 } | 523 } |
| 524 | 524 |
| 525 // TODO(sgjesse): Find a better way of scheduling callbacks from | 525 // TODO(sgjesse): Find a better way of scheduling callbacks from |
| 526 // the event loop. | 526 // the event loop. |
| 527 void _checkScheduleCallback() { | 527 void _checkScheduleCallback() { |
| 528 void issueDataCallback(Timer timer) { | 528 void issueDataCallback() { |
| 529 _scheduledDataCallback = null; | 529 _scheduledDataCallback = null; |
| 530 if (_clientDataHandler != null) { | 530 if (_clientDataHandler != null) { |
| 531 _clientDataHandler(); | 531 _clientDataHandler(); |
| 532 _checkScheduleCallback(); | 532 _checkScheduleCallback(); |
| 533 } | 533 } |
| 534 } | 534 } |
| 535 | 535 |
| 536 void issueLineCallback(Timer timer) { | 536 void issueLineCallback() { |
| 537 _scheduledLineCallback = null; | 537 _scheduledLineCallback = null; |
| 538 if (_clientLineHandler != null) { | 538 if (_clientLineHandler != null) { |
| 539 _clientLineHandler(); | 539 _clientLineHandler(); |
| 540 _checkScheduleCallback(); | 540 _checkScheduleCallback(); |
| 541 } | 541 } |
| 542 } | 542 } |
| 543 | 543 |
| 544 void issueCloseCallback(Timer timer) { | 544 void issueCloseCallback() { |
| 545 _scheduledCloseCallback = null; | 545 _scheduledCloseCallback = null; |
| 546 if (!_closed) { | 546 if (!_closed) { |
| 547 if (_clientCloseHandler != null) _clientCloseHandler(); | 547 if (_clientCloseHandler != null) _clientCloseHandler(); |
| 548 _closed = true; | 548 _closed = true; |
| 549 } | 549 } |
| 550 } | 550 } |
| 551 | 551 |
| 552 if (!_closed) { | 552 if (!_closed) { |
| 553 // Schedule data callback if string data available. | 553 // Schedule data callback if string data available. |
| 554 if (_clientDataHandler != null && | 554 if (_clientDataHandler != null && |
| 555 !_decoder.isEmpty && | 555 !_decoder.isEmpty && |
| 556 _scheduledDataCallback == null) { | 556 _scheduledDataCallback == null) { |
| 557 if (_scheduledLineCallback != null) { | 557 if (_scheduledLineCallback != null) { |
| 558 _scheduledLineCallback.cancel(); | 558 _scheduledLineCallback.cancel(); |
| 559 } | 559 } |
| 560 _scheduledDataCallback = new Timer(0, issueDataCallback); | 560 _scheduledDataCallback = Timer.run(issueDataCallback); |
| 561 } | 561 } |
| 562 | 562 |
| 563 // Schedule line callback if a line is available. | 563 // Schedule line callback if a line is available. |
| 564 if (_clientLineHandler != null && | 564 if (_clientLineHandler != null && |
| 565 (_decoder.lineBreaks > 0 || (!_decoder.isEmpty && _inputClosed)) && | 565 (_decoder.lineBreaks > 0 || (!_decoder.isEmpty && _inputClosed)) && |
| 566 _scheduledLineCallback == null) { | 566 _scheduledLineCallback == null) { |
| 567 if (_scheduledDataCallback != null) { | 567 if (_scheduledDataCallback != null) { |
| 568 _scheduledDataCallback.cancel(); | 568 _scheduledDataCallback.cancel(); |
| 569 } | 569 } |
| 570 _scheduledLineCallback = new Timer(0, issueLineCallback); | 570 _scheduledLineCallback = Timer.run(issueLineCallback); |
| 571 } | 571 } |
| 572 | 572 |
| 573 // Schedule close callback if no more data and input is closed. | 573 // Schedule close callback if no more data and input is closed. |
| 574 if (_decoder.isEmpty && | 574 if (_decoder.isEmpty && |
| 575 _inputClosed && | 575 _inputClosed && |
| 576 _scheduledCloseCallback == null) { | 576 _scheduledCloseCallback == null) { |
| 577 _scheduledCloseCallback = new Timer(0, issueCloseCallback); | 577 _scheduledCloseCallback = Timer.run(issueCloseCallback); |
| 578 } | 578 } |
| 579 } | 579 } |
| 580 } | 580 } |
| 581 | 581 |
| 582 InputStream _input; | 582 InputStream _input; |
| 583 Encoding _encoding; | 583 Encoding _encoding; |
| 584 _StringDecoder _decoder; | 584 _StringDecoder _decoder; |
| 585 bool _inputClosed = false; // Is the underlying input stream closed? | 585 bool _inputClosed = false; // Is the underlying input stream closed? |
| 586 bool _closed = false; // Is this stream closed. | 586 bool _closed = false; // Is this stream closed. |
| 587 bool _eof = false; // Has all data been read from the decoder? | 587 bool _eof = false; // Has all data been read from the decoder? |
| 588 Timer _scheduledDataCallback; | 588 Timer _scheduledDataCallback; |
| 589 Timer _scheduledLineCallback; | 589 Timer _scheduledLineCallback; |
| 590 Timer _scheduledCloseCallback; | 590 Timer _scheduledCloseCallback; |
| 591 Function _clientDataHandler; | 591 Function _clientDataHandler; |
| 592 Function _clientLineHandler; | 592 Function _clientLineHandler; |
| 593 Function _clientCloseHandler; | 593 Function _clientCloseHandler; |
| 594 } | 594 } |
| OLD | NEW |