protected final Out out;
private StringBuffer log = loggingEnabled ? new StringBuffer(16 * 1024) : null;
private String newLine = "\r\n";
- private Stream in_next = null;
+ private Stream in_next = null;
+ public Stream append(String in_next) { return appendStream(new Stream(in_next)); }
public Stream appendStream(Stream in_next) {
- if (this.in_next != null) return this.in_next.appendStream(in_next);
- this.in_next = in_next;
+ if (this.in_next != null)
+ this.in_next.appendStream(in_next);
+ else
+ this.in_next = in_next;
return this;
}
- public static boolean loggingEnabled = "true".equals(System.getProperty("ibex.io.stream.logEnabled", "false"));
+ //public static boolean loggingEnabled = "true".equals(System.getProperty("ibex.io.stream.logEnabled", "false"));
+ public static boolean loggingEnabled = true;
- public void transcribe(Stream out) {
+ public void transcribe(Stream out) { transcribe(out, false); }
+ public void transcribe(Stream out, boolean close) {
try {
byte[] buf = new byte[1024];
while(true) {
int numread = in.read(buf, 0, buf.length);
- if (numread==-1) return;
+ if (numread==-1) { in.close(); break; }
out.out.write(buf, 0, numread);
}
- } catch (IOException ioe) { throw new StreamException(ioe); }
+ if (close) out.close();
+ } catch (IOException ioe) { ioe(ioe); }
+ }
+
+ public void transcribe(StringBuffer out) {
+ //try {
+ char[] buf = new char[1024];
+ while(true) {
+ int numread = in.read(buf, 0, buf.length);
+ if (numread==-1) { in.close(); return; }
+ out.append(buf, 0, numread);
+ }
+ //} catch (IOException ioe) { ioe(ioe); }
}
public static int countLines(Stream s) {
int ret = 0;
while(s.readln() != null) ret++;
+ s.close();
return ret;
}
- public Stream(byte[] b, int off, int len) { this.in = new Stream.In(new ByteArrayInputStream(b, off, len)); this.out=null; }
+ public Stream(byte[] b, int off, int len) { this.in = new Stream.In(new ByteArrayInputStream(b, off, len)); this.out=null; }
public Stream(InputStream in) { this.in = new Stream.In(in); this.out = null; }
public Stream( OutputStream out) { this.in = null; this.out = new Stream.Out(out); }
public Stream(InputStream in, OutputStream out) { this.in = new Stream.In(in); this.out = new Stream.Out(out); }
public Stream(String s) { this(new ByteArrayInputStream(s.getBytes())); }
public Stream(File f) {
- try { this.in = new Stream.In(new FileInputStream(f)); } catch (IOException e) { throw new StreamException(e); }
+ try { this.in = new Stream.In(new FileInputStream(f)); } catch (IOException e) { ioe(e); throw new Error(); }
this.out = null;
}
public Stream(Socket s) {
- try { this.in = new Stream.In(s.getInputStream()); } catch (IOException e) { throw new StreamException(e); }
- try { this.out = new Stream.Out(s.getOutputStream()); } catch (IOException e) { throw new StreamException(e); }
+ try { this.in = new Stream.In(s.getInputStream()); } catch (IOException e) { ioe(e); throw new Error(); }
+ try { this.out = new Stream.Out(s.getOutputStream()); } catch (IOException e) { ioe(e); throw new Error(); }
}
- private static int ioe(Exception e) { throw new StreamException(e); }
+ static int ioe(IOException e) {
+ if (e instanceof SocketException && e.toString().indexOf("Connection reset")!=-1)
+ throw new Closed(e.getMessage());
+ throw new StreamException(e);
+ }
public static class StreamException extends RuntimeException {
public StreamException(Exception e) { super(e); }
public StreamException(String s) { super(s); }
try {
blocker.put(Thread.currentThread(), this);
logWrite(s);
+ logWrite(newLine);
out.write(s);
out.write(newLine);
flush();
public void unread(String s) { in.unread(s); }
+ /** should not throw exceptions */
public void close() { try { if (in!=null) in.close(); } finally { if (out!=null) out.close(); } }
public void setNewline(String s) { newLine = s; }
boolean flushing = false;
public int available() { return flushing ? 0 : (end - start); }
- public void close() { try { if (orig!=null) orig.close(); } catch (Exception e) { Log.error(this, e); } }
+ public void close() { try {
+ if (orig!=null) orig.close();
+ if (in_next != null) in_next.close(); // FIXME: correct?
+ } catch (Exception e) { Log.error(this, e); } }
public char getc(boolean peek) { try {
if (cstart == cend) {
cstart = 0;
cend = reader.read(cbuf, 0, cbuf.length);
if (cend == -1) {
+ reader.close();
cend = cstart;
if (in_next == null) throw new EOF();
- // FIXME: sketchy
- orig = in_next.in.orig;
- in_next = in_next.in_next;
return getc(peek);
}
}
ensurec(256);
int numread = reader.read(cbuf, cend, cbuf.length - cend);
if (numread == -1) {
+ reader.close();
if (cstart == cend) return null;
String ret = new String(cbuf, cstart, cend-cstart);
cstart = cend = 0;
if (cstart == cend) {
cstart = 0;
cend = reader.read(cbuf, 0, cbuf.length);
- if (cend == -1) { cend = cstart; return -1; }
+ if (cend == -1) { reader.close(); cend = cstart; return -1; }
}
if (len > cend - cstart) len = cend - cstart;
System.arraycopy(cbuf, cstart, c, pos, len);
if (start == end) {
start = 0;
end = orig.read(buf, 0, buf.length);
- if (end == -1) { end = start; return -1; }
+ if (end == -1) {
+ orig.close();
+ end = start;
+ if (in_next==null) return -1;
+ return in_next.read(b, pos, len);
+ }
}
if (len > end - start) len = end - start;
System.arraycopy(buf, start, b, pos, len);
private void flushchars() {
try {
flushing = true;
- for(; reader.ready(); reader.read(cbuf, cend++, 1)) ensurec(1);
- unreader.write(cbuf, cstart, cend);
+ for(; reader.ready(); reader.read(cbuf, cend++, 1)) ensurec(10);
+ if (cend>cstart)
+ unreader.write(cbuf, cstart, cend-cstart);
cstart = cend = 0;
unreader.flush();
} catch (IOException e) { ioe(e);