110 lines
3.4 KiB
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;
|
|
}
|