OSDN Git Service

gobex: Add proper error returns to packet sending functions
authorJohan Hedberg <johan.hedberg@intel.com>
Wed, 29 Jun 2011 11:33:04 +0000 (14:33 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 4 Dec 2012 21:21:57 +0000 (22:21 +0100)
gobex/gobex-defs.h
gobex/gobex.c
gobex/gobex.h
unit/test-gobex.c

index 76b274f..e81d0fb 100644 (file)
@@ -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()
index 5b77399..be4fc5f 100644 (file)
@@ -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;
 }
index 01a871c..918a603 100644 (file)
@@ -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,
index 2ce5e2e..7c1e79e 100644 (file)
@@ -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);