| 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 | } |