From da40a35d522c6c06cf15d6ba73e4ff64497b4eb1 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Thu, 27 Sep 2012 17:07:44 +0000 Subject: [PATCH] e: Remove BlueZ module Kind of broken, with almost no functionality. Don't risk someone releasing E17 with this thing. Hopefully I'll be able to rewrite it (or find someone to do) before release. SVN revision: 77156 --- .gitignore | 1 - configure.ac | 11 - data/themes/default.edc | 268 +--- data/themes/images/Makefile.am | 3 - data/themes/images/bluetooth-hidden.png | Bin 18916 -> 0 bytes data/themes/images/bluetooth-inactive.png | Bin 6972 -> 0 bytes data/themes/images/bluetooth-powered.png | Bin 17301 -> 0 bytes src/modules/Makefile.am | 4 - src/modules/bluez/Makefile.am | 33 - src/modules/bluez/e-module-bluez.edj | Bin 26648 -> 0 bytes src/modules/bluez/e_mod_config.c | 188 --- src/modules/bluez/e_mod_main.c | 1439 --------------------- src/modules/bluez/e_mod_main.h | 159 --- src/modules/bluez/module.desktop.in | 17 - 14 files changed, 1 insertion(+), 2122 deletions(-) delete mode 100644 data/themes/images/bluetooth-hidden.png delete mode 100644 data/themes/images/bluetooth-inactive.png delete mode 100644 data/themes/images/bluetooth-powered.png delete mode 100644 src/modules/bluez/Makefile.am delete mode 100644 src/modules/bluez/e-module-bluez.edj delete mode 100644 src/modules/bluez/e_mod_config.c delete mode 100644 src/modules/bluez/e_mod_main.c delete mode 100644 src/modules/bluez/e_mod_main.h delete mode 100644 src/modules/bluez/module.desktop.in diff --git a/.gitignore b/.gitignore index ca4f6f7ac..d7e3d2d73 100644 --- a/.gitignore +++ b/.gitignore @@ -114,7 +114,6 @@ src/bin/enlightenment_open src/modules/access/module.desktop src/modules/backlight/module.desktop src/modules/battery/module.desktop -src/modules/bluez/module.desktop src/modules/clock/module.desktop src/modules/comp/module.desktop src/modules/conf/module.desktop diff --git a/configure.ac b/configure.ac index 1df423e77..8108b763d 100644 --- a/configure.ac +++ b/configure.ac @@ -804,14 +804,6 @@ dnl AC_E_CHECK_PKG(DUMMY, [ connman >= 1.0 ], [], [CONNMAN=false]) AC_SUBST(ECONNMAN_CFLAGS) AC_SUBST(ECONNMAN_LIBS) -AM_CONDITIONAL(HAVE_EBLUEZ, false) -define([CHECK_MODULE_BLUEZ], -[ - AC_E_CHECK_PKG(EBLUEZ, [ edbus >= 1.2.0 ebluez >= 1.2.0 ], [], [BLUEZ=false]) -]) -AC_SUBST(EBLUEZ_CFLAGS) -AC_SUBST(EBLUEZ_LIBS) - AM_CONDITIONAL(HAVE_EOFONO, false) define([CHECK_MODULE_OFONO], [ @@ -877,7 +869,6 @@ AC_E_OPTIONAL_MODULE([conf_interaction], true) AC_E_OPTIONAL_MODULE([gadman], true) AC_E_OPTIONAL_MODULE([mixer], true, [CHECK_MODULE_MIXER]) AC_E_OPTIONAL_MODULE([connman], true, [CHECK_MODULE_CONNMAN]) -AC_E_OPTIONAL_MODULE([bluez], true, [CHECK_MODULE_BLUEZ]) AC_E_OPTIONAL_MODULE([ofono], true, [CHECK_MODULE_OFONO]) AC_E_OPTIONAL_MODULE([illume2], true) AC_E_OPTIONAL_MODULE([syscon], true) @@ -1010,8 +1001,6 @@ src/modules/mixer/Makefile src/modules/mixer/module.desktop src/modules/connman/Makefile src/modules/connman/module.desktop -src/modules/bluez/Makefile -src/modules/bluez/module.desktop src/modules/ofono/Makefile src/modules/ofono/module.desktop src/modules/illume2/Makefile diff --git a/data/themes/default.edc b/data/themes/default.edc index 01e4fa559..f18b5b20e 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -8333,273 +8333,7 @@ CONNMAN_ICON(ethernet) #undef CONNMAN_STATE_PART_ADD #undef CONNMAN_IMAGES_SET -///////////////////////////////////////////////////////////////////////////// -/*** MOD: BLUEZ ***/ - - group { - name: "e/modules/bluez/main"; - images { - image: "bluetooth-powered.png" COMP; - image: "bluetooth-inactive.png" COMP; - image: "bluetooth-hidden.png" COMP; - } - //max: 128 128; - min: 16 16; - parts { - part { - name: "eventarea"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - color: 255 255 255 0; - } - } - part { - name: "state-clipper"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 255; - } - } - part { - name: "state"; - type: IMAGE; - mouse_events: 0; - clip_to: "state-clipper"; - description { - state: "default" 0.0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - fixed: 1 1; - image.normal: "bluetooth-inactive.png"; - } - description { - state: "powered" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-powered.png"; - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-hidden.png"; - } - } - programs { - program { - signal: "e,changed,service,none"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "state"; - } - program { - signal: "e,changed,off"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "state"; - } - program { - signal: "e,changed,powered"; - source: "e"; - action: STATE_SET "powered" 0.0; - target: "state"; - } - program { - signal: "e,changed,hidden"; - source: "e"; - action: STATE_SET "hidden" 0.0; - target: "state"; - } - } - part { - name: "e.text.name"; - type: TEXT; - mouse_events: 0; - effect: SOFT_SHADOW; - description { - state: "default" 0.0; - color: 224 224 224 255; - color3: 0 0 0 64; - align: 0.5 1.0; - rel1 { - relative: 0.0 1.0; - offset: 0 -20; - } - rel2 { - relative: 1.0 1.0; - offset: -1 -1; - } - text { - font: "Sans"; - size: 8; - align: 0.5 1.0; - text: ""; - min: 1 1; - } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - programs { - program { - name: "resize"; - signal: "resize"; - script { - new x, y, w, h, tx, ty, tw, th; - get_geometry(PART:"eventarea", x, y, w, h); - get_geometry(PART:"e.text.name", tx, ty, tw, th); - if ((w <= 32) || (tw >= w)) - set_state(PART:"e.text.name", "hidden", 0.0); - else - set_state(PART:"e.text.name", "default", 0.0); - } - } - program { - signal: "e,changed,name"; - source: "e"; - action: STATE_SET "default" 0.0; - // show so calcs take effect! - target: "e.text.name"; - after: "resize"; - } - } - } - } - group { - name: "e/modules/bluez/tip"; - images { - image: "bluetooth-powered.png" COMP; - image: "bluetooth-inactive.png" COMP; - image: "bluetooth-hidden.png" COMP; - } - min: 200 84; - parts { - part { - name: "state-clipper"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 255; - } - } - part { - name: "state"; - type: IMAGE; - mouse_events: 0; - clip_to: "state-clipper"; - description { - state: "default" 0.0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - fixed: 1 1; - rel1 { - relative: 0.0 0.0; - offset: 10 10; - } - rel2 { - relative: 0.0 0.0; - offset: 73 73; - } - image.normal: "bluetooth-inactive.png"; - } - description { - state: "powered" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-powered.png"; - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-hidden.png"; - } - } - programs { - program { - signal: "e,changed,off"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "state"; - } - program { - signal: "e,changed,powered"; - source: "e"; - action: STATE_SET "powered" 0.0; - target: "state"; - } - program { - signal: "e,changed,hidden"; - source: "e"; - action: STATE_SET "hidden" 0.0; - target: "state"; - } - } - part { - name: "e.text.name"; - type: TEXT; - mouse_events: 0; - effect: SOFT_SHADOW; - description { - state: "default" 0.0; - color: 240 240 240 255; - color3: 0 0 0 64; - align: 0.0 0.0; - rel1 { - to_x: "state"; - relative: 1.0 0.0; - offset: 10 20; - } - rel2 { - relative: 1.0 0.0; - offset: -10 40; - } - text { - font: "Sans:style=Bold"; - size: 16; - align: 0.0 0.0; - text: "Bluetooth Manager"; - min: 1 0; - } - } - } - part { - name: "e.text.status"; - type: TEXT; - mouse_events: 0; - clip_to: "state-clipper"; - description { - state: "default" 0.0; - color: 16 16 16 255; - rel1 { - to_y: "e.text.name"; - to_x: "state"; - relative: 1.0 1.0; - offset: 10 10; - } - rel2 { - to_y: "e.text.name"; - relative: 1.0 1.0; - offset: -10 25; - } - text { - font: "Sans"; - size: 10; - align: 0.0 0.0; - text: ""; - min: 1 0; - } - } - } - } - } - - -///////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// /*** MOD: OFONO ***/ // GADGET and TIP all have the same parts and signals: diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index dfdcbfb1d..efb8f01ce 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -25,9 +25,6 @@ bd_top_hilight.png \ bd_top.png \ big_arrow_down.png \ big_arrow_up.png \ -bluetooth-powered.png \ -bluetooth-inactive.png \ -bluetooth-hidden.png \ bnw.png \ bt_base1.png \ bt_base2.png \ diff --git a/data/themes/images/bluetooth-hidden.png b/data/themes/images/bluetooth-hidden.png deleted file mode 100644 index 1cb6390c74cc05bcbe0d4212e164b43ff1ad6cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18916 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 A$^ZZW diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index 6215dd443..475a2e56f 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -142,10 +142,6 @@ if USE_MODULE_CONNMAN SUBDIRS += connman endif -if USE_MODULE_BLUEZ -SUBDIRS += bluez -endif - if USE_MODULE_ILLUME2 SUBDIRS += \ illume2 \ diff --git a/src/modules/bluez/Makefile.am b/src/modules/bluez/Makefile.am deleted file mode 100644 index 3613626e0..000000000 --- a/src/modules/bluez/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -MAINTAINERCLEANFILES = Makefile.in -MODULE = bluez - -# data files for the module -filesdir = $(libdir)/enlightenment/modules/$(MODULE) -files_DATA = \ -e-module-$(MODULE).edj module.desktop - -EXTRA_DIST = $(files_DATA) - -# the module .so file -INCLUDES = -I. \ - -I$(top_srcdir) \ - -I$(top_srcdir)/src/modules/$(MODULE) \ - -I$(top_srcdir)/src/bin \ - -I$(top_builddir)/src/bin \ - -I$(top_srcdir)/src/modules \ - @e_cflags@ @EBLUEZ_CFLAGS@ - -pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) - -pkg_LTLIBRARIES = module.la - -module_la_SOURCES = e_mod_main.h \ - e_mod_main.c \ - e_mod_config.c - -module_la_LIBADD = @e_libs@ @dlopen_libs@ @EBLUEZ_LIBS@ -module_la_LDFLAGS = -module -avoid-version -module_la_DEPENDENCIES = $(top_builddir)/config.h - -uninstall: - rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/bluez/e-module-bluez.edj b/src/modules/bluez/e-module-bluez.edj deleted file mode 100644 index c20ad2118fa03a37c3690e9606adeaa3a930d951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26648 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 W&*$Js{X;Jq=ZMi3Sw-=w{l5dVWHX!q diff --git a/src/modules/bluez/e_mod_config.c b/src/modules/bluez/e_mod_config.c deleted file mode 100644 index 1514e62dd..000000000 --- a/src/modules/bluez/e_mod_config.c +++ /dev/null @@ -1,188 +0,0 @@ -#include "e_mod_main.h" - -extern const char _e_bluez_Name[]; - -struct _E_Config_Dialog_Data -{ - E_Bluez_Instance *inst; - const char *name; - Eina_Bool mode; - unsigned int timeout; - struct - { - Evas_Object *label; - Evas_Object *slider; - Evas_Object *help; - } gui; -}; - -/* Local Function Prototypes */ -static void *_create_data(E_Config_Dialog *dialog); -static void _free_data(E_Config_Dialog *dialog, - E_Config_Dialog_Data *cfdata); -static Evas_Object *_basic_create(E_Config_Dialog *dialog, - Evas *evas, - E_Config_Dialog_Data *cfdata); -static int _basic_apply(E_Config_Dialog *dialog, - E_Config_Dialog_Data *cfdata); - -E_Config_Dialog * -e_bluez_config_dialog_new(E_Container *con, - E_Bluez_Instance *inst) -{ - E_Config_Dialog *dialog; - E_Config_Dialog_View *view; - - if (inst->conf_dialog) - return inst->conf_dialog; - - view = E_NEW(E_Config_Dialog_View, 1); - if (!view) - return NULL; - - view->create_cfdata = _create_data; - view->free_cfdata = _free_data; - view->basic.create_widgets = _basic_create; - view->basic.apply_cfdata = _basic_apply; - - dialog = e_config_dialog_new(con, _("Bluetooth Settings"), - _e_bluez_Name, "e_bluez_config_dialog_new", - e_bluez_theme_path(), 0, view, inst); - - return dialog; -} - -static void * -_create_data(E_Config_Dialog *dialog) -{ - E_Config_Dialog_Data *cfdata; - E_Bluez_Instance *inst; - - cfdata = E_NEW(E_Config_Dialog_Data, 1); - if (!cfdata) - return NULL; - - cfdata->inst = dialog->data; - inst = cfdata->inst; - if (!e_bluez_adapter_discoverable_get(inst->adapter, &cfdata->mode)) - cfdata->mode = 0; - - if (!e_bluez_adapter_discoverable_timeout_get - (inst->adapter, &cfdata->timeout)) - cfdata->timeout = 0; - cfdata->timeout /= 60; - - if (!e_bluez_adapter_name_get(inst->adapter, &cfdata->name)) - cfdata->name = NULL; - else - cfdata->name = strdup(cfdata->name); - - return cfdata; -} - -static void -_free_data(E_Config_Dialog *dialog, - E_Config_Dialog_Data *cfdata) -{ - E_Bluez_Instance *inst = dialog->data; - - inst->conf_dialog = NULL; - E_FREE(cfdata); -} - -static void -_cb_disable_timeout(void *data, - Evas_Object *obj __UNUSED__) -{ - E_Config_Dialog_Data *cfdata = data; - Eina_Bool disable = !cfdata->mode; - - e_widget_disabled_set(cfdata->gui.label, disable); - e_widget_disabled_set(cfdata->gui.slider, disable); - e_widget_disabled_set(cfdata->gui.help, disable); -} - -static Evas_Object * -_basic_create(E_Config_Dialog *dialog __UNUSED__, - Evas *evas, - E_Config_Dialog_Data *cfdata) -{ - Evas_Object *o, *ob; - Evas_Object *check; - char buf[48]; - const char *address; - - o = e_widget_list_add(evas, 0, 0); - - if (!e_bluez_adapter_address_get(cfdata->inst->adapter, &address)) - address = NULL; - - ob = e_widget_label_add(evas, _("Name")); - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - ob = e_widget_entry_add(evas, (char **)&cfdata->name, NULL, NULL, NULL); - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - check = e_widget_check_add - (evas, _("Discoverable mode"), (int *)&cfdata->mode); - e_widget_list_object_append(o, check, 1, 1, 0.5); - - ob = e_widget_label_add(evas, _("Discovarable Timeout")); - cfdata->gui.label = ob; - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 0, 30, 1, 0, - NULL, (int *)&cfdata->timeout, 100); - e_widget_slider_special_value_add(ob, 0.0, 0.0, _("Forever")); - cfdata->gui.slider = ob; - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - e_widget_on_change_hook_set(check, _cb_disable_timeout, cfdata); - _cb_disable_timeout(cfdata, NULL); - - snprintf(buf, sizeof(buf), _("MAC Address: %s"), address); - ob = e_widget_label_add(evas, buf); - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - return o; -} - -static void -_method_success_check(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - const char *name = data; - - if ((!error) || (!dbus_error_is_set(error))) - return; - - ERR("method %s() finished with error: %s %s\n", - name, error->name, error->message); - dbus_error_free(error); -} - -static int -_basic_apply(E_Config_Dialog *dialog __UNUSED__, - E_Config_Dialog_Data *cfdata) -{ - E_Bluez_Instance *inst = cfdata->inst; - - if (!e_bluez_adapter_discoverable_set - (inst->adapter, cfdata->mode, - _method_success_check, "e_bluez_adapter_discoverable_get")) - ERR("Can't set Discoverable on adapter"); - - if (!e_bluez_adapter_discoverable_timeout_set - (inst->adapter, cfdata->timeout * 60, - _method_success_check, "e_bluez_adapter_discoverable_timeout_get")) - ERR("Can't set DiscoverableTimeout on adapter"); - - if (!e_bluez_adapter_name_set - (inst->adapter, cfdata->name, - _method_success_check, "e_bluez_adapter_name_get")) - ERR("Can't set Name on adapter"); - - return 1; -} - diff --git a/src/modules/bluez/e_mod_main.c b/src/modules/bluez/e_mod_main.c deleted file mode 100644 index 106d3185c..000000000 --- a/src/modules/bluez/e_mod_main.c +++ /dev/null @@ -1,1439 +0,0 @@ -/* - * TODO: - * - * HIGH: - * - * - check why return NULL from method call triggers cancel error - * after timeout. - * - find out why alias == address in _bluez_request_pincode_cb - * - more complete agent support (handle requests from devices) - * - handle device-disappeared events - * - icon with device state (trusted, connected, paired) - * - * LOW: - * - * - configure (probably module) timeout to trigger automatic rescan. - * - gadgets to show different adapters (see mixer module configuration) - * - module to choose the default adapter (see mixer module configuration) - * - icon with device class - */ -#include "e.h" -#include "e_mod_main.h" - -static E_Module *bluez_mod = NULL; -static char tmpbuf[4096]; /* general purpose buffer, just use immediately */ - -static const char _e_bluez_agent_path[] = "/org/enlightenment/bluez/Agent"; -const char _e_bluez_name[] = "bluez"; -const char _e_bluez_Name[] = "Bluetooth Manager"; -int _e_bluez_log_dom = -1; - -static void _bluez_gadget_update(E_Bluez_Instance *inst); -static void _bluez_tip_update(E_Bluez_Instance *inst); -static void _bluez_popup_update(E_Bluez_Instance *inst); - -struct bluez_pincode_data -{ - void (*cb)(struct bluez_pincode_data *d); - DBusMessage *msg; - E_Bluez_Module_Context *ctxt; - char *pincode; - const char *alias; - E_Dialog *dia; - Evas_Object *entry; - Eina_Bool canceled; -}; - -const char * -e_bluez_theme_path(void) -{ -#define TF "/e-module-bluez.edj" - size_t dirlen; - - dirlen = strlen(bluez_mod->dir); - if (dirlen >= sizeof(tmpbuf) - sizeof(TF)) - return NULL; - - memcpy(tmpbuf, bluez_mod->dir, dirlen); - memcpy(tmpbuf + dirlen, TF, sizeof(TF)); - - return tmpbuf; -#undef TF -} - -static void -_bluez_devices_clear(E_Bluez_Instance *inst) -{ - E_Bluez_Instance_Device *d; - EINA_LIST_FREE(inst->devices, d) - { - eina_stringshare_del(d->address); - eina_stringshare_del(d->alias); - free(d); - } - inst->address = NULL; - inst->alias = NULL; -} - -static void -_bluez_discovery_cb(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - E_Bluez_Instance *inst = data; - char *label; - - if (error && dbus_error_is_set(error)) - { - _bluez_dbus_error_show(_("Cannot change adapter's discovery."), error); - dbus_error_free(error); - return; - } - - inst->discovering = !inst->discovering; - - label = !inst->discovering ? _("Start Scan") : _("Stop Scan"); - e_widget_button_label_set(inst->ui.button, label); -} - -static void -_bluez_create_paired_device_cb(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - const char *alias = data; - - if (error && dbus_error_is_set(error)) - { - if (strcmp(error->name, "org.bluez.Error.AlreadyExists") != 0) - _bluez_dbus_error_show(_("Cannot pair with device."), error); - dbus_error_free(error); - eina_stringshare_del(alias); - return; - } - - e_util_dialog_show - (_("Bluetooth Manager"), _("Device '%s' successfully paired."), alias); - eina_stringshare_del(alias); -} - -static void -_bluez_toggle_powered_cb(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - E_Bluez_Instance *inst = data; - - if ((!error) || (!dbus_error_is_set(error))) - { - inst->powered_pending = EINA_FALSE; - inst->powered = !inst->powered; - - if (!inst->powered) - { - _bluez_devices_clear(inst); - - if (inst->popup) - _bluez_popup_update(inst); - } - - _bluez_gadget_update(inst); - return; - } - - _bluez_dbus_error_show(_("Cannot toggle adapter's powered."), error); - dbus_error_free(error); -} - -void -_bluez_toggle_powered(E_Bluez_Instance *inst) -{ - Eina_Bool powered; - - if ((!inst) || (!inst->ctxt->has_manager)) - { - _bluez_operation_error_show(_("BlueZ Daemon is not running.")); - return; - } - - if (!inst->adapter) - { - _bluez_operation_error_show(_("No bluetooth adapter.")); - return; - } - - if (!e_bluez_adapter_powered_get(inst->adapter, &powered)) - { - _bluez_operation_error_show(_("Query adapter's powered.")); - return; - } - - powered = !powered; - - if (!e_bluez_adapter_powered_set - (inst->adapter, powered, _bluez_toggle_powered_cb, inst)) - { - _bluez_operation_error_show(_("Query adapter's powered.")); - return; - } -} - -static void -_bluez_cb_toggle_powered(E_Object *obj __UNUSED__, - const char *params __UNUSED__) -{ - E_Bluez_Module_Context *ctxt; - const Eina_List *l; - E_Bluez_Instance *inst; - - if (!bluez_mod) - return; - - ctxt = bluez_mod->data; - EINA_LIST_FOREACH(ctxt->instances, l, inst) - if (inst->adapter) _bluez_toggle_powered(inst); -} - -static void _bluez_popup_del(E_Bluez_Instance *inst); - -static Eina_Bool -_bluez_popup_input_window_mouse_up_cb(void *data, - int type __UNUSED__, - void *event) -{ - Ecore_Event_Mouse_Button *ev = event; - E_Bluez_Instance *inst = data; - - if (ev->window != inst->ui.input.win) - return ECORE_CALLBACK_PASS_ON; - - _bluez_popup_del(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_bluez_popup_input_window_key_down_cb(void *data, - int type __UNUSED__, - void *event) -{ - Ecore_Event_Key *ev = event; - E_Bluez_Instance *inst = data; - const char *keysym; - - if (ev->window != inst->ui.input.win) - return ECORE_CALLBACK_PASS_ON; - - keysym = ev->key; - if (strcmp(keysym, "Escape") == 0) - _bluez_popup_del(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static void -_bluez_popup_input_window_destroy(E_Bluez_Instance *inst) -{ - ecore_x_window_free(inst->ui.input.win); - inst->ui.input.win = 0; - - ecore_event_handler_del(inst->ui.input.mouse_up); - inst->ui.input.mouse_up = NULL; - - ecore_event_handler_del(inst->ui.input.key_down); - inst->ui.input.key_down = NULL; -} - -static void -_bluez_popup_input_window_create(E_Bluez_Instance *inst) -{ - Ecore_X_Window_Configure_Mask mask; - Ecore_X_Window w, popup_w; - E_Manager *man; - - man = e_manager_current_get(); - - w = ecore_x_window_input_new(man->root, 0, 0, man->w, man->h); - mask = (ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE | - ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING); - popup_w = inst->popup->win->evas_win; - ecore_x_window_configure(w, mask, 0, 0, 0, 0, 0, popup_w, - ECORE_X_WINDOW_STACK_BELOW); - ecore_x_window_show(w); - - inst->ui.input.mouse_up = - ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, - _bluez_popup_input_window_mouse_up_cb, inst); - - inst->ui.input.key_down = - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _bluez_popup_input_window_key_down_cb, inst); - - inst->ui.input.win = w; -} - -static void -_bluez_popup_cb_powered_changed(void *data, - Evas_Object *obj) -{ - E_Bluez_Instance *inst = data; - E_Bluez_Module_Context *ctxt = inst->ctxt; - Eina_Bool powered = e_widget_check_checked_get(obj); - - if ((!ctxt) || (!ctxt->has_manager)) - { - _bluez_operation_error_show(_("BlueZ Daemon is not running.")); - return; - } - - if (!inst->adapter) - { - _bluez_operation_error_show(_("No bluetooth adapter.")); - return; - } - - if (!e_bluez_adapter_powered_set - (inst->adapter, powered, _bluez_toggle_powered_cb, inst)) - { - _bluez_operation_error_show - (_("Cannot toggle adapter's powered.")); - return; - } - - inst->powered_pending = EINA_TRUE; -} - -static void -_bluez_pincode_ask_cb(struct bluez_pincode_data *d) -{ - DBusMessage *reply; - - if (!d->pincode) - { - e_util_dialog_show(_("Bluetooth Manager"), _("Invalid Pin Code.")); - return; - } - - reply = dbus_message_new_method_return(d->msg); - dbus_message_append_args - (reply, DBUS_TYPE_STRING, &d->pincode, DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(reply, EINA_TRUE); - e_dbus_message_send(d->ctxt->agent.conn, reply, NULL, -1, NULL); -} - -static void -bluez_pincode_ask_ok(void *data, - E_Dialog *dia) -{ - struct bluez_pincode_data *d = data; - d->canceled = EINA_FALSE; - e_object_del(E_OBJECT(dia)); -} - -static void -bluez_pincode_ask_cancel(void *data, - E_Dialog *dia) -{ - struct bluez_pincode_data *d = data; - d->canceled = EINA_TRUE; - e_object_del(E_OBJECT(dia)); -} - -static void -bluez_pincode_ask_del(void *data) -{ - E_Dialog *dia = data; - struct bluez_pincode_data *d = e_object_data_get(E_OBJECT(dia)); - - if (!d->canceled) - d->cb(d); - - d->ctxt->agent.pending = eina_list_remove(d->ctxt->agent.pending, dia); - - free(d->pincode); - dbus_message_unref(d->msg); - eina_stringshare_del(d->alias); - E_FREE(d); -} - -static void -bluez_pincode_ask_key_down(void *data, - Evas *e __UNUSED__, - Evas_Object *o __UNUSED__, - void *event) -{ - Evas_Event_Key_Down *ev = event; - struct bluez_pincode_data *d = data; - - if (strcmp(ev->keyname, "Return") == 0) - bluez_pincode_ask_ok(d, d->dia); - else if (strcmp(ev->keyname, "Escape") == 0) - bluez_pincode_ask_cancel(d, d->dia); -} - -static void -bluez_pincode_ask(void (*cb)(struct bluez_pincode_data *), - DBusMessage *msg, - const char *alias, - E_Bluez_Module_Context *ctxt) -{ - struct bluez_pincode_data *d; - Evas_Object *list, *o; - Evas *evas; - char buf[512]; - int mw, mh; - - if (!cb) - return; - - d = E_NEW(struct bluez_pincode_data, 1); - if (!d) - return; - - d->cb = cb; - d->ctxt = ctxt; - d->alias = eina_stringshare_add(alias); - d->msg = dbus_message_ref(msg); - d->canceled = EINA_TRUE; /* closing the dialog defaults to cancel */ - d->dia = e_dialog_new(NULL, "E", "bluez_ask_pincode"); - - snprintf(buf, sizeof(buf), _("Pairing with device '%s'"), alias); - e_dialog_title_set(d->dia, buf); - e_dialog_icon_set(d->dia, "dialog-ask", 32); - e_dialog_border_icon_set(d->dia, "dialog-ask"); - - evas = d->dia->win->evas; - - list = e_widget_list_add(evas, 0, 0); - - o = edje_object_add(evas); - e_theme_edje_object_set(o, "base/theme/dialog", - "e/widgets/dialog/text"); - snprintf(buf, sizeof(buf), - _("Enter the PIN code: ")); - edje_object_part_text_set(o, "e.textblock.message", buf); - edje_object_size_min_calc(o, &mw, &mh); - evas_object_size_hint_min_set(o, mw, mh); - evas_object_resize(o, mw, mh); - evas_object_show(o); - e_widget_list_object_append(list, o, 1, 1, 0.5); - - d->entry = o = e_widget_entry_add(evas, &d->pincode, NULL, NULL, NULL); - e_widget_entry_password_set(o, 0); - evas_object_show(o); - e_widget_list_object_append(list, o, 1, 0, 0.0); - - e_widget_size_min_get(list, &mw, &mh); - if (mw < 200) - mw = 200; - if (mh < 60) - mh = 60; - e_dialog_content_set(d->dia, list, mw, mh); - - e_dialog_button_add - (d->dia, _("Ok"), NULL, bluez_pincode_ask_ok, d); - e_dialog_button_add - (d->dia, _("Cancel"), NULL, bluez_pincode_ask_cancel, d); - - evas_object_event_callback_add - (d->dia->bg_object, EVAS_CALLBACK_KEY_DOWN, - bluez_pincode_ask_key_down, d); - - e_object_del_attach_func_set - (E_OBJECT(d->dia), bluez_pincode_ask_del); - e_object_data_set(E_OBJECT(d->dia), d); - - e_dialog_button_focus_num(d->dia, 0); - e_widget_focus_set(d->entry, 1); - - e_win_centered_set(d->dia->win, 1); - e_dialog_show(d->dia); - - ctxt->agent.pending = eina_list_append(ctxt->agent.pending, d->dia); -} - -static DBusMessage * -_bluez_request_pincode_cb(E_DBus_Object *obj, - DBusMessage *msg) -{ - E_Bluez_Module_Context *ctxt = e_dbus_object_data_get(obj); - E_Bluez_Element *element; - const char *path; - const char *alias; - - // TODO: seems that returning NULL is causing pin code rquest to be canceled! - - if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID) == FALSE) - return NULL; - - element = e_bluez_device_get(path); - if (!element) - alias = path; - else - { - if (!e_bluez_device_alias_get(element, &alias)) - { - if (!e_bluez_device_name_get(element, &alias)) - alias = path; - } - } - // TODO: find out why alias == address, then remove debug: - fprintf(stderr, ">>> request pin code of '%s' (%s)\n", alias, path); - bluez_pincode_ask(_bluez_pincode_ask_cb, msg, alias, ctxt); - return NULL; -} - -static void -_bluez_popup_cb_scan(void *data, - void *data2 __UNUSED__) -{ - E_Bluez_Instance *inst = data; - int ret; - - if (!inst->adapter) - ret = 0; - else if (inst->discovering) - ret = e_bluez_adapter_stop_discovery - (inst->adapter, _bluez_discovery_cb, inst); - else - { - inst->last_scan = ecore_loop_time_get(); - - _bluez_devices_clear(inst); - - ret = e_bluez_adapter_start_discovery - (inst->adapter, _bluez_discovery_cb, inst); - - _bluez_popup_update(inst); - } - - if (!ret) - ERR("Failed on discovery procedure"); -} - -static void -_bluez_popup_cb_controls(void *data, - void *data2 __UNUSED__) -{ - E_Bluez_Instance *inst = data; - if (inst->popup) - _bluez_popup_del(inst); - if (inst->conf_dialog) - return; - if (!inst->adapter) - return; - inst->conf_dialog = e_bluez_config_dialog_new(NULL, inst); -} - -static void -_bluez_popup_device_selected(void *data) -{ - E_Bluez_Instance *inst = data; - const char *address = inst->address; - const char *alias; - const char *cap = "DisplayYesNo"; - const E_Bluez_Instance_Device *d; - const Eina_List *l; - - if (inst->popup) - _bluez_popup_del(inst); - - if (!address) - { - ERR("no device selected for pairing."); - return; - } - - inst->alias = address; - EINA_LIST_FOREACH(inst->devices, l, d) - { - if (address == d->alias) - { - inst->alias = d->alias; - break; - } - } - - if (!inst->alias) - { - ERR("device %s does not have an alias.", address); - return; - } - - alias = eina_stringshare_ref(inst->alias); - if (!e_bluez_adapter_create_paired_device - (inst->adapter, _e_bluez_agent_path, cap, address, - _bluez_create_paired_device_cb, alias)) - { - eina_stringshare_del(alias); - return; - } -} - -static Eina_Bool -_bluez_event_devicefound(void *data, - int type __UNUSED__, - void *event) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Device_Found *device = event; - E_Bluez_Instance *inst; - const Eina_List *l_inst; - const char *alias; - - // TODO: get properties such as paired, connected, trusted, class, icon... - // TODO: check if the adapter contains device->name and if so get path. - - alias = e_bluez_devicefound_alias_get(device); - - EINA_LIST_FOREACH(ctxt->instances, l_inst, inst) - { - const Eina_List *l_dev; - E_Bluez_Instance_Device *dev; - Eina_Bool found = EINA_FALSE; - - if (inst->adapter != device->adapter) continue; - - EINA_LIST_FOREACH(inst->devices, l_dev, dev) - { - if (dev->address == device->name) - { - found = EINA_TRUE; - break; - } - } - - if (found) continue; - - dev = malloc(sizeof(E_Bluez_Instance_Device)); - if (!dev) continue; - - dev->address = eina_stringshare_ref(device->name); - dev->alias = eina_stringshare_ref(alias); - - inst->devices = eina_list_append(inst->devices, dev); - - if (inst->ui.list) - { - e_widget_ilist_append - (inst->ui.list, NULL, dev->alias, - _bluez_popup_device_selected, inst, dev->address); - e_widget_ilist_go(inst->ui.list); - } - } - - return 1; -} - -static void -_bluez_popup_update(E_Bluez_Instance *inst) -{ - Evas_Object *list = inst->ui.list; - int selected; - const char *label; - E_Bluez_Instance_Device *d; - Eina_List *l; - - /* TODO: replace this with a scroller + list of edje - * objects that are more full of features - */ - selected = e_widget_ilist_selected_get(list); - e_widget_ilist_freeze(list); - e_widget_ilist_clear(list); - - EINA_LIST_FOREACH(inst->devices, l, d) - { - e_widget_ilist_append - (inst->ui.list, NULL, d->alias, - _bluez_popup_device_selected, inst, d->address); - } - - if (selected >= 0) - { - inst->first_selection = EINA_TRUE; - e_widget_ilist_selected_set(list, selected); - } - else - inst->first_selection = EINA_FALSE; - - e_widget_ilist_go(list); - - e_widget_check_checked_set(inst->ui.powered, inst->powered); - label = inst->discovering ? _("Stop Scan") : _("Start Scan"); - e_widget_button_label_set(inst->ui.button, label); - e_widget_disabled_set(inst->ui.button, !inst->powered); -} - -static void -_bluez_popup_del(E_Bluez_Instance *inst) -{ - _bluez_popup_input_window_destroy(inst); - e_object_del(E_OBJECT(inst->popup)); - inst->popup = NULL; -} - -static void -_bluez_popup_new(E_Bluez_Instance *inst) -{ - Evas_Object *ol; - Evas *evas; - Evas_Coord mw, mh; - const char *label; - Eina_Bool b, needs_scan = EINA_FALSE; - - if (inst->popup) - { - e_gadcon_popup_show(inst->popup); - return; - } - - if (!inst->adapter) - { - _bluez_operation_error_show(_("No bluetooth adapter.")); - return; - } - - if (!e_bluez_adapter_discovering_get(inst->adapter, &b)) - { - _bluez_operation_error_show(_("Can't get Discovering property")); - return; - } - inst->discovering = b; - // maybe auto-scan if did not in the last 30 minutes? - // seems scan will hurt things like bluetooth audio playback, so don't do it - if ((!inst->discovering) && (inst->last_scan <= 0.0) && (inst->ui.powered)) - { - label = _("Stop Scan"); - needs_scan = EINA_TRUE; - } - else - label = inst->discovering ? _("Stop Scan") : _("Start Scan"); - - inst->popup = e_gadcon_popup_new(inst->gcc); - evas = inst->popup->win->evas; - - ol = e_widget_list_add(evas, 0, 0); - - // TODO: get this size from edj - inst->ui.list = e_widget_ilist_add(evas, 32, 32, &inst->address); - e_widget_size_min_set(inst->ui.list, 180, 100); - e_widget_list_object_append(ol, inst->ui.list, 1, 1, 0.5); - - inst->ui.powered = e_widget_check_add(evas, _("Powered"), &inst->powered); - e_widget_on_change_hook_set - (inst->ui.powered, _bluez_popup_cb_powered_changed, inst); - e_widget_list_object_append(ol, inst->ui.powered, 1, 0, 0.5); - - inst->ui.button = e_widget_button_add - (evas, label, NULL, _bluez_popup_cb_scan, inst, NULL); - e_widget_list_object_append(ol, inst->ui.button, 1, 0, 0.5); - - inst->ui.control = e_widget_button_add - (evas, _("Controls"), NULL, _bluez_popup_cb_controls, inst, NULL); - e_widget_list_object_append(ol, inst->ui.control, 1, 0, 0.5); - - _bluez_popup_update(inst); - - e_widget_size_min_get(ol, &mw, &mh); - if (mh < 200) mh = 200; - if (mw < 200) mw = 200; - e_widget_size_min_set(ol, mw, mh); - - e_gadcon_popup_content_set(inst->popup, ol); - e_gadcon_popup_show(inst->popup); - _bluez_popup_input_window_create(inst); - - if (needs_scan) _bluez_popup_cb_scan(inst, NULL); -} - -static void -_bluez_menu_cb_cfg(void *data, - E_Menu *menu __UNUSED__, - E_Menu_Item *mi __UNUSED__) -{ - E_Bluez_Instance *inst = data; - if (inst->popup) - _bluez_popup_del(inst); - if (inst->conf_dialog) - return; - if (!inst->adapter) - return; - inst->conf_dialog = e_bluez_config_dialog_new(NULL, inst); -} - -static void -_bluez_menu_new(E_Bluez_Instance *inst, - Evas_Event_Mouse_Down *ev) -{ - E_Zone *zone; - E_Menu *m; - E_Menu_Item *mi; - int x, y; - - zone = e_util_zone_current_get(e_manager_current_get()); - - m = e_menu_new(); - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Settings")); - e_util_menu_item_theme_icon_set(mi, "configure"); - e_menu_item_callback_set(mi, _bluez_menu_cb_cfg, inst); - - m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0); - - e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL); - e_menu_activate_mouse(m, zone, x + ev->output.x, y + ev->output.y, - 1, 1, E_MENU_POP_DIRECTION_AUTO, ev->timestamp); - evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, - EVAS_BUTTON_NONE, ev->timestamp, NULL); -} - -static void -_bluez_tip_new(E_Bluez_Instance *inst) -{ - Evas *e; - - inst->tip = e_gadcon_popup_new(inst->gcc); - if (!inst->tip) return; - - e = inst->tip->win->evas; - - inst->o_tip = edje_object_add(e); - e_theme_edje_object_set(inst->o_tip, "base/theme/modules/bluez/tip", - "e/modules/bluez/tip"); - - _bluez_tip_update(inst); - - e_gadcon_popup_content_set(inst->tip, inst->o_tip); - e_gadcon_popup_show(inst->tip); -} - -static void -_bluez_tip_del(E_Bluez_Instance *inst) -{ - evas_object_del(inst->o_tip); - e_object_del(E_OBJECT(inst->tip)); - inst->tip = NULL; - inst->o_tip = NULL; -} - -static void -_bluez_cb_mouse_down(void *data, - Evas *evas __UNUSED__, - Evas_Object *obj __UNUSED__, - void *event) -{ - E_Bluez_Instance *inst; - Evas_Event_Mouse_Down *ev; - - inst = data; - if (!inst) - return; - - ev = event; - if (ev->button == 1) - { - if (!inst->popup) - _bluez_popup_new(inst); - else - _bluez_popup_del(inst); - } - else if (ev->button == 2) - _bluez_toggle_powered(inst); - else if (ev->button == 3) - _bluez_menu_new(inst, ev); -} - -static void -_bluez_cb_mouse_in(void *data, - Evas *evas __UNUSED__, - Evas_Object *obj __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Instance *inst = data; - - if (inst->tip) - return; - - _bluez_tip_new(inst); -} - -static void -_bluez_cb_mouse_out(void *data, - Evas *evas __UNUSED__, - Evas_Object *obj __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Instance *inst = data; - - if (!inst->tip) - return; - - _bluez_tip_del(inst); -} - -static void -_bluez_edje_view_update(E_Bluez_Instance *inst, - Evas_Object *o) -{ - E_Bluez_Module_Context *ctxt = inst->ctxt; - const char *name; - - if (!ctxt->has_manager) - { - edje_object_part_text_set(o, "e.text.powered", ""); - edje_object_part_text_set(o, "e.text.status", ""); - edje_object_signal_emit(o, "e,changed,service,none", "e"); - edje_object_part_text_set(o, "e.text.name", _("No Bluetooth daemon")); - edje_object_signal_emit(o, "e,changed,name", "e"); - return; - } - - if (!inst->adapter) - { - edje_object_part_text_set(o, "e.text.powered", ""); - edje_object_part_text_set(o, "e.text.status", ""); - edje_object_signal_emit(o, "e,changed,off", "e"); - edje_object_part_text_set(o, "e.text.name", _("No Bluetooth adapter")); - edje_object_signal_emit(o, "e,changed,name", "e"); - return; - } - - if (!e_bluez_adapter_name_get(inst->adapter, &name)) - name = ""; - edje_object_part_text_set(o, "e.text.name", name); - edje_object_signal_emit(o, "e,changed,name", "e"); - - if (inst->powered) - { - if (inst->discoverable) - { - edje_object_signal_emit(o, "e,changed,powered", "e"); - edje_object_part_text_set - (o, "e.text.status", - _("Bluetooth is powered and discoverable.")); - } - else - { - edje_object_signal_emit(o, "e,changed,hidden", "e"); - edje_object_part_text_set - (o, "e.text.status", _("Bluetooth is powered and hidden.")); - } - } - else - { - edje_object_signal_emit(o, "e,changed,off", "e"); - edje_object_part_text_set(o, "e.text.status", _("Bluetooth is off.")); - } -} - -static void -_bluez_tip_update(E_Bluez_Instance *inst) -{ - _bluez_edje_view_update(inst, inst->o_tip); -} - -static void -_bluez_gadget_update(E_Bluez_Instance *inst) -{ - E_Bluez_Module_Context *ctxt = inst->ctxt; - - if (inst->popup && ((!ctxt->has_manager) || (!inst->adapter))) - _bluez_popup_del(inst); - - if (inst->popup) - _bluez_popup_update(inst); - if (inst->tip) - _bluez_tip_update(inst); - - _bluez_edje_view_update(inst, inst->ui.gadget); -} - -/* Gadcon Api Functions */ - -static E_Gadcon_Client * -_gc_init(E_Gadcon *gc, - const char *name, - const char *id, - const char *style) -{ - E_Bluez_Instance *inst; - E_Bluez_Module_Context *ctxt; - - if (!bluez_mod) - return NULL; - - ctxt = bluez_mod->data; - - inst = E_NEW(E_Bluez_Instance, 1); - inst->ctxt = ctxt; - inst->ui.gadget = edje_object_add(gc->evas); - e_theme_edje_object_set(inst->ui.gadget, "base/theme/modules/bluez", - "e/modules/bluez/main"); - - inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->ui.gadget); - inst->gcc->data = inst; - - evas_object_event_callback_add - (inst->ui.gadget, EVAS_CALLBACK_MOUSE_DOWN, _bluez_cb_mouse_down, inst); - evas_object_event_callback_add - (inst->ui.gadget, EVAS_CALLBACK_MOUSE_IN, _bluez_cb_mouse_in, inst); - evas_object_event_callback_add - (inst->ui.gadget, EVAS_CALLBACK_MOUSE_OUT, _bluez_cb_mouse_out, inst); - - // TODO: instead of getting the default adapter, get the adapter for - // each instance. See the mixer module. - if (ctxt->default_adapter) - inst->adapter = e_bluez_adapter_get(ctxt->default_adapter); - else - inst->adapter = NULL; - - if (inst->adapter) - { - Eina_Bool powered, discoverable, discovering; - - if (e_bluez_adapter_powered_get(inst->adapter, &powered)) - inst->powered = powered; - - if (e_bluez_adapter_discoverable_get(inst->adapter, &discoverable)) - inst->discoverable = discoverable; - - if (e_bluez_adapter_discovering_get(inst->adapter, &discovering)) - inst->discovering = discovering; - } - - _bluez_gadget_update(inst); - - ctxt->instances = eina_list_append(ctxt->instances, inst); - - return inst->gcc; -} - -static void -_gc_shutdown(E_Gadcon_Client *gcc) -{ - E_Bluez_Module_Context *ctxt; - E_Bluez_Instance *inst; - - if (!bluez_mod) - return; - - ctxt = bluez_mod->data; - if (!ctxt) - return; - - inst = gcc->data; - if (!inst) - return; - - evas_object_del(inst->ui.gadget); - - _bluez_devices_clear(inst); - - ctxt->instances = eina_list_remove(ctxt->instances, inst); - - E_FREE(inst); -} - -static void -_gc_orient(E_Gadcon_Client *gcc, - E_Gadcon_Orient orient __UNUSED__) -{ - e_gadcon_client_aspect_set(gcc, 16, 16); - e_gadcon_client_min_size_set(gcc, 16, 16); -} - -static const char * -_gc_label(const E_Gadcon_Client_Class *client_class __UNUSED__) -{ - return _(_e_bluez_Name); -} - -static Evas_Object * -_gc_icon(const E_Gadcon_Client_Class *client_class __UNUSED__, - Evas *evas) -{ - Evas_Object *o; - - o = edje_object_add(evas); - edje_object_file_set(o, e_bluez_theme_path(), "icon"); - return o; -} - -static const char * -_gc_id_new(const E_Gadcon_Client_Class *client_class __UNUSED__) -{ - E_Bluez_Module_Context *ctxt; - - if (!bluez_mod) - return NULL; - - ctxt = bluez_mod->data; - if (!ctxt) - return NULL; - - snprintf(tmpbuf, sizeof(tmpbuf), "bluez.%d", - eina_list_count(ctxt->instances)); - return tmpbuf; -} - -static const E_Gadcon_Client_Class _gc_class = -{ - GADCON_CLIENT_CLASS_VERSION, _e_bluez_name, - { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, - e_gadcon_site_is_not_toolbar - }, - E_GADCON_CLIENT_STYLE_PLAIN -}; - -EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, _e_bluez_Name}; - -static const char _act_toggle_powered[] = "toggle_powered"; -static const char _lbl_toggle_powered[] = "Toggle Powered"; - -static void -_bluez_actions_register(E_Bluez_Module_Context *ctxt) -{ - ctxt->actions.toggle_powered = e_action_add(_act_toggle_powered); - if (ctxt->actions.toggle_powered) - { - ctxt->actions.toggle_powered->func.go = - _bluez_cb_toggle_powered; - e_action_predef_name_set - (_(_e_bluez_Name), _(_lbl_toggle_powered), _act_toggle_powered, - NULL, NULL, 0); - } -} - -static void -_bluez_actions_unregister(E_Bluez_Module_Context *ctxt) -{ - if (ctxt->actions.toggle_powered) - { - e_action_predef_name_del(_(_e_bluez_Name), _(_lbl_toggle_powered)); - e_action_del(_act_toggle_powered); - } -} - -static Eina_Bool -_bluez_manager_changed_do(void *data) -{ - E_Bluez_Module_Context *ctxt = data; - - //FIXME: reload the default adapter maybe? - - ctxt->poller.manager_changed = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void -_bluez_manager_changed(void *data, - const E_Bluez_Element *element __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - if (ctxt->poller.manager_changed) - ecore_poller_del(ctxt->poller.manager_changed); - ctxt->poller.manager_changed = ecore_poller_add - (ECORE_POLLER_CORE, 1, _bluez_manager_changed_do, ctxt); -} - -static void -_properties_sync_callback(void *data, - DBusMessage *msg __UNUSED__, - DBusError *err) -{ - E_Bluez_Instance *inst = data; - Eina_Bool powered; - Eina_Bool discoverable; - - if (err && dbus_error_is_set(err)) - { - dbus_error_free(err); - return; - } - - if (!e_bluez_adapter_powered_get(inst->adapter, &powered)) - { - _bluez_operation_error_show(_("Query adapter's powered.")); - return; - } - - inst->powered = powered; - - if (!e_bluez_adapter_discoverable_get(inst->adapter, &discoverable)) - { - _bluez_operation_error_show(_("Query adapter's discoverable.")); - return; - } - - inst->discoverable = discoverable; -} - -static void -_default_adapter_callback(void *data, - DBusMessage *msg, - DBusError *err __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - const Eina_List *l; - E_Bluez_Instance *inst; - const char *path; - - if (err && dbus_error_is_set(err)) - { - dbus_error_free(err); - return; - } - - if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID) == FALSE) - return; - - eina_stringshare_replace(&ctxt->default_adapter, path); - - // TODO: instead of getting the default adapter, get the adapter for - // each instance. See the mixer module. - EINA_LIST_FOREACH(ctxt->instances, l, inst) - { - inst->adapter = e_bluez_adapter_get(path); - - e_bluez_element_properties_sync_full - (inst->adapter, _properties_sync_callback, inst); - } -} - -static Eina_Bool -_bluez_event_manager_in(void *data, - int type __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Element *element; - Eina_List *l; - E_Bluez_Instance *inst; - - ctxt->has_manager = EINA_TRUE; - - element = e_bluez_manager_get(); - if (!e_bluez_manager_default_adapter(_default_adapter_callback, ctxt)) - return ECORE_CALLBACK_DONE; - - e_bluez_element_listener_add(element, _bluez_manager_changed, ctxt, NULL); - - EINA_LIST_FOREACH(ctxt->instances, l, inst) - _bluez_gadget_update(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_bluez_event_manager_out(void *data, - int type __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Instance *inst; - Eina_List *l; - - ctxt->has_manager = EINA_FALSE; - eina_stringshare_replace(&ctxt->default_adapter, NULL); - - EINA_LIST_FOREACH(ctxt->instances, l, inst) - _bluez_gadget_update(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_bluez_event_element_updated(void *data, - int type __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Element *element = event; - Eina_Bool powered, discoverable, discovering; - E_Bluez_Instance *inst; - Eina_List *l; - - if (!e_bluez_element_is_adapter(element)) return ECORE_CALLBACK_PASS_ON; - - if (!e_bluez_adapter_powered_get(element, &powered)) - powered = EINA_FALSE; - - if (!e_bluez_adapter_discoverable_get(element, &discoverable)) - discoverable = EINA_FALSE; - - if (!e_bluez_adapter_discovering_get(element, &discovering)) - discovering = EINA_FALSE; - - EINA_LIST_FOREACH(ctxt->instances, l, inst) - { - if (inst->adapter != element) continue; - - inst->powered = powered; - inst->discoverable = discoverable; - inst->discovering = discovering; - _bluez_gadget_update(inst); - } - - return ECORE_CALLBACK_PASS_ON; -} - -static void -_bluez_events_register(E_Bluez_Module_Context *ctxt) -{ - ctxt->event.manager_in = ecore_event_handler_add - (E_BLUEZ_EVENT_MANAGER_IN, _bluez_event_manager_in, ctxt); - ctxt->event.manager_out = ecore_event_handler_add - (E_BLUEZ_EVENT_MANAGER_OUT, _bluez_event_manager_out, ctxt); - ctxt->event.element_updated = ecore_event_handler_add - (E_BLUEZ_EVENT_ELEMENT_UPDATED, _bluez_event_element_updated, ctxt); - ctxt->event.device_found = ecore_event_handler_add - (E_BLUEZ_EVENT_DEVICE_FOUND, _bluez_event_devicefound, ctxt); - - // TODO: E_BLUEZ_EVENT_DEVICE_DISAPPEARED -} - -static void -_bluez_events_unregister(E_Bluez_Module_Context *ctxt) -{ - if (ctxt->event.manager_in) - ecore_event_handler_del(ctxt->event.manager_in); - if (ctxt->event.manager_out) - ecore_event_handler_del(ctxt->event.manager_out); - if (ctxt->event.device_found) - ecore_event_handler_del(ctxt->event.device_found); -} - -static void -_bluez_agent_register(E_Bluez_Module_Context *ctxt) -{ - E_DBus_Object *o; - - ctxt->agent.iface = e_dbus_interface_new("org.bluez.Agent"); - if (!ctxt->agent.iface) - return; - - o = e_dbus_object_add(ctxt->agent.conn, _e_bluez_agent_path, ctxt); - e_dbus_object_interface_attach(o, ctxt->agent.iface); - e_dbus_interface_method_add - (ctxt->agent.iface, "RequestPinCode", "o", "s", _bluez_request_pincode_cb); - // TODO: RequestPasskey - // TODO: RequestConfirmation - // TODO: Authorize - // TODO: DisplayPasskey - // TODO: ConfirmModeChange - // TODO: Cancel - // TODO: Release - - ctxt->agent.obj = o; -} - -static void -_bluez_agent_unregister(E_Bluez_Module_Context *ctxt) -{ - E_Object *o; - - EINA_LIST_FREE(ctxt->agent.pending, o) - e_object_del(o); - - e_dbus_object_interface_detach(ctxt->agent.obj, ctxt->agent.iface); - e_dbus_object_free(ctxt->agent.obj); - e_dbus_interface_unref(ctxt->agent.iface); -} - -EAPI void * -e_modapi_init(E_Module *m) -{ - E_Bluez_Module_Context *ctxt = E_NEW(E_Bluez_Module_Context, 1); - if (!ctxt) - return NULL; - - ctxt->agent.conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); - if ((!ctxt->agent.conn) || (!e_bluez_system_init(ctxt->agent.conn))) - goto error_bluez_system_init; - - bluez_mod = m; - - if (_e_bluez_log_dom < 0) - { - _e_bluez_log_dom = eina_log_domain_register("ebluez", EINA_COLOR_ORANGE); - if (_e_bluez_log_dom < 0) - { - //EINA_LOG_CRIT("could not register logging domain ebluez"); - goto error_log_domain; - } - } - - _bluez_agent_register(ctxt); - _bluez_actions_register(ctxt); - e_gadcon_provider_register(&_gc_class); - - _bluez_events_register(ctxt); - - return ctxt; - -error_log_domain: - _e_bluez_log_dom = -1; - bluez_mod = NULL; - e_bluez_system_shutdown(); -error_bluez_system_init: - E_FREE(ctxt); - return NULL; -} - -static void -_bluez_instances_free(E_Bluez_Module_Context *ctxt) -{ - E_Bluez_Instance *inst; - EINA_LIST_FREE(ctxt->instances, inst) - { - if (inst->popup) - _bluez_popup_del(inst); - if (inst->tip) - _bluez_tip_del(inst); - - e_object_del(E_OBJECT(inst->gcc)); - } -} - -EAPI int -e_modapi_shutdown(E_Module *m) -{ - E_Bluez_Module_Context *ctxt = m->data; - E_Bluez_Element *element; - - if (!ctxt) - return 0; - - element = e_bluez_manager_get(); - e_bluez_element_listener_del(element, _bluez_manager_changed, ctxt); - - _bluez_events_unregister(ctxt); - _bluez_instances_free(ctxt); - - _bluez_actions_unregister(ctxt); - _bluez_agent_unregister(ctxt); - e_gadcon_provider_unregister(&_gc_class); - - if (ctxt->poller.manager_changed) - ecore_poller_del(ctxt->poller.manager_changed); - - eina_stringshare_del(ctxt->default_adapter); - - E_FREE(ctxt); - bluez_mod = NULL; - - e_bluez_system_shutdown(); - - return 1; -} - -EAPI int -e_modapi_save(E_Module *m __UNUSED__) -{ - return 1; -} - diff --git a/src/modules/bluez/e_mod_main.h b/src/modules/bluez/e_mod_main.h deleted file mode 100644 index 7849ce51c..000000000 --- a/src/modules/bluez/e_mod_main.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef E_MOD_MAIN_H -#define E_MOD_MAIN_H - -#include "config.h" -#include -#include -#include - -#define MOD_CONF_VERSION 2 - -extern int _e_bluez_log_dom; -#undef DBG -#undef WRN -#undef ERR -#define DBG(...) EINA_LOG_DOM_DBG(_e_bluez_log_dom, __VA_ARGS__) -#define WRN(...) EINA_LOG_DOM_WARN(_e_bluez_log_dom, __VA_ARGS__) -#define ERR(...) EINA_LOG_DOM_ERR(_e_bluez_log_dom, __VA_ARGS__) - -typedef struct E_Bluez_Instance E_Bluez_Instance; -typedef struct E_Bluez_Instance_Device E_Bluez_Instance_Device; -typedef struct E_Bluez_Module_Context E_Bluez_Module_Context; - -struct E_Bluez_Instance -{ - E_Bluez_Module_Context *ctxt; - E_Gadcon_Client *gcc; - E_Gadcon_Popup *popup; - - /* used by popup */ - int powered; - Eina_Bool first_selection; - const char *address; - const char *alias; - - Eina_List *devices; - E_Bluez_Element *adapter; - double last_scan; - Eina_Bool discovering : 1; - Eina_Bool powered_pending : 1; - Eina_Bool discoverable : 1; - - struct - { - Evas_Object *gadget; - Evas_Object *list; - Evas_Object *powered; - Evas_Object *button; - Evas_Object *control; - struct - { - Ecore_X_Window win; - Ecore_Event_Handler *mouse_up; - Ecore_Event_Handler *key_down; - } input; - } ui; - - E_Gadcon_Popup *tip; - Evas_Object *o_tip; - - E_Config_Dialog *conf_dialog; -}; - -struct E_Bluez_Instance_Device -{ - const char *address; - const char *alias; - // TODO (and also show list icon!): Eina_Bool paired:1; - // TODO (and also show list icon!): Eina_Bool trusted:1; - // TODO (and also show list icon!): Eina_Bool connected:1; - // TODO ... class, icon -}; - -struct E_Bluez_Module_Context -{ - Eina_List *instances; - const char *default_adapter; - - struct - { - E_DBus_Connection *conn; - E_DBus_Interface *iface; - E_DBus_Object *obj; - Eina_List *pending; - } agent; - - struct - { - E_Action *toggle_powered; - } actions; - - struct - { - Ecore_Event_Handler *manager_in; - Ecore_Event_Handler *manager_out; - Ecore_Event_Handler *device_found; - Ecore_Event_Handler *element_updated; - } event; - - struct - { - Ecore_Poller *manager_changed; - } poller; - - Eina_Bool has_manager : 1; -}; - -EAPI extern E_Module_Api e_modapi; -EAPI void *e_modapi_init(E_Module *m); -EAPI int e_modapi_shutdown(E_Module *m); -EAPI int e_modapi_save(E_Module *m); - -const char *e_bluez_theme_path(void); -E_Config_Dialog *e_bluez_config_dialog_new(E_Container *con, - E_Bluez_Instance *inst); -void _bluez_toggle_powered(E_Bluez_Instance *inst); - -static inline void -_bluez_dbus_error_show(const char *msg, - const DBusError *error) -{ - const char *name; - - if ((!error) || (!dbus_error_is_set(error))) - return; - - name = error->name; - if (strncmp(name, "org.bluez.Error.", - sizeof("org.bluez.Error.") - 1) == 0) - name += sizeof("org.bluez.Error.") - 1; - - e_util_dialog_show(_("Bluez Server Operation Failed"), - _("Could not execute remote operation:
" - "%s
" - "Server Error %s: %s"), - msg, name, error->message); -} - -static inline void -_bluez_operation_error_show(const char *msg) -{ - e_util_dialog_show(_("Bluez Operation Failed"), - _("Could not execute local operation:
%s"), - msg); -} - - -/** - * @addtogroup Optional_Devices - * @{ - * - * @defgroup Module_Bluez BlueZ (Bluetooth) - * - * Controls bluetooth visibility, scan and pair devices. - * - * @see http://www.bluez.org/ - * @} - */ - -#endif diff --git a/src/modules/bluez/module.desktop.in b/src/modules/bluez/module.desktop.in deleted file mode 100644 index 2f84a4211..000000000 --- a/src/modules/bluez/module.desktop.in +++ /dev/null @@ -1,17 +0,0 @@ -[Desktop Entry] -Type=Link -Name=Bluetooth Manager -Name[ru]=Менеджер Bluetooth -Name[de]=Bluetooth-Manager -Name[fr]=Gestionnaire Bluetooth -Name[it]=Gestore Bluetooth -Name[pt]=Gestor de bluetooth -Name[tr]=Bluetooth Yöneticisi -Icon=e-module-bluez -Comment=Configure Bluetooth devices. -Comment[ru]=Управление Bluetooth устройствами. -Comment[de]=Bluetooth-Verbindungen verwalten -Comment[fr]=Configure les périphériques Bluetooth. -Comment[it]=Configura i dispositivi Bluetooth. -Comment[pt]=Configuração dos dispositivos Bluetooth -X-Enlightenment-ModuleType=system