Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(398)

Side by Side Diff: runtime/bin/list_stream.dart

Issue 8989019: Implement list based output stream and add pipe to list based input streams (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments from ager@ Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/list_input_stream.dart ('k') | runtime/bin/stream_util.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
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.
4
5 class ListInputStream extends _BaseDataInputStream implements InputStream {
6 ListInputStream(List<int> this._buffer) {
7 _streamMarkedClosed = true;
8 }
9
10 int available() => _buffer.length - _offset;
11
12 List<int> _read(int bytesToRead) {
13 if (_offset == 0 && bytesToRead == _buffer.length) {
14 _offset = _buffer.length;
15 return _buffer;
16 } else {
17 List<int> result = _buffer.getRange(_offset, bytesToRead);
18 _offset += bytesToRead;
19 return result;
20 }
21 }
22
23 int _readInto(List<int> buffer, int offset, int bytesToRead) {
24 buffer.setRange(offset, bytesToRead, _buffer, _offset);
25 _offset += bytesToRead;
26 return bytesToRead;
27 }
28
29 List<int> _buffer;
30 int _offset = 0;
31 }
32
33
34 class DynamicListInputStream
35 extends _BaseDataInputStream implements InputStream {
36 DynamicListInputStream() : _bufferList = new _BufferList();
37
38 int available() => _bufferList.length;
39
40 void write(List<int> data) {
41 _bufferList.add(data);
42 _checkScheduleCallbacks();
43 }
44
45 void markEndOfStream() {
46 _streamMarkedClosed = true;
47 _checkScheduleCallbacks();
48 }
49
50 List<int> _read(int bytesToRead) {
51 return _bufferList.readBytes(bytesToRead);
52 }
53
54 int _readInto(List<int> buffer, int offset, int bytesToRead) {
55 List<int> tmp = _bufferList.readBytes(byteToRead);
56 buffer.setRange(offset, bytesToRead, tmp, _offset);
57 return bytesToRead;
58 }
59
60 _BufferList _bufferList;
61 }
62
63
64 class ListOutputStream implements OutputStream {
65 ListOutputStream() : _bufferList = new _BufferList();
66
67 bool write(List<int> buffer, [bool copyBuffer = false]) {
68 if (_streamMarkedClosed) throw new StreamException.streamClosed();
69 if (copyBuffer) {
70 _bufferList.add(buffer.getRange(0, buffer.length));
71 } else {
72 _bufferList.add(buffer);
73 }
74 }
75
76 bool writeFrom(List<int> buffer, [int offset = 0, int len]) {
77 if (_streamMarkedClosed) throw new StreamException.streamClosed();
78 _bufferList.add(
79 buffer.getRange(offset, (len == null) ? buffer.length - offset : len));
80 }
81
82 void close() {
83 if (_streamMarkedClosed) throw new StreamException.streamClosed();
84 _streamMarkedClosed = true;
85 }
86
87 void destroy() {
88 close();
89 }
90
91 void set noPendingWriteHandler(void callback()) {
92 _clientNoPendingWriteHandler = callback;
93 _checkScheduleCallbacks();
94 }
95
96 void set closeHandler(void callback()) {
97 _clientCloseHandler = callback;
98 }
99
100 void set errorHandler(void callback()) {
101 // No errors emitted.
102 }
103
104 List<int> contents() => _bufferList.readBytes(_bufferList.length);
105
106 void _checkScheduleCallbacks() {
107 void issueNoPendingWriteCallback(Timer timer) {
108 _scheduledNoPendingWriteCallback = null;
109 if (_clientNoPendingWriteHandler !== null) {
110 _clientNoPendingWriteHandler();
111 _checkScheduleCallbacks();
112 }
113 }
114
115 void issueCloseCallback(Timer timer) {
116 _scheduledCloseCallback = null;
117 if (_clientCloseHandler !== null) _clientCloseHandler();
118 }
119
120 // Schedule no pending callback if there is a callback set as this
121 // output stream does not wait for any transmission. Schedule
122 // close callback once when the stream is closed. Only schedule a
123 // new callback if the previous one has actually been called.
124 if (!_closeCallbackCalled) {
125 if (!_streamMarkedClosed) {
126 if (_clientNoPendingWriteHandler != null &&
127 _scheduledNoPendingWriteCallback == null) {
128 _scheduledNoPendingWriteCallback =
129 new Timer(issueNoPendingWriteCallback, 0);
130 }
131 } else if (_clientCloseHandler != null &&
132 _streamMarkedClosed &&
133 !_closeCallbackCalled) {
134 _scheduledCloseCallback = new Timer(issueCloseCallback, 0);
135 _closeCallbackCalled = true;
136 }
137 }
138 }
139
140 _BufferList _bufferList;
141 bool _streamMarkedClosed = false;
142 bool _closeCallbackCalled = false;
143 Timer _scheduledNoPendingWriteCallback;
144 Timer _scheduledCloseCallback;
145 Function _clientNoPendingWriteHandler;
146 Function _clientCloseHandler;
147 }
OLDNEW
« no previous file with comments | « runtime/bin/list_input_stream.dart ('k') | runtime/bin/stream_util.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698