diff --git a/src/modules/bluez5/bz.h b/src/modules/bluez5/bz.h index 2d099977f..63ebe00de 100644 --- a/src/modules/bluez5/bz.h +++ b/src/modules/bluez5/bz.h @@ -13,6 +13,7 @@ typedef struct _Obj Obj; struct _Obj { //// internal object data + Eldbus_Object *obj; Eldbus_Proxy *proxy; Eldbus_Proxy *prop_proxy; Eldbus_Signal_Handler *prop_sig; diff --git a/src/modules/bluez5/bz_agent.c b/src/modules/bluez5/bz_agent.c index 8eb0489cb..066b7a082 100644 --- a/src/modules/bluez5/bz_agent.c +++ b/src/modules/bluez5/bz_agent.c @@ -2,6 +2,7 @@ #include "e.h" static Eldbus_Service_Interface *agent_iface = NULL; +static Eldbus_Object *agent_obj = NULL; static Eldbus_Proxy *agent_proxy = NULL; static void (*fn_release) (void) = NULL; static void (*fn_cancel) (void) = NULL; @@ -149,6 +150,11 @@ cb_unregister(void *data EINA_UNUSED, const Eldbus_Message *msg, eldbus_proxy_unref(agent_proxy); agent_proxy = NULL; } + if (agent_obj) + { + eldbus_object_unref(agent_obj); + agent_obj = NULL; + } if (agent_iface) { eldbus_service_object_unregister(agent_iface); @@ -266,10 +272,8 @@ bz_agent_msg_u32_add(Eldbus_Message *msg, unsigned int u32) void bz_agent_init(void) { - Eldbus_Object *obj; - - obj = eldbus_object_get(bz_conn, "org.bluez", "/org/bluez"); - agent_proxy = eldbus_proxy_get(obj, "org.bluez.AgentManager1"); + agent_obj = eldbus_object_get(bz_conn, "org.bluez", "/org/bluez"); + agent_proxy = eldbus_proxy_get(agent_obj, "org.bluez.AgentManager1"); agent_iface = eldbus_service_interface_register (bz_conn, "/org/enlightenment/bluez5/agent", &agent_desc); if (agent_proxy) diff --git a/src/modules/bluez5/bz_obj.c b/src/modules/bluez5/bz_obj.c index 8bcf66625..b61dc698f 100644 --- a/src/modules/bluez5/bz_obj.c +++ b/src/modules/bluez5/bz_obj.c @@ -1,6 +1,7 @@ #include "bz.h" #include "e_mod_main.h" +static Eldbus_Object *objman_obj = NULL; static Eldbus_Proxy *objman_proxy = NULL; static Eldbus_Signal_Handler *sig_ifadd = NULL; static Eldbus_Signal_Handler *sig_ifdel = NULL; @@ -295,18 +296,16 @@ cb_obj_prop_changed(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSE Obj * bz_obj_add(const char *path) { - Eldbus_Object *obj; - Obj *o = calloc(1, sizeof(Obj)); o->ref = 1; o->path = eina_stringshare_add(path); - obj = eldbus_object_get(bz_conn, "org.bluez", o->path); + o->obj = eldbus_object_get(bz_conn, "org.bluez", o->path); o->type = BZ_OBJ_UNKNOWN; o->in_table = EINA_TRUE; eina_hash_add(obj_table, o->path, o); if (!strcmp(o->path, "/org/bluez")) { - o->proxy = eldbus_proxy_get(obj, "org.bluez.AgentManager1"); + o->proxy = eldbus_proxy_get(o->obj, "org.bluez.AgentManager1"); o->type = BZ_OBJ_BLUEZ; o->add_called = EINA_TRUE; bz_obj_ref(o); @@ -317,12 +316,12 @@ bz_obj_add(const char *path) // all devices are /org/bluez/XXX/dev_XXX so look for /dev_ else if (strstr(o->path, "/dev_")) { - o->proxy = eldbus_proxy_get(obj, "org.bluez.Device1"); + o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Device1"); o->type = BZ_OBJ_DEVICE; if (o->proxy) { eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o); - o->prop_proxy = eldbus_proxy_get(obj, + o->prop_proxy = eldbus_proxy_get(o->obj, "org.freedesktop.DBus.Properties"); if (o->prop_proxy) o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy, @@ -334,12 +333,12 @@ bz_obj_add(const char *path) // all dadapters begin with /org/bluez/ else if (!strncmp(o->path, "/org/bluez/", 11)) { - o->proxy = eldbus_proxy_get(obj, "org.bluez.Adapter1"); + o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Adapter1"); o->type = BZ_OBJ_ADAPTER; if (o->proxy) { eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o); - o->prop_proxy = eldbus_proxy_get(obj, + o->prop_proxy = eldbus_proxy_get(o->obj, "org.freedesktop.DBus.Properties"); if (o->prop_proxy) o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy, @@ -742,16 +741,6 @@ bz_obj_unref(Obj *o) eldbus_signal_handler_del(o->prop_sig); o->prop_sig = NULL; } - if (o->proxy) - { - eldbus_proxy_unref(o->proxy); - o->proxy = NULL; - } - if (o->prop_proxy) - { - eldbus_proxy_unref(o->prop_proxy); - o->prop_proxy = NULL; - } if (o->path) { eina_stringshare_del(o->path); @@ -787,6 +776,21 @@ bz_obj_unref(Obj *o) ecore_exe_free(o->ping_exe); o->ping_exe = NULL; } + if (o->proxy) + { + eldbus_proxy_unref(o->proxy); + o->proxy = NULL; + } + if (o->prop_proxy) + { + eldbus_proxy_unref(o->prop_proxy); + o->prop_proxy = NULL; + } + if (o->obj) + { + eldbus_object_unref(o->obj); + o->obj = NULL; + } free(o); } @@ -894,12 +898,10 @@ _obj_hash_free(Obj *o) void bz_obj_init(void) { - Eldbus_Object *obj; - obj_table = eina_hash_string_superfast_new((void *)_obj_hash_free); - obj = eldbus_object_get(bz_conn, "org.bluez", "/"); - objman_proxy = eldbus_proxy_get(obj, "org.freedesktop.DBus.ObjectManager"); + objman_obj = eldbus_object_get(bz_conn, "org.bluez", "/"); + objman_proxy = eldbus_proxy_get(objman_obj, "org.freedesktop.DBus.ObjectManager"); sig_ifadd = eldbus_proxy_signal_handler_add(objman_proxy, "InterfacesAdded", cb_obj_add, NULL); sig_ifdel = eldbus_proxy_signal_handler_add(objman_proxy, "InterfacesRemoved", @@ -928,8 +930,16 @@ bz_obj_shutdown(void) eldbus_signal_handler_del(sig_ifdel); sig_ifdel = NULL; } - eldbus_proxy_unref(objman_proxy); - objman_proxy = NULL; + if (objman_proxy) + { + eldbus_proxy_unref(objman_proxy); + objman_proxy = NULL; + } + if (objman_obj) + { + eldbus_object_unref(objman_obj); + objman_obj = NULL; + } } void