summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2010-06-13 21:15:26 +0300
committerFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 03:13:33 +0300
commite0f2ff68e46fe2b3360908f3fa5f69d6f65f86bb (patch)
tree0b67d6391cedc4e278105c9903f464045a585a90
parent6cf15e26b7c0c88364e971908c5a63175efa89d5 (diff)
session: add error handling
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r--pn_session.c33
-rw-r--r--pn_session.h2
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())