e/bluez4: Pair when select a found device

-Pair button is no longer needed
-Only non-paired devices appear for the user to pair

Patch by: Lucas Joia <lucasjoia@profusion.mobi>



SVN revision: 82198
This commit is contained in:
Lucas Joia 2013-01-04 16:12:58 +00:00 committed by Lucas De Marchi
parent 482eb40918
commit 990a1e3a11
4 changed files with 54 additions and 23 deletions

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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");
}

View File

@ -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);