From 0f10ac2b8c79f9e5eb49e9f8db023e30cdba93b4 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 29 Jun 2011 14:33:04 +0300 Subject: [PATCH] gobex: Add proper error returns to packet sending functions --- gobex/gobex-defs.h | 1 + gobex/gobex.c | 29 +++++++++++++++++++++++------ gobex/gobex.h | 4 ++-- unit/test-gobex.c | 6 ++++-- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/gobex/gobex-defs.h b/gobex/gobex-defs.h index 76b274f24..e81d0fb6b 100644 --- a/gobex/gobex-defs.h +++ b/gobex/gobex-defs.h @@ -33,6 +33,7 @@ typedef enum { typedef enum { G_OBEX_ERROR_PARSE_ERROR, G_OBEX_ERROR_INVALID_ARGS, + G_OBEX_ERROR_DISCONNECTED, } GObexError; #define G_OBEX_ERROR g_obex_error_quark() diff --git a/gobex/gobex.c b/gobex/gobex.c index 5b7739904..be4fc5f59 100644 --- a/gobex/gobex.c +++ b/gobex/gobex.c @@ -191,10 +191,17 @@ done: return FALSE; } -static gboolean g_obex_send_internal(GObex *obex, struct pending_pkt *p) +static gboolean g_obex_send_internal(GObex *obex, struct pending_pkt *p, + GError **err) { GIOCondition cond; + if (obex->io == NULL) { + g_set_error(err, G_OBEX_ERROR, G_OBEX_ERROR_DISCONNECTED, + "The transport is not connected"); + return FALSE; + } + g_queue_push_tail(obex->tx_queue, p); if (g_queue_get_length(obex->tx_queue) > 1) @@ -206,21 +213,29 @@ static gboolean g_obex_send_internal(GObex *obex, struct pending_pkt *p) return TRUE; } -gboolean g_obex_send(GObex *obex, GObexPacket *pkt) +gboolean g_obex_send(GObex *obex, GObexPacket *pkt, GError **err) { struct pending_pkt *p; + gboolean ret; - if (obex == NULL || pkt == NULL) + if (obex == NULL || pkt == NULL) { + g_set_error(err, G_OBEX_ERROR, G_OBEX_ERROR_INVALID_ARGS, + "Invalid arguments"); return FALSE; + } p = g_new0(struct pending_pkt, 1); p->pkt = pkt; - return g_obex_send_internal(obex, p); + ret = g_obex_send_internal(obex, p, err); + if (ret == FALSE) + pending_pkt_free(p); + + return ret; } guint g_obex_send_req(GObex *obex, GObexPacket *req, GObexResponseFunc func, - gpointer user_data) + gpointer user_data, GError **err) { struct pending_pkt *p; static guint id = 1; @@ -232,8 +247,10 @@ guint g_obex_send_req(GObex *obex, GObexPacket *req, GObexResponseFunc func, p->rsp_func = func; p->rsp_data = user_data; - if (!g_obex_send_internal(obex, p)) + if (!g_obex_send_internal(obex, p, err)) { + pending_pkt_free(p); return 0; + } return p->id; } diff --git a/gobex/gobex.h b/gobex/gobex.h index 01a871c58..918a60342 100644 --- a/gobex/gobex.h +++ b/gobex/gobex.h @@ -39,10 +39,10 @@ typedef void (*GObexResponseFunc) (GObex *obex, GError *err, GObexPacket *rsp, gpointer user_data); typedef void (*GObexDisconnectFunc) (GObex *obex, gpointer user_data); -gboolean g_obex_send(GObex *obex, GObexPacket *pkt); +gboolean g_obex_send(GObex *obex, GObexPacket *pkt, GError **err); guint g_obex_send_req(GObex *obex, GObexPacket *req, GObexResponseFunc func, - gpointer user_data); + gpointer user_data, GError **err); gboolean g_obex_cancel_req(GObex *obex, guint req_id); void g_obex_set_request_function(GObex *obex, GObexRequestFunc func, diff --git a/unit/test-gobex.c b/unit/test-gobex.c index 2ce5e2e17..7c1e79ec7 100644 --- a/unit/test-gobex.c +++ b/unit/test-gobex.c @@ -215,7 +215,8 @@ static void test_send_req_stream(void) g_obex_packet_set_data(req, connect_data, sizeof(connect_data), G_OBEX_DATA_REF); - g_obex_send_req(obex, req, connect_rsp, &gerr); + g_obex_send_req(obex, req, connect_rsp, &gerr, &gerr); + g_assert_no_error(gerr); cond = G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL; io_id = g_io_add_watch(io, cond, send_connect_rsp, &gerr); @@ -254,7 +255,8 @@ static void test_send_connect_stream(void) g_obex_packet_set_data(req, connect_data, sizeof(connect_data), G_OBEX_DATA_REF); - g_obex_send(obex, req); + g_obex_send(obex, req, &gerr); + g_assert_no_error(gerr); cond = G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL; io_id = g_io_add_watch(io, cond, handle_connect_data, &gerr); -- 2.47.3