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

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

Issue 9969202: Add method flush to output stream (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 8 months 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 | « no previous file | runtime/bin/http_impl.dart » ('j') | runtime/bin/output_stream.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 class _FileInputStream extends _BaseDataInputStream implements InputStream { 5 class _FileInputStream extends _BaseDataInputStream implements InputStream {
6 _FileInputStream(String name) { 6 _FileInputStream(String name) {
7 _file = new File(name); 7 _file = new File(name);
8 _data = []; 8 _data = [];
9 _position = 0; 9 _position = 0;
10 _file.onError = (e) { 10 _file.onError = (e) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 _closed = true; 84 _closed = true;
85 } 85 }
86 86
87 File _file; 87 File _file;
88 List<int> _data; 88 List<int> _data;
89 int _position; 89 int _position;
90 bool _closed = false; 90 bool _closed = false;
91 } 91 }
92 92
93 93
94 class _PendingOperation {
95 const _PendingOperation();
96 static final _PendingOperation CLOSE = const _PendingOperation();
97 static final _PendingOperation FLUSH = const _PendingOperation();
98 }
99
100
94 class _FileOutputStream extends _BaseOutputStream implements OutputStream { 101 class _FileOutputStream extends _BaseOutputStream implements OutputStream {
95 _FileOutputStream(String name, FileMode mode) { 102 _FileOutputStream(String name, FileMode mode) {
96 _pendingOperations = new List<List<int>>(); 103 _pendingOperations = new List();
97 var f = new File(name); 104 var f = new File(name);
98 f.open(mode, (openedFile) { 105 f.open(mode, (openedFile) {
99 _file = openedFile; 106 _file = openedFile;
100 _setupFileHandlers(); 107 _setupFileHandlers();
101 _processPendingOperations(); 108 _processPendingOperations();
102 }); 109 });
103 f.onError = (e) { 110 f.onError = (e) {
104 if (_onError != null) _onError(e); 111 if (_onError != null) _onError(e);
105 }; 112 };
106 } 113 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 var length = buffer.length - offset; 150 var length = buffer.length - offset;
144 if (len != null) { 151 if (len != null) {
145 if (len > length) throw new IndexOutOfRangeException(len); 152 if (len > length) throw new IndexOutOfRangeException(len);
146 length = len; 153 length = len;
147 } 154 }
148 var copy = new ByteArray(length); 155 var copy = new ByteArray(length);
149 copy.setRange(0, length, buffer, offset); 156 copy.setRange(0, length, buffer, offset);
150 return write(copy); 157 return write(copy);
151 } 158 }
152 159
160 void flush() {
161 if (_file == null) {
162 _pendingOperations.add(_PendingOperation.FLUSH);
163 } else {
164 _file.flush();
Mads Ager (google) 2012/04/17 11:56:44 Isn't _file a RandomAccessFile? Doesn't flush take
Søren Gjesse 2012/04/17 13:14:19 It does - not sure why no tests failed. Turend ou
165 }
166 }
167
153 void close() { 168 void close() {
154 if (_file == null) { 169 if (_file == null) {
155 _pendingOperations.add(null); 170 _pendingOperations.add(_PendingOperation.CLOSE);
156 } else if (!_streamMarkedClosed) { 171 } else if (!_streamMarkedClosed) {
157 _file.close(() { 172 _file.close(() {
158 if (_onClosed != null) _onClosed(); 173 if (_onClosed != null) _onClosed();
159 }); 174 });
160 _streamMarkedClosed = true; 175 _streamMarkedClosed = true;
161 } 176 }
162 } 177 }
163 178
164 void set onNoPendingWrites(void callback()) { 179 void set onNoPendingWrites(void callback()) {
165 _onNoPendingWrites = callback; 180 _onNoPendingWrites = callback;
166 } 181 }
167 182
168 void set onClosed(void callback()) { 183 void set onClosed(void callback()) {
169 _onClosed = callback; 184 _onClosed = callback;
170 } 185 }
171 186
172 void set onError(void callback(Exception e)) { 187 void set onError(void callback(Exception e)) {
173 _onError = callback; 188 _onError = callback;
174 } 189 }
175 190
176 void _processPendingOperations() { 191 void _processPendingOperations() {
177 _pendingOperations.forEach((buffer) { 192 _pendingOperations.forEach((buffer) {
178 (buffer != null) ? write(buffer) : close(); 193 if (buffer is _PendingOperation) {
194 if (buffer === _PendingOperation.CLOSE) {
195 close();
196 } else {
197 assert(buffer === _PendingOperation.FLUSH);
198 flush();
199 }
200 } else {
201 write(buffer);
202 }
179 }); 203 });
180 _pendingOperations = null; 204 _pendingOperations = null;
181 } 205 }
182 206
183 void _write(List<int> buffer, int offset, int len) { 207 void _write(List<int> buffer, int offset, int len) {
184 _file.writeList(buffer, offset, len); 208 _file.writeList(buffer, offset, len);
185 } 209 }
186 210
187 RandomAccessFile _file; 211 RandomAccessFile _file;
188 212
189 // When this is set to true the stream is marked closed. When a 213 // When this is set to true the stream is marked closed. When a
190 // stream is marked closed no more data can be written. 214 // stream is marked closed no more data can be written.
191 bool _streamMarkedClosed = false; 215 bool _streamMarkedClosed = false;
192 216
193 // When this is set to true the close callback has been called and 217 // When this is set to true the close callback has been called and
194 // the stream is fully closed. 218 // the stream is fully closed.
195 bool _closeCallbackCalled = false; 219 bool _closeCallbackCalled = false;
196 220
197 // List of pending writes that were issued before the underlying 221 // List of pending writes that were issued before the underlying
198 // file was successfully opened. 222 // file was successfully opened.
199 List<List<int>> _pendingOperations; 223 List _pendingOperations;
200 224
201 Function _onNoPendingWrites; 225 Function _onNoPendingWrites;
202 Function _onClosed; 226 Function _onClosed;
203 Function _onError; 227 Function _onError;
204 } 228 }
205 229
206 230
207 // Helper class containing static file helper methods. 231 // Helper class containing static file helper methods.
208 class _FileUtils { 232 class _FileUtils {
209 static final kExistsRequest = 0; 233 static final kExistsRequest = 0;
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 String _name; 1083 String _name;
1060 int _id; 1084 int _id;
1061 int _pendingWrites = 0; 1085 int _pendingWrites = 0;
1062 1086
1063 SendPort _fileService; 1087 SendPort _fileService;
1064 1088
1065 Timer _noPendingWriteTimer; 1089 Timer _noPendingWriteTimer;
1066 1090
1067 Function _onNoPendingWrites; 1091 Function _onNoPendingWrites;
1068 } 1092 }
OLDNEW
« no previous file with comments | « no previous file | runtime/bin/http_impl.dart » ('j') | runtime/bin/output_stream.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698