[Telepathy-commits] [telepathy-gabble/master] sync with current gibber
Guillaume Desmottes
guillaume.desmottes at collabora.co.uk
Thu Dec 18 07:53:09 PST 2008
---
lib/gibber/gibber-fd-transport.c | 43 ++++++++++++++++++++++++++++++++++++-
lib/gibber/gibber-fd-transport.h | 9 ++++++++
2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/lib/gibber/gibber-fd-transport.c b/lib/gibber/gibber-fd-transport.c
index adf7006..c7eedee 100644
--- a/lib/gibber/gibber-fd-transport.c
+++ b/lib/gibber/gibber-fd-transport.c
@@ -52,6 +52,17 @@ static void gibber_fd_transport_block_receiving (GibberTransport *transport,
G_DEFINE_TYPE(GibberFdTransport, gibber_fd_transport, GIBBER_TYPE_TRANSPORT)
+GQuark
+gibber_fd_transport_error_quark (void)
+{
+ static GQuark quark = 0;
+
+ if (!quark)
+ quark = g_quark_from_static_string ("gibber_fd_transport_error");
+
+ return quark;
+}
+
/* private structure */
typedef struct _GibberFdTransportPrivate GibberFdTransportPrivate;
@@ -311,8 +322,36 @@ _channel_io_out (GIOChannel *source, GIOCondition condition, gpointer data)
static gboolean
_channel_io_err (GIOChannel *source, GIOCondition condition, gpointer data)
{
- g_assert_not_reached ();
- return TRUE;
+ GibberFdTransport *self = GIBBER_FD_TRANSPORT (data);
+ GError *error = NULL;
+ gint code;
+ const gchar *msg;
+
+ if (condition & G_IO_ERR)
+ {
+ DEBUG ("Error on GIOChannel.Closing the transport");
+ /* We can't use g_io_channel_error_from_errno because it seems errno is
+ * not always set when we got a G_IO_ERR. */
+ code = GIBBER_FD_TRANSPORT_ERROR_FAILED;
+ msg = "Error on GIOChannel";
+ }
+ else if (condition & G_IO_HUP)
+ {
+ DEBUG ("Connection has been broken. Closing the transport");
+ code = GIBBER_FD_TRANSPORT_ERROR_PIPE;
+ msg = "Connection has been broken";
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+
+ error = g_error_new_literal (GIBBER_FD_TRANSPORT_ERROR, code, msg);
+ gibber_transport_emit_error (GIBBER_TRANSPORT (self), error);
+ g_error_free (error);
+
+ _do_disconnect (self);
+ return FALSE;
}
/* Default read and write implementations */
diff --git a/lib/gibber/gibber-fd-transport.h b/lib/gibber/gibber-fd-transport.h
index 3c2b7dd..813947f 100644
--- a/lib/gibber/gibber-fd-transport.h
+++ b/lib/gibber/gibber-fd-transport.h
@@ -37,6 +37,15 @@ typedef enum {
G_BEGIN_DECLS
+GQuark gibber_fd_transport_error_quark (void);
+#define GIBBER_FD_TRANSPORT_ERROR gibber_fd_transport_error_quark()
+
+typedef enum
+{
+ GIBBER_FD_TRANSPORT_ERROR_PIPE,
+ GIBBER_FD_TRANSPORT_ERROR_FAILED,
+} GibberFdTransportError;
+
typedef struct _GibberFdTransport GibberFdTransport;
typedef struct _GibberFdTransportClass GibberFdTransportClass;
--
1.5.6.5
More information about the Telepathy-commits
mailing list