summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2008-03-05 17:48:08 +0000
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2008-03-05 17:48:08 +0000
commitb251bd8f5dcc4ca2ae8ed6f044c73fa38094e1c5 (patch)
tree440ecaf6a44bdf03e0692b034d63f0362eefa5ab
parent0e80f8098d1a758149474b3ac3d540322a8b6e23 (diff)
downloadtelepathy-salut-b251bd8f5dcc4ca2ae8ed6f044c73fa38094e1c5.tar.gz
gibber-fd-transport.c: implement gibber_transport_block
20080305174808-7fe3f-f02e8973276cfcb0e09d7eaec57ad66ead0da158.gz
-rw-r--r--lib/gibber/gibber-fd-transport.c28
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);
+ }
+}