okra pushed a commit to branch master. http://git.enlightenment.org/enlightenment/gadgets/wireless.git/commit/?id=5736bd5aae339ef5c0f79b441c85abc8a40f459f
commit 5736bd5aae339ef5c0f79b441c85abc8a40f459f Author: Stephen Houston <stephen@localhost.localdomain> Date: Wed Nov 29 16:39:53 2017 -0600 Track when connections are created and deleted. --- src/networkmanager.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 3 deletions(-) diff --git a/src/networkmanager.c b/src/networkmanager.c index 037a164..55f627a 100644 --- a/src/networkmanager.c +++ b/src/networkmanager.c @@ -3,10 +3,16 @@ #define NETWORKMANAGER_BUS_NAME "org.freedesktop.NetworkManager" #define NETWORKMANAGER_BUS_PATH "/org/freedesktop/NetworkManager" #define NETWORKMANAGER_BUS_INTERFACE NETWORKMANAGER_BUS_NAME + +#define NETWORKMANAGER_CONN_BUS_PATH "/org/freedesktop/NetworkManager/Settings" +#define NETWORKMANAGER_CONN_BUS_INTERFACE NETWORKMANAGER_BUS_INTERFACE ".Settings" + #define NETWORKMANAGER_AGENT_MANAGER NETWORKMANAGER_BUS_NAME ".AgentManager" #define NETWORKMANAGER_AGENT_MANAGER_PATH NETWORKMANAGER_BUS_PATH "/AgentManager" + #define NETWORKMANAGER_SECRET_AGENT "org.freedesktop.NetworkManager.SecretAgent" #define NETWORKMANAGER_SECRET_AGENT_PATH "/org/freedesktop/NetworkManager/SecretAgent" + #define NETWORKMANAGER_AGENT_NAME "org.wireless.networkmanager.agent" #define NETWORKMANAGER_SERVICE_TYPE_ITER(i) \ @@ -146,9 +152,11 @@ static Eldbus_Pending *pending_getdevices; static Eldbus_Pending *pending_getactive; static Eldbus_Proxy *proxy_manager; static Eldbus_Proxy *agent_proxy_manager; +static Eldbus_Proxy *conn_proxy_manager; static Eina_List *pending_technologies; static Eina_List *sig_handlers; static Eldbus_Service_Interface *agent_iface; +static int active_connection_type; static const char *active_connection; Eldbus_Connection *dbus_conn; @@ -2182,8 +2190,10 @@ _networkmanager_manager_getactive_conn(void *data EINA_UNUSED, const Eldbus_Mess if (!ns->path) continue; if (eina_streq(ns->path, conn_path)) { - ns->is_active_connection = EINA_TRUE; + active_connection_type = i; + ns->is_active_connection = EINA_TRUE; _networkmanager_service_state(ns, networkmanager_technology[i].state); + break; } } } @@ -2234,6 +2244,7 @@ _networkmanager_manager_getactive(void *data EINA_UNUSED, const Eldbus_Message * } _networkmanager_update_networks(i); } + active_connection_type = -1; return; } obj = eldbus_object_get(dbus_conn, NETWORKMANAGER_BUS_NAME, conn_path); @@ -2354,6 +2365,7 @@ _networkmanager_manager_update_prop(void *data EINA_UNUSED, const void *msg, Eld } _networkmanager_update_networks(i); } + active_connection_type = -1; return; } obj = eldbus_object_get(dbus_conn, NETWORKMANAGER_BUS_NAME, conn_path); @@ -2365,6 +2377,138 @@ _networkmanager_manager_update_prop(void *data EINA_UNUSED, const void *msg, Eld } static void +_networkmanager_add_con_addservice(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) +{ + const char *path, *name, *text; + Eldbus_Message_Iter *it, *array; + pending_technologies = eina_list_remove(pending_technologies, pending); + NetworkManager_Technology *nt = data; + NetworkManager_Service *ns; + + it = eldbus_message_iter_get(msg); + if (eldbus_message_error_get(msg, &name, &text)) + { + ERR("Could not get technology connection %s: %s", name, text); + return; + } + if (!eldbus_message_iter_arguments_get(it, "a{sv}", &array)) + { + ERR("Could not get connection settings %p", msg); + return; + } + path = eldbus_pending_path_get(pending); + ns = _networkmanager_service_new(nt->type, nt->state, path, array); + if (ns) ns->device_proxy = nt->proxy; + _networkmanager_update_networks(nt->type); +} + +static void +_networkmanager_add_con_getsettings(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) +{ + const char *name, *text, *path = data, *main_setting, *setting; + Eldbus_Message_Iter *it, *array, *array2, *array3, *array4, *variant; + pending_technologies = eina_list_remove(pending_technologies, pending); + + it = eldbus_message_iter_get(msg); + if (eldbus_message_error_get(msg, &name, &text)) + { + ERR("Could not get technology connection %s: %s", name, text); + return; + } + if (!eldbus_message_iter_arguments_get(it, "a{sv}", &array)) + { + ERR("Could not get connection settings %p", msg); + return; + } + while (eldbus_message_iter_get_and_next(array, 'e', &array2)) + { + if (!eldbus_message_iter_arguments_get(array2, "sa{sv}", &main_setting, &array3)) + { + ERR("Could not get technology settings array %p", msg); + return; + } + while (eldbus_message_iter_get_and_next(array3, 'e', &array4)) + { + if (!eldbus_message_iter_arguments_get(array4, "sv", &setting, &variant)) + { + ERR("Could not get technology settings array %p", msg); + return; + } + if (eina_streq(main_setting, "connection") && eina_streq(setting, "type")) + { + const char *type; + NetworkManager_Technology *nt; + + if (!eldbus_message_iter_arguments_get(variant, "s", &type)) + { + ERR("Could not parse settings array %p", msg); + continue; + } + if (eina_streq(type, "802-3-ethernet")) + nt = &networkmanager_technology[0]; + else if (eina_streq(type, "802-11-wireless")) + nt = &networkmanager_technology[1]; + else if (eina_streq(type, "bluetooth")) + nt = &networkmanager_technology[2]; + else if (eina_streq(type, "gdm") || eina_streq(type, "cdma")) + nt = &networkmanager_technology[3]; + if (nt) + { + Eldbus_Object *obj; + Eldbus_Proxy *proxy; + Eldbus_Pending *pend; + obj = eldbus_object_get(dbus_conn, NETWORKMANAGER_BUS_NAME, path); + proxy = eldbus_proxy_get(obj, NETWORKMANAGER_BUS_INTERFACE ".Settings.Connection"); + pend = eldbus_proxy_call(proxy, "GetSettings", + _networkmanager_add_con_addservice, nt, -1, ""); + pending_technologies = eina_list_append(pending_technologies, pend); + } + break; + } + } + } + } + +static void +_networkmanager_manager_event_connection_add(void *data EINA_UNUSED, const Eldbus_Message *msg) +{ + const char *path; + Eldbus_Object *obj; + Eldbus_Proxy *proxy; + Eldbus_Pending *pend; + + if (!eldbus_message_arguments_get(msg, "o", &path)) + { + ERR("Could not parse connection update %p", msg); + return; + } + obj = eldbus_object_get(dbus_conn, NETWORKMANAGER_BUS_NAME, path); + proxy = eldbus_proxy_get(obj, NETWORKMANAGER_BUS_INTERFACE ".Settings.Connection"); + pend = eldbus_proxy_call(proxy, "GetSettings", + _networkmanager_add_con_getsettings, path, -1, ""); + pending_technologies = eina_list_append(pending_technologies, pend); +} + +static void +_networkmanager_manager_event_connection_remove(void *data EINA_UNUSED, const Eldbus_Message *msg) +{ + const char *path; + NetworkManager_Service *ns; + int i; + + if (!eldbus_message_arguments_get(msg, "o", &path)) + { + ERR("Could not parse property update %p", msg); + return; + } + ns = _networkmanager_service_find_path(path); + EINA_SAFETY_ON_NULL_RETURN(ns); + i = ns->type; + _networkmanager_service_free(ns); + _networkmanager_update_networks(i); +} + +static void _networkmanager_manager_event_property(void *data EINA_UNUSED, const Eldbus_Message *msg) { Eldbus_Message_Iter *var; @@ -2477,9 +2621,11 @@ _networkmanager_manager_agent_register(void *data EINA_UNUSED, const Eldbus_Mess static void _networkmanager_start(void) { - Eldbus_Object *obj, *agent_obj; + Eldbus_Object *obj, *agent_obj, *conn_obj; int i; + active_connection_type = -1; + NETWORKMANAGER_SERVICE_TYPE_ITER(i) { networkmanager_technology[i].type = -1; @@ -2491,6 +2637,8 @@ _networkmanager_start(void) proxy_manager = eldbus_proxy_get(obj, NETWORKMANAGER_BUS_INTERFACE); agent_obj = eldbus_object_get(dbus_conn, NETWORKMANAGER_BUS_NAME, NETWORKMANAGER_AGENT_MANAGER_PATH); agent_proxy_manager = eldbus_proxy_get(agent_obj, NETWORKMANAGER_AGENT_MANAGER); + conn_obj = eldbus_object_get(dbus_conn, NETWORKMANAGER_BUS_NAME, NETWORKMANAGER_CONN_BUS_PATH); + conn_proxy_manager = eldbus_proxy_get(conn_obj, NETWORKMANAGER_CONN_BUS_INTERFACE); pending_getproperties_manager = eldbus_proxy_call(proxy_manager, "state", _networkmanager_manager_getstate, @@ -2510,7 +2658,12 @@ _networkmanager_start(void) sig_handlers = eina_list_append(sig_handlers, eldbus_proxy_signal_handler_add(proxy_manager, "PropertiesChanged", _networkmanager_manager_event_property, NULL)); - + sig_handlers = eina_list_append(sig_handlers, + eldbus_proxy_signal_handler_add(conn_proxy_manager, "NewConnection", + _networkmanager_manager_event_connection_add, NULL)); + sig_handlers = eina_list_append(sig_handlers, + eldbus_proxy_signal_handler_add(conn_proxy_manager, "ConnectionRemoved", + _networkmanager_manager_event_connection_remove, NULL)); } static void @@ -2548,6 +2701,8 @@ _networkmanager_end(void) pending_getproperties_manager = NULL; _eldbus_proxy_del(agent_proxy_manager); agent_proxy_manager = NULL; + _eldbus_proxy_del(conn_proxy_manager); + conn_proxy_manager = NULL; _eldbus_proxy_del(proxy_manager); proxy_manager = NULL; eldbus_service_object_unregister(agent_iface); --