| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |