diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-13 21:15:26 +0300 |
---|---|---|
committer | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 03:13:33 +0300 |
commit | e0f2ff68e46fe2b3360908f3fa5f69d6f65f86bb (patch) | |
tree | 0b67d6391cedc4e278105c9903f464045a585a90 | |
parent | 6cf15e26b7c0c88364e971908c5a63175efa89d5 (diff) |
session: add error handling
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r-- | pn_session.c | 33 | ||||
-rw-r--r-- | pn_session.h | 2 |
2 files changed, 35 insertions, 0 deletions
diff --git a/pn_session.c b/pn_session.c index 2ec58b7..20db826 100644 --- a/pn_session.c +++ b/pn_session.c @@ -8,6 +8,7 @@ struct pn_session_priv { char *password; struct pn_node *ns; + gulong error_handler; }; enum { @@ -53,6 +54,16 @@ pn_session_get_username(struct pn_session *session) return session->priv->username; } +static void +error_cb(struct pn_node *node, + GError **error, + struct pn_session *session) +{ + struct pn_session_class *class; + class = g_type_class_peek(PN_SESSION_TYPE); + g_signal_emit(G_OBJECT(session), class->error_sig, 0, error, session); +} + /* GObject stuff */ static void @@ -64,6 +75,8 @@ instance_init(GTypeInstance *instance, self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE(instance, PN_SESSION_TYPE, struct pn_session_priv); priv->ns = PN_NODE(pn_ns_new(self)); + + priv->error_handler = g_signal_connect(priv->ns, "error", G_CALLBACK(error_cb), self); } static void @@ -111,6 +124,19 @@ set_property(GObject *object, } static void +dispose(GObject *obj) +{ + struct pn_session *self = PN_SESSION(obj); + struct pn_session_priv *priv = self->priv; + + if (priv->error_handler) { + g_signal_handler_disconnect(priv->ns, priv->error_handler); + priv->error_handler = 0; + } + G_OBJECT_CLASS(parent_class)->dispose(obj); +} + +static void finalize(GObject *obj) { struct pn_session *self = PN_SESSION(obj); @@ -127,7 +153,9 @@ class_init(void *g_class, void *class_data) { GObjectClass *gobject_class = G_OBJECT_CLASS(g_class); + struct pn_session_class *session_class = PN_SESSION_CLASS(g_class); + gobject_class->dispose = dispose; gobject_class->finalize = finalize; gobject_class->get_property = get_property; gobject_class->set_property = set_property; @@ -148,6 +176,11 @@ class_init(void *g_class, parent_class = g_type_class_peek_parent(g_class); g_type_class_add_private(g_class, sizeof(struct pn_session_priv)); + + session_class->error_sig = g_signal_new("error", G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_FIRST, 0, NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); } GType diff --git a/pn_session.h b/pn_session.h index 83be96f..866d43c 100644 --- a/pn_session.h +++ b/pn_session.h @@ -11,6 +11,8 @@ struct pn_session { struct pn_session_class { GObjectClass parent_class; + + guint error_sig; }; #define PN_SESSION_TYPE (pn_session_get_type()) |