enlightenment/src/modules/bluez5/bz.c

110 lines
3.4 KiB
C

#include "e_mod_main.h"
Eldbus_Connection *bz_conn = NULL;
static Ecore_Timer *owner_gain_timer = NULL;
/////////////////////////////////////////////////////////////////////////////
static Eina_Bool
cb_name_owner_new(void *data EINA_UNUSED)
{
owner_gain_timer = NULL;
bz_obj_init();
bz_agent_init();
return EINA_FALSE;
}
static void
cb_name_owner_changed(void *data EINA_UNUSED,
const char *bus EINA_UNUSED,
const char *from EINA_UNUSED,
const char *to)
{
static Eina_Bool first = EINA_TRUE;
if (to[0])
{
if (owner_gain_timer) ecore_timer_del(owner_gain_timer);
// on first start try and re-init quickly because we get a name
// owner change even if all is good when we register to listen for it,
// so start fast
if (first)
owner_gain_timer = ecore_timer_add(0.1, cb_name_owner_new, NULL);
// but if we gegt a name owner change later it's probably because
// bluez was restarted or crashed. a new bz daemon will (or should)
// come up. so re-init more slowly here giving the daemon some time
// to come up before pestering it.
else
owner_gain_timer = ecore_timer_add(1.0, cb_name_owner_new, NULL);
first = EINA_FALSE;
}
else
{
if (owner_gain_timer) ecore_timer_del(owner_gain_timer);
owner_gain_timer = NULL;
ebluze5_popup_clear();
bz_agent_shutdown();
bz_obj_shutdown();
}
}
static void
cb_obj_add(Obj *o)
{
if (o->type == BZ_OBJ_ADAPTER)
{
o->fn_change = ebluez5_popup_adapter_change;
o->fn_del = ebluez5_popup_adapter_del;
ebluez5_popup_adapter_add(o);
return;
}
if (o->type == BZ_OBJ_DEVICE)
{
o->fn_change = ebluez5_popup_device_change;
o->fn_del = ebluez5_popup_device_del;
ebluez5_popup_device_add(o);
return;
}
}
void
bz_init(void)
{
bz_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
bz_obj_add_func_set(cb_obj_add);
bz_agent_release_func_set(ebluez5_agent_agent_release);
bz_agent_cancel_func_set(ebluez5_agent_agent_cancel);
bz_agent_req_pin_func_set(ebluez5_agent_agent_req_pin);
bz_agent_disp_pin_func_set(ebluez5_agent_agent_disp_pin);
bz_agent_req_pass_func_set(ebluez5_agent_req_pass);
bz_agent_disp_pass_func_set(ebluez5_agent_disp_pass);
bz_agent_req_confirm_func_set(ebluez5_agent_req_confirm);
bz_agent_req_auth_func_set(ebluez5_agent_req_auth);
bz_agent_auth_service_func_set(ebluez5_agent_auth_service);
eldbus_name_owner_changed_callback_add(bz_conn, "org.bluez",
cb_name_owner_changed,
NULL, EINA_TRUE);
}
void
bz_shutdown(void)
{
eldbus_name_owner_changed_callback_del(bz_conn, "org.bluez",
cb_name_owner_changed, NULL);
bz_agent_release_func_set(NULL);
bz_agent_cancel_func_set(NULL);
bz_agent_req_pin_func_set(NULL);
bz_agent_disp_pin_func_set(NULL);
bz_agent_req_pass_func_set(NULL);
bz_agent_disp_pass_func_set(NULL);
bz_agent_req_confirm_func_set(NULL);
bz_agent_req_auth_func_set(NULL);
bz_agent_auth_service_func_set(NULL);
bz_obj_add_func_set(NULL);
ebluze5_popup_clear();
bz_agent_shutdown();
bz_obj_shutdown();
eldbus_connection_unref(bz_conn);
bz_conn = NULL;
}