chiark / gitweb /
progress.scala: Miscellaneous WIP.
[tripe-android] / sock.scala
1 package uk.org.distorted.tripe;
2
3 import java.io.{Closeable, File, InputStream, OutputStream};
4 import jni.Constants._;
5
6 class Connection(path: File) extends Closeable {
7   def this(path: String) { this(new File(path)); }
8   val conn = jni.connect(path.getPath);
9   override def close() { jni.close(conn, CF_CLOSEMASK); }
10   lazy val input = new ConnectionInputStream(this);
11   lazy val output = new ConnectionOutputStream(this);
12   override protected def finalize() { super.finalize(); close(); }
13 }
14
15 class ConnectionInputStream(val conn: Connection) extends InputStream {
16   override def read(): Int = {
17     val buf = new Array[Byte](1);
18     val n = read(buf, 0, 1);
19     if (n < 0) -1 else buf(0)&0xff;
20   }
21   override def read(buf: Array[Byte]): Int =
22     read(buf, 0, buf.length);
23   override def read(buf: Array[Byte], start: Int, len: Int) =
24     jni.recv(conn.conn, buf, start, len);
25   override def close() { jni.close(conn.conn, CF_CLOSERD); }
26 }
27
28 class ConnectionOutputStream(val conn: Connection) extends OutputStream {
29   override def write(b: Int) = {
30     val buf = Array[Byte](b.toByte);
31     write(buf, 0, 1);
32   }
33   override def write(buf: Array[Byte]) { write(buf, 0, buf.length); }
34   override def write(buf: Array[Byte], start: Int, len: Int) =
35     jni.send(conn.conn, buf, start, len);
36   override def close() { jni.close(conn.conn, CF_CLOSEWR); }
37 }