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

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

Issue 8819021: Simulate data and close callbacks on a synchronous file input stream (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: 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 | « no previous file | tests/standalone/src/FileInputStreamTest.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 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 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 implements FileInputStream { 5 class _FileInputStream implements FileInputStream {
6 _FileInputStream(File file) { 6 _FileInputStream(File file) {
7 _file = new File(file.name); 7 _file = new File(file.name);
8 _file.openSync(); 8 _file.openSync();
9 _length = _file.lengthSync();
10 _checkScheduleCallbacks();
9 } 11 }
10 12
11 List<int> read([int len]) { 13 List<int> read([int len]) {
14 if (_closed) return null;
12 int bytesToRead = available(); 15 int bytesToRead = available();
13 if (bytesToRead == 0) { 16 if (bytesToRead == 0) {
17 _checkScheduleCallbacks();
14 return null; 18 return null;
15 } 19 }
16 if (len !== null) { 20 if (len !== null) {
17 if (len <= 0) { 21 if (len <= 0) {
18 throw new StreamException("Illegal length $len"); 22 throw new StreamException("Illegal length $len");
19 } else if (bytesToRead > len) { 23 } else if (bytesToRead > len) {
20 bytesToRead = len; 24 bytesToRead = len;
21 } 25 }
22 } 26 }
23 List<int> buffer = new List<int>(bytesToRead); 27 List<int> buffer = new List<int>(bytesToRead);
24 int bytesRead = _file.readListSync(buffer, 0, bytesToRead); 28 int bytesRead = _file.readListSync(buffer, 0, bytesToRead);
25 if (bytesRead < bytesToRead) { 29 if (bytesRead < bytesToRead) {
26 List<int> newBuffer = new List<int>(bytesRead); 30 List<int> newBuffer = new List<int>(bytesRead);
27 newBuffer.copyFrom(buffer, 0, 0, bytesRead); 31 newBuffer.copyFrom(buffer, 0, 0, bytesRead);
28 return newBuffer; 32 return newBuffer;
29 } else { 33 } else {
30 return buffer; 34 return buffer;
31 } 35 }
32 } 36 }
33 37
34 int readInto(List<int> buffer, int offset, int len) { 38 int readInto(List<int> buffer, int offset, int len) {
35 if (offset === null) offset = 0; 39 if (offset === null) offset = 0;
36 if (len === null) len = buffer.length; 40 if (len === null) len = buffer.length;
37 if (offset < 0) throw new StreamException("Illegal offset $offset"); 41 if (offset < 0) throw new StreamException("Illegal offset $offset");
38 if (len < 0) throw new StreamException("Illegal length $len"); 42 if (len < 0) throw new StreamException("Illegal length $len");
39 return _file.readListSync(buffer, offset, len); 43 int result = _file.readListSync(buffer, offset, len);
44 _checkScheduleCallbacks();
45 return result;
40 } 46 }
41 47
42 int available() { 48 int available() {
43 return _file.lengthSync() - _file.positionSync(); 49 return _length - _file.positionSync();
44 } 50 }
45 51
46 bool closed() { 52 bool closed() => _eof;
47 _file.positionSync() == _file.lengthSync();
48 }
49 53
50 void close() { 54 void close() {
51 _file.closeSync(); 55 _file.closeSync();
56 _closed = true;
52 } 57 }
53 58
54 void set dataHandler(void callback()) { 59 void set dataHandler(void callback()) {
55 // TODO(sgjesse): How to handle this? 60 _clientDataHandler = callback;
61 _checkScheduleCallbacks();
56 } 62 }
57 63
58 void set closeHandler(void callback()) { 64 void set closeHandler(void callback()) {
59 // TODO(sgjesse): How to handle this? 65 _clientCloseHandler = callback;
60 } 66 }
61 67
62 void set errorHandler(void callback()) { 68 void set errorHandler(void callback()) {
63 // TODO(sgjesse): How to handle this? 69 // TODO(sgjesse): How to handle this?
64 } 70 }
65 71
72 void _checkScheduleCallbacks() {
73 // TODO(sgjesse): Find a better way of scheduling callbacks from
74 // the event loop.
75 void issueDataCallback(Timer timer) {
76 _scheduledDataCallback = null;
77 if (_clientDataHandler !== null) {
78 _clientDataHandler();
79 _checkScheduleCallbacks();
80 }
81 }
82
83 void issueCloseCallback(Timer timer) {
84 _scheduledCloseCallback = null;
85 if (!_closed) {
86 if (_clientCloseHandler !== null) _clientCloseHandler();
87 _closed = true;
88 }
89 }
90
91 // Schedule data callback if there is more data to read. Schedule
92 // close callback once when all data has been read. Only schedule
93 // a new callback if the previous one have actually been called.
Mads Ager (google) 2011/12/06 15:16:37 have -> has
94 if (available() > 0) {
95 if (_scheduledDataCallback == null) {
96 _scheduledDataCallback = new Timer(issueDataCallback, 0, false);
97 }
98 } else if (!_eof && !_closed) {
99 if (_scheduledCloseCallback == null) {
100 _scheduledCloseCallback = new Timer(issueCloseCallback, 0, false);
101 _eof = true;
102 }
103 }
104 }
105
66 File _file; 106 File _file;
107 int _length;
108 bool _eof = false;
109 bool _closed = false;
110 Timer _scheduledDataCallback;
111 Timer _scheduledCloseCallback;
112 var _clientDataHandler;
113 var _clientCloseHandler;
67 } 114 }
68 115
69 116
70 class _FileOutputStream implements FileOutputStream { 117 class _FileOutputStream implements FileOutputStream {
71 _FileOutputStream(File file) { 118 _FileOutputStream(File file) {
72 _file = new File(file.name); 119 _file = new File(file.name);
73 _file.openSync(true); 120 _file.openSync(true);
74 } 121 }
75 122
76 bool write(List<int> buffer, [bool copyBuffer = false]) { 123 bool write(List<int> buffer, [bool copyBuffer = false]) {
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 var _readListHandler; 1090 var _readListHandler;
1044 var _noPendingWriteHandler; 1091 var _noPendingWriteHandler;
1045 var _positionHandler; 1092 var _positionHandler;
1046 var _setPositionHandler; 1093 var _setPositionHandler;
1047 var _truncateHandler; 1094 var _truncateHandler;
1048 var _lengthHandler; 1095 var _lengthHandler;
1049 var _flushHandler; 1096 var _flushHandler;
1050 var _fullPathHandler; 1097 var _fullPathHandler;
1051 var _errorHandler; 1098 var _errorHandler;
1052 } 1099 }
OLDNEW
« no previous file with comments | « no previous file | tests/standalone/src/FileInputStreamTest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698