Browse Source

devicechannel: detect connection close

bboozzoo/device-cache
Maciek Borzecki 10 years ago
parent
commit
695de9b06d
1 changed files with 36 additions and 12 deletions
  1. +36
    -12
      src/devicechannel.vala

+ 36
- 12
src/devicechannel.vala View File

@ -79,9 +79,9 @@ class DeviceChannel : Object {
sock.set_keepalive(true);
// prep source for monitoring events
SocketSource source = sock.create_source(IOCondition.IN | IOCondition.ERR |
IOCondition.HUP);
IOCondition.HUP);
source.set_callback((src, cond) => {
this._io_ready.begin();
this._io_ready.begin(cond);
return true;
});
// attach source
@ -136,13 +136,30 @@ class DeviceChannel : Object {
}
}
public async void receive() throws Error {
/**
* receive:
* Try to receive some data from channel
*
* @return false if channel was closed, true otherwise
*/
public async bool receive() throws Error {
size_t line_len;
string data = null;
// read line up to newline
string data = yield _din.read_upto_async("\n", -1,
Priority.DEFAULT,
null,
out line_len);
try {
data = yield _din.read_upto_async("\n", -1,
Priority.DEFAULT,
null,
out line_len);
} catch (IOError ie) {
debug("I/O error: %s", ie.message);
}
if (data == null) {
debug("connection closed?");
return false;
}
debug("received line: %s", data);
// expecting \n\n
_din.read_byte();
@ -151,16 +168,23 @@ class DeviceChannel : Object {
Packet pkt = Packet.new_from_data(data);
if (pkt == null) {
critical("failed to build packet from data");
return;
// data was received, hence connection is still alive
return true;
}
handle_packet(pkt);
return true;
}
private async void _io_ready() {
debug("check for IO");
debug("try read");
this.receive.begin();
private async void _io_ready(uint flags) {
debug("check for IO, conditions: 0x%x", flags);
bool res = yield this.receive();
if (res == false) {
// disconnected
disconnected();
}
}
private void handle_packet(Packet pkt) {


Loading…
Cancel
Save