enlightenment/src/modules/connman/e_mod_main.c

431 lines
11 KiB
C
Raw Normal View History

#include "e.h"
#include "e_mod_main.h"
#include "E_Connman.h"
static E_Module *connman_mod;
static char tmpbuf[4096]; /* general purpose buffer, just use immediately */
const char _e_connman_name[] = "connman";
const char _e_connman_Name[] = "Connection Manager";
int _e_connman_log_dom = -1;
const char *
e_connman_theme_path(void)
{
#define TF "/e-module-connman.edj"
size_t dirlen;
dirlen = strlen(connman_mod->dir);
if (dirlen >= sizeof(tmpbuf) - sizeof(TF))
return NULL;
memcpy(tmpbuf, connman_mod->dir, dirlen);
memcpy(tmpbuf + dirlen, TF, sizeof(TF));
return tmpbuf;
#undef TF
}
static void _econnman_mod_manager_update_inst(E_Connman_Module_Context *ctxt,
E_Connman_Instance *inst,
enum Connman_State state,
enum Connman_Service_Type type)
{
Evas_Object *o = inst->ui.gadget;
switch (state)
{
case CONNMAN_STATE_ONLINE:
edje_object_signal_emit(o, "e,changed,connected,yes", "e");
edje_object_signal_emit(o, "e,changed,state,online", "e");
break;
case CONNMAN_STATE_READY:
edje_object_signal_emit(o, "e,changed,connected,yes", "e");
edje_object_signal_emit(o, "e,changed,state,ready", "e");
break;
case CONNMAN_STATE_IDLE:
edje_object_signal_emit(o, "e,changed,connected,no", "e");
edje_object_signal_emit(o, "e,changed,state,idle", "e");
break;
case CONNMAN_STATE_OFFLINE:
edje_object_signal_emit(o, "e,changed,connected,no", "e");
edje_object_signal_emit(o, "e,changed,state,disconnect", "e");
break;
case CONNMAN_STATE_NONE:
edje_object_signal_emit(o, "e,changed,connected,no", "e");
edje_object_signal_emit(o, "e,changed,state,failure", "e");
break;
}
switch (type)
{
case CONNMAN_SERVICE_TYPE_ETHERNET:
edje_object_signal_emit(o, "e,changed,technology,ethernet", "e");
break;
case CONNMAN_SERVICE_TYPE_WIFI:
edje_object_signal_emit(o, "e,changed,technology,wifi", "e");
break;
case CONNMAN_SERVICE_TYPE_NONE:
edje_object_signal_emit(o, "e,changed,technology,none", "e");
break;
}
DBG("state=%d type=%d", state, type);
}
void econnman_mod_manager_update(struct Connman_Manager *cm)
{
enum Connman_Service_Type type;
E_Connman_Module_Context *ctxt = connman_mod->data;
E_Connman_Instance *inst;
Eina_List *l;
DBG("cm->services=%p", cm->services);
if (cm->services)
{
struct Connman_Service *cs = EINA_INLIST_CONTAINER_GET(cm->services,
struct Connman_Service);
type = cs->type;
}
else
type = CONNMAN_SERVICE_TYPE_NONE;
EINA_LIST_FOREACH(ctxt->instances, l, inst)
_econnman_mod_manager_update_inst(ctxt, inst, cm->state, type);
}
static void _econnman_gadget_setup(E_Connman_Instance *inst)
{
E_Connman_Module_Context *ctxt = inst->ctxt;
Evas_Object *o = inst->ui.gadget;
if (!ctxt->has_manager)
{
edje_object_signal_emit(o, "e,unavailable", "e");
edje_object_part_text_set(o, "e.text.name", _("No ConnMan"));
edje_object_part_text_set(o, "e.text.error",
_("No ConnMan server found."));
edje_object_signal_emit(o, "e,changed,connected,no", "e");
edje_object_part_text_set(o, "e.text.offline_mode", "");
edje_object_signal_emit(o, "e,changed,offline_mode,no", "e");
}
else
edje_object_signal_emit(o, "e,available", "e");
return;
}
static void
_connman_cb_mouse_down(void *data, Evas *evas __UNUSED__,
Evas_Object *obj __UNUSED__, void *event)
{
}
static void
_connman_cb_mouse_in(void *data, Evas *evas __UNUSED__,
Evas_Object *obj __UNUSED__, void *event __UNUSED__)
{
}
static void
_connman_cb_mouse_out(void *data, Evas *evas __UNUSED__,
Evas_Object *obj __UNUSED__, void *event __UNUSED__)
{
}
/* Gadcon Api Functions */
static E_Gadcon_Client *
_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
{
E_Connman_Instance *inst;
E_Connman_Module_Context *ctxt;
if (!connman_mod)
return NULL;
ctxt = connman_mod->data;
inst = E_NEW(E_Connman_Instance, 1);
inst->ctxt = ctxt;
inst->ui.gadget = edje_object_add(gc->evas);
e_theme_edje_object_set(inst->ui.gadget, "base/theme/modules/connman",
"e/modules/connman/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, _connman_cb_mouse_down, inst);
evas_object_event_callback_add
(inst->ui.gadget, EVAS_CALLBACK_MOUSE_IN, _connman_cb_mouse_in, inst);
evas_object_event_callback_add
(inst->ui.gadget, EVAS_CALLBACK_MOUSE_OUT, _connman_cb_mouse_out, inst);
_econnman_gadget_setup(inst);
ctxt->instances = eina_list_append(ctxt->instances, inst);
return inst->gcc;
}
static void
_gc_shutdown(E_Gadcon_Client *gcc)
{
E_Connman_Module_Context *ctxt;
E_Connman_Instance *inst;
if (!connman_mod)
return;
ctxt = connman_mod->data;
if (!ctxt)
return;
inst = gcc->data;
if (!inst)
return;
evas_object_del(inst->ui.gadget);
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_connman_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_connman_theme_path(), "icon");
return o;
}
static const char *
_gc_id_new(const E_Gadcon_Client_Class *client_class __UNUSED__)
{
E_Connman_Module_Context *ctxt;
Eina_List *instances;
if (!connman_mod)
return NULL;
ctxt = connman_mod->data;
if (!ctxt)
return NULL;
instances = ctxt->instances;
snprintf(tmpbuf, sizeof(tmpbuf), "connman.%d", eina_list_count(instances));
return tmpbuf;
}
static const E_Gadcon_Client_Class _gc_class =
{
GADCON_CLIENT_CLASS_VERSION, _e_connman_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_connman_Name };
static Eina_Bool
_econnman_event_manager_in(void *data, int type __UNUSED__,
void *event __UNUSED__)
{
E_Connman_Module_Context *ctxt = data;
const Eina_List *l;
E_Connman_Instance *inst;
DBG("Manager in");
ctxt->has_manager = EINA_TRUE;
EINA_LIST_FOREACH(ctxt->instances, l, inst)
_econnman_gadget_setup(inst);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_econnman_event_manager_out(void *data, int type __UNUSED__,
void *event __UNUSED__)
{
E_Connman_Module_Context *ctxt = data;
const Eina_List *l;
E_Connman_Instance *inst;
DBG("Manager out");
ctxt->has_manager = EINA_FALSE;
EINA_LIST_FOREACH(ctxt->instances, l, inst)
_econnman_gadget_setup(inst);
return ECORE_CALLBACK_PASS_ON;
}
static E_Config_Dialog * _econnman_config(E_Container *con,
const char *params __UNUSED__)
{
E_Connman_Module_Context *ctxt;
if (!connman_mod)
return NULL;
ctxt = connman_mod->data;
if (!ctxt)
return NULL;
if (!ctxt->conf_dialog)
ctxt->conf_dialog = e_connman_config_dialog_new(con, ctxt);
return ctxt->conf_dialog;
}
static const char _reg_cat[] = "extensions";
static const char _reg_item[] = "extensions/connman";
static void
_econnman_configure_registry_register(void)
{
e_configure_registry_category_add(_reg_cat, 90, _("Extensions"), NULL,
"preferences-extensions");
e_configure_registry_item_add(_reg_item, 110, _(_e_connman_Name), NULL,
e_connman_theme_path(),
_econnman_config);
}
static void
_econnman_configure_registry_unregister(void)
{
e_configure_registry_item_del(_reg_item);
e_configure_registry_category_del(_reg_cat);
}
static void
_econnman_events_register(E_Connman_Module_Context *ctxt)
{
ctxt->event.manager_in = ecore_event_handler_add
(E_CONNMAN_EVENT_MANAGER_IN, _econnman_event_manager_in, ctxt);
ctxt->event.manager_out = ecore_event_handler_add
(E_CONNMAN_EVENT_MANAGER_OUT, _econnman_event_manager_out, ctxt);
}
static void
_econnman_events_unregister(E_Connman_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);
}
EAPI void *
e_modapi_init(E_Module *m)
{
E_Connman_Module_Context *ctxt;
E_DBus_Connection *c;
c = e_dbus_bus_get(DBUS_BUS_SYSTEM);
if (!c)
goto error_dbus_bus_get;
if (!e_connman_system_init(c))
goto error_connman_system_init;
ctxt = E_NEW(E_Connman_Module_Context, 1);
if (!ctxt)
goto error_connman_context;
ctxt->conf_dialog = NULL;
connman_mod = m;
if (_e_connman_log_dom < 0)
{
_e_connman_log_dom = eina_log_domain_register("econnman", EINA_COLOR_ORANGE);
if (_e_connman_log_dom < 0)
{
EINA_LOG_CRIT("could not register logging domain econnman");
goto error_log_domain;
}
}
_econnman_configure_registry_register();
e_gadcon_provider_register(&_gc_class);
_econnman_events_register(ctxt);
return ctxt;
error_log_domain:
_e_connman_log_dom = -1;
connman_mod = NULL;
E_FREE(ctxt);
error_connman_context:
e_connman_system_shutdown();
error_connman_system_init:
error_dbus_bus_get:
return NULL;
}
static void
_econnman_instances_free(E_Connman_Module_Context *ctxt)
{
while (ctxt->instances)
{
E_Connman_Instance *inst = ctxt->instances->data;
ctxt->instances = eina_list_remove_list(ctxt->instances,
ctxt->instances);
e_object_del(E_OBJECT(inst->gcc));
}
}
EAPI int
e_modapi_shutdown(E_Module *m)
{
E_Connman_Module_Context *ctxt;
ctxt = m->data;
if (!ctxt)
return 0;
_econnman_events_unregister(ctxt);
_econnman_instances_free(ctxt);
_econnman_configure_registry_unregister();
e_gadcon_provider_unregister(&_gc_class);
E_FREE(ctxt);
connman_mod = NULL;
e_connman_system_shutdown();
return 1;
}
EAPI int
e_modapi_save(E_Module *m)
{
E_Connman_Module_Context *ctxt;
ctxt = m->data;
if (!ctxt)
return 0;
return 1;
}