| 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 /** | 5 /** |
| 6 * Default implementation of [ListInputStream]. | 6 * Default implementation of [ListInputStream]. |
| 7 */ | 7 */ |
| 8 class _ListInputStream extends _BaseDataInputStream implements ListInputStream { | 8 class _ListInputStream extends _BaseDataInputStream implements ListInputStream { |
| 9 _ListInputStream() : _bufferList = new _BufferList(); | 9 _ListInputStream() : _bufferList = new _BufferList(); |
| 10 | 10 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 _bufferList.clear(); | 38 _bufferList.clear(); |
| 39 } | 39 } |
| 40 | 40 |
| 41 _BufferList _bufferList; | 41 _BufferList _bufferList; |
| 42 } | 42 } |
| 43 | 43 |
| 44 | 44 |
| 45 class _ListOutputStream extends _BaseOutputStream implements ListOutputStream { | 45 class _ListOutputStream extends _BaseOutputStream implements ListOutputStream { |
| 46 _ListOutputStream() : _bufferList = new _BufferList(); | 46 _ListOutputStream() : _bufferList = new _BufferList(); |
| 47 | 47 |
| 48 List<int> contents() => _bufferList.readBytes(_bufferList.length); | 48 List<int> read() => _bufferList.readBytes(_bufferList.length); |
| 49 | 49 |
| 50 bool write(List<int> buffer, [bool copyBuffer = false]) { | 50 bool write(List<int> buffer, [bool copyBuffer = true]) { |
| 51 if (_streamMarkedClosed) throw new StreamException.streamClosed(); | 51 if (_streamMarkedClosed) throw new StreamException.streamClosed(); |
| 52 if (copyBuffer) { | 52 if (copyBuffer) { |
| 53 _bufferList.add(buffer.getRange(0, buffer.length)); | 53 _bufferList.add(buffer.getRange(0, buffer.length)); |
| 54 } else { | 54 } else { |
| 55 _bufferList.add(buffer); | 55 _bufferList.add(buffer); |
| 56 } | 56 } |
| 57 _checkScheduleCallbacks(); |
| 57 return true; | 58 return true; |
| 58 } | 59 } |
| 59 | 60 |
| 60 bool writeFrom(List<int> buffer, [int offset = 0, int len]) { | 61 bool writeFrom(List<int> buffer, [int offset = 0, int len]) { |
| 61 if (_streamMarkedClosed) throw new StreamException.streamClosed(); | 62 return write( |
| 62 _bufferList.add( | 63 buffer.getRange(offset, (len == null) ? buffer.length - offset : len), |
| 63 buffer.getRange(offset, (len == null) ? buffer.length - offset : len)); | 64 copyBuffer: false); |
| 64 return true; | |
| 65 } | 65 } |
| 66 | 66 |
| 67 void flush() { | 67 void flush() { |
| 68 // Nothing to do on a list output stream. | 68 // Nothing to do on a list output stream. |
| 69 } | 69 } |
| 70 | 70 |
| 71 void close() { | 71 void close() { |
| 72 if (_streamMarkedClosed) throw new StreamException.streamClosed(); | 72 if (_streamMarkedClosed) throw new StreamException.streamClosed(); |
| 73 _streamMarkedClosed = true; | 73 _streamMarkedClosed = true; |
| 74 } | 74 } |
| 75 | 75 |
| 76 void destroy() { | 76 void destroy() { |
| 77 close(); | 77 close(); |
| 78 } | 78 } |
| 79 | 79 |
| 80 void set onData(void callback()) { |
| 81 _clientDataHandler = callback; |
| 82 _checkScheduleCallbacks(); |
| 83 } |
| 84 |
| 80 void set onNoPendingWrites(void callback()) { | 85 void set onNoPendingWrites(void callback()) { |
| 81 _clientNoPendingWriteHandler = callback; | 86 _clientNoPendingWriteHandler = callback; |
| 82 _checkScheduleCallbacks(); | 87 _checkScheduleCallbacks(); |
| 83 } | 88 } |
| 84 | 89 |
| 85 void set onClosed(void callback()) { | 90 void set onClosed(void callback()) { |
| 86 _clientCloseHandler = callback; | 91 _clientCloseHandler = callback; |
| 87 } | 92 } |
| 88 | 93 |
| 89 void set onError(void callback(e)) { | 94 void set onError(void callback(e)) { |
| 90 // No errors emitted. | 95 // No errors emitted. |
| 91 } | 96 } |
| 92 | 97 |
| 93 void _checkScheduleCallbacks() { | 98 void _checkScheduleCallbacks() { |
| 99 void issueDataCallback(Timer timer) { |
| 100 _scheduledDataCallback = null; |
| 101 if (_clientDataHandler != null) { |
| 102 _clientDataHandler(); |
| 103 _checkScheduleCallbacks(); |
| 104 } |
| 105 } |
| 106 |
| 94 void issueNoPendingWriteCallback(Timer timer) { | 107 void issueNoPendingWriteCallback(Timer timer) { |
| 95 _scheduledNoPendingWriteCallback = null; | 108 _scheduledNoPendingWriteCallback = null; |
| 96 if (_clientNoPendingWriteHandler !== null) { | 109 if (_clientNoPendingWriteHandler != null && |
| 110 !_streamMarkedClosed) { |
| 97 _clientNoPendingWriteHandler(); | 111 _clientNoPendingWriteHandler(); |
| 98 _checkScheduleCallbacks(); | 112 _checkScheduleCallbacks(); |
| 99 } | 113 } |
| 100 } | 114 } |
| 101 | 115 |
| 102 void issueCloseCallback(Timer timer) { | 116 void issueCloseCallback(Timer timer) { |
| 103 _scheduledCloseCallback = null; | 117 _scheduledCloseCallback = null; |
| 104 if (_clientCloseHandler !== null) _clientCloseHandler(); | 118 if (_clientCloseHandler !== null) _clientCloseHandler(); |
| 105 } | 119 } |
| 106 | 120 |
| 107 // Schedule no pending callback if there is a callback set as this | 121 // Schedule no pending callback if there is a callback set as this |
| 108 // output stream does not wait for any transmission. Schedule | 122 // output stream does not wait for any transmission. Schedule |
| 109 // close callback once when the stream is closed. Only schedule a | 123 // close callback once when the stream is closed. Only schedule a |
| 110 // new callback if the previous one has actually been called. | 124 // new callback if the previous one has actually been called. |
| 111 if (!_closeCallbackCalled) { | 125 if (_closeCallbackCalled) return; |
| 112 if (!_streamMarkedClosed) { | 126 |
| 113 if (_clientNoPendingWriteHandler != null && | 127 if (!_streamMarkedClosed) { |
| 114 _scheduledNoPendingWriteCallback == null) { | 128 if (!_bufferList.isEmpty() && |
| 115 _scheduledNoPendingWriteCallback = | 129 _clientDataHandler != null && |
| 116 new Timer(0, issueNoPendingWriteCallback); | 130 _scheduledDataCallback == null) { |
| 117 } | 131 _scheduledDataCallback = new Timer(0, issueDataCallback); |
| 118 } else if (_clientCloseHandler != null && | |
| 119 _streamMarkedClosed && | |
| 120 !_closeCallbackCalled) { | |
| 121 _scheduledCloseCallback = new Timer(0, issueCloseCallback); | |
| 122 _closeCallbackCalled = true; | |
| 123 } | 132 } |
| 133 |
| 134 if (_clientNoPendingWriteHandler != null && |
| 135 _scheduledNoPendingWriteCallback == null && |
| 136 _scheduledDataCallback == null) { |
| 137 _scheduledNoPendingWriteCallback = |
| 138 new Timer(0, issueNoPendingWriteCallback); |
| 139 } |
| 140 |
| 141 } else if (_clientCloseHandler != null) { |
| 142 _scheduledCloseCallback = new Timer(0, issueCloseCallback); |
| 143 _closeCallbackCalled = true; |
| 124 } | 144 } |
| 125 } | 145 } |
| 126 | 146 |
| 127 _BufferList _bufferList; | 147 _BufferList _bufferList; |
| 128 bool _streamMarkedClosed = false; | 148 bool _streamMarkedClosed = false; |
| 129 bool _closeCallbackCalled = false; | 149 bool _closeCallbackCalled = false; |
| 150 Timer _scheduledDataCallback; |
| 130 Timer _scheduledNoPendingWriteCallback; | 151 Timer _scheduledNoPendingWriteCallback; |
| 131 Timer _scheduledCloseCallback; | 152 Timer _scheduledCloseCallback; |
| 153 Function _clientDataHandler; |
| 132 Function _clientNoPendingWriteHandler; | 154 Function _clientNoPendingWriteHandler; |
| 133 Function _clientCloseHandler; | 155 Function _clientCloseHandler; |
| 134 } | 156 } |
| OLD | NEW |