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