From 712b073f95f694f23a070bd43cd0c9e7479142b7 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 7 Jul 2010 05:24:31 +0200 Subject: Implemented most types, sending & receiving --- src/PacketHandler.vala | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/PacketHandler.vala (limited to 'src/PacketHandler.vala') diff --git a/src/PacketHandler.vala b/src/PacketHandler.vala new file mode 100644 index 0000000..0f5cd3c --- /dev/null +++ b/src/PacketHandler.vala @@ -0,0 +1,77 @@ +namespace Eva { + public class PacketHandler { + private DataInputStream istream; + private DataOutputStream ostream; + private int sizeLength; + + public signal void received_term(Term term); + + public PacketHandler(InputStream input, OutputStream output, int length) { + assert(length == 1 || length == 2 || length == 4); + + istream = new DataInputStream(input); + ostream = new DataOutputStream(output); + sizeLength = length; + + istream.byte_order = DataStreamByteOrder.BIG_ENDIAN; + ostream.byte_order = DataStreamByteOrder.BIG_ENDIAN; + } + + public void send(Term term) throws Error { + Erl.Buffer buffer = Erl.Buffer.with_version(); + term.encode(buffer); + + switch(sizeLength) { + case 1: + ostream.put_byte((uchar)buffer.buff.length, null); + break; + case 2: + ostream.put_uint16((uint16)buffer.buff.length, null); + break; + case 4: + ostream.put_uint32((uint32)buffer.buff.length, null); + break; + } + + ostream.write(buffer.buff, buffer.buff.length, null); + } + + private async void receive() throws Error { + while(true) { + while(istream.get_available() < sizeLength) { + yield istream.fill_async((ssize_t)(sizeLength - istream.get_available()), 0, null); + } + + int length = 0; + switch(sizeLength) { + case 1: + length = istream.read_byte(null); + break; + case 2: + length = istream.read_uint16(null); + break; + case 4: + length = (int)istream.read_uint32(null); + break; + } + + uint8[] buffer = new uint8[length]; + size_t received = 0; + + while(received < length) { + size_t ret = yield istream.read_async(&(buffer[received]), length-received, 0, null); + assert(ret > 0); + + received += ret; + } + + Term term = Term.decode(buffer); + Idle.add(() => {received_term(term); return false;}); + } + } + + public void start() { + receive.begin(); + } + } +} -- cgit v1.2.3