diff --git a/src/modules/bluez4/e_mod_main.c b/src/modules/bluez4/e_mod_main.c index 6cd29dc97..01d19e043 100644 --- a/src/modules/bluez4/e_mod_main.c +++ b/src/modules/bluez4/e_mod_main.c @@ -17,28 +17,41 @@ _ebluez4_search_dialog_del(Instance *inst) if (!inst->search_dialog) return; e_object_del(E_OBJECT(inst->search_dialog)); inst->search_dialog = NULL; + inst->found_list = NULL; + + if (ctxt->adap_obj) + { + ebluez4_stop_discovery(); + DBG("Stopping discovery..."); + } } static void _ebluez4_cb_search_dialog_del(E_Win *win) { E_Dialog *dialog = win->data; - _ebluez4_search_dialog_del(dialog->data); - - ebluez4_stop_discovery(); - DBG("Stopping discovery..."); } static void -_ebluez4_cb_pair(void *data, E_Dialog *dialog) +_ebluez4_cb_paired(void *data, Eina_Bool success, const char *err_msg) +{ + Instance *inst = data; + if (success) + _ebluez4_search_dialog_del(inst); + else + ebluez4_show_error("Bluez Error", err_msg); +} + +static void +_ebluez4_cb_pair(void *data) { Instance *inst = data; const char *addr = e_widget_ilist_selected_value_get(inst->found_list); if(!addr) return; - ebluez4_pair_with_device(addr); + ebluez4_pair_with_device(addr, _ebluez4_cb_paired, inst); } static void @@ -50,7 +63,7 @@ _ebluez4_cb_search(void *data, E_Menu *m, E_Menu_Item *mi) Evas *evas; if (inst->search_dialog) - _ebluez4_cb_search_dialog_del(inst->search_dialog->win); + _ebluez4_search_dialog_del(inst); con = e_container_current_get(e_manager_current_get()); @@ -64,7 +77,6 @@ _ebluez4_cb_search(void *data, E_Menu *m, E_Menu_Item *mi) inst->found_list = e_widget_ilist_add(evas, 0, 0, NULL); e_dialog_content_set(dialog, inst->found_list, 250, 220); - e_dialog_button_add(dialog, "Pair", NULL, _ebluez4_cb_pair, inst); e_dialog_show(dialog); @@ -332,7 +344,7 @@ e_modapi_save(E_Module *m) /* Public Functions */ void -ebluez4_update_inst(Evas_Object *dest, Eina_List *src) +ebluez4_update_inst(Evas_Object *dest, Eina_List *src, Instance *inst) { Device *dev; Eina_List *iter; @@ -341,7 +353,9 @@ ebluez4_update_inst(Evas_Object *dest, Eina_List *src) e_widget_ilist_clear(dest); EINA_LIST_FOREACH(src, iter, dev) - e_widget_ilist_append(dest, NULL, dev->name, NULL, NULL, dev->addr); + if (src == ctxt->found_devices && !dev->paired) + e_widget_ilist_append(dest, NULL, dev->name, _ebluez4_cb_pair, inst, + dev->addr); e_widget_ilist_thaw(dest); e_widget_ilist_go(dest); @@ -357,7 +371,7 @@ ebluez4_update_instances(Eina_List *src) { EINA_LIST_FOREACH(instances, iter, inst) if (inst->found_list) - ebluez4_update_inst(inst->found_list, src); + ebluez4_update_inst(inst->found_list, src, inst); } } diff --git a/src/modules/bluez4/e_mod_main.h b/src/modules/bluez4/e_mod_main.h index 7072fa0bc..4e47c1323 100644 --- a/src/modules/bluez4/e_mod_main.h +++ b/src/modules/bluez4/e_mod_main.h @@ -17,7 +17,7 @@ EAPI void *e_modapi_init(E_Module *m); EAPI int e_modapi_shutdown(E_Module *m); EAPI int e_modapi_save(E_Module *m); -void ebluez4_update_inst(Evas_Object *dest, Eina_List *src); +void ebluez4_update_inst(Evas_Object *dest, Eina_List *src, Instance *inst); void ebluez4_update_instances(Eina_List *src); void ebluez4_update_all_gadgets_visibility(); void ebluez4_show_error(const char *err_name, const char *err_msg); diff --git a/src/modules/bluez4/ebluez4.c b/src/modules/bluez4/ebluez4.c index 9386c74bd..ebc5955ac 100644 --- a/src/modules/bluez4/ebluez4.c +++ b/src/modules/bluez4/ebluez4.c @@ -4,6 +4,12 @@ #include "e_mod_main.h" #include "ebluez4.h" +typedef struct _Pair_Cb +{ + void (*cb)(void *, Eina_Bool, const char *); + void *data; +} Pair_Cb; + Service services[] = { { HumanInterfaceDevice_UUID, INPUT }, { AudioSource_UUID, AUDIO_SOURCE }, @@ -245,13 +251,16 @@ static void _on_paired(void *data, const EDBus_Message *msg, EDBus_Pending *pending) { const char *err_name, *err_msg; + Pair_Cb *d = data; + Eina_Bool success = EINA_TRUE; if (edbus_message_error_get(msg, &err_name, &err_msg)) { ERR("%s: %s", err_name, err_msg); - ebluez4_show_error(err_name, err_msg); - return; + success = EINA_FALSE; } + if (d->cb) d->cb(d->data, success, err_msg); + free(d); } static void @@ -276,14 +285,14 @@ _on_dev_properties(void *data, const EDBus_Message *msg, EDBus_Pending *pending) } static void -_unset_dev(const char *path) +_unset_dev(Device *dev, Eina_List *list) { - Device *dev = eina_list_search_unsorted(ctxt->devices, ebluez4_path_cmp, - path); - if (!dev) return; - ctxt->devices = eina_list_remove(ctxt->devices, dev); + if (list == ctxt->devices) + ctxt->devices = eina_list_remove(list, dev); + else + ctxt->found_devices = eina_list_remove(list, dev); _free_dev(dev); } @@ -305,11 +314,15 @@ static void _on_removed(void *context, const EDBus_Message *msg) { const char *path; + Device *dev, *fdev; if (!edbus_message_arguments_get(msg, "o", &path)) return; - _unset_dev(path); + dev = eina_list_search_unsorted(ctxt->devices, ebluez4_path_cmp, path); + fdev = eina_list_search_unsorted(ctxt->found_devices, _addr_cmp, dev->addr); + _unset_dev(dev, ctxt->devices); + _unset_dev(fdev, ctxt->found_devices); } static void @@ -520,9 +533,13 @@ ebluez4_disconnect_device(Device *dev) } void -ebluez4_pair_with_device(const char *addr) +ebluez4_pair_with_device(const char *addr, void (*cb)(void *, Eina_Bool, const char *), void *data) { - edbus_proxy_call(ctxt->adap_proxy, "CreatePairedDevice", _on_paired, NULL, + Pair_Cb *d = malloc(sizeof(Pair_Cb)); + EINA_SAFETY_ON_NULL_RETURN(d); + d->cb = cb; + d->data = data; + edbus_proxy_call(ctxt->adap_proxy, "CreatePairedDevice", _on_paired, d, -1, "sos", addr, AGENT_PATH, "KeyboardDisplay"); } diff --git a/src/modules/bluez4/ebluez4.h b/src/modules/bluez4/ebluez4.h index 726d761a2..6033930bd 100644 --- a/src/modules/bluez4/ebluez4.h +++ b/src/modules/bluez4/ebluez4.h @@ -62,6 +62,6 @@ void ebluez4_start_discovery(); void ebluez4_stop_discovery(); void ebluez4_connect_to_device(Device *dev); void ebluez4_disconnect_device(Device *dev); -void ebluez4_pair_with_device(const char *addr); +void ebluez4_pair_with_device(const char *addr, void (*cb)(void *, Eina_Bool, const char *), void *data); void ebluez4_remove_device(EDBus_Object *obj); int ebluez4_path_cmp(const void *d1, const void *d2);