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 // Read the file in blocks of size 64k. | 7 // Read the file in blocks of size 64k. |
8 const int _BLOCK_SIZE = 64 * 1024; | 8 const int _BLOCK_SIZE = 64 * 1024; |
9 | 9 |
10 | 10 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 } else { | 144 } else { |
145 _resume(); | 145 _resume(); |
146 } | 146 } |
147 } | 147 } |
148 } | 148 } |
149 | 149 |
150 class _FileStreamConsumer extends StreamConsumer<List<int>, File> { | 150 class _FileStreamConsumer extends StreamConsumer<List<int>, File> { |
151 File _file; | 151 File _file; |
152 Future<RandomAccessFile> _openFuture; | 152 Future<RandomAccessFile> _openFuture; |
153 StreamSubscription _subscription; | 153 StreamSubscription _subscription; |
| 154 |
154 | 155 |
155 _FileStreamConsumer(File this._file, FileMode mode) { | 156 _FileStreamConsumer(File this._file, FileMode mode) { |
156 _openFuture = _file.open(mode: mode); | 157 _openFuture = _file.open(mode: mode); |
157 } | 158 } |
158 | 159 |
159 _FileStreamConsumer.fromStdio(int fd) { | 160 _FileStreamConsumer.fromStdio(int fd) { |
160 assert(1 <= fd && fd <= 2); | 161 assert(1 <= fd && fd <= 2); |
161 _openFuture = new Future.immediate(_File._openStdioSync(fd)); | 162 _openFuture = new Future.immediate(_File._openStdioSync(fd)); |
162 } | 163 } |
163 | 164 |
164 Future<File> consume(Stream<List<int>> stream) { | 165 Future<File> consume(Stream<List<int>> stream) { |
| 166 return addStream(stream).then((_) => close()); |
| 167 } |
| 168 |
| 169 Future<File> addStream(Stream<List<int>> stream) { |
165 Completer<File> completer = new Completer<File>(); | 170 Completer<File> completer = new Completer<File>(); |
166 _openFuture | 171 _openFuture |
167 .then((openedFile) { | 172 .then((openedFile) { |
168 _subscription = stream.listen( | 173 _subscription = stream.listen( |
169 (d) { | 174 (d) { |
170 _subscription.pause(); | 175 _subscription.pause(); |
171 openedFile.writeList(d, 0, d.length) | 176 openedFile.writeList(d, 0, d.length) |
172 .then((_) => _subscription.resume()) | 177 .then((_) => _subscription.resume()) |
173 .catchError((e) { | 178 .catchError((e) { |
174 openedFile.close(); | 179 openedFile.close(); |
175 completer.completeError(e); | 180 completer.completeError(e); |
176 }); | 181 }); |
177 }, | 182 }, |
178 onDone: () { | 183 onDone: () { |
179 // Wait for the file to close (and therefore flush) before | 184 completer.complete(_file); |
180 // completing the future. | |
181 openedFile.close() | |
182 .then((_) { | |
183 completer.complete(_file); | |
184 }) | |
185 .catchError((e) { | |
186 completer.completeError(e); | |
187 }); | |
188 }, | 185 }, |
189 onError: (e) { | 186 onError: (e) { |
190 openedFile.close(); | 187 openedFile.close(); |
191 completer.completeError(e); | 188 completer.completeError(e); |
192 }, | 189 }, |
193 unsubscribeOnError: true); | 190 unsubscribeOnError: true); |
194 }) | 191 }) |
195 .catchError((e) { | 192 .catchError((e) { |
196 completer.completeError(e); | 193 completer.completeError(e); |
197 }); | 194 }); |
198 return completer.future; | 195 return completer.future; |
199 } | 196 } |
| 197 |
| 198 Future<File> close() { |
| 199 return _openFuture.then((openedFile) => openedFile.close()); |
| 200 } |
200 } | 201 } |
201 | 202 |
202 | 203 |
203 const int _EXISTS_REQUEST = 0; | 204 const int _EXISTS_REQUEST = 0; |
204 const int _CREATE_REQUEST = 1; | 205 const int _CREATE_REQUEST = 1; |
205 const int _DELETE_REQUEST = 2; | 206 const int _DELETE_REQUEST = 2; |
206 const int _OPEN_REQUEST = 3; | 207 const int _OPEN_REQUEST = 3; |
207 const int _FULL_PATH_REQUEST = 4; | 208 const int _FULL_PATH_REQUEST = 4; |
208 const int _DIRECTORY_REQUEST = 5; | 209 const int _DIRECTORY_REQUEST = 5; |
209 const int _CLOSE_REQUEST = 6; | 210 const int _CLOSE_REQUEST = 6; |
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 new FileIOException("File closed '$_path'")); | 1051 new FileIOException("File closed '$_path'")); |
1051 }); | 1052 }); |
1052 return completer.future; | 1053 return completer.future; |
1053 } | 1054 } |
1054 | 1055 |
1055 final String _path; | 1056 final String _path; |
1056 int _id; | 1057 int _id; |
1057 | 1058 |
1058 SendPort _fileService; | 1059 SendPort _fileService; |
1059 } | 1060 } |
OLD | NEW |