GObexRequestFunc req_func;
gpointer req_func_data;
+ GObexDisconnectFunc disconn_func;
+ gpointer disconn_func_data;
+
struct pending_pkt *pending_req;
};
obex->req_func_data = user_data;
}
+void g_obex_set_disconnect_function(GObex *obex, GObexDisconnectFunc func,
+ gpointer user_data)
+{
+ obex->disconn_func = func;
+ obex->disconn_func_data = user_data;
+}
+
static void parse_connect_data(GObex *obex, GObexPacket *pkt)
{
const struct connect_data *data;
g_io_channel_unref(obex->io);
obex->io = NULL;
obex->io_source = 0;
+
+ if (obex->disconn_func)
+ obex->disconn_func(obex, obex->disconn_func_data);
+
return FALSE;
}
g_queue_foreach(obex->tx_queue, (GFunc) pending_pkt_free, NULL);
g_queue_free(obex->tx_queue);
- g_io_channel_unref(obex->io);
+ if (obex->io != NULL)
+ g_io_channel_unref(obex->io);
if (obex->io_source > 0)
g_source_remove(obex->io_source);
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);
void g_obex_set_request_function(GObex *obex, GObexRequestFunc func,
gpointer user_data);
+void g_obex_set_disconnect_function(GObex *obex, GObexDisconnectFunc func,
+ gpointer user_data);
+
GObex *g_obex_new(GIOChannel *io, GObexTransportType transport_type);
GObex *g_obex_ref(GObex *obex);
g_assert_no_error(gerr);
}
+static void disconnected(GObex *obex, gpointer user_data)
+{
+ g_main_loop_quit(mainloop);
+}
+
+static void test_disconnect(void)
+{
+ GError *gerr = NULL;
+ guint timer_id;
+ GObex *obex;
+ GIOChannel *io;
+
+ create_endpoints(&obex, &io, SOCK_STREAM);
+
+ g_obex_set_disconnect_function(obex, disconnected, NULL);
+
+ timer_id = g_timeout_add_seconds(1, test_timeout, &gerr);
+
+ mainloop = g_main_loop_new(NULL, FALSE);
+
+ g_io_channel_shutdown(io, FALSE, NULL);
+
+ g_main_loop_run(mainloop);
+
+ g_assert_no_error(gerr);
+
+ g_source_remove(timer_id);
+ g_io_channel_unref(io);
+ g_obex_unref(obex);
+
+ g_main_loop_unref(mainloop);
+ mainloop = NULL;
+}
+
static void test_ref_unref(void)
{
GObex *obex;
g_test_add_func("/gobex/basic", test_basic);
g_test_add_func("/gobex/ref_unref", test_ref_unref);
+ g_test_add_func("/gobex/test_disconnect", test_disconnect);
+
g_test_add_func("/gobex/test_recv_connect_stream",
test_recv_connect_stream);
g_test_add_func("/gobex/test_send_connect_stream",