| Index: runtime/bin/socket_stream.dart
|
| diff --git a/runtime/bin/socket_stream.dart b/runtime/bin/socket_stream.dart
|
| index 7bcd72e84700e5ee401fd7ee7025f4b7c2ed02d8..b0b50c16c2fb60bb492325294cacda440d88fe87 100644
|
| --- a/runtime/bin/socket_stream.dart
|
| +++ b/runtime/bin/socket_stream.dart
|
| @@ -5,158 +5,59 @@
|
| class SocketInputStream implements InputStream {
|
| SocketInputStream(Socket socket) {
|
| _socket = socket;
|
| - _buffer = null;
|
| }
|
|
|
| - bool read(List<int> buffer, int offset, int len, void callback()) {
|
| - // Read data just out of the buffer.
|
| - if (_buffer !== null && len <= _buffer.length) {
|
| - buffer.copyFrom(_buffer, 0, offset, len);
|
| - int remainder = _buffer.length - len;
|
| - if (remainder > 0) {
|
| - List<int> newBuffer = new List<int>(remainder);
|
| - newBuffer.copyFrom(_buffer, 0, len, remainder);
|
| - _buffer = newBuffer;
|
| - } else {
|
| - _buffer = null;
|
| + List<int> read([int len]) {
|
| + int bytesToRead = available();
|
| + if (bytesToRead == 0) return null;
|
| + if (len != null) {
|
| + if (len <= 0) {
|
| + throw new StreamException("Illegal length $len");
|
| + } else if (bytesToRead > len) {
|
| + bytesToRead = len;
|
| }
|
| - return true;
|
| }
|
| - // Read data out of the buffer if available and from the socket.
|
| - else {
|
| - int bytesRead = 0;
|
| - if (_buffer !== null) {
|
| - buffer.copyFrom(_buffer, offset, 0, _buffer.length);
|
| - bytesRead = _buffer.length;
|
| - _buffer = null;
|
| - }
|
| -
|
| - bytesRead +=
|
| - _socket.readList(buffer, offset + bytesRead, len - bytesRead);
|
| -
|
| - if (bytesRead == len) {
|
| - return true;
|
| - }
|
| -
|
| - void doRead() {
|
| - bytesRead +=
|
| - _socket.readList(buffer, offset + bytesRead, len - bytesRead);
|
| - if (bytesRead < len) {
|
| - _socket.setDataHandler(doRead);
|
| - } else {
|
| - assert(bytesRead == len);
|
| - _socket.setDataHandler(null);
|
| - if (callback !== null) {
|
| - callback();
|
| - }
|
| - }
|
| - }
|
| -
|
| - _socket.setDataHandler(doRead);
|
| - return false;
|
| + List<int> buffer = new List<int>(bytesToRead);
|
| + int bytesRead = _socket.readList(buffer, 0, bytesToRead);
|
| + if (bytesRead < bytesToRead) {
|
| + List<int> newBuffer = new List<int>(bytesRead);
|
| + newBuffer.copyFrom(buffer, 0, 0, bytesRead);
|
| + return newBuffer;
|
| + } else {
|
| + return buffer;
|
| }
|
| }
|
|
|
| - int _matchPattern(List<int> buffer, List<int> pattern, int start) {
|
| - int j;
|
| - if (pattern.length > buffer.length) {
|
| - return -1;
|
| - }
|
| - for (int i = start; i < (buffer.length - pattern.length + 1); i++) {
|
| - for (j = 0; j < pattern.length; j++) {
|
| - if (buffer[i + j] != pattern[j]) {
|
| - break;
|
| - }
|
| - }
|
| - if (j == pattern.length) {
|
| - return i;
|
| - }
|
| - }
|
| - return -1;
|
| + int readInto(List<int> buffer, int offset, int len) {
|
| + if (offset == null) offset = 0;
|
| + if (len == null) len = buffer.length;
|
| + if (offset < 0) throw new StreamException("Illegal offset $offset");
|
| + if (len < 0) throw new StreamException("Illegal length $len");
|
| + return _socket.readList(buffer, offset, len);
|
| }
|
|
|
| - /*
|
| - * Appends the newBuffer to the buffer (if available), sets the buffer to
|
| - * null, and returns the merged buffer.
|
| - */
|
| - List<int> _getBufferedData(List<int> newBuffer, int appendingBufferSpace) {
|
| - List<int> buffer;
|
| - int newDataStart = 0;
|
| - if (_buffer !== null) {
|
| - buffer = new List<int>(_buffer.length + appendingBufferSpace);
|
| - buffer.copyFrom(_buffer, 0, 0, _buffer.length);
|
| - newDataStart = _buffer.length;
|
| - _buffer = null;
|
| - } else {
|
| - buffer = new List<int>(appendingBufferSpace);
|
| - }
|
| - buffer.copyFrom(newBuffer, 0, newDataStart, appendingBufferSpace);
|
| - return buffer;
|
| + int available() {
|
| + return _socket.available();
|
| }
|
|
|
| - void readUntil(List<int> pattern, void callback(List<int> resultBuffer)) {
|
| - void doRead() {
|
| - List<int> newBuffer;
|
| - int available = _socket.available();
|
| - if (available > 0) {
|
| - List<int> buffer = new List<int>(available);
|
| - int result = _socket.readList(buffer, 0, buffer.length);
|
| - if (result > 0) {
|
| - // TODO(hpayer): Avoid copying of data before pattern matching.
|
| - newBuffer = _getBufferedData(buffer, result);
|
| - }
|
| - } else if (_buffer != null) {
|
| - newBuffer = _buffer;
|
| - } else {
|
| - _socket.setDataHandler(doRead);
|
| - return;
|
| - }
|
| -
|
| - int index = _matchPattern(newBuffer, pattern, 0);
|
| - // If pattern was found return the data including pattern and store the
|
| - // remainder in the buffer.
|
| - if (index != -1) {
|
| - int finalBufferSize = index + pattern.length;
|
| - List<int> finalBuffer = new List<int>(finalBufferSize);
|
| - finalBuffer.copyFrom(newBuffer, 0, 0, finalBufferSize);
|
| - if (finalBufferSize < newBuffer.length) {
|
| - List<int> remainder =
|
| - new List<int>(newBuffer.length - finalBufferSize);
|
| - remainder.copyFrom(newBuffer, finalBufferSize, 0, remainder.length);
|
| - _buffer = remainder;
|
| - } else {
|
| - _buffer = null;
|
| - }
|
| - _socket.setDataHandler(null);
|
| - callback(finalBuffer);
|
| - } else {
|
| - _buffer = newBuffer;
|
| - _socket.setDataHandler(doRead);
|
| - }
|
| - }
|
| + void set dataHandler(void callback()) {
|
| + _socket.setDataHandler(callback);
|
| + }
|
|
|
| - // Register callback for data available.
|
| - _socket.setDataHandler(doRead);
|
| + void set closeHandler(void callback()) {
|
| + _socket.setCloseHandler(callback);
|
| + }
|
|
|
| - // If data is already buffered schedule a data available callback.
|
| - if (_buffer != null) {
|
| - _socket._scheduleEvent(_SocketBase._IN_EVENT);
|
| - }
|
| + void set errorHandler(void callback()) {
|
| + _socket.setErrorHandler(callback);
|
| }
|
|
|
| Socket _socket;
|
| -
|
| - /*
|
| - * Read and readUntil read data out of that buffer first before reading new
|
| - * data out of the socket.
|
| - */
|
| - List<int> _buffer;
|
| }
|
|
|
| +
|
| class SocketOutputStream implements OutputStream {
|
| - SocketOutputStream(Socket socket) {
|
| - _socket = socket;
|
| - }
|
| + SocketOutputStream(Socket socket) : _socket = socket;
|
|
|
| bool write(List<int> buffer, int offset, int len, void callback()) {
|
| int bytesWritten = _socket.writeList(buffer, offset, len);
|
|
|