From 22580d466d2b9d3b18eab7538b78c2655934c735 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Thu, 31 Dec 2009 21:44:33 +0000 Subject: [PATCH] rework of connman module, a semi-functional display only module so far. SVN revision: 44834 --- configure.ac | 12 +- data/themes/default.edc | 265 ++- data/themes/images/Makefile.am | 5 +- data/themes/images/connman-disconnect.png | Bin 0 -> 6504 bytes data/themes/images/connman-ethernet.png | Bin 0 -> 4263 bytes data/themes/images/connman-wifi.png | Bin 0 -> 6499 bytes src/modules/connman/Makefile.am | 8 +- src/modules/connman/e_iface.c | 1335 ------------ src/modules/connman/e_iface.h | 118 - src/modules/connman/e_mod_main.c | 2383 ++++++++------------- src/modules/connman/e_mod_main.h | 83 +- 11 files changed, 1213 insertions(+), 2996 deletions(-) create mode 100644 data/themes/images/connman-disconnect.png create mode 100644 data/themes/images/connman-ethernet.png create mode 100644 data/themes/images/connman-wifi.png delete mode 100644 src/modules/connman/e_iface.c delete mode 100644 src/modules/connman/e_iface.h diff --git a/configure.ac b/configure.ac index 2c97d96e7..82c4105ee 100644 --- a/configure.ac +++ b/configure.ac @@ -411,6 +411,16 @@ fi AC_SUBST(SOUND_CFLAGS) AC_SUBST(SOUND_LIBS) +AM_CONDITIONAL(HAVE_ECONNMAN, false) +define([CHECK_MODULE_CONNMAN], +[ + AC_E_CHECK_PKG(ECONNMAN, [edbus econnman], + [], [ECONNMAN=false]) +]) +AC_SUBST(ECONNMAN_CFLAGS) +AC_SUBST(ECONNMAN_LIBS) + + AC_E_OPTIONAL_MODULE([ibar], true) AC_E_OPTIONAL_MODULE([dropshadow], true) AC_E_OPTIONAL_MODULE([clock], true) @@ -469,7 +479,7 @@ AC_E_OPTIONAL_MODULE([conf_interaction], true) AC_E_OPTIONAL_MODULE([conf_scale], true) AC_E_OPTIONAL_MODULE([gadman], true) AC_E_OPTIONAL_MODULE([mixer], true, [CHECK_MODULE_MIXER]) -AC_E_OPTIONAL_MODULE([connman], false) +AC_E_OPTIONAL_MODULE([connman], true, [CHECK_MODULE_CONNMAN]) AC_E_OPTIONAL_MODULE([illume], true) AC_E_OPTIONAL_MODULE([syscon], true) AC_E_OPTIONAL_MODULE([everything], true) diff --git a/data/themes/default.edc b/data/themes/default.edc index cc2b5dce1..38260cd5e 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -6888,98 +6888,199 @@ collections { /* begin the collection of edje groups that are in this file */ ///////////////////////////////////////////////////////////////////////////// /*** MOD: CONNMAN ***/ - /* inactive module right now - doesnt work, so this is a placeholder */ - group { - name: "e/modules/connman/main"; // for gadget - alias: "e/modules/connman/network"; // for icon in popup - max: 128 128; - min: 1 1; + +// FIXME: do proper gadget and artwork + + group { name: "e/modules/connman/main"; images { - image: "ball.png" COMP; + image: "connman-disconnect.png" COMP; + image: "connman-ethernet.png" COMP; + image: "connman-wifi.png" COMP; } + //max: 128 128; + min: 16 16; +#if 0 // TODO: show strength in gadget script { - public message(Msg_Type:type, id, ...) { - if ((type == MSG_INT_SET) && (id == 0)) { - new sig; + public message(Msg_Type:type, id, ...) { + if ((type == MSG_INT) && (id == 1)) { + new strength; - sig = getarg(2); - - if (sig <= 0) - run_program(PROGRAM:"sig_none"); - else if (sig < 33) - run_program(PROGRAM:"sig_low"); - else if (sig < 66) - run_program(PROGRAM:"sig_medium"); - else if (sig >= 66) - run_program(PROGRAM:"sig_high"); - } - } - } - parts { - part { name: "base"; - description { state: "default" 0.0; - aspect: 1 1; - aspect_preference: BOTH; - image.normal: "ball.png"; + strength = getarg(2); } } } - programs { - program { name: "sig_none"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sig_low"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sig_medium"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sig_high"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sec0"; - signal: "e,state,security,open"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sec1"; - signal: "e,state,security,wep"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sec2"; - signal: "e,state,security,wpa"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sec3"; - signal: "e,state,security,rsn"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sav0"; - signal: "e,state,saved,on"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { name: "sav1"; - signal: "e,state,saved,off"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } +#endif + parts { + part { + name: "eventarea"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + color: 255 255 255 0; + } + } + + part { name: "availability"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 128 128 0; + visible: 0; + } + description { + state: "unavailable" 0.0; + inherit: "default" 0.0; + color: 255 128 128 255; + visible: 1; + } + } + programs { + program { name: "e,available"; + signal: "e,available"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "availability"; + transition: LINEAR 0.2; + } + program { name: "e,unavailable"; + signal: "e,unavailable"; + source: "e"; + action: STATE_SET "unavailable" 0.0; + target: "availability"; + transition: LINEAR 0.2; + } + } + + part { name: "state-clipper"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "pulse" 0.0; + color: 255 255 255 128; + } + } + programs { + program { name: "e,changed,state,ready"; + signal: "e,changed,state,ready"; + source: "e"; + script { + stop_program(PROGRAM:"state,pulse,0"); + stop_program(PROGRAM:"state,pulse,1"); + } + after: "state,ready,apply"; + } + program { name: "state,ready,apply"; + action: STATE_SET "default" 0.0; + target: "state-clipper"; + transition: LINEAR 0.1; + } + + program { name: "e,changed,state,association"; + signal: "e,changed,state,association"; + source: "e"; + after: "state,pulse,0"; + } + program { name: "e,changed,state,configuration"; + signal: "e,changed,state,configuration"; + source: "e"; + after: "state,pulse,0"; + } + + program { name: "state,pulse,0"; + action: STATE_SET "default" 0.0; + target: "state-clipper"; + transition: LINEAR 0.8; + after: "state,pulse,1"; + } + program { name: "state,pulse,1"; + action: STATE_SET "pulse" 0.0; + target: "state-clipper"; + transition: LINEAR 0.8; + after: "state,pulse,0"; + } + } + + part { name: "technology"; + 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: "connman-disconnect.png"; + } + description { + state: "ethernet" 0.0; + inherit: "default" 0.0; + image.normal: "connman-ethernet.png"; + } + description { + state: "wifi" 0.0; + inherit: "default" 0.0; + image.normal: "connman-wifi.png"; + } + // TODO: wimax, cellular, bluetooth + } + programs { + program { name: "e,changed,technology,none"; + signal: "e,changed,technology,none"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "technology"; + } + program { name: "e,changed,technology,ethernet"; + signal: "e,changed,technology,ethernet"; + source: "e"; + action: STATE_SET "ethernet" 0.0; + target: "technology"; + } + program { name: "e,changed,technology,wifi"; + signal: "e,changed,technology,wifi"; + source: "e"; + action: STATE_SET "wifi" 0.0; + target: "technology"; + } + } + + 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; + } + } + } } } + ///////////////////////////////////////////////////////////////////////////// /*** MOD: CONF_EDGEBINDINGS ***/ /* This group draws the edge and corners for the user to pick. diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index 20b768a7f..28c2c5661 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -571,5 +571,8 @@ icon_efm_file_del.png \ exq-barglow.png \ exq-bar.png \ exq-bglight.png \ -exq-logo.png +exq-logo.png \ +connman-disconnect.png \ +connman-ethernet.png \ +connman-wifi.png diff --git a/data/themes/images/connman-disconnect.png b/data/themes/images/connman-disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..f63c83af6ad1f3125c505a82082fe917bddfda1d GIT binary patch literal 6504 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�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 JPDHLkV1lqm3tIpH literal 0 HcmV?d00001 diff --git a/data/themes/images/connman-wifi.png b/data/themes/images/connman-wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c1a9b7facc6bb1492ac7da7d913c2ef93b4481 GIT binary patch literal 6499 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 C_)Iwf literal 0 HcmV?d00001 diff --git a/src/modules/connman/Makefile.am b/src/modules/connman/Makefile.am index 6d6322a55..02ce11a3c 100644 --- a/src/modules/connman/Makefile.am +++ b/src/modules/connman/Makefile.am @@ -15,18 +15,16 @@ INCLUDES = -I. \ -I$(top_srcdir)/src/bin \ -I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/modules \ - @e_cflags@ + @e_cflags@ @ECONNMAN_CFLAGS@ pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) pkg_LTLIBRARIES = module.la module_la_SOURCES = e_mod_main.h \ - e_mod_main.c \ - e_iface.h \ - e_iface.c + e_mod_main.c -module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LIBADD = @e_libs@ @dlopen_libs@ @ECONNMAN_LIBS@ module_la_LDFLAGS = -module -avoid-version module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/connman/e_iface.c b/src/modules/connman/e_iface.c deleted file mode 100644 index b34a85437..000000000 --- a/src/modules/connman/e_iface.c +++ /dev/null @@ -1,1335 +0,0 @@ -#include "e_iface.h" - -/* IFACE INTERNALS */ -static E_DBus_Connection *conn = NULL; -static Eina_List *callbacks = NULL; -static E_DBus_Signal_Handler *sigh_name_ownerchanged = NULL; -static E_DBus_Signal_Handler *sigh_interface_added = NULL; -static E_DBus_Signal_Handler *sigh_interface_removed = NULL; -static Eina_List *interfaces = NULL; - -static Eina_List * -iface_callback(Eina_List *callbacks, Interface_Event event, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - Eina_List *deletes = NULL; - - for (l = callbacks; l; l = l->next) - { - Interface_Callback *cb; - - cb = l->data; - if (cb->delete_me) - { - deletes = eina_list_append(deletes, l->data); - continue; - } - if (cb->event == event) - cb->func(cb->data, iface, ifnet); - } - while (deletes) - { - callbacks = eina_list_remove(callbacks, deletes->data); - free(deletes->data); - deletes = eina_list_remove_list(deletes, deletes); - } - return callbacks; -} - -static Interface_IPv4 * -iface_ipv4_decode(DBusMessage *msg) -{ - DBusMessageIter array, iter, item, val; - Interface_IPv4 *d; - - d = calloc(1, sizeof(Interface_IPv4)); - if (!d) return NULL; - - if (dbus_message_iter_init(msg, &array)) - { - if (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) - { - dbus_message_iter_recurse(&array, &iter); - while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_DICT_ENTRY) - { - char *key, *v; - int type; - - dbus_message_iter_recurse(&iter, &item); - key = NULL; - dbus_message_iter_get_basic(&item, &key); - dbus_message_iter_next(&item); - dbus_message_iter_recurse(&item, &val); - type = dbus_message_iter_get_arg_type(&val); - v = NULL; - if ((!strcmp(key, "Method")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->method = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Address")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->address = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Gateway")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->gateway = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Netmask")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->netmask = eina_stringshare_add(v); - } - dbus_message_iter_next(&iter); - } - } - } - return d; -} - -static void * -iface_getipv4_unmarhsall(DBusMessage *msg, DBusError *err) -{ - return iface_ipv4_decode(msg); -} - -static void -iface_getipv4_callback(void *data, void *ret, DBusError *err) -{ - Interface *iface = data; - Interface_IPv4 *d = ret; - - if (!d) - { - iface_unref(iface); - return; - } - if (iface->ipv4.method) eina_stringshare_del(iface->ipv4.method); - if (iface->ipv4.address) eina_stringshare_del(iface->ipv4.address); - if (iface->ipv4.gateway) eina_stringshare_del(iface->ipv4.gateway); - if (iface->ipv4.netmask) eina_stringshare_del(iface->ipv4.netmask); - memcpy(&(iface->ipv4), d, sizeof(Interface_IPv4)); - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_IPV4_CHANGE, - iface, NULL); - iface_unref(iface); -} - -static void -iface_getipv4_result_free(void *data) -{ - Interface_IPv4 *d = data; - free(d); -} - -static Interface_Network_Selection * -iface_network_selection_decode(DBusMessage *msg) -{ - DBusMessageIter array, iter, item, val; - Interface_Network_Selection *d; - - d = calloc(1, sizeof(Interface_Network_Selection)); - if (!d) return NULL; - - if (dbus_message_iter_init(msg, &array)) - { - if (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) - { - dbus_message_iter_recurse(&array, &iter); - while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_DICT_ENTRY) - { - char *key, *v; - int type; - - dbus_message_iter_recurse(&iter, &item); - key = NULL; - dbus_message_iter_get_basic(&item, &key); - dbus_message_iter_next(&item); - dbus_message_iter_recurse(&item, &val); - type = dbus_message_iter_get_arg_type(&val); - v = NULL; - if ((!strcmp(key, "ESSID")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->id = eina_stringshare_add(v); - } - else if ((!strcmp(key, "PSK")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->pass = eina_stringshare_add(v); - } - dbus_message_iter_next(&iter); - } - } - } - return d; -} - -static void * -iface_getnetwork_unmarhsall(DBusMessage *msg, DBusError *err) -{ - return iface_network_selection_decode(msg); -} - -static void -iface_getnetwork_callback(void *data, void *ret, DBusError *err) -{ - Interface *iface = data; - Interface_Network_Selection *d = ret; - - if (!d) - { - iface_unref(iface); - return; - } - if (iface->network_selection.id) eina_stringshare_del(iface->network_selection.id); - if (iface->network_selection.pass) eina_stringshare_del(iface->network_selection.pass); - memcpy(&(iface->network_selection), d, sizeof(Interface_Network_Selection)); - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_NETWORK_SELECTION_CHANGE, - iface, NULL); - iface_unref(iface); -} - -static void -iface_getnetwork_result_free(void *data) -{ - Interface_IPv4 *d = data; - free(d); -} - -static void * -iface_getproperties_unmarhsall(DBusMessage *msg, DBusError *err) -{ - DBusMessageIter array, iter, item, val; - Interface_Properties *d; - - d = calloc(1, sizeof(Interface_Properties)); - if (!d) return NULL; - - if (dbus_message_iter_init(msg, &array)) - { - if (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) - { - dbus_message_iter_recurse(&array, &iter); - while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_DICT_ENTRY) - { - char *key, *v; - int type; - - dbus_message_iter_recurse(&iter, &item); - key = NULL; - dbus_message_iter_get_basic(&item, &key); - dbus_message_iter_next(&item); - dbus_message_iter_recurse(&item, &val); - type = dbus_message_iter_get_arg_type(&val); - v = NULL; - if ((!strcmp(key, "Type")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->type = eina_stringshare_add(v); - } - else if ((!strcmp(key, "State")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->state = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Policy")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->policy = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Driver")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->driver = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Vendor")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->vendor = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Product")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) d->product = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Signal")) && (type == DBUS_TYPE_UINT16)) - { - dbus_uint16_t vi; - dbus_message_iter_get_basic(&val, &vi); - d->signal_strength = vi; - } - dbus_message_iter_next(&iter); - } - } - } - return d; -} - -static void -iface_getproperties_callback(void *data, void *ret, DBusError *err) -{ - Interface *iface = data; - Interface_Properties *d = ret; - if (!d) - { - iface_unref(iface); - iface_unref(iface); - return; - } - if (iface->prop.product) eina_stringshare_del(iface->prop.product); - if (iface->prop.vendor) eina_stringshare_del(iface->prop.vendor); - if (iface->prop.driver) eina_stringshare_del(iface->prop.driver); - if (iface->prop.state) eina_stringshare_del(iface->prop.state); - if (iface->prop.policy) eina_stringshare_del(iface->prop.policy); - if (iface->prop.type) eina_stringshare_del(iface->prop.type); - memcpy(&(iface->prop), d, sizeof(Interface_Properties)); - if (!iface->newif) - { - callbacks = iface_callback(callbacks, - IFACE_EVENT_ADD, - iface, NULL); - iface->newif = 1; - } - iface_unref(iface); -} - -static void -iface_getproperties_result_free(void *data) -{ - Interface_Properties *d = data; - free(d); -} - -static void -iface_net_add(Interface *iface, const char *essid, const char *bssid, int signal_strength, const char *security) -{ - Interface_Network *net; - Eina_List *l; - - for (l = iface->networks; l; l = l->next) - { - net = l->data; - if (!strcmp(bssid, net->bssid)) - { - int changes = 0; - - net->last_seen_time = ecore_time_get(); - if (((essid) && (net->essid) && - (!strcmp(essid, net->essid))) || - (!!essid != !!net->essid)) - { - if (net->essid) eina_stringshare_del(net->essid); - if (essid) net->essid = eina_stringshare_add(essid); - else net->essid = NULL; - changes++; - } - if (signal_strength != net->signal_strength) - { - net->signal_strength = signal_strength; - changes++; - } - if (((security) && (net->security) && - (!strcmp(security, net->security))) || - (!!security != !!net->security)) - { - if (net->security) eina_stringshare_del(net->security); - if (security) net->security = eina_stringshare_add(security); - else net->security = NULL; - changes++; - } - if (changes > 0) - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_SCAN_NETWORK_CHANGE, - iface, net); - return; - } - } - net = calloc(1, sizeof(Interface_Network)); - if (net) - { - net->last_seen_time = ecore_time_get(); - if (essid) net->essid = eina_stringshare_add(essid); - net->bssid = eina_stringshare_add(bssid); - net->signal_strength = signal_strength; - if (security) net->security = eina_stringshare_add(security); - iface->networks = eina_list_append(iface->networks, net); - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_SCAN_NETWORK_ADD, - iface, net); - } -} - -static void -iface_sigh_network_found(void *data, DBusMessage *msg) -{ - Interface *iface = data; - DBusMessageIter array, iter, item, val; - - if (dbus_message_iter_init(msg, &array)) - { - if (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) - { - Interface_Network *net; - - dbus_message_iter_recurse(&array, &iter); - net = calloc(1, sizeof(Interface_Network)); - if (net) - { - while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_DICT_ENTRY) - { - char *key, *v; - int type; - - dbus_message_iter_recurse(&iter, &item); - key = NULL; - dbus_message_iter_get_basic(&item, &key); - dbus_message_iter_next(&item); - dbus_message_iter_recurse(&item, &val); - type = dbus_message_iter_get_arg_type(&val); - v = NULL; - if ((!strcmp(key, "ESSID")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) net->essid = eina_stringshare_add(v); - } - else if ((!strcmp(key, "BSSID")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) net->bssid = eina_stringshare_add(v); - } - else if ((!strcmp(key, "Signal")) && (type == DBUS_TYPE_UINT16)) - { - dbus_uint16_t vi; - dbus_message_iter_get_basic(&val, &vi); - net->signal_strength = vi; - } - if ((!strcmp(key, "Security")) && (type == DBUS_TYPE_STRING)) - { - dbus_message_iter_get_basic(&val, &v); - if (v) net->security = eina_stringshare_add(v); - } - dbus_message_iter_next(&iter); - } - if (net->bssid) - iface_net_add(iface, net->essid, net->bssid, - net->signal_strength, net->security); - if (net->essid) eina_stringshare_del(net->essid); - if (net->bssid) eina_stringshare_del(net->bssid); - if (net->security) eina_stringshare_del(net->security); - free(net); - } - } - } -} - -static void -iface_sigh_signal_changed(void *data, DBusMessage *msg) -{ - Interface *iface = data; - - /* FIXME: need to handle signal changed - and fix connman */ - /* FIXME: wpa_supplicant doesn't support this yet. see: - * mlme.c: ieee80211_associated() */ - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_SIGNAL_CHANGE, - iface, NULL); -} - -static void -iface_sigh_state_changed(void *data, DBusMessage *msg) -{ - Interface *iface = data; - DBusMessageIter iter; - const char *s = NULL; - - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &(s)); - if (!s) return; - if (iface->prop.state) eina_stringshare_del(iface->prop.state); - iface->prop.state = eina_stringshare_add(s); - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "GetIPv4"); - if (msg) - { - e_dbus_method_call_send(conn, msg, - iface_getipv4_unmarhsall, - iface_getipv4_callback, - iface_getipv4_result_free, -1, iface); - dbus_message_unref(msg); - iface_ref(iface); - } - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_STATE_CHANGE, - iface, NULL); -} - -static void -iface_sigh_policy_changed(void *data, DBusMessage *msg) -{ - Interface *iface = data; - DBusMessageIter iter; - const char *s = NULL; - - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &(s)); - if (!s) return; - if (iface->prop.policy) eina_stringshare_del(iface->prop.policy); - iface->prop.policy = eina_stringshare_add(s); - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_POLICY_CHANGE, - iface, NULL); -} - -static void -iface_sigh_network_changed(void *data, DBusMessage *msg) -{ - Interface *iface = data; - Interface_Network_Selection *d; - - d = iface_network_selection_decode(msg); - if (!d) return; - - if (iface->network_selection.id) eina_stringshare_del(iface->network_selection.id); - if (iface->network_selection.pass) eina_stringshare_del(iface->network_selection.pass); - memcpy(&(iface->network_selection), d, sizeof(Interface_Network_Selection)); - free(d); - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_NETWORK_SELECTION_CHANGE, - iface, NULL); -} - -static void -iface_sigh_ipv4_changed(void *data, DBusMessage *msg) -{ - Interface *iface = data; - Interface_IPv4 *d; - - d = iface_ipv4_decode(msg); - if (!d) return; - - if (iface->ipv4.method) eina_stringshare_del(iface->ipv4.method); - if (iface->ipv4.address) eina_stringshare_del(iface->ipv4.address); - if (iface->ipv4.gateway) eina_stringshare_del(iface->ipv4.gateway); - if (iface->ipv4.netmask) eina_stringshare_del(iface->ipv4.netmask); - memcpy(&(iface->ipv4), d, sizeof(Interface_IPv4)); - free(d); - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_IPV4_CHANGE, - iface, NULL); -} - -static int -iface_timer_network_timeout(void *data) -{ - Interface *iface = data; - double now; - Interface_Network *net; - Eina_List *l, *l_del; - - now = ecore_time_get(); - iface_ref(iface); - for (l = iface->networks; l;) - { - net = l->data; - if ((now - net->last_seen_time) > 20.0) - { - l_del = l; - l = l->next; - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_SCAN_NETWORK_DEL, - iface, net); - iface->networks = eina_list_remove_list(iface->networks, l_del); - if (net->essid) eina_stringshare_del(net->essid); - if (net->bssid) eina_stringshare_del(net->bssid); - if (net->security) eina_stringshare_del(net->security); - free(net); - } - else - l = l->next; - } - iface_unref(iface); - return ECORE_CALLBACK_RENEW; -} - -static void * -iface_system_listinterfaces_unmarhsall(DBusMessage *msg, DBusError *err) -{ - DBusMessageIter array, iter; - - if (dbus_message_iter_init(msg, &array)) - { - if (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) - { - dbus_message_iter_recurse(&array, &iter); - do - { - char *ifpath; - - ifpath = NULL; - dbus_message_iter_get_basic(&iter, &ifpath); - if (ifpath) - { - if (!iface_find(ifpath)) - { - printf("ADD 1 %s\n", ifpath); - iface_add(ifpath); - } - } - } - while (dbus_message_iter_next(&iter)); - } - } - return NULL; -} - -static void -iface_system_listinterfaces_callback(void *data, void *ret, DBusError *err) -{ -} - -static void -iface_system_listinterfaces_result_free(void *data) -{ -} - -static void -iface_system_added(void *data, DBusMessage *msg) -{ - DBusMessageIter iter; - const char *s = NULL; - - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &(s)); - if (!s) return; - if (iface_find(s)) return; - printf("ADD 2 %s\n", s); - iface_add(s); -} - -static void -iface_system_removed(void *data, DBusMessage *msg) -{ - DBusMessageIter iter; - const char *s = NULL; - Interface *iface; - - dbus_message_iter_init(msg, &iter); - dbus_message_iter_get_basic(&iter, &(s)); - if (!s) return; - if (!(iface = iface_find(s))) return; - callbacks = iface_callback(callbacks, - IFACE_EVENT_DEL, - iface, NULL); - iface_unref(iface); -} - -static void -iface_system_interfaces_list(void) -{ - DBusMessage *msg; - - msg = dbus_message_new_method_call("org.freedesktop.connman", - "/", - "org.freedesktop.connman.Manager", - "ListInterfaces"); - if (!msg) return; - e_dbus_method_call_send(conn, msg, - iface_system_listinterfaces_unmarhsall, - iface_system_listinterfaces_callback, - iface_system_listinterfaces_result_free, -1, NULL); - dbus_message_unref(msg); - - if (sigh_interface_added) - e_dbus_signal_handler_del(conn, sigh_interface_added); - sigh_interface_added = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", "/", "org.freedesktop.connman.Manager", - "InterfaceAdded", iface_system_added, NULL); - if (sigh_interface_removed) - e_dbus_signal_handler_del(conn, sigh_interface_removed); - sigh_interface_removed = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", "/", "org.freedesktop.connman.Manager", - "InterfaceRemoved", iface_system_removed, NULL); -} - -static void -iface_system_name_ownerchanged(void *data, DBusMessage *msg) -{ - DBusError err; - const char *s1, *s2, *s3; - - dbus_error_init(&err); - if (!dbus_message_get_args(msg, &err, - DBUS_TYPE_STRING, &s1, - DBUS_TYPE_STRING, &s2, - DBUS_TYPE_STRING, &s3, - DBUS_TYPE_INVALID)) - return; - if (strcmp(s1, "org.freedesktop.connman")) return; - iface_system_interfaces_list(); -} - -/* IFACE PUBLIC API */ -Interface * -iface_add(const char *ifpath) -{ - Interface *iface; - DBusMessage *msg; - - iface = calloc(1, sizeof(Interface)); - iface->ref = 1; - iface->ifpath = eina_stringshare_add(ifpath); - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "GetProperties"); - if (!msg) - { - eina_stringshare_del(iface->ifpath); - free(iface); - return NULL; - } - e_dbus_method_call_send(conn, msg, - iface_getproperties_unmarhsall, - iface_getproperties_callback, - iface_getproperties_result_free, -1, iface); - dbus_message_unref(msg); - iface_ref(iface); - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "GetIPv4"); - if (msg) - { - e_dbus_method_call_send(conn, msg, - iface_getipv4_unmarhsall, - iface_getipv4_callback, - iface_getipv4_result_free, -1, iface); - dbus_message_unref(msg); - iface_ref(iface); - } - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "GetNetwork"); - if (msg) - { - e_dbus_method_call_send(conn, msg, - iface_getnetwork_unmarhsall, - iface_getnetwork_callback, - iface_getnetwork_result_free, -1, iface); - dbus_message_unref(msg); - iface_ref(iface); - } - - iface->sigh.network_found = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", iface->ifpath, - "org.freedesktop.connman.Interface", "NetworkFound", - iface_sigh_network_found, iface); - iface->sigh.signal_changed = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", iface->ifpath, - "org.freedesktop.connman.Interface", "SignalChanged", - iface_sigh_signal_changed, iface); - iface->sigh.state_changed = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", iface->ifpath, - "org.freedesktop.connman.Interface", "StateChanged", - iface_sigh_state_changed, iface); - iface->sigh.policy_changed = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", iface->ifpath, - "org.freedesktop.connman.Interface", "PolicyChanged", - iface_sigh_policy_changed, iface); - iface->sigh.network_changed = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", iface->ifpath, - "org.freedesktop.connman.Interface", "NetworkChanged", - iface_sigh_network_changed, iface); - iface->sigh.ipv4_changed = e_dbus_signal_handler_add - (conn, "org.freedesktop.connman", iface->ifpath, - "org.freedesktop.connman.Interface", "IPv4Changed", - iface_sigh_ipv4_changed, iface); - - iface->network_timeout = ecore_timer_add(10.0, iface_timer_network_timeout, - iface); - interfaces = eina_list_append(interfaces, iface); - return iface; -} - -void -iface_ref(Interface *iface) -{ - iface->ref++; -} - -void -iface_unref(Interface *iface) -{ - iface->ref--; - if (iface->ref != 0) return; - - iface->callbacks = iface_callback(iface->callbacks, - IFACE_EVENT_DEL, - iface, NULL); - - while (iface->callbacks) - { - free(iface->callbacks->data); - iface->callbacks = eina_list_remove_list(iface->callbacks, iface->callbacks); - } - - if (iface->network_timeout) - ecore_timer_del(iface->network_timeout); - if (iface->network_selection.id) eina_stringshare_del(iface->network_selection.id); - if (iface->network_selection.pass) eina_stringshare_del(iface->network_selection.pass); - while (iface->networks) - { - Interface_Network *net; - - net = iface->networks->data; - if (net->essid) eina_stringshare_del(net->essid); - if (net->bssid) eina_stringshare_del(net->bssid); - if (net->security) eina_stringshare_del(net->security); - free(net); - iface->networks = eina_list_remove_list(iface->networks, iface->networks); - } - if (iface->prop.product) eina_stringshare_del(iface->prop.product); - if (iface->prop.vendor) eina_stringshare_del(iface->prop.vendor); - if (iface->prop.driver) eina_stringshare_del(iface->prop.driver); - if (iface->prop.state) eina_stringshare_del(iface->prop.state); - if (iface->prop.policy) eina_stringshare_del(iface->prop.policy); - if (iface->prop.type) eina_stringshare_del(iface->prop.type); - e_dbus_signal_handler_del(conn, iface->sigh.network_found); - e_dbus_signal_handler_del(conn, iface->sigh.signal_changed); - e_dbus_signal_handler_del(conn, iface->sigh.state_changed); - e_dbus_signal_handler_del(conn, iface->sigh.policy_changed); - e_dbus_signal_handler_del(conn, iface->sigh.network_changed); - e_dbus_signal_handler_del(conn, iface->sigh.ipv4_changed); - interfaces = eina_list_remove(interfaces, iface); - free(iface); -} - -Interface * -iface_find(const char *ifpath) -{ - Eina_List *l; - - if (!ifpath) return NULL; - for (l = interfaces; l; l = l->next) - { - Interface *iface; - - iface = l->data; - if (!strcmp(iface->ifpath, ifpath)) return iface; - } - return NULL; -} - -void -iface_network_set(Interface *iface, const char *ssid, const char *pass) -{ - DBusMessage *msg; - DBusMessageIter iter, array, item, val; - const char *key; - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "SetNetwork"); - if (!msg) return; - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING - DBUS_TYPE_STRING_AS_STRING - DBUS_TYPE_VARIANT_AS_STRING - DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &array); - - dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL, &item); - key = "ESSID"; - dbus_message_iter_append_basic(&item, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&item, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &val); - dbus_message_iter_append_basic(&val, DBUS_TYPE_STRING, &ssid); - dbus_message_iter_close_container(&item, &val); - dbus_message_iter_close_container(&array, &item); - - if (pass) - { - dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL, &item); - key = "PSK"; - dbus_message_iter_append_basic(&item, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&item, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &val); - dbus_message_iter_append_basic(&val, DBUS_TYPE_STRING, &pass); - dbus_message_iter_close_container(&item, &val); - dbus_message_iter_close_container(&array, &item); - } - - dbus_message_iter_close_container(&iter, &array); - - e_dbus_method_call_send(conn, msg, NULL, NULL, NULL, -1, NULL); - dbus_message_unref(msg); -} - -void -iface_policy_set(Interface *iface, const char *policy) -{ - DBusMessage *msg; - DBusMessageIter iter; - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "SetPolicy"); - if (!msg) return; - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &policy); - - e_dbus_method_call_send(conn, msg, NULL, NULL, NULL, -1, NULL); - dbus_message_unref(msg); -} - -void -iface_scan(Interface *iface, const char *policy) -{ - DBusMessage *msg; - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "Scan"); - if (!msg) return; - e_dbus_method_call_send(conn, msg, NULL, NULL, NULL, -1, NULL); - dbus_message_unref(msg); -} - -void -iface_ipv4_set(Interface *iface, const char *method, const char *address, const char *gateway, const char *netmask) -{ - DBusMessage *msg; - DBusMessageIter iter, array, item, val; - const char *key; - - msg = dbus_message_new_method_call("org.freedesktop.connman", - iface->ifpath, - "org.freedesktop.connman.Interface", - "SetIPv4"); - if (!msg) return; - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING - DBUS_TYPE_STRING_AS_STRING - DBUS_TYPE_VARIANT_AS_STRING - DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &array); - - if (method) - { - dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL, &item); - key = "Method"; - dbus_message_iter_append_basic(&item, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&item, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &val); - dbus_message_iter_append_basic(&val, DBUS_TYPE_STRING, &method); - dbus_message_iter_close_container(&item, &val); - dbus_message_iter_close_container(&array, &item); - } - - if (address) - { - dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL, &item); - key = "Address"; - dbus_message_iter_append_basic(&item, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&item, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &val); - dbus_message_iter_append_basic(&val, DBUS_TYPE_STRING, &address); - dbus_message_iter_close_container(&item, &val); - dbus_message_iter_close_container(&array, &item); - } - - if (gateway) - { - dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL, &item); - key = "Gateway"; - dbus_message_iter_append_basic(&item, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&item, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &val); - dbus_message_iter_append_basic(&val, DBUS_TYPE_STRING, &gateway); - dbus_message_iter_close_container(&item, &val); - dbus_message_iter_close_container(&array, &item); - } - - if (netmask) - { - dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, NULL, &item); - key = "Netmask"; - dbus_message_iter_append_basic(&item, DBUS_TYPE_STRING, &key); - dbus_message_iter_open_container(&item, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &val); - dbus_message_iter_append_basic(&val, DBUS_TYPE_STRING, &netmask); - dbus_message_iter_close_container(&item, &val); - dbus_message_iter_close_container(&array, &item); - } - - dbus_message_iter_close_container(&iter, &array); - - e_dbus_method_call_send(conn, msg, NULL, NULL, NULL, -1, NULL); - dbus_message_unref(msg); -} - -void -iface_callback_add(Interface *iface, Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data) -{ - Interface_Callback *cb; - - cb = calloc(1, sizeof(Interface_Callback)); - if (!cb) return; - cb->event = event; - cb->func = func; - cb->data = data; - iface->callbacks = eina_list_append(iface->callbacks, cb); -} - -void -iface_callback_del(Interface *iface, Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data) -{ - Eina_List *l; - - for (l = iface->callbacks; l; l = l->next) - { - Interface_Callback *cb; - - cb = l->data; - if ((cb->event == event) && (cb->func == func) && (cb->data == data)) - { - /* just flag for deletion - cleanup happens later */ - cb->delete_me = 1; - return; - } - } -} - -void -iface_system_init(E_DBus_Connection *edbus_conn) -{ - conn = edbus_conn; - /* init iface system - listen for connman name owner change - if we get it - * connman was sarted or restarted this handles connman starting later - * than the front-end gui */ - sigh_name_ownerchanged = e_dbus_signal_handler_add - (conn, "org.freedesktop.DBus", "/org/freedesktop/DBus", - "org.freedesktop.DBus", "NameOwnerChanged", - iface_system_name_ownerchanged, NULL); - /* do an initial list */ - iface_system_interfaces_list(); - - /* FIXME: do we care about connman state? haven't found a use for it yet */ - /* FIXME: get state with GetState */ - /* FIXME: add signal handler StateChanged */ -} - -void -iface_system_shutdown(void) -{ - Eina_List *l, *tlist = NULL; - - for (l = interfaces; l; l = l->next) - tlist = eina_list_append(tlist, l->data); - while (tlist) - { - iface_unref(tlist->data); - tlist = eina_list_remove_list(tlist, tlist); - } - if (sigh_name_ownerchanged) - e_dbus_signal_handler_del(conn, sigh_name_ownerchanged); - sigh_name_ownerchanged = NULL; - if (sigh_interface_added) - e_dbus_signal_handler_del(conn, sigh_interface_added); - sigh_interface_added = NULL; - if (sigh_interface_removed) - e_dbus_signal_handler_del(conn, sigh_interface_removed); - sigh_interface_removed = NULL; - while (callbacks) - { - free(callbacks->data); - callbacks = eina_list_remove_list(callbacks, callbacks); - } - conn = NULL; -} - -void -iface_system_callback_add(Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data) -{ - Interface_Callback *cb; - - cb = calloc(1, sizeof(Interface_Callback)); - if (!cb) return; - cb->event = event; - cb->func = func; - cb->data = data; - callbacks = eina_list_append(callbacks, cb); -} - -void -iface_system_callback_del(Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data) -{ - Eina_List *l; - - for (l = callbacks; l; l = l->next) - { - Interface_Callback *cb; - - cb = l->data; - if ((cb->event == event) && (cb->func == func) && (cb->data == data)) - { - /* just flag for deletion - cleanup happens later */ - cb->delete_me = 1; - return; - } - } -} - - - - - - - - - -#if 0// TESTING CODE ONLY HERE - EXCERCISE THE API ABOVE -static void -cb_if_del(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF-- %s\n", iface->ifpath); -} - -static void -cb_if_ipv4(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF %s\n", iface->ifpath); - printf(" IPV4: [%s][%s][%s][%s]\n", - iface->ipv4.method, iface->ipv4.address, - iface->ipv4.gateway, iface->ipv4.netmask); -} - -static void -cb_if_net_sel(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF %s\n", iface->ifpath); - printf(" NET_SEL: [%s] [%s]\n", - iface->network_selection.id, iface->network_selection.pass); -} - -static void -cb_if_scan_net_add(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF %s\n", iface->ifpath); - printf(" SCAN NET ADD: [%s] %i \"%s\" %s\n", - ifnet->bssid, ifnet->signal_strength, ifnet->essid, ifnet->security); -} - -static void -cb_if_scan_net_del(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF %s\n", iface->ifpath); - printf(" SCAN NET DEL: [%s] %i \"%s\" %s\n", - ifnet->bssid, ifnet->signal_strength, ifnet->essid, ifnet->security); -} - -static void -cb_if_scan_net_change(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF %s\n", iface->ifpath); - printf(" SCAN NET CHANGE: [%s] %i \"%s\" %s\n", - ifnet->bssid, ifnet->signal_strength, ifnet->essid, ifnet->security); -} - -static void -cb_if_signal(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF %s\n", iface->ifpath); - printf(" SIGNAL: %i\n", iface->signal_strength); -} - -static int connect_test = 0; -static int disconnect_test = 0; -static double connect_timeout_test = 5.0; -static char *essid_test = ""; -static char *pass_test = ""; - -// this is testing - every 5 seconds connect then disconnect from the network -static int -delay_up(void *data) -{ - Interface *iface = data; - - // turn it back on - iface_policy_set(iface, "auto"); - iface_network_set(iface, essid_test, pass_test); - return 0; -} - -static int -delay_down(void *data) -{ - Interface *iface = data; - - // turn interface off - iface_policy_set(iface, "off"); - // in 5 seconds call delay_up - if (connect_test) - ecore_timer_add(connect_timeout_test, delay_up, iface); - return 0; -} - -static void -cb_if_state(void *data, Interface *iface, Interface_Network *ifnet) -{ - // .. iface->prop.state: - // scanning - // carrier - // configure - // ready - // unknown - // off - // enabled - // connect - // connected - printf("IF %s\n", iface->ifpath); - printf(" STATE: %s\n", iface->prop.state); - // if we go into a ready state - in 5 seconds, call delay_down - if (disconnect_test) - { - if (!strcmp(iface->prop.state, "ready")) - ecore_timer_add(connect_timeout_test, delay_down, iface); - } -} - -static void -cb_if_policy(void *data, Interface *iface, Interface_Network *ifnet) -{ - // .. iface->prop.policy: - // unknown - // off - // ignore - // auto - // ask - // - printf("IF %s\n", iface->ifpath); - printf(" POLICY: %s\n", iface->prop.policy); -} - -static void -cb_main_if_add(void *data, Interface *iface, Interface_Network *ifnet) -{ - printf("IF++ %s\n", iface->ifpath); - - // TESTING ... - // add callbacks to events so we know when things happen - iface_callback_add(iface, IFACE_EVENT_DEL, cb_if_del, NULL); - iface_callback_add(iface, IFACE_EVENT_IPV4_CHANGE, cb_if_ipv4, NULL); - iface_callback_add(iface, IFACE_EVENT_NETWORK_SELECTION_CHANGE, cb_if_net_sel, NULL); - iface_callback_add(iface, IFACE_EVENT_SCAN_NETWORK_ADD, cb_if_scan_net_add, NULL); - iface_callback_add(iface, IFACE_EVENT_SCAN_NETWORK_DEL, cb_if_scan_net_del, NULL); - iface_callback_add(iface, IFACE_EVENT_SCAN_NETWORK_CHANGE, cb_if_scan_net_change, NULL); - iface_callback_add(iface, IFACE_EVENT_SIGNAL_CHANGE, cb_if_signal, NULL); - iface_callback_add(iface, IFACE_EVENT_STATE_CHANGE, cb_if_state, NULL); - iface_callback_add(iface, IFACE_EVENT_POLICY_CHANGE, cb_if_policy, NULL); - - // .. iface->prop.type: - // unknown - // 80203 - // 80211 - // wimax - // modem - // bluetooth - // - // if it is 802.11 - try connect - if (essid_test) - { - if ((iface->prop.type) && (!strcmp(iface->prop.type, "80211"))) - { - iface_policy_set(iface, "auto"); - iface_network_set(iface, essid_test, pass_test); - } - } -} - -//////// DRIVE THE TESt SYSTEM ABOVE //////// -int -main(int argc, char **argv) -{ - E_DBus_Connection *c; - - { - int i; - - for (i = 0; i < argc; i++) - { - if (!strcmp(argv[i], "-ct")) - { - connect_test = 1; - } - else if (!strcmp(argv[i], "-dt")) - { - disconnect_test = 1; - } - else if (!strcmp(argv[i], "-e")) - { - essid_test = argv[++i]; - } - else if (!strcmp(argv[i], "-p")) - { - pass_test = argv[++i]; - } - else if (!strcmp(argv[i], "-t")) - { - connect_timeout_test = atof(argv[++i]); - } - else if (!strcmp(argv[i], "-h")) - { - printf - ("Options:\n" - " -ct Enable connection connect test\n" - " -dt Enable connection disconnect test\n" - " -t N Timeout for connect/disconnect test (seconds)\n" - " -e XXX Use Essid XXX\n" - " -p XXX Use passphrase XXX\n" - " -h This help\n" - ); - exit(0); - } - } - } - - ecore_init(); - eina_init(); - ecore_app_args_set(argc, (const char **)argv); - e_dbus_init(); - evas_init(); - - c = e_dbus_bus_get(DBUS_BUS_SYSTEM); - if (!c) - { - printf("ERROR: can't connect to system session\n"); - exit(-1); - } - - // add calback that gets called whenever an interface is added to the system - // or on initial lst of interfaces that are present - iface_system_callback_add(IFACE_EVENT_ADD, cb_main_if_add, NULL); - iface_system_init(c); - - ecore_main_loop_begin(); - - iface_system_shutdown(); - - e_dbus_connection_close(c); - evas_shutdown(); - e_dbus_shutdown(); - eina_shutdown(); - ecore_shutdown(); - - return 0; -} -#endif diff --git a/src/modules/connman/e_iface.h b/src/modules/connman/e_iface.h deleted file mode 100644 index 828b11ed9..000000000 --- a/src/modules/connman/e_iface.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef E_IFACE_H -#define E_IFACE_H - -#include -#include -#include -#include -#include -#include -#include -#include - -/* IFACE HEADER */ -typedef enum _Interface_Event -{ - IFACE_EVENT_ADD, - IFACE_EVENT_DEL, - IFACE_EVENT_IPV4_CHANGE, - IFACE_EVENT_NETWORK_SELECTION_CHANGE, - IFACE_EVENT_SCAN_NETWORK_ADD, - IFACE_EVENT_SCAN_NETWORK_DEL, - IFACE_EVENT_SCAN_NETWORK_CHANGE, - IFACE_EVENT_SIGNAL_CHANGE, - IFACE_EVENT_STATE_CHANGE, - IFACE_EVENT_POLICY_CHANGE, -} Interface_Event; - -typedef struct _Interface_Network Interface_Network; -typedef struct _Interface_Properties Interface_Properties; -typedef struct _Interface_IPv4 Interface_IPv4; -typedef struct _Interface_Network_Selection Interface_Network_Selection; -typedef struct _Interface_Callback Interface_Callback; -typedef struct _Interface Interface; - -struct _Interface_Network -{ - const char *essid; - const char *bssid; - const char *security; - int signal_strength; - double last_seen_time; -}; - -struct _Interface_Properties -{ - const char *product; - const char *vendor; - int signal_strength; - const char *driver; - const char *state; - const char *policy; - const char *type; -}; - -struct _Interface_IPv4 -{ - const char *method; - const char *address; - const char *gateway; - const char *netmask; -}; - -struct _Interface_Network_Selection -{ - const char *id; - const char *pass; -}; - -struct _Interface_Callback -{ - Interface_Event event; - void (*func) (void *data, Interface *iface, Interface_Network *ifnet); - void *data; - unsigned char delete_me : 1; -}; - -struct _Interface -{ - /* public - read-only. look but don't touch */ - const char *ifpath; - Interface_Properties prop; - Interface_IPv4 ipv4; - Interface_Network_Selection network_selection; - Eina_List *networks; - int signal_strength; - - /* private - don't touch */ - Eina_List *callbacks; - struct { - E_DBus_Signal_Handler *network_found; - E_DBus_Signal_Handler *signal_changed; - E_DBus_Signal_Handler *state_changed; - E_DBus_Signal_Handler *policy_changed; - E_DBus_Signal_Handler *network_changed; - E_DBus_Signal_Handler *ipv4_changed; - } sigh; - Ecore_Timer *network_timeout; - int ref; - unsigned char newif : 1; -}; - -/* IFACE PUBLIC API */ -Interface *iface_add (const char *ifpath); -void iface_ref (Interface *iface); -void iface_unref (Interface *iface); -Interface *iface_find (const char *ifpath); -void iface_network_set (Interface *iface, const char *ssid, const char *pass); -void iface_policy_set (Interface *iface, const char *policy); -void iface_scan (Interface *iface, const char *policy); -void iface_ipv4_set (Interface *iface, const char *method, const char *address, const char *gateway, const char *netmask); -void iface_callback_add(Interface *iface, Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data); -void iface_callback_del(Interface *iface, Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data); - -void iface_system_init (E_DBus_Connection *edbus_conn); -void iface_system_shutdown(void); -void iface_system_callback_add (Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data); -void iface_system_callback_del (Interface_Event event, void (*func) (void *data, Interface *iface, Interface_Network *ifnet), void *data); -#endif diff --git a/src/modules/connman/e_mod_main.c b/src/modules/connman/e_mod_main.c index 1b73d79a2..af2afcae3 100644 --- a/src/modules/connman/e_mod_main.c +++ b/src/modules/connman/e_mod_main.c @@ -3,1540 +3,1013 @@ */ #include "e.h" #include "e_mod_main.h" -#include "e_iface.h" -// FUCK. -// -// connman now completely changed api in git upstream (just found out) after -// weeks of no changes - huge change. nothing seems compatible anymore. -// -// ... -// -// this basically puts this all on hold. hoo-ray! -// -// back to ignoring network stuff. +/* + * STATUS: + * + * displays current status, segfaults often. needs connman from git + * (will be 0.48, still unreleased). + * + * TODO: + * + * MUST: + * 1. popup with list of services, allows connecting + offline mode + * 2. improve gadget ui + * 3. fix stringshare usage errors (probably in e_connman itself) + * + * GOOD: + * 1. mouse over popup with information such as IP and AP name + * (remove name from gadget) + * 2. nice popup using edje objects as rows, not simple lists (fancy) + * 3. "Controls" for detailed information, similar to Mixer app + * it would contain switches to toggle offline and choose + * technologies that are enabled. + * 4. toggle internal e17 mode (Menu > Settings > Mode > Offline) + * + * IDEAS: + * 1. create static connections + * + */ -// FIXME: need config to -// 1. list instance id -> iface config -// 2. list networks (essid, password, dhcp?, ip, gw, netmask) +static E_Module *connman_mod = NULL; +static char tmpbuf[PATH_MAX]; /* general purpose buffer, just use immediately */ +static const char _name[] = "connman"; +const char _Name[] = "Connection Manager"; -/***************************************************************************/ -/**/ -/* gadcon requirements */ -static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); -static void _gc_shutdown(E_Gadcon_Client *gcc); -static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient); -static char *_gc_label(E_Gadcon_Client_Class *client_class); -static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas); -static const char *_gc_id_new(E_Gadcon_Client_Class *client_class); -/* and actually define the gadcon class that this module provides (just 1) */ -static const E_Gadcon_Client_Class _gadcon_class = +static const char *e_str_idle = NULL; +static const char *e_str_association = NULL; +static const char *e_str_configuration = NULL; +static const char *e_str_ready = NULL; +static const char *e_str_disconnect = NULL; +static const char *e_str_failure = NULL; + +static void _connman_default_service_changed_delayed(E_Connman_Module_Context *ctxt); +static void _connman_gadget_update(E_Connman_Instance *inst); + +static const char * +e_connman_theme_path(void) { - GADCON_CLIENT_CLASS_VERSION, - "connman", +#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 inline void +_connman_dbus_error_show(const char *msg, const DBusError *error) +{ + if ((!error) || (!dbus_error_is_set(error))) + return; + + e_util_dialog_show(_("Connman Server Operation Failed"), + _("Could not execute remote operation:
" + "%s
" + "Server Error %s: %s"), + msg, error->name, error->message); +} + +static inline void +_connman_operation_error_show(const char *msg) +{ + e_util_dialog_show(_("Connman Operation Failed"), + _("Could not execute local operation:
%s"), + msg); +} + +static void +_connman_toggle_offline_mode_cb(void *data __UNUSED__, DBusMessage *msg __UNUSED__, DBusError *error) +{ + _connman_dbus_error_show(_("Cannot toggle system's offline mode."), error); + dbus_error_free(error); +} + +static void +_connman_toggle_offline_mode(E_Connman_Module_Context *ctxt) +{ + bool offline; + + if ((!ctxt) || (!ctxt->has_manager)) { - _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 -}; -/**/ -/***************************************************************************/ + _connman_operation_error_show(_("ConnMan Daemon is not running.")); + return; + } -static void gadget_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event); + if (!e_connman_manager_offline_mode_get(&offline)) + { + _connman_operation_error_show + (_("Cannot query system's offline mode.")); + return; + } -/***************************************************************************/ -/**/ -/* actual module specifics */ + offline = !offline; + if (!e_connman_manager_offline_mode_set + (offline, _connman_toggle_offline_mode_cb, NULL)) + { + _connman_operation_error_show + (_("Cannot toggle system's offline mode.")); + return; + } +} -typedef struct _Instance Instance; -typedef struct _Conf Conf; -typedef struct _Conf_Interface Conf_Interface; -typedef struct _Conf_Network Conf_Network; - - -struct _Instance +static void +_connman_cb_toggle_offline_mode(E_Object *obj __UNUSED__, const char *params __UNUSED__) { - E_Gadcon_Client *gcc; - Evas_Object *o_net; // FIXME: clock to go... + E_Connman_Module_Context *ctxt; - E_Gadcon_Popup *popup; - Evas_Object *popup_ilist_obj; - E_Dialog *if_dia; - Evas_Object *if_radio_device; - Evas_Object *if_ilist_obj; - E_Dialog *net_dia; - E_Dialog *manual_dia; - E_Dialog *netlist_dia; + if (!connman_mod) + return; - struct { - int ifmode; - int ifmode_tmp; - const char *ifpath; - const char *ifpath_tmp; - const char *bssid; - char *sec; - Conf_Network *cfnet, *cfnet_new; - Conf_Interface *cfif; - } config; -}; + ctxt = connman_mod->data; + _connman_toggle_offline_mode(ctxt); +} -struct _Conf_Interface +static void +_connman_service_free(E_Connman_Service *service) { - const char *name; - const char *id; - const char *ifpath; - int ifmode; - Conf_Network *netconf; // if ethernet - then this will hold config -}; + eina_stringshare_del(service->path); + eina_stringshare_del(service->name); + eina_stringshare_del(service->type); + eina_stringshare_del(service->mode); + eina_stringshare_del(service->state); + eina_stringshare_del(service->error); + eina_stringshare_del(service->security); + eina_stringshare_del(service->ipv4_method); + eina_stringshare_del(service->ipv4_address); + eina_stringshare_del(service->ipv4_netmask); -struct _Conf_Network + e_connman_element_unref(service->element); + E_FREE(service); +} + +static void +_connman_service_changed(void *data, const E_Connman_Element *element) { - char *name; - char *essid; - char *password; - char *ip; - char *gateway; - char *netmask; - int dhcp; - int remember_password; - int use_always; - int addme; -}; + E_Connman_Service *service = data; + const char *str; + unsigned char u8; + bool b; -struct _Conf +#define GSTR(name, getter) \ + if (!getter(element, &str)) \ + str = NULL; \ + eina_stringshare_replace(&service->name, str) + + GSTR(name, e_connman_service_name_get); + GSTR(type, e_connman_service_type_get); + GSTR(mode, e_connman_service_mode_get); + GSTR(state, e_connman_service_state_get); + GSTR(error, e_connman_service_error_get); + GSTR(security, e_connman_service_security_get); + GSTR(ipv4_method, e_connman_service_ipv4_method_get); + GSTR(ipv4_address, e_connman_service_ipv4_address_get); + GSTR(ipv4_netmask, e_connman_service_ipv4_netmask_get); +#undef GSTR + + if (!e_connman_service_strength_get(element, &u8)) + u8 = 0; + service->strength = u8; + +#define GBOOL(name, getter) \ + if (!getter(element, &b)) \ + b = EINA_FALSE; \ + service->name = b + + GBOOL(favorite, e_connman_service_favorite_get); + GBOOL(auto_connect, e_connman_service_auto_connect_get); + GBOOL(pass_required, e_connman_service_passphrase_required_get); +#undef GBOOL + + + printf("DBG CONNMAN: service details changed: (default=%p, %hhu)\n" + " name....: %s\n" + " state...: %s\n" + " type....: %s\n" + " error...: %s\n" + " security: %s\n" + " strength: %hhu\n" + " flags...: favorite=%hhu, auto_connect=%hhu, pass_required=%hhu\n", + service->ctxt->default_service, + service->ctxt->default_service == service, + service->name, + service->state, + service->type, + service->error, + service->security, + service->strength, + service->favorite, + service->auto_connect, + service->pass_required); + + if ((service->ctxt->default_service == service) || + (!service->ctxt->default_service)) + _connman_default_service_changed_delayed(service->ctxt); + else + printf("DBG CONNMAN: do not request for delayed changed as this is not the default.\n"); +} + +static void +_connman_service_freed(void *data) { - Eina_List *interfaces; - Eina_List *networks; -}; + E_Connman_Service *service = data; + E_Connman_Module_Context *ctxt = service->ctxt; -static E_Module *connman_module = NULL; -static E_DBus_Connection *connman_dbus = NULL; -static Eina_List *instances = NULL; -static E_Config_DD *conf_edd = NULL; -static E_Config_DD *conf_interface_edd = NULL; -static E_Config_DD *conf_network_edd = NULL; -static Conf *conf = NULL; + printf("DBG CONNMAN service freed %s\n", service->name); + + ctxt->services = eina_inlist_remove + (ctxt->services, EINA_INLIST_GET(service)); + + _connman_service_free(service); + + if (ctxt->default_service == service) + { + ctxt->default_service = NULL; + _connman_default_service_changed_delayed(ctxt); + } +} + +static E_Connman_Service * +_connman_service_new(E_Connman_Module_Context *ctxt, E_Connman_Element *element) +{ + E_Connman_Service *service; + const char *str; + unsigned char u8; + bool b; + + if (!element) + return NULL; + + service = E_NEW(E_Connman_Service, 1); + if (!service) + return NULL; + + service->ctxt = ctxt; + service->element = element; + service->path = eina_stringshare_add(element->path); + +#define GSTR(name, getter) \ + if (!getter(element, &str)) \ + str = NULL; \ + service->name = eina_stringshare_add(str) + + GSTR(name, e_connman_service_name_get); + GSTR(type, e_connman_service_type_get); + GSTR(mode, e_connman_service_mode_get); + GSTR(state, e_connman_service_state_get); + GSTR(error, e_connman_service_error_get); + GSTR(security, e_connman_service_security_get); + GSTR(ipv4_method, e_connman_service_ipv4_method_get); + GSTR(ipv4_address, e_connman_service_ipv4_address_get); + GSTR(ipv4_netmask, e_connman_service_ipv4_netmask_get); +#undef GSTR + + if (!e_connman_service_strength_get(element, &u8)) + u8 = 0; + service->strength = u8; + +#define GBOOL(name, getter) \ + if (!getter(element, &b)) \ + b = EINA_FALSE; \ + service->name = b + + GBOOL(favorite, e_connman_service_favorite_get); + GBOOL(auto_connect, e_connman_service_auto_connect_get); + GBOOL(pass_required, e_connman_service_passphrase_required_get); +#undef GBOOL + + e_connman_element_listener_add + (element, _connman_service_changed, service, + _connman_service_freed); + + return service; +} + +static void +_connman_services_free(E_Connman_Module_Context *ctxt) +{ + while (ctxt->services) + { + E_Connman_Service *service = (E_Connman_Service *)ctxt->services; + ctxt->services = eina_inlist_remove(ctxt->services, ctxt->services); + _connman_service_free(service); + } +} + +static inline Eina_Bool +_connman_services_element_exists(const E_Connman_Module_Context *ctxt, const E_Connman_Element *element) +{ + const E_Connman_Service *service; + + EINA_INLIST_FOREACH(ctxt->services, service) + if (service->path == element->path) + return EINA_TRUE; + + return EINA_FALSE; +} + +static void +_connman_services_load(E_Connman_Module_Context *ctxt) +{ + unsigned int i, count; + E_Connman_Element **elements; + + if (!e_connman_manager_services_get(&count, &elements)) + return; + + for (i = 0; i < count; i++) + { + E_Connman_Element *e = elements[i]; + E_Connman_Service *service; + + if ((!e) || (_connman_services_element_exists(ctxt, e))) + { + printf("DBG CONNMAN service already exists %p (%s)\n", + e, e ? e->path : ""); + continue; + } + + service = _connman_service_new(ctxt, e); + if (!service) + continue; + + printf("DBG CONNMAN added service: %s\n", service->name); + ctxt->services = eina_inlist_append + (ctxt->services, EINA_INLIST_GET(service)); + } + + /* no need to remove elements, as they remove themselves */ + + free(elements); +} + +static void +_connman_default_service_changed(E_Connman_Module_Context *ctxt) +{ + E_Connman_Service *itr, *def = NULL; + E_Connman_Instance *inst; + const Eina_List *l; + const char *tech; + + EINA_INLIST_FOREACH(ctxt->services, itr) + { + if (itr->state == e_str_ready) + { + def = itr; + break; + } + else if ((itr->state == e_str_association) && + ((!def) || (def && def->state != e_str_configuration))) + def = itr; + else if (itr->state == e_str_configuration) + def = itr; + } + + printf("DBG CONNMAN: default service changed to %p (%s)\n", def, def ? def->name : ""); + + if (!e_connman_manager_technology_default_get(&tech)) + tech = NULL; + eina_stringshare_replace(&ctxt->technology, tech); + printf("DBG CONNMAN: manager technology is '%s'\n", tech); + + ctxt->default_service = def; + EINA_LIST_FOREACH(ctxt->instances, l, inst) + _connman_gadget_update(inst); +} + +static void +_connman_services_reload(E_Connman_Module_Context *ctxt) +{ + _connman_services_load(ctxt); + _connman_default_service_changed(ctxt); +} + +static int +_connman_default_service_changed_delayed_do(void *data) +{ + E_Connman_Module_Context *ctxt = data; + + ctxt->poller.default_service_changed = NULL; + printf("\033[32mDBG CONNMAN: do delayed change\033[0m\n"); + _connman_default_service_changed(ctxt); + return 0; +} + +static void +_connman_default_service_changed_delayed(E_Connman_Module_Context *ctxt) +{ + printf("\033[1;31mDBG CONNMAN: request delayed change\033[0m\n"); + if (ctxt->poller.default_service_changed) + ecore_poller_del(ctxt->poller.default_service_changed); + ctxt->poller.default_service_changed = ecore_poller_add + (ECORE_POLLER_CORE, 1, _connman_default_service_changed_delayed_do, ctxt); +} + +static void _connman_popup_del(E_Connman_Instance *inst); + +static int +_connman_popup_input_window_mouse_up_cb(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Button *ev = event; + E_Connman_Instance *inst = data; + + if (ev->window != inst->ui.input.win) + return 1; + + _connman_popup_del(inst); + + return 1; +} + +static int +_connman_popup_input_window_key_down_cb(void *data, int type, void *event) +{ + Ecore_Event_Key *ev = event; + E_Connman_Instance *inst = data; + const char *keysym; + + if (ev->window != inst->ui.input.win) + return 1; + + keysym = ev->key; + if (strcmp(keysym, "Escape") == 0) + _connman_popup_del(inst); + + return 1; +} + +static void +_connman_popup_input_window_destroy(E_Connman_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 +_connman_popup_input_window_create(E_Connman_Instance *inst) +{ + Ecore_X_Window_Configure_Mask mask; + Ecore_X_Window w, popup_w; + E_Manager *man; + + return; // TODO + + 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, + _connman_popup_input_window_mouse_up_cb, inst); + + inst->ui.input.key_down = + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, + _connman_popup_input_window_key_down_cb, inst); + + inst->ui.input.win = w; +} + +static void +_connman_popup_del(E_Connman_Instance *inst) +{ + _connman_popup_input_window_destroy(inst); + e_object_del(E_OBJECT(inst->popup)); + inst->popup = NULL; +} + +static void +_connman_popup_new(E_Connman_Instance *inst) +{ + Evas *evas; + Evas_Coord mw, mh; + + // TODO + + e_widget_size_min_get(inst->ui.table, &mw, &mh); + if (mh < 208) mh = 208; + if (mw < 68) mw = 68; + 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); + _connman_popup_input_window_create(inst); +} + +static void +_connman_menu_cb_post(void *data, E_Menu *menu) +{ + E_Connman_Instance *inst; + + inst = data; + if ((!inst) || (!inst->menu)) + return; + if (inst->menu) + { + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; + } +} + +static void +_connman_menu_cb_cfg(void *data, E_Menu *menu __UNUSED__, E_Menu_Item *mi __UNUSED__) +{ + E_Connman_Instance *inst = data; + + if (!inst) + return; + if (inst->popup) + _connman_popup_del(inst); + + e_util_dialog_show("TODO", "TODO!"); +} + +static void +_connman_menu_new(E_Connman_Instance *inst, Evas_Event_Mouse_Down *ev) +{ + E_Zone *zone; + E_Menu *mn; + E_Menu_Item *mi; + int x, y; + + zone = e_util_zone_current_get(e_manager_current_get()); + + mn = e_menu_new(); + e_menu_post_deactivate_callback_set(mn, _connman_menu_cb_post, inst); + inst->menu = mn; + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Settings")); + e_util_menu_item_theme_icon_set(mi, "configure"); + e_menu_item_callback_set(mi, _connman_menu_cb_cfg, inst); + + e_gadcon_client_util_menu_items_append(inst->gcc, mn, 0); + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL); + e_menu_activate_mouse(mn, 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 +_connman_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + E_Connman_Instance *inst; + Evas_Event_Mouse_Down *ev; + + inst = data; + if (!inst) + return; + + ev = event; + if (ev->button == 1) + { + if (!inst->popup) + _connman_popup_new(inst); + else + _connman_popup_del(inst); + } + else if (ev->button == 2) + _connman_toggle_offline_mode(inst->ctxt); + else if ((ev->button == 3) && (!inst->menu)) + _connman_menu_new(inst, ev); +} + +static void +_connman_gadget_update(E_Connman_Instance *inst) +{ + E_Connman_Module_Context *ctxt = inst->ctxt; + Evas_Object *gadget = inst->ui.gadget; + const E_Connman_Service *service; + Edje_Message_Int msg; + char buf[128]; + + printf("\033[1;33mUPDATE GADGET\033[0m\n"); + + if (!ctxt->has_manager) + { + edje_object_signal_emit(gadget, "e,unavailable", "e"); + edje_object_part_text_set(gadget, "e.text.name", _("No ConnMan")); + edje_object_part_text_set(gadget, "e.text.error", + _("No ConnMan server found.")); + } + + edje_object_signal_emit(gadget, "e,available", "e"); + + if (ctxt->offline_mode) + edje_object_signal_emit(gadget, "e,changed,offline_mode,yes", "e"); + else + edje_object_signal_emit(gadget, "e,changed,offline_mode,no", "e"); + + printf("DBG CONNMAN: technology: %s\n", ctxt->technology); + + if (ctxt->technology) + { + edje_object_part_text_set(gadget, "e.text.technology", + ctxt->technology); + snprintf(buf, sizeof(buf), "e,changed,technology,%s", + ctxt->technology); + edje_object_signal_emit(gadget, buf, "e"); + } + else + { + edje_object_part_text_set(gadget, "e.text.technology", ""); + edje_object_signal_emit(gadget, "e,changed,technology,none", "e"); + } + + service = ctxt->default_service; + printf("DBG CONNMAN: default_service: %p (%s)\n", service, service ? service->name : ""); + if (!service) + { + edje_object_part_text_set(gadget, "e.text.name", _("No Connection")); + edje_object_signal_emit(gadget, "e,changed,service,none", "e"); + return; + } + + printf("\033[0mDBG CONNMAN: service details:\n" + " state: %s\n" + " type: %s\n" + " error: %s\n" + " security: %s\n" + " strength: %hhu\n" + " flags: favorite=%hhu, auto_connect=%hhu, pass_required=%hhu\033[0m\n", + service->state, + service->type, + service->error, + service->security, + service->strength, + service->favorite, + service->auto_connect, + service->pass_required); + + if (service->name) + edje_object_part_text_set(gadget, "e.text.name", service->name); + else + edje_object_part_text_set(gadget, "e.text.name", _("Unknown Name")); + + if (service->error) + { + edje_object_part_text_set(gadget, "e.text.error", service->error); + edje_object_signal_emit(gadget, "e,changed,error,yes", "e"); + } + else + { + edje_object_part_text_set(gadget, "e.text.error", _("No error")); + edje_object_signal_emit(gadget, "e,changed,error,no", "e"); + } + + snprintf(buf, sizeof(buf), "e,changed,service,%s", service->type); + edje_object_signal_emit(gadget, buf, "e"); + + snprintf(buf, sizeof(buf), "e,changed,state,%s", service->state); + edje_object_signal_emit(gadget, buf, "e"); + printf("DBG CONNMAN signal: %s\n", buf); + + if (service->mode) + { + snprintf(buf, sizeof(buf), "e,changed,mode,%s", service->mode); + edje_object_signal_emit(gadget, buf, "e"); + } + + if (service->security) + { + snprintf(buf, sizeof(buf), "e,changed,security,%s", service->security); + edje_object_signal_emit(gadget, buf, "e"); + } + + if (service->favorite) + edje_object_signal_emit(gadget, "e,changed,favorite,yes", "e"); + else + edje_object_signal_emit(gadget, "e,changed,favorite,no", "e"); + + if (service->auto_connect) + edje_object_signal_emit(gadget, "e,changed,auto_connect,yes", "e"); + else + edje_object_signal_emit(gadget, "e,changed,auto_connect,no", "e"); + + if (service->pass_required) + edje_object_signal_emit(gadget, "e,changed,pass_required,yes", "e"); + else + edje_object_signal_emit(gadget, "e,changed,pass_required,no", "e"); + + + msg.val = service->strength; + edje_object_message_send(gadget, EDJE_MESSAGE_INT, 1, &msg); +} + +/* Gadcon Api Functions */ static E_Gadcon_Client * _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) { - Evas_Object *o; - E_Gadcon_Client *gcc; - Instance *inst; - Eina_List *l; + E_Connman_Instance *inst; + E_Connman_Module_Context *ctxt; - inst = E_NEW(Instance, 1); + if (!connman_mod) + return NULL; - o = edje_object_add(gc->evas); - e_theme_edje_object_set(o, "base/theme/modules/connman", - "e/modules/connman/main"); - evas_object_show(o); + ctxt = connman_mod->data; - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, - gadget_cb_mouse_down, inst); + 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"); - gcc = e_gadcon_client_new(gc, name, id, style, o); - gcc->data = inst; + inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->ui.gadget); + inst->gcc->data = inst; - inst->gcc = gcc; - inst->o_net = o; + evas_object_event_callback_add + (inst->ui.gadget, EVAS_CALLBACK_MOUSE_DOWN, _connman_cb_mouse_down, inst); - e_gadcon_client_util_menu_attach(gcc); + _connman_gadget_update(inst); - instances = eina_list_append(instances, inst); + ctxt->instances = eina_list_append(ctxt->instances, inst); - if (!conf) - { - conf = E_NEW(Conf, 1); - e_config_save_queue(); - } - for (l = conf->interfaces; l; l = l->next) - { - Conf_Interface *cfif; - - cfif = l->data; - if ((cfif->name) && (!strcmp(name, cfif->name)) && - (cfif->id) && (!strcmp(name, cfif->id))) - { - inst->config.cfif = cfif; - break; - } - } - if (!inst->config.cfif) - { - Conf_Interface *cfif; - - cfif = E_NEW(Conf_Interface, 1); - cfif->name = eina_stringshare_add(name); - cfif->id = eina_stringshare_add(id); - conf->interfaces = eina_list_append(conf->interfaces, cfif); - inst->config.cfif = cfif; - e_config_save_queue(); - // FIXME: check interfaces - if one matches, do the if init - } - return gcc; + return inst->gcc; } static void _gc_shutdown(E_Gadcon_Client *gcc) { - Instance *inst; + E_Connman_Module_Context *ctxt; + E_Connman_Instance *inst; + + if (!connman_mod) + return; + + ctxt = connman_mod->data; + if (!ctxt) + return; inst = gcc->data; - instances = eina_list_remove(instances, inst); + if (!inst) + return; - evas_object_del(inst->o_net); - free(inst); + if (inst->menu) + { + e_menu_post_deactivate_callback_set(inst->menu, NULL, NULL); + e_object_del(E_OBJECT(inst->menu)); + } + 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) +_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__) { - Instance *inst; - Evas_Coord mw, mh; - - inst = gcc->data; - mw = 0, mh = 0; - edje_object_size_min_get(inst->o_net, &mw, &mh); - if ((mw < 1) || (mh < 1)) - edje_object_size_min_calc(inst->o_net, &mw, &mh); - if (mw < 4) mw = 4; - if (mh < 4) mh = 4; - e_gadcon_client_aspect_set(gcc, mw, mh); - e_gadcon_client_min_size_set(gcc, mw, mh); + e_gadcon_client_aspect_set(gcc, 16, 16); + e_gadcon_client_min_size_set(gcc, 16, 16); } static char * -_gc_label(E_Gadcon_Client_Class *client_class) +_gc_label(E_Gadcon_Client_Class *client_class __UNUSED__) { - return _("Connection Manager"); + return _(_Name); } static Evas_Object * -_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas) +_gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas) { Evas_Object *o; - char buf[4096]; o = edje_object_add(evas); - snprintf(buf, sizeof(buf), "%s/e-module-connman.edj", - e_module_dir_get(connman_module)); - edje_object_file_set(o, buf, "icon"); + edje_object_file_set(o, e_connman_theme_path(), "icon"); return o; } static const char * -_gc_id_new(E_Gadcon_Client_Class *client_class) +_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__) { - return _gadcon_class.name; + 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 void if_dialog_hide(Instance *inst); -static void popup_hide(Instance *inst); -static void net_dialog_show(Instance *inst, Conf_Network *cfnet); -static void net_dialog_hide(Instance *inst); -static void popup_ifnet_nets_refresh(Instance *inst); - -static Eina_List *ifaces = NULL; - -static int -inst_if_matches(Instance *inst, Interface *iface) +static const E_Gadcon_Client_Class _gc_class = { - if ((inst->config.ifmode == 0) && (iface->prop.type) && - (!strcmp(iface->prop.type, "80211"))) - return 1; - if ((inst->config.ifmode == 1) && (iface->prop.type) && - (!strcmp(iface->prop.type, "80203"))) - return 1; - if ((inst->config.ifpath) && (!strcmp(iface->ifpath, inst->config.ifpath))) - return 1; - return 0; -} - -static Interface * -if_get(Instance *inst) -{ - Eina_List *l; - Interface *iface = NULL; - - if (inst->config.ifpath) - iface = iface_find(inst->config.ifpath); - else - { - EINA_LIST_FOREACH(ifaces, l, iface) - if (inst_if_matches(inst, iface)) return iface; - } - return iface; -} - -static int -net_join(Instance *inst, Interface *iface, Conf_Network *cfnet) -{ - if (!inst->config.sec) - { - iface_policy_set(iface, "auto"); - iface_network_set(iface, cfnet->essid, ""); - if (cfnet->dhcp) - { - iface_ipv4_set(iface, "dhcp", NULL, NULL, NULL); - } - else - iface_ipv4_set(iface, "static", - cfnet->ip, cfnet->gateway, - cfnet->netmask); - if ((!cfnet->remember_password) && (cfnet->password)) - { - eina_stringshare_del(cfnet->password); - cfnet->password = NULL; - } - } - else - { - if (!cfnet->password) - { - net_dialog_show(inst, cfnet); - } - else - { - iface_policy_set(iface, "auto"); - iface_network_set(iface, cfnet->essid, cfnet->password); - if (cfnet->dhcp) - { - iface_ipv4_set(iface, "dhcp", NULL, NULL, NULL); - } - else - iface_ipv4_set(iface, "static", - cfnet->ip, cfnet->gateway, - cfnet->netmask); - if ((!cfnet->remember_password) && (cfnet->password)) - { - eina_stringshare_del(cfnet->password); - cfnet->password = NULL; - } - } - } - return 0; -} - -#define STR_SHARE(x) \ -do { char *___s; ___s = (x); \ - if (___s) { (x) = (char *)eina_stringshare_add(___s); free(___s); } \ -} while (0); - -#define STR_UNSHARE(x) \ -do { char *___s; ___s = (x); \ - if (___s) { (x) = strdup(___s); eina_stringshare_del(___s); } \ -} while (0); - -static void -net_dialog_cb_ok(void *data, E_Dialog *dialog) -{ - Instance *inst; - Conf_Network *cfnet; - Interface *iface; - - inst = data; - cfnet = inst->config.cfnet_new; - inst->config.cfnet = cfnet; - inst->config.cfnet_new = NULL; - if (cfnet->addme) - conf->networks = eina_list_prepend(conf->networks, cfnet); - STR_SHARE(cfnet->name); - STR_SHARE(cfnet->essid); - STR_SHARE(cfnet->password); - STR_SHARE(cfnet->ip); - STR_SHARE(cfnet->gateway); - STR_SHARE(cfnet->netmask); - net_dialog_hide(inst); - iface = if_get(inst); - if (iface) net_join(inst, iface, cfnet); - // FIXME: if ethernet - save cfnet to instances->confnet - e_config_save_queue(); -} - -static void -net_dialog_cb_cancel(void *data, E_Dialog *dialog) -{ - Instance *inst; - Conf_Network *cfnet; - - inst = data; - cfnet = inst->config.cfnet_new; - inst->config.cfnet_new = NULL; - if (cfnet->addme) - { - E_FREE(cfnet->name); - E_FREE(cfnet->essid); - E_FREE(cfnet->password); - E_FREE(cfnet->ip); - E_FREE(cfnet->gateway); - E_FREE(cfnet->netmask); - free(cfnet); - } - else if (inst->config.cfnet) - { - cfnet = inst->config.cfnet; - STR_SHARE(cfnet->name); - STR_SHARE(cfnet->essid); - STR_SHARE(cfnet->password); - STR_SHARE(cfnet->ip); - STR_SHARE(cfnet->gateway); - STR_SHARE(cfnet->netmask); - } - net_dialog_hide(inst); -} - -static void -net_dialog_cb_del(E_Win *win) -{ - E_Dialog *dialog; - Instance *inst; - Conf_Network *cfnet; - - dialog = win->data; - inst = dialog->data; - cfnet = inst->config.cfnet_new; - inst->config.cfnet_new = NULL; - if (cfnet->addme) - { - E_FREE(cfnet->name); - E_FREE(cfnet->essid); - E_FREE(cfnet->password); - E_FREE(cfnet->ip); - E_FREE(cfnet->gateway); - E_FREE(cfnet->netmask); - free(cfnet); - } - else if (inst->config.cfnet) - { - cfnet = inst->config.cfnet; - STR_SHARE(cfnet->name); - STR_SHARE(cfnet->essid); - STR_SHARE(cfnet->password); - STR_SHARE(cfnet->ip); - STR_SHARE(cfnet->gateway); - STR_SHARE(cfnet->netmask); - } - net_dialog_hide(inst); -} - -// FIXME: if iface deleted - del dialog -// FIXME: if ifnet del (this ifnet) del dialog -static void -net_dialog_show(Instance *inst, Conf_Network *cfnet) -{ - E_Dialog *dialog; - Evas *evas; - Evas_Object *table, *o, *button; - Evas_Coord mw, mh; - int row = 0; - - dialog = e_dialog_new(inst->gcc->gadcon->zone->container, "e", "e_connman_net_dialog"); - e_dialog_title_set(dialog, "Connection Details"); - dialog->data = inst; - evas = e_win_evas_get(dialog->win); - - table = e_widget_table_add(evas, 0); - - o = e_widget_label_add(evas, "Personal Name"); - e_widget_table_object_append(table, o, 0, row, 1, 1, 1, 1, 0, 0); - o = e_widget_entry_add(evas, &(cfnet->name), NULL, NULL, NULL); - e_widget_size_min_get(o, &mw, &mh); - mw = 160; - e_widget_size_min_set(o, mw, mh); - e_widget_table_object_append(table, o, 1, row, 1, 1, 1, 1, 0, 0); - row++; - - // FIXME: onyl for wifi - not LAN - o = e_widget_label_add(evas, "ESSID"); - e_widget_table_object_append(table, o, 0, row, 1, 1, 1, 1, 0, 0); - o = e_widget_label_add(evas, cfnet->essid); - e_widget_table_object_append(table, o, 1, row, 1, 1, 1, 1, 0, 0); - row++; - - o = e_widget_check_add(evas, "Use when available", &(cfnet->use_always)); - e_widget_table_object_append(table, o, 0, row, 2, 1, 1, 1, 0, 0); - row++; - - if (inst->config.sec) - { - o = e_widget_label_add(evas, "Password"); - e_widget_table_object_append(table, o, 0, row, 1, 1, 1, 1, 0, 0); - o = e_widget_entry_add(evas, &(cfnet->password), NULL, NULL, NULL); - e_widget_size_min_get(o, &mw, &mh); - mw = 160; - e_widget_size_min_set(o, mw, mh); - e_widget_table_object_append(table, o, 1, row, 1, 1, 1, 1, 0, 0); - row++; - - o = e_widget_check_add(evas, "Remember password", &(cfnet->remember_password)); - e_widget_table_object_append(table, o, 0, row, 2, 1, 1, 1, 0, 0); - row++; - } - - // FIXME: manual dialog needs to work - button = e_widget_button_add(evas, "Address Details", NULL, NULL, - inst, NULL); - e_widget_table_object_append(table, button, 0, row, 2, 1, 0, 0, 0, 0); - row++; - - e_widget_size_min_get(table, &mw, &mh); - e_dialog_content_set(dialog, table, mw, mh); - - e_win_delete_callback_set(dialog->win, net_dialog_cb_del); - - e_dialog_button_add(dialog, "OK", NULL, net_dialog_cb_ok, inst); - e_dialog_button_add(dialog, "Cancel", NULL, net_dialog_cb_cancel, inst); - e_dialog_button_focus_num(dialog, 1); - e_win_centered_set(dialog->win, 1); - e_dialog_show(dialog); - - inst->net_dia = dialog; -} - -static void -net_dialog_hide(Instance *inst) -{ - if (inst->net_dia) - { - e_object_del(E_OBJECT(inst->net_dia)); - inst->net_dia = NULL; - } -} - -// FIXME: need a "manual network settings" dialog: -// * checkbox "use dhcp" -// * entry "ip" -// * entry "gateway" -// * entry "netmask" -static void -manual_dialog_show(Instance *inst) -{ -} - -static void -manual_dialog_hide(Instance *inst) -{ -} - -// FIXME: need saved networks list dialog -// * ilist of saved network names -// * delete button -static void -netlist_dialog_show(Instance *inst) -{ - Conf_Network *cfnet; - - cfnet = inst->config.cfnet_new; - inst->config.cfnet_new = NULL; - if ((cfnet) && (cfnet->addme)) - { - E_FREE(cfnet->name); - E_FREE(cfnet->essid); - E_FREE(cfnet->password); - E_FREE(cfnet->ip); - E_FREE(cfnet->gateway); - E_FREE(cfnet->netmask); - free(cfnet); - } - else if (inst->config.cfnet) - { - cfnet = inst->config.cfnet; - STR_SHARE(cfnet->name); - STR_SHARE(cfnet->essid); - STR_SHARE(cfnet->password); - STR_SHARE(cfnet->ip); - STR_SHARE(cfnet->gateway); - STR_SHARE(cfnet->netmask); - } - net_dialog_hide(inst); - manual_dialog_hide(inst); - if_dialog_hide(inst); - eina_stringshare_del(inst->config.ifpath); - inst->config.ifpath = NULL; -} - -static void -netlist_dialog_hide(Instance *inst) -{ -} - -static void -button_cb_netlist(void *data, void *data2) -{ - Instance *inst; - - inst = data; - if (!inst->netlist_dia) netlist_dialog_show(inst); - else netlist_dialog_hide(inst); -} - -static void -if_dialog_cb_ok(void *data, E_Dialog *dialog) -{ - Instance *inst; - - inst = data; - if_dialog_hide(inst); - eina_stringshare_del(inst->config.ifpath); - inst->config.ifmode = inst->config.ifmode_tmp; - inst->config.ifpath = inst->config.ifpath_tmp; - inst->config.ifpath_tmp = NULL; - - if (inst->config.cfif) - { - if (inst->config.cfif->ifpath) - { - eina_stringshare_del(inst->config.cfif->ifpath); - inst->config.cfif->ifpath = NULL; - } - inst->config.cfif->ifpath = eina_stringshare_ref(inst->config.ifpath); - inst->config.cfif->ifmode = inst->config.ifmode; - } - popup_ifnet_nets_refresh(inst); - e_config_save_queue(); -} - -static void -if_dialog_cb_cancel(void *data, E_Dialog *dialog) -{ - Instance *inst; - - inst = data; - if_dialog_hide(inst); - eina_stringshare_del(inst->config.ifpath_tmp); - inst->config.ifpath_tmp = NULL; -} - -static void -if_dialog_cb_del(E_Win *win) -{ - E_Dialog *dialog; - Instance *inst; - - dialog = win->data; - inst = dialog->data; - if_dialog_hide(inst); - eina_stringshare_del(inst->config.ifpath_tmp); - inst->config.ifpath_tmp = NULL; -} - -static void -if_radio_cb_generic(void *data, Evas_Object *obj, void *event_info) -{ - Instance *inst; - - inst = data; - if (inst->config.ifmode != 2) - { - e_widget_ilist_unselect(inst->if_ilist_obj); - eina_stringshare_del(inst->config.ifpath); - inst->config.ifpath = NULL; - } -} - -static void -if_ilist_cb_if_sel(void *data) -{ - Instance *inst; - - inst = data; - e_widget_radio_toggle_set(inst->if_radio_device, 1); -} - -static void -if_ilist_update(Instance *inst) -{ - Evas_Object *ilist; - Eina_List *l; - int i; - - ilist = inst->if_ilist_obj; - if (!ilist) return; - e_widget_ilist_freeze(ilist); - e_widget_ilist_clear(ilist); - - for (i = 0, l = ifaces; l; l = l->next, i++) - { - Interface *iface; - char buf[256]; - const char *vendor, *product, *type; - Evas_Object *icon; - - iface = l->data; - vendor = iface->prop.vendor; - product = iface->prop.product; - type = iface->prop.type; - icon = NULL; - if (type) - { - if (!strcmp(type, "80211")) - { - type = "WiFi"; - // FIXME: find an icon; - } - else if (!strcmp(type, "80203")) - { - type = "LAN"; - // FIXME: find an icon; - } - else if (!strcmp(type, "wimax")) - { - type = "WiMax"; - // FIXME: find an icon; - } - else if (!strcmp(type, "modem")) - { - type = "Modem"; - // FIXME: find an icon; - } - else if (!strcmp(type, "bluetooth")) - { - type = "Bluetooth"; - // FIXME: find an icon; - } - } - if (!vendor) vendor = "Unknown"; - if (!product) product = "Unknown"; - if (!type) type = "Unknown"; - snprintf(buf, sizeof(buf), "%s (%s)", type, product); - e_widget_ilist_append(ilist, icon, buf, if_ilist_cb_if_sel, inst, - iface->ifpath); - if ((inst->config.ifpath) && - (!strcmp(inst->config.ifpath, iface->ifpath))) - e_widget_ilist_selected_set(ilist, i); - } - - e_widget_ilist_go(ilist); - e_widget_ilist_thaw(ilist); -} - -static void -if_dialog_show(Instance *inst) -{ - E_Dialog *dialog; - Evas *evas; - Evas_Object *list, *flist, *o, *ilist, *button; - Evas_Coord mw, mh; - E_Radio_Group *rg; - - dialog = e_dialog_new(inst->gcc->gadcon->zone->container, "e", "e_connman_iface_dialog"); - e_dialog_title_set(dialog, _("Network Connection Settings")); - dialog->data = inst; - evas = e_win_evas_get(dialog->win); - - list = e_widget_list_add(evas, 0, 0); - - flist = e_widget_framelist_add(evas, _("Network Device"), 0); - - inst->config.ifmode_tmp = inst->config.ifmode; - rg = e_widget_radio_group_new(&(inst->config.ifmode_tmp)); - - o = e_widget_radio_add(evas, _("Wifi"), 0, rg); - evas_object_smart_callback_add(o, "changed", if_radio_cb_generic, inst); - e_widget_framelist_object_append(flist, o); - o = e_widget_radio_add(evas, _("LAN"), 1, rg); - evas_object_smart_callback_add(o, "changed", if_radio_cb_generic, inst); - e_widget_framelist_object_append(flist, o); - o = e_widget_radio_add(evas, _("Specific Device"), 2, rg); - inst->if_radio_device = o; - e_widget_framelist_object_append(flist, o); - - inst->config.ifpath_tmp = eina_stringshare_ref(inst->config.ifpath); - ilist = e_widget_ilist_add(evas, 48, 48, &(inst->config.ifpath_tmp)); - inst->if_ilist_obj = ilist; - - e_widget_ilist_freeze(ilist); - - if_ilist_update(inst); - - e_widget_ilist_go(ilist); - e_widget_ilist_thaw(ilist); - - e_widget_size_min_set(ilist, 240, 180); - e_widget_framelist_object_append(flist, ilist); - - e_widget_list_object_append(list, flist, 1, 0, 0.5); - - // FIXME: netlist needs to work - button = e_widget_button_add(evas, _("Networks"), NULL, button_cb_netlist, - inst, NULL); - e_widget_list_object_append(list, button, 1, 0, 0.5); - - e_widget_size_min_get(list, &mw, &mh); - e_dialog_content_set(dialog, list, mw, mh); - - e_win_delete_callback_set(dialog->win, if_dialog_cb_del); - - e_dialog_button_add(dialog, _("OK"), NULL, if_dialog_cb_ok, inst); - e_dialog_button_add(dialog, _("Cancel"), NULL, if_dialog_cb_cancel, inst); - e_dialog_button_focus_num(dialog, 1); - e_win_centered_set(dialog->win, 1); - e_dialog_show(dialog); - - inst->if_dia = dialog; -} - -static void -if_dialog_hide(Instance *inst) -{ - if (inst->if_dia) - { - e_object_del(E_OBJECT(inst->if_dia)); - inst->if_dia = NULL; - inst->if_radio_device = NULL; - inst->if_ilist_obj = NULL; - } -} - - - - - -static void -popup_cb_setup(void *data, void *data2) -{ - Instance *inst; - - inst = data; - popup_hide(inst); - if (!inst->if_dia) if_dialog_show(inst); - else if_dialog_hide(inst); -} - -static void -popup_ifnet_icon_adjust(Evas_Object *icon, Interface_Network *ifnet) -{ - Edje_Message_Int_Set *msg; - Eina_List *l; - int saved = 0; - - msg = alloca(sizeof(Edje_Message_Int_Set) + (0 * sizeof(int))); - msg->count = 1; - msg->val[0] = ifnet->signal_strength; - edje_object_message_send(icon, EDJE_MESSAGE_INT_SET, 1, msg); - - if (ifnet->security) - { - if (!strcmp(ifnet->security, "WEP")) - edje_object_signal_emit(icon, "e,state,security,wep", "e"); - else if (!strcmp(ifnet->security, "WPA")) - edje_object_signal_emit(icon, "e,state,security,wpa", "e"); - else if (!strcmp(ifnet->security, "RSN")) - edje_object_signal_emit(icon, "e,state,security,rsn", "e"); - } - else - edje_object_signal_emit(icon, "e,state,security,open", "e"); - if (conf) - { - for (l = conf->networks; l; l = l->next) - { - Conf_Network *cfnet; - - cfnet = l->data; - if ((cfnet->essid) && (ifnet->essid) && - (!strcmp(cfnet->essid, ifnet->essid))) - { - saved = 1; - break; - } - } - } - if (saved) - edje_object_signal_emit(icon, "e,state,saved,on", "e"); - else - edje_object_signal_emit(icon, "e,state,saved,off", "e"); -} - -static void -popup_cb_ifnet_sel(void *data) -{ - Instance *inst; - Eina_List *l; - Interface *iface; - - inst = data; - if (!inst->config.bssid) return; - iface = if_get(inst); - if (!iface) return; - for (l = iface->networks; l; l = l->next) - { - Interface_Network *ifnet; - - ifnet = l->data; - E_FREE(inst->config.sec); - if (ifnet->security) inst->config.sec = strdup(ifnet->security); - if (!strcmp(inst->config.bssid, ifnet->bssid)) - { - Conf_Network *cfnet; - - printf("SEL %s\n", ifnet->essid); - if (!conf) - conf = E_NEW(Conf, 1); - for (l = conf->networks; l; l = l->next) - { - cfnet = l->data; - if (!strcmp(cfnet->essid, ifnet->essid)) - { - STR_UNSHARE(cfnet->name); - STR_UNSHARE(cfnet->essid); - STR_UNSHARE(cfnet->password); - STR_UNSHARE(cfnet->ip); - STR_UNSHARE(cfnet->gateway); - STR_UNSHARE(cfnet->netmask); - inst->config.cfnet_new = cfnet; - net_dialog_show(inst, cfnet); - popup_hide(inst); - return; - } - } - cfnet = E_NEW(Conf_Network, 1); - conf->networks = eina_list_prepend(conf->networks, cfnet); - if (ifnet->essid) - { - cfnet->name = strdup(ifnet->essid); - cfnet->essid = strdup(ifnet->essid); - } - else - cfnet->name = strdup("NONE"); - cfnet->remember_password = 1; - cfnet->dhcp = 1; - cfnet->addme = 1; - inst->config.cfnet_new = cfnet; - net_dialog_show(inst, cfnet); - popup_hide(inst); - return; - } - } - popup_hide(inst); -} - -static void -popup_ifnet_net_add(Instance *inst, Interface_Network *ifnet) -{ - const char *label; - Evas_Object *icon; - - label = ifnet->essid; - if (!label) label = "NONE"; - icon = edje_object_add(evas_object_evas_get(inst->popup_ilist_obj)); - e_theme_edje_object_set(icon, "base/theme/modules/connman", - "e/modules/connman/network"); - popup_ifnet_icon_adjust(icon, ifnet); - e_widget_ilist_append(inst->popup_ilist_obj, icon, label, - popup_cb_ifnet_sel, inst, ifnet->bssid); - evas_object_show(icon); -} - -/* -static int -popup_ifnet_cb_sort(void *data1, void *data2) -{ - Interface_Network *ifnet1, *ifnet2; - - ifnet1 = data1; - ifnet2 = data2; - return ifnet2->signal_strength - ifnet1->signal_strength; -} -*/ -static void -popup_ifnet_nets_refresh(Instance *inst) -{ - Eina_List *l, *networks = NULL; - Interface *iface; - Evas_Object *ilist; - - if (!inst->popup_ilist_obj) return; - ilist = inst->popup_ilist_obj; - - iface = if_get(inst); - - e_widget_ilist_freeze(ilist); - e_widget_ilist_clear(ilist); - - if (iface) - { - for (l = iface->networks; l; l = l->next) - networks = eina_list_append(networks, l->data); - } -/* - if (networks) - networks = eina_list_sort(networks, - eina_list_count(networks), - popup_ifnet_cb_sort); - */ - for (l = networks; l; l = l->next) - { - Interface_Network *ifnet; - - ifnet = l->data; - popup_ifnet_net_add(inst, ifnet); - } - if (networks) eina_list_free(networks); - - e_widget_ilist_go(ilist); - e_widget_ilist_thaw(ilist); -} - -static int -ifnet_num_get(Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - int i; - - for (i = 0, l = iface->networks; l; l = l->next, i++) - { - if (ifnet == l->data) return i; - } - return -1; -} - -static void -popup_ifnet_add(Instance *inst, Interface *iface, Interface_Network *ifnet) -{ - if (!inst->popup_ilist_obj) return; - popup_ifnet_net_add(inst, ifnet); - e_widget_ilist_go(inst->popup_ilist_obj); -// popup_ifnet_nets_refresh(inst); -} - -static void -popup_ifnet_del(Instance *inst, Interface *iface, Interface_Network *ifnet) -{ - int i; - - if (!inst->popup_ilist_obj) return; - i = ifnet_num_get(iface, ifnet); - if (i < 0) return; - e_widget_ilist_remove_num(inst->popup_ilist_obj, i); - e_widget_ilist_go(inst->popup_ilist_obj); -// popup_ifnet_nets_refresh(inst); -} - -static void -popup_ifnet_change(Instance *inst, Interface *iface, Interface_Network *ifnet) -{ - const char *label; - Evas_Object *icon; - int i; - - if (!inst->popup_ilist_obj) return; - i = ifnet_num_get(iface, ifnet); - if (i < 0) return; - icon = e_widget_ilist_nth_icon_get(inst->popup_ilist_obj, i); - if (icon) popup_ifnet_icon_adjust(icon, ifnet); - label = ifnet->essid; - if (!label) label = "NONE"; - e_widget_ilist_nth_label_set(inst->popup_ilist_obj, i, label); -// popup_ifnet_nets_refresh(inst); -} - -static void -popup_show(Instance *inst) -{ - Evas_Object *base, *ilist, *button, *o; - Evas *evas; - Evas_Coord mw, mh; - - inst->popup = e_gadcon_popup_new(inst->gcc); - evas = inst->popup->win->evas; - - edje_freeze(); - - base = e_widget_table_add(evas, 0); - - o = edje_object_add(evas); - e_theme_edje_object_set(o, "base/theme/modules/connman", - "e/modules/connman/network"); - edje_object_size_min_get(o, &mw, &mh); - if ((mw < 1) || (mh < 1)) edje_object_size_min_calc(o, &mw, &mh); - if (mw < 4) mw = 4; - if (mh < 4) mh = 4; - evas_object_del(o); - ilist = e_widget_ilist_add(evas, mw, mh, &(inst->config.bssid)); - inst->popup_ilist_obj = ilist; - - e_widget_ilist_freeze(ilist); - - popup_ifnet_nets_refresh(inst); - - e_widget_ilist_go(ilist); - e_widget_ilist_thaw(ilist); - - e_widget_size_min_set(ilist, 240, 320); - e_widget_table_object_append(base, ilist, - 0, 0, 1, 1, 1, 1, 1, 1); - - button = e_widget_button_add(evas, _("Settings"), NULL, popup_cb_setup, - inst, NULL); - e_widget_table_object_append(base, button, - 0, 1, 1, 1, 0, 0, 0, 0); - - e_widget_size_min_get(base, &mw, &mh); - if (mh < 188) mh = 188; - if (mw < 168) mw = 168; - e_widget_size_min_set(base, mw, mh); - - edje_thaw(); - - e_gadcon_popup_content_set(inst->popup, base); - e_gadcon_popup_show(inst->popup); -} - -static void -popup_hide(Instance *inst) -{ - if (inst->popup) - { - e_object_del(E_OBJECT(inst->popup)); - inst->popup = NULL; - inst->popup_ilist_obj = NULL; - } -} - -static void -gadget_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) -{ - Instance *inst; - Evas_Event_Mouse_Down *ev; - - ev = event; - inst = data; - if (ev->button == 1) - { - if (!inst->popup) popup_show(inst); - else popup_hide(inst); - } -} - -static void -inst_enable(Instance *inst) -{ - // FIXME: emit signal to enable -} - -static void -inst_disable(Instance *inst) -{ - // FIXME: emit signal to disable -} - -static void -inst_type(Instance *inst, const char *type) -{ - // FIXME: emit signal to change type -} - -static void -inst_connected(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_disconnected(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_connecting(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_associating(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_associated(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_signal(Instance *inst, int sig) -{ - // FIXME: emit signal -} - -static void -inst_unknown(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_off(Instance *inst) -{ - // FIXME: emit signal -} - -static void -inst_on(Instance *inst) -{ - // FIXME: emit signal -} - -static void -cb_if_del(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - printf("IF-- %s\n", iface->ifpath); - ifaces = eina_list_remove(ifaces, iface); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - inst_disable(inst); - if_ilist_update(inst); - } -} - -static void -cb_if_ipv4(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - printf("IF %s\n", iface->ifpath); - printf(" IPV4: [%s][%s][%s][%s]\n", - iface->ipv4.method, iface->ipv4.address, - iface->ipv4.gateway, iface->ipv4.netmask); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - inst_connected(inst); - } -} - -static void -cb_if_net_sel(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - printf("IF %s\n", iface->ifpath); - printf(" NET_SEL: [%s] [%s]\n", - iface->network_selection.id, iface->network_selection.pass); - // FIXME: change status to say we managed to select a network - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - inst_associating(inst); - } -} - -static void -cb_if_scan_net_add(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l, *l2; - -// printf("IF %s\n", iface->ifpath); -// printf(" SCAN NET ADD: [%s] %i \"%s\" %s\n", -// ifnet->bssid, ifnet->signal_strength, ifnet->essid, ifnet->security); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - popup_ifnet_add(l->data, iface, ifnet); - if (!inst->config.cfnet) - { - for (l2 = conf->networks; l2; l2 = l2->next) - { - Conf_Network *cfnet; - - cfnet = l2->data; - if ((ifnet->essid) && (cfnet->essid) && - (!strcmp(ifnet->essid, cfnet->essid))) - { - inst->config.cfnet = cfnet; - net_join(inst, iface, cfnet); - break; - } - } - } - } -} - -static void -cb_if_scan_net_del(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - -// printf("IF %s\n", iface->ifpath); -// printf(" SCAN NET DEL: [%s] %i \"%s\" %s\n", -// ifnet->bssid, ifnet->signal_strength, ifnet->essid, ifnet->security); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - { - popup_ifnet_del(l->data, iface, ifnet); - } - } -} - -static void -cb_if_scan_net_change(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - -// printf("IF %s\n", iface->ifpath); -// printf(" SCAN NET CHANGE: [%s] %i \"%s\" %s\n", -// ifnet->bssid, ifnet->signal_strength, ifnet->essid, ifnet->security); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - popup_ifnet_change(l->data, iface, ifnet); - } -} - -static void -cb_if_signal(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - printf("IF %s\n", iface->ifpath); - printf(" SIGNAL: %i\n", iface->signal_strength); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - inst_signal(inst, iface->signal_strength); - } -} - -static void -cb_if_state(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - // .. iface->prop.state: - // scanning - // carrier - // configure - // ready - // unknown - // off - // enabled - // connect - // connected - printf("IF %s\n", iface->ifpath); - printf(" STATE: %s\n", iface->prop.state); - // FIXME: show state instnaces for this iface - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - { - if (!strcmp(iface->prop.state, "unknown")) - inst_disconnected(inst); - else if (!strcmp(iface->prop.state, "off")) - inst_disconnected(inst); - else if (!strcmp(iface->prop.state, "carrier")) - inst_connecting(inst); - else if (!strcmp(iface->prop.state, "configure")) - inst_associated(inst); - else if (!strcmp(iface->prop.state, "ready")) - inst_connected(inst); - else if (!strcmp(iface->prop.state, "enabled")) - inst_associating(inst); - else if (!strcmp(iface->prop.state, "connect")) - inst_connecting(inst); - else if (!strcmp(iface->prop.state, "connected")) - inst_connected(inst); - } - } -} - -static void -cb_if_policy(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - // .. iface->prop.policy: - // unknown - // off - // ignore - // auto - // ask - // - printf("IF %s\n", iface->ifpath); - printf(" POLICY: %s\n", iface->prop.policy); - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - { - if (!strcmp(iface->prop.policy, "unknown")) - inst_unknown(inst); - else if (!strcmp(iface->prop.policy, "off")) - inst_off(inst); - else if (!strcmp(iface->prop.policy, "ignore")) - inst_off(inst); - else if (!strcmp(iface->prop.policy, "auto")) - inst_on(inst); - else if (!strcmp(iface->prop.policy, "ask")) - inst_on(inst); - } - } -} - -static void -cb_main_if_add(void *data, Interface *iface, Interface_Network *ifnet) -{ - Eina_List *l; - - printf("IF++ %s\n", iface->ifpath); - ifaces = eina_list_append(ifaces, iface); - iface_callback_add(iface, IFACE_EVENT_DEL, cb_if_del, NULL); - iface_callback_add(iface, IFACE_EVENT_IPV4_CHANGE, cb_if_ipv4, NULL); - iface_callback_add(iface, IFACE_EVENT_NETWORK_SELECTION_CHANGE, cb_if_net_sel, NULL); - iface_callback_add(iface, IFACE_EVENT_SCAN_NETWORK_ADD, cb_if_scan_net_add, NULL); - iface_callback_add(iface, IFACE_EVENT_SCAN_NETWORK_DEL, cb_if_scan_net_del, NULL); - iface_callback_add(iface, IFACE_EVENT_SCAN_NETWORK_CHANGE, cb_if_scan_net_change, NULL); - iface_callback_add(iface, IFACE_EVENT_SIGNAL_CHANGE, cb_if_signal, NULL); - iface_callback_add(iface, IFACE_EVENT_STATE_CHANGE, cb_if_state, NULL); - iface_callback_add(iface, IFACE_EVENT_POLICY_CHANGE, cb_if_policy, NULL); - - for (l = instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (inst_if_matches(inst, iface)) - { - inst_enable(inst); - if (!strcmp(iface->prop.policy, "unknown")) - inst_unknown(inst); - else if (!strcmp(iface->prop.policy, "off")) - inst_off(inst); - else if (!strcmp(iface->prop.policy, "ignore")) - inst_off(inst); - else if (!strcmp(iface->prop.policy, "auto")) - inst_on(inst); - else if (!strcmp(iface->prop.policy, "ask")) - inst_on(inst); - - if (inst->config.cfif->netconf) - { - // FIXME: must be ethernet - bring up netconf - } - } - if_ilist_update(l->data); - } -} - -/**/ -/***************************************************************************/ - -/***************************************************************************/ -/**/ -/* module setup */ -EAPI E_Module_Api e_modapi = -{ - E_MODULE_API_VERSION, - "Connection Manager" + GADCON_CLIENT_CLASS_VERSION, _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, _Name}; + +static const char _act_toggle_offline_mode[] = "toggle_offline_mode"; +static const char _lbl_toggle_offline_mode[] = "Toggle Offline Mode"; + +static void +_connman_actions_register(E_Connman_Module_Context *ctxt) +{ + ctxt->actions.toggle_offline_mode = e_action_add(_act_toggle_offline_mode); + if (ctxt->actions.toggle_offline_mode) + { + ctxt->actions.toggle_offline_mode->func.go = + _connman_cb_toggle_offline_mode; + e_action_predef_name_set + (_(_Name), _(_lbl_toggle_offline_mode), _act_toggle_offline_mode, + NULL, NULL, 0); + } +} + +static void +_connman_actions_unregister(E_Connman_Module_Context *ctxt) +{ + if (ctxt->actions.toggle_offline_mode) + { + e_action_predef_name_del(_(_Name), _(_lbl_toggle_offline_mode)); + e_action_del(_act_toggle_offline_mode); + } +} + +static int +_connman_manager_changed_do(void *data) +{ + E_Connman_Module_Context *ctxt = data; + + _connman_services_reload(ctxt); + + ctxt->poller.manager_changed = NULL; + return 0; +} + +static void +_connman_manager_changed(void *data, const E_Connman_Element *element __UNUSED__) +{ + E_Connman_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, 2, _connman_manager_changed_do, ctxt); +} + +static int +_connman_event_manager_in(void *data, int type __UNUSED__, void *event __UNUSED__) +{ + E_Connman_Module_Context *ctxt = data; + E_Connman_Element *element; + + ctxt->has_manager = EINA_TRUE; + + element = e_connman_manager_get(); + e_connman_element_listener_add + (element, _connman_manager_changed, ctxt, NULL); + + _connman_services_reload(ctxt); + + return 1; +} + +static int +_connman_event_manager_out(void *data, int type __UNUSED__, void *event __UNUSED__) +{ + E_Connman_Module_Context *ctxt = data; + + ctxt->has_manager = EINA_FALSE; + eina_stringshare_replace(&ctxt->technology, NULL); + + _connman_services_free(ctxt); + _connman_default_service_changed(ctxt); + + return 1; +} + +static void +_connman_events_register(E_Connman_Module_Context *ctxt) +{ + ctxt->event.manager_in = ecore_event_handler_add + (E_CONNMAN_EVENT_MANAGER_IN, _connman_event_manager_in, ctxt); + ctxt->event.manager_out = ecore_event_handler_add + (E_CONNMAN_EVENT_MANAGER_OUT, _connman_event_manager_out, ctxt); +} + +static void +_connman_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) { - connman_module = m; + E_Connman_Module_Context *ctxt; + E_DBus_Connection *c; - conf_network_edd = E_CONFIG_DD_NEW("Conf_Network", Conf_Network); - E_CONFIG_VAL(conf_network_edd, Conf_Network, name, STR); - E_CONFIG_VAL(conf_network_edd, Conf_Network, essid, STR); - E_CONFIG_VAL(conf_network_edd, Conf_Network, password, STR); - E_CONFIG_VAL(conf_network_edd, Conf_Network, ip, STR); - E_CONFIG_VAL(conf_network_edd, Conf_Network, gateway, STR); - E_CONFIG_VAL(conf_network_edd, Conf_Network, netmask, STR); - E_CONFIG_VAL(conf_network_edd, Conf_Network, dhcp, INT); - E_CONFIG_VAL(conf_network_edd, Conf_Network, remember_password, INT); - E_CONFIG_VAL(conf_network_edd, Conf_Network, use_always, INT); + e_str_idle = eina_stringshare_add("idle"); + e_str_association = eina_stringshare_add("association"); + e_str_configuration = eina_stringshare_add("configuration"); + e_str_ready = eina_stringshare_add("ready"); + e_str_disconnect = eina_stringshare_add("disconnect"); + e_str_failure = eina_stringshare_add("failure"); - conf_interface_edd = E_CONFIG_DD_NEW("Conf_Interface", Conf_Interface); - E_CONFIG_VAL(conf_interface_edd, Conf_Interface, name, STR); - E_CONFIG_VAL(conf_interface_edd, Conf_Interface, id, STR); - E_CONFIG_VAL(conf_interface_edd, Conf_Interface, ifpath, STR); - E_CONFIG_VAL(conf_interface_edd, Conf_Interface, ifmode, INT); - E_CONFIG_SUB(conf_interface_edd, Conf_Interface, netconf, conf_network_edd); + c = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!c) + return NULL; + if (!e_connman_system_init(c)) + return NULL; - conf_edd = E_CONFIG_DD_NEW("Conf", Conf); - E_CONFIG_LIST(conf_edd, Conf, interfaces, conf_interface_edd); - E_CONFIG_LIST(conf_edd, Conf, networks, conf_network_edd); + ctxt = E_NEW(E_Connman_Module_Context, 1); + if (!ctxt) + return NULL; - conf = e_config_domain_load("module.connman", conf_edd); + _connman_actions_register(ctxt); + e_gadcon_provider_register(&_gc_class); - connman_dbus = e_dbus_bus_get(DBUS_BUS_SYSTEM); - if (connman_dbus) - { - iface_system_callback_add(IFACE_EVENT_ADD, cb_main_if_add, NULL); - iface_system_init(connman_dbus); - } + _connman_events_register(ctxt); - e_gadcon_provider_register(&_gadcon_class); - return m; + connman_mod = m; + return ctxt; +} + +static void +_connman_instances_free(E_Connman_Module_Context *ctxt) +{ + while (ctxt->instances) + { + E_Connman_Instance *inst; + + inst = ctxt->instances->data; + e_object_del(E_OBJECT(inst->gcc)); + } } EAPI int e_modapi_shutdown(E_Module *m) { - // FIXME: free conf + E_Connman_Module_Context *ctxt; + E_Connman_Element *element; - E_CONFIG_DD_FREE(conf_network_edd); - E_CONFIG_DD_FREE(conf_interface_edd); - E_CONFIG_DD_FREE(conf_edd); + ctxt = m->data; + if (!ctxt) + return 0; - conf_network_edd = NULL; - conf_interface_edd = NULL; - conf_edd = NULL; + element = e_connman_manager_get(); + e_connman_element_listener_del + (element, _connman_manager_changed, ctxt); - e_gadcon_provider_unregister(&_gadcon_class); - if (connman_dbus) - { - if (ifaces) - { - eina_list_free(ifaces); - ifaces = NULL; - } - iface_system_shutdown(); -// e_dbus_connection_close(connman_dbus); - connman_dbus = NULL; - } + _connman_events_unregister(ctxt); - connman_module = NULL; + _connman_instances_free(ctxt); + _connman_services_free(ctxt); + + _connman_actions_unregister(ctxt); + e_gadcon_provider_unregister(&_gc_class); + + if (ctxt->poller.default_service_changed) + ecore_poller_del(ctxt->poller.default_service_changed); + if (ctxt->poller.manager_changed) + ecore_poller_del(ctxt->poller.manager_changed); + + E_FREE(ctxt); + connman_mod = NULL; + + e_connman_system_shutdown(); + + eina_stringshare_replace(&e_str_idle, NULL); + eina_stringshare_replace(&e_str_association, NULL); + eina_stringshare_replace(&e_str_configuration, NULL); + eina_stringshare_replace(&e_str_ready, NULL); + eina_stringshare_replace(&e_str_disconnect, NULL); + eina_stringshare_replace(&e_str_failure, NULL); return 1; } @@ -1544,6 +1017,10 @@ e_modapi_shutdown(E_Module *m) EAPI int e_modapi_save(E_Module *m) { - if (conf) e_config_domain_save("module.connman", conf_edd, conf); + E_Connman_Module_Context *ctxt; + + ctxt = m->data; + if (!ctxt) + return 0; return 1; } diff --git a/src/modules/connman/e_mod_main.h b/src/modules/connman/e_mod_main.h index 2eb60362e..4eca1959a 100644 --- a/src/modules/connman/e_mod_main.h +++ b/src/modules/connman/e_mod_main.h @@ -4,8 +4,89 @@ #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H -EAPI extern E_Module_Api e_modapi; +#include "config.h" +#include +#include +#define MOD_CONF_VERSION 2 + + +typedef struct E_Connman_Instance E_Connman_Instance; +typedef struct E_Connman_Module_Context E_Connman_Module_Context; +typedef struct E_Connman_Service E_Connman_Service; + +struct E_Connman_Instance +{ + E_Connman_Module_Context *ctxt; + E_Gadcon_Client *gcc; + E_Gadcon_Popup *popup; + E_Menu *menu; + + struct + { + Evas_Object *gadget; + Evas_Object *toggle_offline; + Evas_Object *button; + Evas_Object *table; + struct + { + Ecore_X_Window win; + Ecore_Event_Handler *mouse_up; + Ecore_Event_Handler *key_down; + } input; + } ui; +}; + +struct E_Connman_Service +{ + EINA_INLIST; + E_Connman_Module_Context *ctxt; + E_Connman_Element *element; + const char *path; + const char *name; + const char *type; + const char *mode; + const char *state; + const char *error; + const char *security; + const char *ipv4_method; + const char *ipv4_address; + const char *ipv4_netmask; + unsigned char strength; + Eina_Bool favorite:1; + Eina_Bool auto_connect:1; + Eina_Bool pass_required:1; +}; + +struct E_Connman_Module_Context +{ + Eina_List *instances; + + struct st_connman_actions + { + E_Action *toggle_offline_mode; + } actions; + + struct + { + Ecore_Event_Handler *manager_in; + Ecore_Event_Handler *manager_out; + } event; + + struct + { + Ecore_Poller *default_service_changed; + Ecore_Poller *manager_changed; + } poller; + + Eina_Bool has_manager:1; + Eina_Bool offline_mode; + const char *technology; + const E_Connman_Service *default_service; + Eina_Inlist *services; +}; + +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);