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);

-- 


Reply via email to