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()
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)
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;
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;
}
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,
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);
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);