e: Remove oFono 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: 77157
devs/princeamd/enlightenment-0.17-elive
Lucas De Marchi 11 years ago
parent da40a35d52
commit 68bd64d583
  1. 11
      configure.ac
  2. 531
      data/themes/default.edc
  3. 4
      src/modules/Makefile.am
  4. 32
      src/modules/ofono/Makefile.am
  5. BIN
      src/modules/ofono/e-module-ofono.edj
  6. 875
      src/modules/ofono/e_mod_main.c
  7. 134
      src/modules/ofono/e_mod_main.h
  8. 22
      src/modules/ofono/module.desktop.in

@ -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_EOFONO, false)
define([CHECK_MODULE_OFONO],
[
AC_E_CHECK_PKG(EOFONO, [ edbus >= 1.2.0 eofono >= 1.2.0 ], [], [OFONO=false])
])
AC_SUBST(EOFONO_CFLAGS)
AC_SUBST(EOFONO_LIBS)
have_wayland_clients=no
AC_ARG_ENABLE([wayland-clients],
AS_HELP_STRING([--enable-wayland-clients],[enable wayland clients in composite module @<:@default=disabled@:>@]),
@ -869,7 +861,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([ofono], true, [CHECK_MODULE_OFONO])
AC_E_OPTIONAL_MODULE([illume2], true)
AC_E_OPTIONAL_MODULE([syscon], true)
AC_E_OPTIONAL_MODULE([everything], true)
@ -1001,8 +992,6 @@ src/modules/mixer/Makefile
src/modules/mixer/module.desktop
src/modules/connman/Makefile
src/modules/connman/module.desktop
src/modules/ofono/Makefile
src/modules/ofono/module.desktop
src/modules/illume2/Makefile
src/modules/illume2/doc/illume.dox
src/modules/illume2/doc/Makefile

@ -8333,537 +8333,6 @@ CONNMAN_ICON(ethernet)
#undef CONNMAN_STATE_PART_ADD
#undef CONNMAN_IMAGES_SET
////////////////////////////////////////////////////////////////////////////
/*** MOD: OFONO ***/
// GADGET and TIP all have the same parts and signals:
//
// PARTS:
// e.text.name
// e.text.status
// e.text.op
//
// SIGNALS:
// e,unavailable: ofonod is not running (nothing else works)
// e,available: ofonod is running
// e,name,available: there is info about device name
// e,name,unavailable: there is no info about device name
// e,netinfo,available: there is info about network
// e,netinfo,unavailable: there is no info about network
//
// MESSAGES:
// id=1, type=MSG_INT, description=strength (0-100)
group {
name: "e/modules/ofono/main";
max: 128 128;
min: 1 1;
images {
image: "gsm_0.png" COMP;
image: "gsm_1.png" COMP;
image: "gsm_2.png" COMP;
image: "gsm_3.png" COMP;
image: "gsm_4.png" COMP;
image: "gsm_no.png" COMP;
}
script {
public message(Msg_Type:type, id, ...) {
if ((type == MSG_INT) && (id == 1)) {
new strength;
strength = getarg(2);
if (strength >= 80)
run_program(PROGRAM:"strength,5");
else if (strength >= 60)
run_program(PROGRAM:"strength,4");
else if (strength >= 40)
run_program(PROGRAM:"strength,3");
else if (strength >= 20)
run_program(PROGRAM:"strength,2");
else if (strength >= 1)
run_program(PROGRAM:"strength,1");
else
run_program(PROGRAM:"strength,no");
}
}
}
parts {
part {
name: "eventarea";
type: RECT;
mouse_events: 1;
description {
state: "default" 0.0;
color: 255 255 255 0;
}
}
part {
name: "eventarea.image";
type: IMAGE;
description {
state: "default" 0.0;
aspect: 1.6 1.7;
aspect_preference: HORIZONTAL;
image.normal: "gsm_no.png";
rel1.to: "eventarea";
rel2.to: "eventarea";
}
description {
state: "strength,5" 0.0;
inherit: "default" 0.0;
image.normal: "gsm_4.png";
}
description {
state: "strength,4" 0.0;
inherit: "default" 0.0;
image.normal: "gsm_3.png";
}
description {
state: "strength,3" 0.0;
inherit: "default" 0.0;
image.normal: "gsm_2.png";
}
description {
state: "strength,2" 0.0;
inherit: "default" 0.0;
image.normal: "gsm_1.png";
}
description {
state: "strength,1" 0.0;
inherit: "default" 0.0;
image.normal: "gsm_0.png";
}
description {
state: "strength,no" 0.0;
inherit: "default" 0.0;
image.normal: "gsm_no.png";
}
description {
state: "disabled" 0.0;
inherit: "default" 0.0;
color: 255 255 255 100;
}
}
programs {
program {
name: "strength,5";
action: STATE_SET "strength,5" 0.0;
target: "eventarea.image";
}
program {
name: "strength,4";
action: STATE_SET "strength,4" 0.0;
target: "eventarea.image";
}
program {
name: "strength,3";
action: STATE_SET "strength,3" 0.0;
target: "eventarea.image";
}
program {
name: "strength,2";
action: STATE_SET "strength,2" 0.0;
target: "eventarea.image";
}
program {
name: "strength,1";
action: STATE_SET "strength,1" 0.0;
target: "eventarea.image";
}
program {
name: "strength,0";
action: STATE_SET "strength,0" 0.0;
target: "eventarea.image";
}
program {
name: "strength,no";
action: STATE_SET "strength,no" 0.0;
target: "eventarea.image";
}
program {
name: "e,available";
signal: "e,available";
source: "e";
action: STATE_SET "default" 0.0;
target: "eventarea.image";
}
program {
name: "e,unavailable";
signal: "e,unavailable";
source: "e";
action: STATE_SET "disabled" 0.0;
target: "eventarea.image";
}
program {
name: "netinfo,unavailable";
signal: "e,netinfo,unavailable";
source: "e";
action: STATE_SET "default" 0.0;
target: "eventarea.image";
}
}
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: 0 1;
}
}
description {
state: "hidden" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
programs {
program {
name: "resize";
signal: "resize";
script {
new x, y, w, h;
get_geometry(PART:"eventarea", x, y, w, h);
if (w <= 32)
set_state(PART:"e.text.name", "hidden", 0.0);
else
set_state(PART:"e.text.name", "default", 0.0);
}
}
}
}
}
group {
name: "e/modules/ofono/tip";
min: 220 80;
images {
image: "inset_sunk.png" COMP;
}
script {
public message(Msg_Type:type, id, ...) {
if ((type == MSG_INT) && (id == 1)) {
new strength;
new Float:val;
strength = getarg(2);
val = float(strength) / 100.0;
set_drag(PART:"strength_gauge_knob", val, 0.0);
}
}
}
parts {
part {
name: "e.text.error";
type: TEXT;
mouse_events: 0;
description {
state: "default" 0.0;
color: 150 150 150 255;
fixed: 1 1;
visible: 0;
text {
font: "Sans:style=Bold";
size: 16;
text: "";
min: 1 1;
}
}
description {
state: "shown" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
programs {
program {
name: "error,e,available";
signal: "e,available";
source: "e";
action: STATE_SET "default" 0.0;
target: "e.text.error";
}
program {
name: "error,e,unavailable";
signal: "e,unavailable";
source: "e";
action: STATE_SET "shown" 0.0;
target: "e.text.error";
}
program {
name: "error,netinfo,available";
signal: "e,netinfo,available";
source: "e";
action: STATE_SET "default" 0.0;
target: "e.text.error";
}
program {
name: "error,netinfo,unavailable";
signal: "e,netinfo,unavailable";
source: "e";
action: STATE_SET "shown" 0.0;
target: "e.text.error";
}
}
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;
fixed: 1 1;
visible: 0;
rel1 {
relative: 0.0 0.0;
offset: 10 5;
}
text {
font: "Sans:style=Bold";
size: 16;
align: 0.0 0.0;
text: "";
min: 1 1;
}
}
description {
state: "shown" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
programs {
program {
name: "name,available";
signal: "e,available";
source: "e";
action: STATE_SET "default" 0.0;
target: "e.text.name";
}
program {
name: "name,unavailable";
signal: "e,unavailable";
source: "e";
action: STATE_SET "shown" 0.0;
target: "e.text.name";
}
}
part {
name: "e.text.op";
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;
fixed: 1 1;
visible: 1;
rel1 {
relative: 0.0 0.0;
offset: 10 5;
}
text {
font: "Sans:style=Bold";
size: 16;
align: 0.0 0.0;
text: "";
min: 1 1;
}
}
description {
state: "hidden" 0.0;
inherit: "default" 0.0;
visible: 0;
}
}
programs {
program {
name: "op,available";
signal: "e,available";
source: "e";
action: STATE_SET "default" 0.0;
target: "e.text.op";
}
program {
name: "op,unavailable";
signal: "e,unavailable";
source: "e";
action: STATE_SET "hidden" 0.0;
target: "e.text.op";
}
program {
name: "op,netinfo,unavailable";
signal: "e,netinfo,unavailable";
source: "e";
action: STATE_SET "hidden" 0.0;
target: "e.text.op";
}
}
part {
name: "e.text.status";
type: TEXT;
mouse_events: 0;
description {
state: "default" 0.0;
color: 0 0 0 255;
align: 0.0 0.0;
fixed: 1 1;
visible: 0;
rel1 {
relative: 0.0 0.0;
offset: 10 30;
}
text {
font: "Sans";
size: 10;
align: 0.0 0.0;
text: "";
min: 1 1;
}
}
description {
state: "shown" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
programs {
program {
name: "status,available";
signal: "e,netinfo,available";
source: "e";
action: STATE_SET "shown" 0.0;
target: "e.text.status";
}
program {
name: "status,unavailable";
signal: "e,netinfo,unavailable";
source: "e";
action: STATE_SET "default" 0.0;
target: "e.text.status";
}
}
part {
name: "strength_gauge_bg";
type: IMAGE;
scale: 1;
mouse_events: 0;
description {
state: "default" 0.0;
min: 100 10;
max: 99999 99999;
visible: 0;
rel1 {
relative: 0.0 0.0;
offset: 10 55;
}
rel2 {
relative: 1.0 1.0;
offset: -10 -10;
}
image {
normal: "inset_sunk.png";
border: 6 6 6 6;
}
}
description {
state: "shown" 0.0;
inherit: "default" 0.0;
visible: 1;
}
}
programs {
program {
name: "strength,available";
signal: "e,netinfo,available";
source: "e";
action: STATE_SET "shown" 0.0;
target: "strength_gauge_bg";
}
program {
name: "strength,unavailable";
signal: "e,netinfo,unavailable";
source: "e";
action: STATE_SET "default" 0.0;
target: "strength_gauge_bg";
}
}
part {
name: "strength_gauge_confine";
type: RECT;
scale: 1;
mouse_events: 0;
description {
state: "default" 0.0;
color: 255 255 255 0;
visible: 0;
rel1 {
to: "strength_gauge_bg";
offset: 1 1;
}
rel2 {
to: "strength_gauge_bg";
offset: -2 -2;
}
}
}
part {
name: "strength_gauge_knob";
mouse_events: 0;
scale: 1;
type: RECT;
dragable {
x: 1 1 0;
y: 0 0 0;
confine: "strength_gauge_confine";
confine: "strength_gauge_bg";
}
description {
state: "default" 0.0;
color: 255 255 255 0;
visible: 0;
min: 0 0;
max: 0 0;
}
}
part {
name: "strength_gauge_fill";
mouse_events: 0;
type: RECT;
description {
state: "default" 0.0;
color: 55 55 55 100;
fixed: 1 1;
rel1.to: "strength_gauge_confine";
rel2 {
to_x: "strength_gauge_knob";
to_y: "strength_gauge_confine";
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
/*** MOD: CONF_EDGEBINDINGS ***/

@ -179,10 +179,6 @@ if USE_MODULE_QUICKACCESS
SUBDIRS += quickaccess
endif
if USE_MODULE_OFONO
SUBDIRS += ofono
endif
if USE_MODULE_SHOT
SUBDIRS += shot
endif

@ -1,32 +0,0 @@
MAINTAINERCLEANFILES = Makefile.in
MODULE = ofono
# 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@ @EOFONO_CFLAGS@
pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH)
pkg_LTLIBRARIES = module.la
module_la_SOURCES = e_mod_main.h \
e_mod_main.c
module_la_LIBADD = @e_libs@ @dlopen_libs@ @EOFONO_LIBS@
module_la_LDFLAGS = -module -avoid-version
module_la_DEPENDENCIES = $(top_builddir)/config.h
uninstall:
rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE)

@ -1,875 +0,0 @@
/* TODO: config dialog to select which modem to monitor */
#include "e.h"
#include "e_mod_main.h"
static E_Module *ofono_mod = NULL;
static char tmpbuf[4096];
const char _e_ofono_name[] = "ofono";
const char _e_ofono_Name[] = N_("Mobile Modems Info");
int _e_ofono_module_log_dom = -1;
static void _ofono_gadget_update(E_Ofono_Instance *inst);
static void _ofono_tip_update(E_Ofono_Instance *inst);
const char *
e_ofono_theme_path(void)
{
#define TF "/e-module-ofono.edj"
size_t dirlen;
dirlen = strlen(ofono_mod->dir);
if (dirlen >= sizeof(tmpbuf) - sizeof(TF))
return NULL;
memcpy(tmpbuf, ofono_mod->dir, dirlen);
memcpy(tmpbuf + dirlen, TF, sizeof(TF));
return tmpbuf;
#undef TF
}
static void _ofono_popup_del(E_Ofono_Instance *inst);
static Eina_Bool
_ofono_popup_input_window_mouse_up_cb(void *data,
int type __UNUSED__,
void *event)
{
Ecore_Event_Mouse_Button *ev = event;
E_Ofono_Instance *inst = data;
if (ev->window != inst->ui.input.win)
return ECORE_CALLBACK_PASS_ON;
_ofono_popup_del(inst);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_ofono_popup_input_window_key_down_cb(void *data,
int type __UNUSED__,
void *event)
{
Ecore_Event_Key *ev = event;
E_Ofono_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"))
_ofono_popup_del(inst);
return ECORE_CALLBACK_PASS_ON;
}
static void
_ofono_popup_input_window_destroy(E_Ofono_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
_ofono_popup_input_window_create(E_Ofono_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,
_ofono_popup_input_window_mouse_up_cb, inst);
inst->ui.input.key_down =
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
_ofono_popup_input_window_key_down_cb, inst);
inst->ui.input.win = w;
}
static void
_ofono_toggle_powered_cb(void *data,
DBusMessage *msg __UNUSED__,
DBusError *error)
{
E_Ofono_Instance *inst = data;
if ((error) && (dbus_error_is_set(error)))
_ofono_dbus_error_show(_("Failed to power modem on/off."), error);
else
DBG("new powered value set");
e_widget_disabled_set(inst->ui.powered, (int)EINA_FALSE);
inst->powered_pending = EINA_FALSE;
dbus_error_free(error);
}
static void
_ofono_popup_cb_powered_changed(void *data,
Evas_Object *obj,
void *event __UNUSED__)
{
E_Ofono_Instance *inst = data;
E_Ofono_Module_Context *ctxt = inst->ctxt;
Eina_Bool powered = e_widget_check_checked_get(obj);
if ((!ctxt) || (!ctxt->has_manager))
{
_ofono_operation_error_show(_("oFono Daemon is not running."));
return;
}
if (!e_ofono_modem_powered_set(inst->modem_element, powered,
_ofono_toggle_powered_cb, inst))
{
_ofono_operation_error_show(_("Cannot toggle modem's powered state."));
return;
}
e_widget_disabled_set(obj, EINA_TRUE);
inst->powered_pending = EINA_TRUE;
DBG("powered = %d pending", !inst->powered);
}
static void
_ofono_popup_update(E_Ofono_Instance *inst)
{
if (inst->name)
e_widget_label_text_set(inst->ui.name, inst->name);
else
e_widget_label_text_set(inst->ui.name, _("No modem available"));
e_widget_check_checked_set(inst->ui.powered, inst->powered);
}
static void
_ofono_popup_del(E_Ofono_Instance *inst)
{
_ofono_popup_input_window_destroy(inst);
e_object_del(E_OBJECT(inst->popup));
inst->popup = NULL;
}
static void
_ofono_popup_new(E_Ofono_Instance *inst)
{
Evas *evas;
Evas_Coord mw, mh;
if (inst->popup)
{
e_gadcon_popup_show(inst->popup);
return;
}
inst->popup = e_gadcon_popup_new(inst->gcc);
evas = inst->popup->win->evas;
inst->ui.table = e_widget_table_add(evas, 0);
if (inst->name)
inst->ui.name = e_widget_label_add(evas, inst->name);
else
inst->ui.name = e_widget_label_add(evas, "No modem available");
e_widget_table_object_append(inst->ui.table, inst->ui.name,
0, 0, 1, 1, 1, 1, 1, 1);
evas_object_show(inst->ui.name);
inst->int_powered = inst->powered;
inst->ui.powered = e_widget_check_add(evas, _("Powered"),
&inst->int_powered);
e_widget_table_object_append(inst->ui.table, inst->ui.powered,
0, 1, 1, 1, 1, 1, 1, 1);
if (inst->powered_pending)
e_widget_disabled_set(inst->ui.powered, (int)EINA_TRUE);
evas_object_show(inst->ui.powered);
evas_object_smart_callback_add(inst->ui.powered, "changed",
_ofono_popup_cb_powered_changed, inst);
_ofono_popup_update(inst);
e_widget_size_min_get(inst->ui.table, &mw, &mh);
e_widget_size_min_set(inst->ui.table, mw, mh);
e_gadcon_popup_content_set(inst->popup, inst->ui.table);
e_gadcon_popup_show(inst->popup);
_ofono_popup_input_window_create(inst);
}
static void
_ofono_menu_new(E_Ofono_Instance *inst,
Evas_Event_Mouse_Down *ev)
{
E_Zone *zone;
E_Menu *m;
int x, y;
zone = e_util_zone_current_get(e_manager_current_get());
m = e_menu_new();
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
_ofono_tip_new(E_Ofono_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/ofono/tip",
"e/modules/ofono/tip");
_ofono_tip_update(inst);
e_gadcon_popup_content_set(inst->tip, inst->o_tip);
e_gadcon_popup_show(inst->tip);
}
static void
_ofono_tip_del(E_Ofono_Instance *inst)
{
evas_object_del(inst->o_tip);
e_object_del(E_OBJECT(inst->tip));
inst->tip = NULL;
inst->o_tip = NULL;
}
static void
_ofono_cb_mouse_down(void *data,
Evas *evas __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event)
{
E_Ofono_Instance *inst;
Evas_Event_Mouse_Down *ev;
inst = data;
if (!inst)
return;
ev = event;
if (ev->button == 1)
{
if (!inst->popup)
_ofono_popup_new(inst);
else
_ofono_popup_del(inst);
}
else if (ev->button == 2)
_ofono_popup_cb_powered_changed(inst, inst->ui.powered, NULL);
else if (ev->button == 3)
_ofono_menu_new(inst, ev);
}
static void
_ofono_cb_mouse_in(void *data,
Evas *evas __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event __UNUSED__)
{
E_Ofono_Instance *inst = data;
if (inst->tip)
return;
_ofono_tip_new(inst);
}
static void
_ofono_cb_mouse_out(void *data,
Evas *evas __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event __UNUSED__)
{
E_Ofono_Instance *inst = data;
if (!inst->tip)
return;
_ofono_tip_del(inst);
}
static void
_ofono_edje_view_update(E_Ofono_Instance *inst,
Evas_Object *o)
{
Edje_Message_Int msg;
char buf[128];
if (!inst->ctxt->has_manager)
{
edje_object_signal_emit(o, "e,unavailable", "e");
edje_object_part_text_set(o, "e.text.error", _("ofonod is not running"));
return;
}
edje_object_signal_emit(o, "e,available", "e");
if (inst->name)
edje_object_part_text_set(o, "e.text.name", inst->name);
else
edje_object_part_text_set(o, "e.text.name", _("Unknown name"));
if (!inst->powered)
{
edje_object_part_text_set(o, "e.text.error", _("Modem powered off"));
edje_object_signal_emit(o, "e,netinfo,unavailable", "e");
return;
}
if (inst->status)
{
snprintf(buf, sizeof(buf), "%c%s",
toupper(inst->status[0]), inst->status + 1);
edje_object_part_text_set(o, "e.text.status", buf);
edje_object_signal_emit(o, "e,netinfo,available", "e");
}
else
edje_object_part_text_set(o, "e.text.status", _("Unknown status"));
if (inst->op)
{
edje_object_part_text_set(o, "e.text.op", inst->op);
edje_object_signal_emit(o, "e,netinfo,available", "e");
}
else
edje_object_part_text_set(o, "e.text.op", _("Unknown operator"));
msg.val = inst->strength;
edje_object_message_send(o, EDJE_MESSAGE_INT, 1, &msg);
}
static void
_ofono_tip_update(E_Ofono_Instance *inst)
{
_ofono_edje_view_update(inst, inst->o_tip);
}
static void
_ofono_gadget_update(E_Ofono_Instance *inst)
{
E_Ofono_Module_Context *ctxt = inst->ctxt;
if (!ctxt->has_manager && inst->popup)
_ofono_popup_del(inst);
if (inst->popup)
_ofono_popup_update(inst);
if (inst->tip)
_ofono_tip_update(inst);
_ofono_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_Ofono_Instance *inst;
E_Ofono_Module_Context *ctxt;
if (!ofono_mod)
return NULL;
ctxt = ofono_mod->data;
inst = E_NEW(E_Ofono_Instance, 1);
inst->ctxt = ctxt;
inst->ui.gadget = edje_object_add(gc->evas);
e_theme_edje_object_set(inst->ui.gadget, "base/theme/modules/ofono",
"e/modules/ofono/main");
inst->path = NULL;
inst->name = NULL;
inst->powered = EINA_FALSE;
inst->int_powered = 0;
inst->status = NULL;
inst->op = NULL;
inst->strength = 0;
inst->modem_element = NULL;
inst->netreg_element = NULL;
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, _ofono_cb_mouse_down, inst);
evas_object_event_callback_add
(inst->ui.gadget, EVAS_CALLBACK_MOUSE_IN, _ofono_cb_mouse_in, inst);
evas_object_event_callback_add
(inst->ui.gadget, EVAS_CALLBACK_MOUSE_OUT, _ofono_cb_mouse_out, inst);
_ofono_gadget_update(inst);
ctxt->instances = eina_list_append(ctxt->instances, inst);
return inst->gcc;
}
static void
_gc_shutdown(E_Gadcon_Client *gcc)
{
E_Ofono_Module_Context *ctxt;
E_Ofono_Instance *inst;
if (!ofono_mod)
return;
ctxt = ofono_mod->data;
if (!ctxt)
return;
inst = gcc->data;
if (!inst)
return;
if (inst->popup)
_ofono_popup_del(inst);
if (inst->tip)
_ofono_tip_del(inst);
evas_object_del(inst->ui.gadget);
eina_stringshare_del(inst->path);
eina_stringshare_del(inst->name);
eina_stringshare_del(inst->status);
eina_stringshare_del(inst->op);
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_ofono_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_ofono_theme_path(), "icon");
return o;
}
static const char *
_gc_id_new(const E_Gadcon_Client_Class *client_class __UNUSED__)
{
E_Ofono_Module_Context *ctxt;
Eina_List *instances;
if (!ofono_mod)
return NULL;
ctxt = ofono_mod->data;
if (!ctxt)
return NULL;
instances = ctxt->instances;
snprintf(tmpbuf, sizeof(tmpbuf), "ofono.%d", eina_list_count(instances));
return tmpbuf;
}
static const E_Gadcon_Client_Class _gc_class =
{
GADCON_CLIENT_CLASS_VERSION, _e_ofono_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_ofono_Name};
static Eina_Bool
_ofono_manager_changed_do(void *data)
{
E_Ofono_Module_Context *ctxt = data;
ctxt->poller.manager_changed = NULL;
return ECORE_CALLBACK_CANCEL;
}
static void
_ofono_manager_changed(void *data,
const E_Ofono_Element *element __UNUSED__)
{
E_Ofono_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, _ofono_manager_changed_do, ctxt);
}
static Eina_Bool
_ofono_event_manager_in(void *data,
int type __UNUSED__,
void *event __UNUSED__)
{
E_Ofono_Element *element;
E_Ofono_Module_Context *ctxt = data;
E_Ofono_Instance *inst;
Eina_List *l;
DBG("manager in");
ctxt->has_manager = EINA_TRUE;
element = e_ofono_manager_get();
e_ofono_element_listener_add(element, _ofono_manager_changed, ctxt, NULL);
EINA_LIST_FOREACH(ctxt->instances, l, inst)
_ofono_gadget_update(inst);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_ofono_event_manager_out(void *data,
int type __UNUSED__,
void *event __UNUSED__)
{
E_Ofono_Module_Context *ctxt = data;
E_Ofono_Instance *inst;
Eina_List *l;
DBG("manager out");
ctxt->has_manager = EINA_FALSE;
EINA_LIST_FOREACH(ctxt->instances, l, inst)
_ofono_gadget_update(inst);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_eofono_event_element_add(void *data,
int type __UNUSED__,
void *info)
{
E_Ofono_Element *element = info;
E_Ofono_Module_Context *ctxt = data;
E_Ofono_Instance *inst;
Eina_List *l;
Eina_Bool have_inst = EINA_FALSE;
DBG(">>> %s %s", element->path, element->interface);
/* is there any instance taking care of this modem already? */
EINA_LIST_FOREACH(ctxt->instances, l, inst)
if ((inst->path) && (inst->path == element->path))
{
have_inst = EINA_TRUE;
break;
}
/* if no instance is handling this, is there any instance available */
if ((!have_inst) && (e_ofono_element_is_modem(element)))
EINA_LIST_FOREACH(ctxt->instances, l, inst)
if (!inst->path)
{
inst->path = eina_stringshare_ref(element->path);
DBG("bound %s to an ofono module instance", inst->path);
have_inst = EINA_TRUE;
break;
}
/* if still orphan, do nothing */
if (!have_inst)
return ECORE_CALLBACK_PASS_ON;
if (e_ofono_element_is_modem(element))
inst->modem_element = element;
else if (e_ofono_element_is_netreg(element))
inst->netreg_element = element;
_ofono_gadget_update(inst);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_eofono_event_element_del(void *data,
int type __UNUSED__,
void *info)
{
E_Ofono_Element *element = info;
E_Ofono_Module_Context *ctxt = data;
E_Ofono_Instance *inst;
Eina_List *l;
Eina_Bool inst_found = EINA_FALSE;
DBG("<<< %s %s", element->path, element->interface);
EINA_LIST_FOREACH(ctxt->instances, l, inst)
if ((inst->path) && (inst->path == element->path))
{
inst_found = EINA_TRUE;
break;
}
if (!inst_found)
return ECORE_CALLBACK_PASS_ON;
if (e_ofono_element_is_modem(element))
{
inst->modem_element = NULL;
eina_stringshare_replace(&inst->name, NULL);
inst->powered = EINA_FALSE;
}
else if (e_ofono_element_is_netreg(element))
{
inst->netreg_element = NULL;
eina_stringshare_replace(&inst->status, NULL);
eina_stringshare_replace(&inst->op, NULL);
inst->strength = 0;
}
_ofono_gadget_update(inst);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_eofono_event_element_updated(void *data,
int type __UNUSED__,
void *event_info)
{
E_Ofono_Element *element = event_info;
E_Ofono_Module_Context *ctxt = data;
E_Ofono_Instance *inst;
Eina_List *l;
Eina_Bool inst_found = EINA_FALSE;
const char *tmp;
DBG("!!! %s %s", element->path, element->interface);
EINA_LIST_FOREACH(ctxt->instances, l, inst)
if ((inst->path) && (inst->path == element->path))
{
inst_found = EINA_TRUE;
break;
}
if (!inst_found)
return ECORE_CALLBACK_PASS_ON;
if (e_ofono_element_is_modem(element))
{
if (!e_ofono_modem_powered_get(element, &(inst->powered)))
inst->powered = 0;
if (!e_ofono_modem_name_get(element, &tmp))
tmp = NULL;
if ((!tmp) || (!tmp[0]))
tmp = inst->path;
eina_stringshare_replace(&inst->name, tmp);
DBG("!!! powered = %d, name = %s", inst->powered, inst->name);
}
else if (e_ofono_element_is_netreg(element))
{
if (!e_ofono_netreg_status_get(element, &tmp))
tmp = NULL;
eina_stringshare_replace(&inst->status, tmp);
if (!e_ofono_netreg_operator_get(element, &tmp))
tmp = NULL;
eina_stringshare_replace(&inst->op, tmp);
if (!e_ofono_netreg_strength_get(element, &(inst->strength)))
inst->strength = 0;
DBG("!!! status = %s, operator = %s, strength = %d",
inst->status, inst->op, inst->strength);
}
_ofono_gadget_update(inst);
return ECORE_CALLBACK_PASS_ON;
}
static void
_ofono_events_register(E_Ofono_Module_Context *ctxt)
{
ctxt->event.manager_in = ecore_event_handler_add
(E_OFONO_EVENT_MANAGER_IN, _ofono_event_manager_in, ctxt);
ctxt->event.manager_out = ecore_event_handler_add
(E_OFONO_EVENT_MANAGER_OUT, _ofono_event_manager_out, ctxt);
ctxt->event.element_add = ecore_event_handler_add
(E_OFONO_EVENT_ELEMENT_ADD, _eofono_event_element_add, ctxt);
ctxt->event.element_del = ecore_event_handler_add
(E_OFONO_EVENT_ELEMENT_DEL, _eofono_event_element_del, ctxt);
ctxt->event.element_updated = ecore_event_handler_add
(E_OFONO_EVENT_ELEMENT_UPDATED, _eofono_event_element_updated, ctxt);
}
static void
_ofono_events_unregister(E_Ofono_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.element_add)
ecore_event_handler_del(ctxt->event.element_add);
if (ctxt->event.element_del)
ecore_event_handler_del(ctxt->event.element_del);
if (ctxt->event.element_updated)
ecore_event_handler_del(ctxt->event.element_updated);
}
EAPI void *
e_modapi_init(E_Module *m)
{
E_Ofono_Module_Context *ctxt;
E_DBus_Connection *c;
c = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!c)
goto error_dbus_bus_get;
if (!e_ofono_system_init(c))
goto error_ofono_system_init;
ctxt = E_NEW(E_Ofono_Module_Context, 1);
if (!ctxt)
goto error_ofono_context;
ofono_mod = m;
if (_e_ofono_module_log_dom < 0)
{
_e_ofono_module_log_dom = eina_log_domain_register("e_module_ofono",
EINA_COLOR_ORANGE);
if (_e_ofono_module_log_dom < 0)
{
EINA_LOG_CRIT("could not register logging domain e_module_ofono");
goto error_log_domain;
}
}
e_gadcon_provider_register(&_gc_class);
_ofono_events_register(ctxt);
return ctxt;
error_log_domain:
_e_ofono_module_log_dom = -1;
ofono_mod = NULL;
E_FREE(ctxt);
error_ofono_context:
e_ofono_system_shutdown();
error_ofono_system_init:
error_dbus_bus_get:
return NULL;
}
static void
_ofono_instances_free(E_Ofono_Module_Context *ctxt)
{
while (ctxt->instances)
{
E_Ofono_Instance *inst;
inst = ctxt->instances->data;
if (inst->popup)
_ofono_popup_del(inst);
if (inst->tip)
_ofono_tip_del(inst);
e_object_del(E_OBJECT(inst->gcc));
}
}
EAPI int
e_modapi_shutdown(E_Module *m)
{
E_Ofono_Module_Context *ctxt;
E_Ofono_Element *element;
ctxt = m->data;
if (!ctxt)
return 0;
element = e_ofono_manager_get();
e_ofono_element_listener_del(element, _ofono_manager_changed, ctxt);
_ofono_events_unregister(ctxt);
_ofono_instances_free(ctxt);
e_gadcon_provider_unregister(&_gc_class);
if (ctxt->poller.manager_changed)
ecore_poller_del(ctxt->poller.manager_changed);
E_FREE(ctxt);
ofono_mod = NULL;
e_ofono_system_shutdown();
return 1;
}
EAPI int
e_modapi_save(E_Module *m)
{
E_Ofono_Module_Context *ctxt;
ctxt = m->data;
if (!ctxt)
return 0;
return 1;
}