From 371bd8adf6edee9a80413be98cef651fe627bcb4 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 29 Jun 2011 21:23:14 +0300 Subject: [PATCH] gobex: Remove disconn callback in favor of generic event callback --- gobex/gobex-defs.h | 1 + gobex/gobex.c | 66 ++++++++++++++++++++++++---------------------- gobex/gobex.h | 8 ++---- unit/test-gobex.c | 33 ++++++++++++++--------- 4 files changed, 57 insertions(+), 51 deletions(-) diff --git a/gobex/gobex-defs.h b/gobex/gobex-defs.h index 10e3fbbe7..6d7e37964 100644 --- a/gobex/gobex-defs.h +++ b/gobex/gobex-defs.h @@ -35,6 +35,7 @@ typedef enum { G_OBEX_ERROR_INVALID_ARGS, G_OBEX_ERROR_DISCONNECTED, G_OBEX_ERROR_TIMEOUT, + G_OBEX_ERROR_FAILED, } GObexError; #define G_OBEX_ERROR g_obex_error_quark() diff --git a/gobex/gobex.c b/gobex/gobex.c index d53612562..267f61a71 100644 --- a/gobex/gobex.c +++ b/gobex/gobex.c @@ -37,8 +37,8 @@ struct _GObex { GIOChannel *io; guint io_source; - gboolean (*read) (GObex *obex); - gboolean (*write) (GObex *obex); + gboolean (*read) (GObex *obex, GError **err); + gboolean (*write) (GObex *obex, GError **err); guint8 *rx_buf; size_t rx_data; @@ -55,11 +55,8 @@ struct _GObex { GQueue *tx_queue; - GObexRequestFunc req_func; - gpointer req_func_data; - - GObexDisconnectFunc disconn_func; - gpointer disconn_func_data; + GObexEventFunc ev_func; + gpointer ev_func_data; struct pending_pkt *pending_req; }; @@ -146,7 +143,7 @@ static gboolean req_timeout(gpointer user_data) return FALSE; } -static gboolean write_stream(GObex *obex) +static gboolean write_stream(GObex *obex, GError **err) { GIOStatus status; gsize bytes_written; @@ -154,7 +151,7 @@ static gboolean write_stream(GObex *obex) buf = (gchar *) &obex->tx_buf[obex->tx_sent]; status = g_io_channel_write_chars(obex->io, buf, obex->tx_data, - &bytes_written, NULL); + &bytes_written, err); if (status != G_IO_STATUS_NORMAL) return FALSE; @@ -164,8 +161,10 @@ static gboolean write_stream(GObex *obex) return TRUE; } -static gboolean write_packet(GObex *obex) +static gboolean write_packet(GObex *obex, GError **err) { + g_set_error(err, G_OBEX_ERROR, G_OBEX_ERROR_FAILED, + "Packet based writing not implemented"); return FALSE; } @@ -210,7 +209,7 @@ static gboolean write_data(GIOChannel *io, GIOCondition cond, obex->tx_sent = 0; } - if (!obex->write(obex)) + if (!obex->write(obex, NULL)) goto done; if (obex->tx_data > 0 || g_queue_get_length(obex->tx_queue) > 0) @@ -311,18 +310,11 @@ gboolean g_obex_cancel_req(GObex *obex, guint req_id) return TRUE; } -void g_obex_set_request_function(GObex *obex, GObexRequestFunc func, - gpointer user_data) -{ - obex->req_func = func; - obex->req_func_data = user_data; -} - -void g_obex_set_disconnect_function(GObex *obex, GObexDisconnectFunc func, +void g_obex_set_event_function(GObex *obex, GObexEventFunc func, gpointer user_data) { - obex->disconn_func = func; - obex->disconn_func_data = user_data; + obex->ev_func = func; + obex->ev_func_data = user_data; } static void parse_connect_data(GObex *obex, GObexPacket *pkt) @@ -363,18 +355,21 @@ static void handle_response(GObex *obex, GError *err, GObexPacket *rsp) static void handle_request(GObex *obex, GError *err, GObexPacket *req) { - if (g_obex_packet_get_operation(req, NULL) == G_OBEX_OP_CONNECT) - parse_connect_data(obex, req); + if (req != NULL) { + guint8 op = g_obex_packet_get_operation(req, NULL); + if (op == G_OBEX_OP_CONNECT) + parse_connect_data(obex, req); + } - if (obex->req_func) - obex->req_func(obex, req, obex->req_func_data); + if (obex->ev_func) + obex->ev_func(obex, err, req, obex->ev_func_data); } static gboolean g_obex_handle_packet(GObex *obex, GError *err, GObexPacket *pkt) { if (obex->pending_req) handle_response(obex, err, pkt); - else if (pkt != NULL) + else handle_request(obex, err, pkt); /* FIXME: Application callback needed for err != NULL? */ @@ -382,7 +377,7 @@ static gboolean g_obex_handle_packet(GObex *obex, GError *err, GObexPacket *pkt) return TRUE; } -static gboolean read_stream(GObex *obex) +static gboolean read_stream(GObex *obex, GError **err) { GIOChannel *io = obex->io; GIOStatus status; @@ -426,8 +421,10 @@ read_body: return TRUE; } -static gboolean read_packet(GObex *obex) +static gboolean read_packet(GObex *obex, GError **err) { + g_set_error(err, G_OBEX_ERROR, G_OBEX_ERROR_DISCONNECTED, + "Packet reading not implemented"); return FALSE; } @@ -442,10 +439,13 @@ static gboolean incoming_data(GIOChannel *io, GIOCondition cond, if (cond & G_IO_NVAL) return FALSE; - if (cond & (G_IO_HUP | G_IO_ERR)) + if (cond & (G_IO_HUP | G_IO_ERR)) { + err = g_error_new(G_OBEX_ERROR, G_OBEX_ERROR_DISCONNECTED, + "Transport got disconnected"); goto failed; + } - if (!obex->read(obex)) + if (!obex->read(obex, &err)) goto failed; if (obex->rx_data < 3 || obex->rx_data < obex->rx_pkt_len) @@ -483,8 +483,10 @@ failed: obex->io = NULL; obex->io_source = 0; - if (obex->disconn_func) - obex->disconn_func(obex, obex->disconn_func_data); + if (obex->ev_func) + obex->ev_func(obex, err, NULL, obex->ev_func_data); + + g_error_free(err); return FALSE; } diff --git a/gobex/gobex.h b/gobex/gobex.h index d074698f2..59cec801b 100644 --- a/gobex/gobex.h +++ b/gobex/gobex.h @@ -33,11 +33,10 @@ typedef enum { typedef struct _GObex GObex; -typedef void (*GObexRequestFunc) (GObex *obex, GObexPacket *req, +typedef void (*GObexEventFunc) (GObex *obex, GError *err, GObexPacket *req, gpointer user_data); 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, GError **err); @@ -46,10 +45,7 @@ guint g_obex_send_req(GObex *obex, GObexPacket *req, gint timeout, GError **err); gboolean g_obex_cancel_req(GObex *obex, guint req_id); -void g_obex_set_request_function(GObex *obex, GObexRequestFunc func, - gpointer user_data); - -void g_obex_set_disconnect_function(GObex *obex, GObexDisconnectFunc func, +void g_obex_set_event_function(GObex *obex, GObexEventFunc func, gpointer user_data); GObex *g_obex_new(GIOChannel *io, GObexTransportType transport_type); diff --git a/unit/test-gobex.c b/unit/test-gobex.c index b216b42cd..764da28fc 100644 --- a/unit/test-gobex.c +++ b/unit/test-gobex.c @@ -355,21 +355,21 @@ static void test_send_connect_stream(void) g_assert_no_error(gerr); } -static void handle_connect_request(GObex *obex, GObexPacket *pkt, +static void handle_connect_event(GObex *obex, GError *err, GObexPacket *pkt, gpointer user_data) { - GError **err = user_data; + GError **test_err = user_data; - switch (g_obex_packet_get_operation(pkt, NULL)) { - case G_OBEX_OP_CONNECT: - break; - default: - g_set_error(err, TEST_ERROR, TEST_ERROR_UNEXPECTED, - "Unexpected operation"); - break; + g_main_loop_quit(mainloop); + + if (err != NULL) { + *test_err = g_error_copy(err); + return; } - g_main_loop_quit(mainloop); + if (g_obex_packet_get_operation(pkt, NULL) != G_OBEX_OP_CONNECT) + g_set_error(test_err, TEST_ERROR, TEST_ERROR_UNEXPECTED, + "Unexpected operation"); } static void test_recv_connect_stream(void) @@ -383,7 +383,7 @@ static void test_recv_connect_stream(void) create_endpoints(&obex, &io, SOCK_STREAM); - g_obex_set_request_function(obex, handle_connect_request, &gerr); + g_obex_set_event_function(obex, handle_connect_event, &gerr); status = g_io_channel_write_chars(io, (gchar *) pkt_connect_req, sizeof(pkt_connect_req), @@ -407,8 +407,15 @@ static void test_recv_connect_stream(void) g_assert_no_error(gerr); } -static void disconnected(GObex *obex, gpointer user_data) +static void disconn_ev(GObex *obex, GError *err, GObexPacket *req, + gpointer user_data) { + GError **test_err = user_data; + + if (!g_error_matches(err, G_OBEX_ERROR, G_OBEX_ERROR_DISCONNECTED)) + g_set_error(test_err, TEST_ERROR, TEST_ERROR_UNEXPECTED, + "Did not get expected disconnect error"); + g_main_loop_quit(mainloop); } @@ -421,7 +428,7 @@ static void test_disconnect(void) create_endpoints(&obex, &io, SOCK_STREAM); - g_obex_set_disconnect_function(obex, disconnected, NULL); + g_obex_set_event_function(obex, disconn_ev, &gerr); timer_id = g_timeout_add_seconds(1, test_timeout, &gerr); -- 2.47.3