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

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

Issue 9029001: Add close to input stream and cleanup socket and streams (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 12 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
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 InputStream {
6 _FileInputStream(File file) { 6 _FileInputStream(File file) {
7 _file = file.openSync(); 7 _file = file.openSync();
8 _length = _file.lengthSync(); 8 _length = _file.lengthSync();
9 _checkScheduleCallbacks(); 9 _checkScheduleCallbacks();
10 } 10 }
11 11
12 List<int> read([int len]) { 12 List<int> read([int len]) {
13 if (_closed) return null; 13 if (_closed) return null;
14 int bytesToRead = available(); 14 int bytesToRead = available();
15 if (bytesToRead == 0) { 15 if (bytesToRead == 0) {
(...skipping 21 matching lines...) Expand all
37 int readInto(List<int> buffer, int offset, int len) { 37 int readInto(List<int> buffer, int offset, int len) {
38 if (offset === null) offset = 0; 38 if (offset === null) offset = 0;
39 if (len === null) len = buffer.length; 39 if (len === null) len = buffer.length;
40 if (offset < 0) throw new StreamException("Illegal offset $offset"); 40 if (offset < 0) throw new StreamException("Illegal offset $offset");
41 if (len < 0) throw new StreamException("Illegal length $len"); 41 if (len < 0) throw new StreamException("Illegal length $len");
42 int result = _file.readListSync(buffer, offset, len); 42 int result = _file.readListSync(buffer, offset, len);
43 _checkScheduleCallbacks(); 43 _checkScheduleCallbacks();
44 return result; 44 return result;
45 } 45 }
46 46
47 int available() { 47 int available() => (_closing || _eof) ? 0 : _length - _file.positionSync();
48 return _length - _file.positionSync();
49 }
50 48
51 void pipe(OutputStream output, [bool close = true]) { 49 void pipe(OutputStream output, [bool close = true]) {
52 _pipe(this, output, close: close); 50 _pipe(this, output, close: close);
53 } 51 }
54 52
55 bool closed() => _eof; 53 bool get closed() => _eof;
56 54
57 void close() { 55 void close() {
56 _closing = true;
58 _file.closeSync(); 57 _file.closeSync();
59 _closed = true;
60 } 58 }
61 59
62 void set dataHandler(void callback()) { 60 void set dataHandler(void callback()) {
63 _clientDataHandler = callback; 61 _clientDataHandler = callback;
64 _checkScheduleCallbacks(); 62 _checkScheduleCallbacks();
65 } 63 }
66 64
67 void set closeHandler(void callback()) { 65 void set closeHandler(void callback()) {
68 _clientCloseHandler = callback; 66 _clientCloseHandler = callback;
69 } 67 }
70 68
71 void set errorHandler(void callback()) { 69 void set errorHandler(void callback()) {
72 // TODO(sgjesse): How to handle this? 70 // TODO(sgjesse): How to handle this?
73 } 71 }
74 72
75 void _checkScheduleCallbacks() { 73 void _checkScheduleCallbacks() {
76 // TODO(sgjesse): Find a better way of scheduling callbacks from
77 // the event loop.
78 void issueDataCallback(Timer timer) { 74 void issueDataCallback(Timer timer) {
79 _scheduledDataCallback = null; 75 _scheduledDataCallback = null;
80 if (_clientDataHandler !== null) { 76 if (_clientDataHandler !== null) {
81 _clientDataHandler(); 77 _clientDataHandler();
82 _checkScheduleCallbacks(); 78 _checkScheduleCallbacks();
83 } 79 }
84 } 80 }
85 81
86 void issueCloseCallback(Timer timer) { 82 void issueCloseCallback(Timer timer) {
87 _scheduledCloseCallback = null; 83 _scheduledCloseCallback = null;
88 if (!_closed) { 84 if (!_closed) {
89 if (_clientCloseHandler !== null) _clientCloseHandler(); 85 if (_clientCloseHandler !== null) _clientCloseHandler();
90 _closed = true; 86 _closed = true;
91 } 87 }
92 } 88 }
93 89
94 // Schedule data callback if there is more data to read. Schedule 90 // Schedule data callback if there is more data to read. Schedule
95 // close callback once when all data has been read. Only schedule 91 // close callback once when all data has been read. Only schedule
96 // a new callback if the previous one has actually been called. 92 // a new callback if the previous one has actually been called.
97 if (!_closed) { 93 if (!_closed) {
98 if (available() > 0) { 94 if (available() > 0) {
99 if (_scheduledDataCallback == null) { 95 if (_scheduledDataCallback == null) {
100 _scheduledDataCallback = new Timer(issueDataCallback, 0); 96 _scheduledDataCallback = new Timer(issueDataCallback, 0);
101 } 97 }
102 } else if (!_eof) { 98 } else if (!_eof) {
99 close();
103 if (_scheduledCloseCallback == null) { 100 if (_scheduledCloseCallback == null) {
104 _scheduledCloseCallback = new Timer(issueCloseCallback, 0); 101 _scheduledCloseCallback = new Timer(issueCloseCallback, 0);
105 _eof = true;
106 } 102 }
103 _eof = true;
107 } 104 }
108 } 105 }
109 } 106 }
110 107
111 RandomAccessFile _file; 108 RandomAccessFile _file;
112 int _length; 109 int _length;
113 bool _eof = false; 110 bool _eof = false;
111 bool _closing = false;
114 bool _closed = false; 112 bool _closed = false;
115 Timer _scheduledDataCallback; 113 Timer _scheduledDataCallback;
116 Timer _scheduledCloseCallback; 114 Timer _scheduledCloseCallback;
117 Function _clientDataHandler; 115 Function _clientDataHandler;
118 Function _clientCloseHandler; 116 Function _clientCloseHandler;
119 } 117 }
120 118
121 119
122 class _FileOutputStream implements FileOutputStream { 120 class _FileOutputStream implements OutputStream {
123 _FileOutputStream(File file) { 121 _FileOutputStream(File file) {
124 _file = file.openSync(true); 122 _file = file.openSync(true);
125 } 123 }
126 124
127 bool write(List<int> buffer, [bool copyBuffer = false]) { 125 bool write(List<int> buffer, [bool copyBuffer = false]) {
128 return _write(buffer, 0, buffer.length); 126 return _write(buffer, 0, buffer.length);
129 } 127 }
130 128
131 bool writeFrom(List<int> buffer, [int offset = 0, int len]) { 129 bool writeFrom(List<int> buffer, [int offset = 0, int len]) {
132 return _write( 130 return _write(
133 buffer, offset, (len == null) ? buffer.length - offset : len); 131 buffer, offset, (len == null) ? buffer.length - offset : len);
134 } 132 }
135 133
136 void end() {
137 _file.closeSync();
138 }
139
140 void close() { 134 void close() {
141 _file.closeSync(); 135 _file.closeSync();
142 } 136 }
143 137
144 void set noPendingWriteHandler(void callback()) { 138 void set noPendingWriteHandler(void callback()) {
145 // TODO(sgjesse): How to handle this? 139 // TODO(sgjesse): How to handle this?
146 } 140 }
147 141
148 void set closeHandler(void callback()) { 142 void set closeHandler(void callback()) {
149 // TODO(sgjesse): How to handle this? 143 // TODO(sgjesse): How to handle this?
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
1123 var _readByteHandler; 1117 var _readByteHandler;
1124 var _readListHandler; 1118 var _readListHandler;
1125 var _noPendingWriteHandler; 1119 var _noPendingWriteHandler;
1126 var _positionHandler; 1120 var _positionHandler;
1127 var _setPositionHandler; 1121 var _setPositionHandler;
1128 var _truncateHandler; 1122 var _truncateHandler;
1129 var _lengthHandler; 1123 var _lengthHandler;
1130 var _flushHandler; 1124 var _flushHandler;
1131 var _errorHandler; 1125 var _errorHandler;
1132 } 1126 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698