diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2008-03-05 17:48:08 +0000 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2008-03-05 17:48:08 +0000 |
commit | b251bd8f5dcc4ca2ae8ed6f044c73fa38094e1c5 (patch) | |
tree | 440ecaf6a44bdf03e0692b034d63f0362eefa5ab | |
parent | 0e80f8098d1a758149474b3ac3d540322a8b6e23 (diff) | |
download | telepathy-salut-b251bd8f5dcc4ca2ae8ed6f044c73fa38094e1c5.tar.gz |
gibber-fd-transport.c: implement gibber_transport_block
20080305174808-7fe3f-f02e8973276cfcb0e09d7eaec57ad66ead0da158.gz
-rw-r--r-- | lib/gibber/gibber-fd-transport.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/lib/gibber/gibber-fd-transport.c b/lib/gibber/gibber-fd-transport.c index 37c1f18d..29863c92 100644 --- a/lib/gibber/gibber-fd-transport.c +++ b/lib/gibber/gibber-fd-transport.c @@ -50,6 +50,9 @@ static void _do_disconnect(GibberFdTransport *self); static gboolean gibber_fd_transport_buffer_is_empty ( GibberTransport *transport); +static void gibber_fd_transport_block (GibberTransport *transport, + gboolean block); + G_DEFINE_TYPE(GibberFdTransport, gibber_fd_transport, GIBBER_TYPE_TRANSPORT) /* private structure */ @@ -108,6 +111,7 @@ gibber_fd_transport_class_init (GibberFdTransportClass *gibber_fd_transport_clas transport_class->disconnect = gibber_fd_transport_disconnect; transport_class->get_sockaddr = gibber_fd_transport_get_sockaddr; transport_class->buffer_is_empty = gibber_fd_transport_buffer_is_empty; + transport_class->block = gibber_fd_transport_block; gibber_fd_transport_class->read = gibber_fd_transport_read; gibber_fd_transport_class->write = gibber_fd_transport_write; @@ -145,7 +149,8 @@ _do_disconnect(GibberFdTransport *self) { } DEBUG("Closing the fd transport"); if (priv->channel != NULL) { - g_source_remove(priv->watch_in); + if (priv->watch_in != 0) + g_source_remove (priv->watch_in); if (priv->watch_out) g_source_remove(priv->watch_out); g_source_remove(priv->watch_err); @@ -389,3 +394,24 @@ gibber_fd_transport_buffer_is_empty (GibberTransport *transport) return (priv->output_buffer == NULL || priv->output_buffer->len == 0); } + +static void +gibber_fd_transport_block (GibberTransport *transport, + gboolean block) +{ + GibberFdTransport *self = GIBBER_FD_TRANSPORT (transport); + GibberFdTransportPrivate *priv = GIBBER_FD_TRANSPORT_GET_PRIVATE (self); + + if (block && priv->watch_in != 0) + { + DEBUG ("block the transport"); + g_source_remove (priv->watch_in); + priv->watch_in = 0; + } + else if (!block && priv->watch_in == 0) + { + DEBUG ("unblock the transport"); + priv->watch_in = g_io_add_watch (priv->channel, G_IO_IN, + _channel_io_in, self); + } +} |