[gnome-control-center] network: Export net_device_get_find_connection() so it can be used by future network devices



commit cd765a1267b01c843fdf10ad122e4b8daab973c2
Author: Richard Hughes <richard hughsie com>
Date:   Mon Jul 16 17:28:09 2012 +0100

    network: Export net_device_get_find_connection() so it can be used by future network devices

 panels/network/cc-network-panel.c |  168 ++-----------------------------------
 panels/network/net-device.c       |  167 ++++++++++++++++++++++++++++++++++++
 panels/network/net-device.h       |    1 +
 3 files changed, 177 insertions(+), 159 deletions(-)
---
diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c
index eae731a..b0cbcc1 100644
--- a/panels/network/cc-network-panel.c
+++ b/panels/network/cc-network-panel.c
@@ -33,8 +33,6 @@
 #include "nm-device-ethernet.h"
 #include "nm-device-modem.h"
 #include "nm-device-wifi.h"
-#include "nm-device-wimax.h"
-#include "nm-device-infiniband.h"
 #include "nm-utils.h"
 #include "nm-active-connection.h"
 #include "nm-vpn-connection.h"
@@ -1120,168 +1118,20 @@ out:
         return str;
 }
 
-/* return value must be freed by caller with g_free() */
-static gchar *
-get_mac_address_of_connection (NMConnection *connection)
-{
-        if (!connection)
-                return NULL;
-
-        const GByteArray *mac = NULL;
-
-        /* check the connection type */
-        if (nm_connection_is_type (connection,
-                                   NM_SETTING_WIRELESS_SETTING_NAME)) {
-                /* check wireless settings */
-                NMSettingWireless *s_wireless = \
-                        nm_connection_get_setting_wireless (connection);
-                if (!s_wireless)
-                        return NULL;
-                mac = nm_setting_wireless_get_mac_address (s_wireless);
-                if (mac)
-                        return nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
-        } else if (nm_connection_is_type (connection,
-                                          NM_SETTING_WIRED_SETTING_NAME)) {
-                /* check wired settings */
-                NMSettingWired *s_wired = \
-                        nm_connection_get_setting_wired (connection);
-                if (!s_wired)
-                        return NULL;
-                mac = nm_setting_wired_get_mac_address (s_wired);
-                if (mac)
-                        return nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
-        } else if (nm_connection_is_type (connection,
-                                          NM_SETTING_WIMAX_SETTING_NAME)) {
-                /* check wimax settings */
-                NMSettingWimax *s_wimax = \
-                        nm_connection_get_setting_wimax (connection);
-                if (!s_wimax)
-                        return NULL;
-                mac = nm_setting_wimax_get_mac_address (s_wimax);
-                if (mac)
-                        return nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
-        } else if (nm_connection_is_type (connection,
-                                          NM_SETTING_INFINIBAND_SETTING_NAME)) {
-                /* check infiniband settings */
-                NMSettingInfiniband *s_infiniband = \
-                        nm_connection_get_setting_infiniband (connection);
-                if (!s_infiniband)
-                        return NULL;
-                mac = nm_setting_infiniband_get_mac_address (s_infiniband);
-                if (mac)
-                        return nm_utils_hwaddr_ntoa (mac->data,
-                                                     ARPHRD_INFINIBAND);
-        }
-        /* no MAC address found */
-        return NULL;
-}
-
-/* return value must not be freed! */
-static const gchar *
-get_mac_address_of_device (NMDevice *device)
-{
-        const gchar *mac = NULL;
-        switch (nm_device_get_device_type (device)) {
-        case NM_DEVICE_TYPE_WIFI:
-        {
-                NMDeviceWifi *device_wifi = NM_DEVICE_WIFI (device);
-                mac = nm_device_wifi_get_hw_address (device_wifi);
-                break;
-        }
-        case NM_DEVICE_TYPE_ETHERNET:
-        {
-                NMDeviceEthernet *device_ethernet = NM_DEVICE_ETHERNET (device);
-                mac = nm_device_ethernet_get_hw_address (device_ethernet);
-                break;
-        }
-        case NM_DEVICE_TYPE_WIMAX:
-        {
-                NMDeviceWimax *device_wimax = NM_DEVICE_WIMAX (device);
-                mac = nm_device_wimax_get_hw_address (device_wimax);
-                break;
-        }
-        case NM_DEVICE_TYPE_INFINIBAND:
-        {
-                NMDeviceInfiniband *device_infiniband = \
-                        NM_DEVICE_INFINIBAND (device);
-                mac = nm_device_infiniband_get_hw_address (device_infiniband);
-                break;
-        }
-        default:
-                break;
-        }
-        /* no MAC address found */
-        return mac;
-}
-
-/* returns TRUE if both MACs are equal */
-static gboolean
-compare_mac_device_with_mac_connection (NMDevice *device,
-                                        NMConnection *connection)
-{
-        const gchar *mac_dev = NULL;
-        gchar *mac_conn = NULL;
-
-        mac_dev = get_mac_address_of_device (device);
-        if (mac_dev) {
-                mac_conn = get_mac_address_of_connection (connection);
-                if (mac_conn) {
-                        /* compare both MACs */
-                        if (g_strcmp0 (mac_dev, mac_conn) == 0) {
-                                g_free (mac_conn);
-                                return TRUE;
-                        }
-                        g_free (mac_conn);
-                }
-        }
-        return FALSE;
-}
-
 static NMConnection *
 find_connection_for_device (CcNetworkPanel *panel,
                             NMDevice       *device)
 {
-        /* is the device available in a active connection? */
-        NMActiveConnection *ac = nm_device_get_active_connection (device);
-        if (ac) {
-                return (NMConnection*)nm_remote_settings_get_connection_by_path \
-                        (panel->priv->remote_settings,
-                         nm_active_connection_get_connection (ac));
-        }
-
-        /* not found in active connections - check all available connections */
-        GSList *list, *filtered, *iterator;
+        NetDevice *tmp;
         NMConnection *connection;
-        list = nm_remote_settings_list_connections \
-           (panel->priv->remote_settings);
-        filtered = nm_device_filter_connections (device, list);
-
-        if (filtered) {
-                /* if list has only one connection, use this connection */
-                if (g_slist_length (filtered) == 1) {
-                        connection = filtered->data;
-                        g_slist_free (list);
-                        g_slist_free (filtered);
-                        return connection;
-                }
-
-                /* is there connection with the MAC address of the device? */
-                for (iterator = filtered; iterator; iterator = iterator->next) {
-                        connection = iterator->data;
-                        if (compare_mac_device_with_mac_connection (device,
-                                                                    connection)) {
-                                /* found a valid MAC combination */
-                                g_slist_free (list);
-                                g_slist_free (filtered);
-                                return connection;
-                        }
-                }
-        }
-
-        /* no connection found for the given device */
-        g_slist_free (list);
-        g_slist_free (filtered);
-        return NULL;
+        tmp = g_object_new (NET_TYPE_DEVICE,
+                            "client", panel->priv->client,
+                            "remote-settings", panel->priv->remote_settings,
+                            "nm-device", device,
+                            NULL);
+        connection = net_device_get_find_connection (tmp);
+        g_object_unref (tmp);
+        return connection;
 }
 
 static void
diff --git a/panels/network/net-device.c b/panels/network/net-device.c
index 6c4a805..a06c56e 100644
--- a/panels/network/net-device.c
+++ b/panels/network/net-device.c
@@ -23,6 +23,15 @@
 
 #include <glib-object.h>
 #include <glib/gi18n.h>
+#include <arpa/inet.h>
+#include <netinet/ether.h>
+
+#include <nm-device-ethernet.h>
+#include <nm-device-modem.h>
+#include <nm-device-wifi.h>
+#include <nm-device-wimax.h>
+#include <nm-device-infiniband.h>
+#include <nm-utils.h>
 
 #include "net-device.h"
 
@@ -41,6 +50,164 @@ enum {
 
 G_DEFINE_TYPE (NetDevice, net_device, NET_TYPE_OBJECT)
 
+/* return value must be freed by caller with g_free() */
+static gchar *
+get_mac_address_of_connection (NMConnection *connection)
+{
+        if (!connection)
+                return NULL;
+
+        const GByteArray *mac = NULL;
+
+        /* check the connection type */
+        if (nm_connection_is_type (connection,
+                                   NM_SETTING_WIRELESS_SETTING_NAME)) {
+                /* check wireless settings */
+                NMSettingWireless *s_wireless = nm_connection_get_setting_wireless (connection);
+                if (!s_wireless)
+                        return NULL;
+                mac = nm_setting_wireless_get_mac_address (s_wireless);
+                if (mac)
+                        return nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
+        } else if (nm_connection_is_type (connection,
+                                          NM_SETTING_WIRED_SETTING_NAME)) {
+                /* check wired settings */
+                NMSettingWired *s_wired = nm_connection_get_setting_wired (connection);
+                if (!s_wired)
+                        return NULL;
+                mac = nm_setting_wired_get_mac_address (s_wired);
+                if (mac)
+                        return nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
+        } else if (nm_connection_is_type (connection,
+                                          NM_SETTING_WIMAX_SETTING_NAME)) {
+                /* check wimax settings */
+                NMSettingWimax *s_wimax = nm_connection_get_setting_wimax (connection);
+                if (!s_wimax)
+                        return NULL;
+                mac = nm_setting_wimax_get_mac_address (s_wimax);
+                if (mac)
+                        return nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
+        } else if (nm_connection_is_type (connection,
+                                          NM_SETTING_INFINIBAND_SETTING_NAME)) {
+                /* check infiniband settings */
+                NMSettingInfiniband *s_infiniband = \
+                        nm_connection_get_setting_infiniband (connection);
+                if (!s_infiniband)
+                        return NULL;
+                mac = nm_setting_infiniband_get_mac_address (s_infiniband);
+                if (mac)
+                        return nm_utils_hwaddr_ntoa (mac->data,
+                                                     ARPHRD_INFINIBAND);
+        }
+        /* no MAC address found */
+        return NULL;
+}
+
+/* return value must not be freed! */
+static const gchar *
+get_mac_address_of_device (NMDevice *device)
+{
+        const gchar *mac = NULL;
+        switch (nm_device_get_device_type (device)) {
+        case NM_DEVICE_TYPE_WIFI:
+        {
+                NMDeviceWifi *device_wifi = NM_DEVICE_WIFI (device);
+                mac = nm_device_wifi_get_hw_address (device_wifi);
+                break;
+        }
+        case NM_DEVICE_TYPE_ETHERNET:
+        {
+                NMDeviceEthernet *device_ethernet = NM_DEVICE_ETHERNET (device);
+                mac = nm_device_ethernet_get_hw_address (device_ethernet);
+                break;
+        }
+        case NM_DEVICE_TYPE_WIMAX:
+        {
+                NMDeviceWimax *device_wimax = NM_DEVICE_WIMAX (device);
+                mac = nm_device_wimax_get_hw_address (device_wimax);
+                break;
+        }
+        case NM_DEVICE_TYPE_INFINIBAND:
+        {
+                NMDeviceInfiniband *device_infiniband = \
+                        NM_DEVICE_INFINIBAND (device);
+                mac = nm_device_infiniband_get_hw_address (device_infiniband);
+                break;
+        }
+        default:
+                break;
+        }
+        /* no MAC address found */
+        return mac;
+}
+
+/* returns TRUE if both MACs are equal */
+static gboolean
+compare_mac_device_with_mac_connection (NMDevice *device,
+                                        NMConnection *connection)
+{
+        const gchar *mac_dev = NULL;
+        gchar *mac_conn = NULL;
+
+        mac_dev = get_mac_address_of_device (device);
+        if (mac_dev != NULL) {
+                mac_conn = get_mac_address_of_connection (connection);
+                if (mac_conn) {
+                        /* compare both MACs */
+                        if (g_strcmp0 (mac_dev, mac_conn) == 0) {
+                                g_free (mac_conn);
+                                return TRUE;
+                        }
+                        g_free (mac_conn);
+                }
+        }
+        return FALSE;
+}
+
+NMConnection *
+net_device_get_find_connection (NetDevice *device)
+{
+        GSList *list, *filtered, *iterator;
+        NMConnection *connection = NULL;
+        NMActiveConnection *ac;
+        NMRemoteSettings *remote_settings;
+
+        /* is the device available in a active connection? */
+        remote_settings = net_object_get_remote_settings (NET_OBJECT (device));
+        ac = nm_device_get_active_connection (device->priv->nm_device);
+        if (ac) {
+                return (NMConnection*)nm_remote_settings_get_connection_by_path (remote_settings,
+                                        nm_active_connection_get_connection (ac));
+        }
+
+        /* not found in active connections - check all available connections */
+        list = nm_remote_settings_list_connections (remote_settings);
+        filtered = nm_device_filter_connections (device->priv->nm_device, list);
+        if (filtered != NULL) {
+                /* if list has only one connection, use this connection */
+                if (g_slist_length (filtered) == 1) {
+                        connection = filtered->data;
+                        goto out;
+                }
+
+                /* is there connection with the MAC address of the device? */
+                for (iterator = filtered; iterator; iterator = iterator->next) {
+                        connection = iterator->data;
+                        if (compare_mac_device_with_mac_connection (device->priv->nm_device,
+                                                                    connection)) {
+                                goto out;
+                        }
+                }
+        }
+
+        /* no connection found for the given device */
+        connection = NULL;
+out:
+        g_slist_free (list);
+        g_slist_free (filtered);
+        return connection;
+}
+
 static void
 state_changed_cb (NMDevice *device,
                   NMDeviceState new_state,
diff --git a/panels/network/net-device.h b/panels/network/net-device.h
index 709f909..283fa3f 100644
--- a/panels/network/net-device.h
+++ b/panels/network/net-device.h
@@ -56,6 +56,7 @@ NetDevice       *net_device_new                         (void);
 void             net_device_set_nm_device               (NetDevice      *device,
                                                          NMDevice       *nm_device);
 NMDevice        *net_device_get_nm_device               (NetDevice      *device);
+NMConnection    *net_device_get_find_connection         (NetDevice      *device);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]