Diff between d76690df91d6dd7d82590b55d740e2afe4dbcde1 and 0f10ac2b8c79f9e5eb49e9f8db023e30cdba93b4

Changed Files

File Additions Deletions Status
gobex/gobex-defs.h +1 -0 modified
gobex/gobex.c +23 -6 modified
gobex/gobex.h +2 -2 modified
unit/test-gobex.c +4 -2 modified

Full Patch

diff --git a/gobex/gobex-defs.h b/gobex/gobex-defs.h
index 76b274f..e81d0fb 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 5b77399..be4fc5f 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 01a871c..918a603 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 2ce5e2e..7c1e79e 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);