network-manager-applet r488 - in branches/network-manager-applet-0-6: . src



Author: tambeti
Date: Wed Jan 30 20:32:27 2008
New Revision: 488
URL: http://svn.gnome.org/viewvc/network-manager-applet?rev=488&view=rev

Log:
2008-01-30  Tambet Ingo  <tambet gmail com>

        Implement 802.1x wired authentication.



Added:
   branches/network-manager-applet-0-6/src/nm-wired-dialog.c
   branches/network-manager-applet-0-6/src/nm-wired-dialog.h
Modified:
   branches/network-manager-applet-0-6/ChangeLog
   branches/network-manager-applet-0-6/configure.ac
   branches/network-manager-applet-0-6/src/Makefile.am
   branches/network-manager-applet-0-6/src/applet-dbus-devices.c
   branches/network-manager-applet-0-6/src/applet-dbus-devices.h
   branches/network-manager-applet-0-6/src/applet-dbus-info.c
   branches/network-manager-applet-0-6/src/applet-dbus.c
   branches/network-manager-applet-0-6/src/applet.c
   branches/network-manager-applet-0-6/src/applet.h
   branches/network-manager-applet-0-6/src/nm-device.c
   branches/network-manager-applet-0-6/src/nm-device.h
   branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.c
   branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.h
   branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.c
   branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.h
   branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.c
   branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.h
   branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.c
   branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.h
   branches/network-manager-applet-0-6/src/nm-gconf-wso.c
   branches/network-manager-applet-0-6/src/nm-gconf-wso.h
   branches/network-manager-applet-0-6/src/other-network-dialog.c
   branches/network-manager-applet-0-6/src/passphrase-dialog.c
   branches/network-manager-applet-0-6/src/passphrase-dialog.h
   branches/network-manager-applet-0-6/src/wireless-network.c
   branches/network-manager-applet-0-6/src/wireless-network.h
   branches/network-manager-applet-0-6/src/wso-wpa-eap.c
   branches/network-manager-applet-0-6/src/wso-wpa-eap.h

Modified: branches/network-manager-applet-0-6/configure.ac
==============================================================================
--- branches/network-manager-applet-0-6/configure.ac	(original)
+++ branches/network-manager-applet-0-6/configure.ac	Wed Jan 30 20:32:27 2008
@@ -100,7 +100,7 @@
 AC_SUBST(GTHREAD_CFLAGS)
 AC_SUBST(GTHREAD_LIBS)
 
-PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.10)
+PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.8)
 AC_SUBST(GLIB_CFLAGS)
 AC_SUBST(GLIB_LIBS)
 

Modified: branches/network-manager-applet-0-6/src/Makefile.am
==============================================================================
--- branches/network-manager-applet-0-6/src/Makefile.am	(original)
+++ branches/network-manager-applet-0-6/src/Makefile.am	Wed Jan 30 20:32:27 2008
@@ -85,6 +85,8 @@
 	nm-gconf-wso-wpa-psk.h	\
 	nm-gconf-wso-leap.c	\
 	nm-gconf-wso-leap.h	\
+	nm-wired-dialog.c	\
+	nm-wired-dialog.h	\
 	gconf-helpers.c		\
 	gconf-helpers.h		\
 	nm-utils.c \

Modified: branches/network-manager-applet-0-6/src/applet-dbus-devices.c
==============================================================================
--- branches/network-manager-applet-0-6/src/applet-dbus-devices.c	(original)
+++ branches/network-manager-applet-0-6/src/applet-dbus-devices.c	Wed Jan 30 20:32:27 2008
@@ -833,7 +833,11 @@
 				for (item = networks; *item; item++)
 					nma_dbus_device_update_one_network (applet, op, *item, active_network_path);
 			}
+		} else if (type == DEVICE_TYPE_802_3_ETHERNET) {
+			if (active && strlen (active_network_path) > 0)
+				network_device_set_active_wired_network (dev, active_network_path);
 		}
+
 		dbus_free_string_array (networks);
 
 		applet->device_list = g_slist_append (applet->device_list, dev);
@@ -925,7 +929,11 @@
 			message = g_strdup (_("You are now connected to the wired network with a self-assigned address."));
 			icon = "nm-device-wired-autoip";
 		} else {
-			message = g_strdup (_("You are now connected to the wired network."));
+			if (essid)
+				message = g_strdup_printf (_("You are now connected to the wired network '%s'."), essid);
+			else
+				message = g_strdup (_("You are now connected to the wired network."));
+
 			icon = "nm-device-wired";
 		}
 	}
@@ -1286,22 +1294,56 @@
 	{
 		const char *dev_path = network_device_get_nm_path (dev);
 
-		if (network_device_is_wireless (dev))
-		{
-			/* Build up the required args */
-			dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path,
-										DBUS_TYPE_STRING, &essid,
-										DBUS_TYPE_INVALID);
+		nm_info ("Forcing device '%s'\n", dev_path);
 
-			/* If we have specific wireless security options, add them */
-			if (opt)
-				success = wso_append_dbus_params (opt, essid, message);
-		}
-		else
-		{
-			nm_info ("Forcing device '%s'\n", network_device_get_nm_path (dev));
-			dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path, DBUS_TYPE_INVALID);
+		dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path, DBUS_TYPE_INVALID);
+
+		if (essid)
+			dbus_message_append_args (message, DBUS_TYPE_STRING, &essid, DBUS_TYPE_INVALID);
+
+		if (opt)
+			success = wso_append_dbus_params (opt, essid, message);
+
+		if (success)
+			dbus_connection_send (connection, message, NULL);
+		dbus_message_unref (message);
+	}
+	else
+		nm_warning ("Couldn't allocate the dbus message\n");
+}
+
+
+void nma_dbus_set_device_with_gconf_wso (DBusConnection *connection,
+								 NetworkDevice *dev,
+								 const char *essid,
+								 NMGConfWSO *opt)
+{
+	DBusMessage *	message;
+	gboolean		success = TRUE;
+
+	g_return_if_fail (connection != NULL);
+	g_return_if_fail (dev != NULL);
+	if (network_device_is_wireless (dev))
+		g_return_if_fail (essid != NULL);
+
+	if ((message = dbus_message_new_method_call (NM_DBUS_SERVICE, NM_DBUS_PATH, NM_DBUS_INTERFACE, "setActiveDevice")))
+	{
+		const char *dev_path = network_device_get_nm_path (dev);
+
+		nm_info ("Forcing device '%s'\n", dev_path);
+
+		dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path, DBUS_TYPE_INVALID);
+
+		if (essid)
+			dbus_message_append_args (message, DBUS_TYPE_STRING, &essid, DBUS_TYPE_INVALID);
+
+		if (opt) {
+			DBusMessageIter iter;
+
+			dbus_message_iter_init_append (message, &iter);
+			success = nm_gconf_wso_serialize_dbus (opt, &iter);
 		}
+
 		if (success)
 			dbus_connection_send (connection, message, NULL);
 		dbus_message_unref (message);

Modified: branches/network-manager-applet-0-6/src/applet-dbus-devices.h
==============================================================================
--- branches/network-manager-applet-0-6/src/applet-dbus-devices.h	(original)
+++ branches/network-manager-applet-0-6/src/applet-dbus-devices.h	Wed Jan 30 20:32:27 2008
@@ -30,6 +30,7 @@
 #include "nm-device.h"
 #include "wireless-network.h"
 #include "wireless-security-option.h"
+#include "nm-gconf-wso.h"
 
 void			nma_dbus_update_one_vpn_connection		(DBusConnection *connection, const char *name, NMApplet *applet, gboolean is_active);
 void			nma_dbus_update_vpn_connections			(NMApplet *applet);
@@ -50,6 +51,12 @@
 void			nma_dbus_device_remove_one_network		(NMApplet *applet, const char *dev_path, const char *net_path);
 void			nma_dbus_update_strength				(NMApplet *applet, const char *dev_path, const char *net_path, int strength);
 void			nma_dbus_set_device					(DBusConnection *connection, NetworkDevice *dev, const char *essid, WirelessSecurityOption *opt);
+
+void			nma_dbus_set_device_with_gconf_wso		(DBusConnection *connection,
+											 NetworkDevice *dev,
+											 const char *essid,
+											 NMGConfWSO *opt);
+
 void			nma_dbus_create_network					(DBusConnection *connection, NetworkDevice *dev, const char *essid, WirelessSecurityOption *opt);
 
 void			nma_free_data_model					(NMApplet *applet);

Modified: branches/network-manager-applet-0-6/src/applet-dbus-info.c
==============================================================================
--- branches/network-manager-applet-0-6/src/applet-dbus-info.c	(original)
+++ branches/network-manager-applet-0-6/src/applet-dbus-info.c	Wed Jan 30 20:32:27 2008
@@ -36,6 +36,7 @@
 #include "applet-dbus.h"
 #include "applet-dbus-info.h"
 #include "passphrase-dialog.h"
+#include "nm-wired-dialog.h"
 #include "nm-utils.h"
 #include "nm-gconf-wso.h"
 #include "gconf-helpers.h"
@@ -89,7 +90,8 @@
 	WirelessNetwork *	net = NULL;
 	char *			temp = NULL;
 	char *			escaped_network;
-	int			we_cipher = -1;
+	NMNetworkType type = NETWORK_TYPE_ALLOWED;
+	const char *gconf_prefix = GCONF_PATH_WIRELESS_NETWORKS;
 
 	g_return_val_if_fail (applet != NULL, NULL);
 	g_return_val_if_fail (message != NULL, NULL);
@@ -106,20 +108,24 @@
 	if (!(dev = nma_get_device_for_nm_path (applet->device_list, dev_path)))
 		return NULL;
 
+	if (network_device_is_wired (dev)) {
+		type = NETWORK_TYPE_WIRED;
+		gconf_prefix = GCONF_PATH_WIRED_NETWORKS;
+	}
+
 	/* If we don't have a record of the network yet in GConf, ask for
 	 * a new key no matter what NM says.
 	 */
 	escaped_network = gconf_escape_key (essid, strlen (essid));
-	nm_gconf_get_int_helper (applet->gconf_client,
-                              GCONF_PATH_WIRELESS_NETWORKS,
-                              "we_cipher", escaped_network, &we_cipher);
 	if (!nm_gconf_get_string_helper (applet->gconf_client,
-                                      GCONF_PATH_WIRELESS_NETWORKS,
+                                      gconf_prefix,
                                       "essid",
                                       escaped_network, &temp)
          || !temp)
 		new_key = TRUE;
 
+	g_free (temp);
+
 	/* It's not a new key, so try to get the key from the keyring. */
 	if (!new_key)
 	{
@@ -132,7 +138,7 @@
 		if (applet->dropdown_menu && GTK_WIDGET_VISIBLE (GTK_WIDGET (applet->dropdown_menu)))
 			gtk_menu_shell_deactivate (GTK_MENU_SHELL (applet->dropdown_menu));
 
-		gconf_wso = nm_gconf_wso_new_deserialize_gconf (applet->gconf_client, escaped_network);
+		gconf_wso = nm_gconf_wso_new_deserialize_gconf (applet->gconf_client, type, escaped_network);
 		if (!gconf_wso) {
 			new_key = TRUE;
 			goto new_key;
@@ -149,13 +155,17 @@
 
 new_key:
 	if (new_key) {
-		/* We only ask the user for a new key when we know about the network from NM,
-		 * since throwing up a dialog with a random essid from somewhere is a security issue.
-		 */
-		if ((net = network_device_get_wireless_network_by_nm_path (dev, net_path)))
-		{
-			nmi_passphrase_dialog_destroy (applet);
-			applet->passphrase_dialog = nmi_passphrase_dialog_new (applet, 0, dev, net, message);
+		if (network_device_is_wireless (dev)) {
+			/* We only ask the user for a new key when we know about the network from NM,
+			 * since throwing up a dialog with a random essid from somewhere is a security issue.
+			 */
+			if ((net = network_device_get_wireless_network_by_nm_path (dev, net_path)))
+				nmi_passphrase_dialog_new (applet, dev, net, message);
+
+		} else if (network_device_is_wired (dev)) {
+			nma_wired_dialog_ask_password (applet, escaped_network, message);
+		} else {
+			nm_warning ("Unhandled device type ('%s')", G_OBJECT_TYPE_NAME (dev));
 		}
 	}
 
@@ -201,7 +211,8 @@
 
 	g_return_val_if_fail (applet != NULL, NULL);
 
-	nmi_passphrase_dialog_destroy (applet);
+	if (applet->passphrase_dialog)
+		gtk_widget_destroy (applet->passphrase_dialog);
 
 	return NULL;
 }
@@ -389,7 +400,7 @@
 	}
 
 	/* Get the network's security information from GConf */
-	if (!(gconf_wso = nm_gconf_wso_new_deserialize_gconf (client, escaped_network)))
+	if (!(gconf_wso = nm_gconf_wso_new_deserialize_gconf (client, type, escaped_network)))
 	{
 		nm_warning ("%s:%d - couldn't retrieve security information from "
 				"GConf for '%s'.", __FILE__, __LINE__, essid);
@@ -762,13 +773,21 @@
 	char *					key;
 	GConfEntry *				gconf_entry;
 	char *					escaped_network;
+	const char *gconf_prefix = GCONF_PATH_WIRELESS_NETWORKS;
+	NMNetworkType type = NETWORK_TYPE_ALLOWED;
 
 	g_return_if_fail (applet != NULL);
 	g_return_if_fail (essid != NULL);
 	g_return_if_fail (gconf_wso != NULL);
 
+	/* Crappy hack */
+	if (!strncmp (bssid, "WIRED", 5)) {
+		type = NETWORK_TYPE_WIRED;
+		gconf_prefix = GCONF_PATH_WIRED_NETWORKS;
+	}
+
 	escaped_network = gconf_escape_key (essid, strlen (essid));
-	key = g_strdup_printf ("%s/%s", GCONF_PATH_WIRELESS_NETWORKS, escaped_network);
+	key = g_strdup_printf ("%s/%s", gconf_prefix, escaped_network);
 	gconf_entry = gconf_client_get_entry (applet->gconf_client, key, NULL, TRUE, NULL);
 	g_free (key);
 	if (!gconf_entry)
@@ -778,7 +797,7 @@
 	}
 	gconf_entry_unref (gconf_entry);
 
-	key = g_strdup_printf ("%s/%s/essid", GCONF_PATH_WIRELESS_NETWORKS, escaped_network);
+	key = g_strdup_printf ("%s/%s/essid", gconf_prefix, escaped_network);
 	gconf_client_set_string (applet->gconf_client, key, essid, NULL);
 	g_free (key);
 
@@ -787,7 +806,7 @@
 	 */
 	if (!automatic)
 	{
-		key = g_strdup_printf ("%s/%s/timestamp", GCONF_PATH_WIRELESS_NETWORKS, escaped_network);
+		key = g_strdup_printf ("%s/%s/timestamp", gconf_prefix, escaped_network);
 		gconf_client_set_int (applet->gconf_client, key, time (NULL), NULL);
 		g_free (key);
 	}
@@ -799,7 +818,7 @@
 		gboolean		found = FALSE;
 
 		/* Get current list of access point BSSIDs for this AP from GConf */
-		key = g_strdup_printf ("%s/%s/bssids", GCONF_PATH_WIRELESS_NETWORKS, escaped_network);
+		key = g_strdup_printf ("%s/%s/bssids", gconf_prefix, escaped_network);
 		if ((value = gconf_client_get (applet->gconf_client, key, NULL)))
 		{
 			if ((value->type == GCONF_VALUE_LIST) && (gconf_value_get_list_type (value) == GCONF_VALUE_STRING))
@@ -835,7 +854,7 @@
 	}
 
 	/* Stuff the security information into GConf */
-	if (!nm_gconf_wso_serialize_gconf (gconf_wso, applet->gconf_client, escaped_network))
+	if (!nm_gconf_wso_serialize_gconf (gconf_wso, applet->gconf_client, type, escaped_network))
 	{
 		nm_warning ("%s:%d - Couldn't serialize security info for '%s'.",
 				__FILE__, __LINE__, essid);

Modified: branches/network-manager-applet-0-6/src/applet-dbus.c
==============================================================================
--- branches/network-manager-applet-0-6/src/applet-dbus.c	(original)
+++ branches/network-manager-applet-0-6/src/applet-dbus.c	Wed Jan 30 20:32:27 2008
@@ -111,7 +111,9 @@
 				{
 					nma_set_state (applet, NM_STATE_DISCONNECTED);
 					nma_set_running (applet, FALSE);
-					nmi_passphrase_dialog_destroy (applet);
+
+					if (applet->passphrase_dialog)
+						gtk_widget_destroy (applet->passphrase_dialog);
 
 					/* One last redraw to capture new state before sleeping */
 					nma_update_state (applet);

Modified: branches/network-manager-applet-0-6/src/applet.c
==============================================================================
--- branches/network-manager-applet-0-6/src/applet.c	(original)
+++ branches/network-manager-applet-0-6/src/applet.c	Wed Jan 30 20:32:27 2008
@@ -60,6 +60,7 @@
 #include "other-network-dialog.h"
 #include "passphrase-dialog.h"
 #include "menu-items.h"
+#include "nm-wired-dialog.h"
 #include "vpn-password-dialog.h"
 #include "vpn-connection.h"
 #include "nm-utils.h"
@@ -1538,7 +1539,7 @@
 			GtkCheckMenuItem *gtk_item = wired_menu_item_get_check_item (item);
 
 			wired_menu_item_update (item, device, n_devices);
-			if (network_device_get_active (device))
+			if (network_device_get_active (device) && network_device_get_active_wired_network (device) == NULL)
 				gtk_check_menu_item_set_active (gtk_item, TRUE);
 			gtk_check_menu_item_set_draw_as_radio (gtk_item, TRUE);
 
@@ -1620,6 +1621,26 @@
 	g_signal_connect (menu_item, "activate", G_CALLBACK (new_network_item_selected), applet);
 }
 
+static void wired_network_item_selected (GtkWidget *menu_item, NMApplet *applet)
+{
+	nma_wired_dialog_create (applet);
+}
+
+
+static void nma_menu_add_wired_network_item (GtkWidget *menu, NMApplet *applet)
+{
+	GtkWidget *menu_item;
+	GtkWidget *label;
+
+	menu_item = gtk_menu_item_new ();
+	label = gtk_label_new_with_mnemonic (_("Connect to 802.1X _Protected Wired Network..."));
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_container_add (GTK_CONTAINER (menu_item), label);
+	gtk_widget_show_all (menu_item);
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+	g_signal_connect (menu_item, "activate", G_CALLBACK (wired_network_item_selected), applet);
+}
+
 
 typedef struct AddNetworksCB
 {
@@ -1668,6 +1689,25 @@
 }
 
 
+static void nma_add_wired_networks (NMApplet *applet, NetworkDevice *device, GtkWidget *menu)
+{
+	GSList *networks;
+	GSList *iter;
+
+	networks = nma_wired_read_networks (applet->gconf_client);
+	for (iter = networks; iter; iter = iter->next) {
+		char *network_id = (char *) iter->data;
+		NMGConfWSO *opt;
+		GtkWidget *w;
+
+		opt = nm_gconf_wso_new_deserialize_gconf (applet->gconf_client, NETWORK_TYPE_WIRED, network_id);
+		w = nma_wired_menu_item_new (applet, device, network_id, opt);
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), w);
+	}
+
+	g_slist_free (networks);
+}
+
 /*
  * nma_has_encrypted_networks_helper
  *
@@ -1696,27 +1736,28 @@
 static void nma_menu_device_add_networks (GtkWidget *menu, NetworkDevice *dev, NMApplet *applet)
 {
 	gboolean			has_encrypted = FALSE;
-	AddNetworksCB *	add_networks_cb = NULL;
+	AddNetworksCB add_networks_cb;
 
 	g_return_if_fail (menu != NULL);
 	g_return_if_fail (applet != NULL);
 	g_return_if_fail (dev != NULL);
 
-	if (!network_device_is_wireless (dev) || !applet->wireless_enabled)
+	if (network_device_is_wired (dev)) {
+		if ((network_device_get_capabilities (dev) & NM_DEVICE_CAP_CARRIER_DETECT) && network_device_get_link (dev))
+			nma_add_wired_networks (applet, dev, menu);
+		return;
+	} else if (!network_device_is_wireless (dev) || !applet->wireless_enabled)
 		return;
 
 	/* Check for any security */
 	network_device_foreach_wireless_network (dev, nma_has_encrypted_networks_helper, &has_encrypted);
 
-	add_networks_cb = g_malloc0 (sizeof (AddNetworksCB));
-	add_networks_cb->applet = applet;
-	add_networks_cb->has_encrypted = has_encrypted;
-	add_networks_cb->menu = menu;
+	add_networks_cb.applet = applet;
+	add_networks_cb.has_encrypted = has_encrypted;
+	add_networks_cb.menu = menu;
 
 	/* Add all networks in our network list to the menu */
-	network_device_foreach_wireless_network (dev, nma_add_networks_helper, add_networks_cb);
-
-	g_free (add_networks_cb);
+	network_device_foreach_wireless_network (dev, nma_add_networks_helper, &add_networks_cb);
 }
 
 
@@ -1867,6 +1908,7 @@
 	GSList	*element;
 	gint n_wireless_interfaces = 0;
 	gint n_wired_interfaces = 0;
+	gint n_wired_interfaces_with_link = 0;
 	gboolean vpn_available, dialup_available;
 
 	g_return_if_fail (menu != NULL);
@@ -1901,6 +1943,9 @@
 				break;
 			case DEVICE_TYPE_802_3_ETHERNET:
 				n_wired_interfaces++;
+				if ((network_device_get_capabilities (dev) & NM_DEVICE_CAP_CARRIER_DETECT) &&
+				    network_device_get_link (dev))
+					n_wired_interfaces_with_link++;
 				break;
 			default:
 				break;
@@ -1961,6 +2006,12 @@
 		nma_menu_add_custom_essid_item (menu, applet);
 		nma_menu_add_create_network_item (menu, applet);
 	}
+
+
+	if (n_wired_interfaces_with_link > 0) {
+		nma_menu_add_separator_item (menu);
+		nma_menu_add_wired_network_item (menu, applet);
+	}
 }
 
 
@@ -2545,7 +2596,9 @@
 
 	nma_icons_free (applet);
 
-	nmi_passphrase_dialog_destroy (applet);
+	if (applet->passphrase_dialog)
+		gtk_widget_destroy (applet->passphrase_dialog);
+
 #ifdef ENABLE_NOTIFY
 	if (applet->notification)
 	{

Modified: branches/network-manager-applet-0-6/src/applet.h
==============================================================================
--- branches/network-manager-applet-0-6/src/applet.h	(original)
+++ branches/network-manager-applet-0-6/src/applet.h	Wed Jan 30 20:32:27 2008
@@ -48,6 +48,7 @@
  * Preference locations
  */
 #define GCONF_PATH_WIRELESS_NETWORKS	"/system/networking/wireless/networks"
+#define GCONF_PATH_WIRED_NETWORKS	"/system/networking/wired/networks"
 #define GCONF_PATH_WIRELESS			"/system/networking/wireless"
 #define GCONF_PATH_VPN_CONNECTIONS		"/system/networking/vpn_connections"
 #define GCONF_PATH_PREFS				"/apps/NetworkManagerApplet"

Modified: branches/network-manager-applet-0-6/src/nm-device.c
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-device.c	(original)
+++ branches/network-manager-applet-0-6/src/nm-device.c	Wed Jan 30 20:32:27 2008
@@ -53,6 +53,7 @@
 	gint			strength;
 	gint			speed;
 	GSList *		networks;
+	char *		active_wired_network;
 	NMActStage	act_stage;
 };
 
@@ -110,6 +111,7 @@
 	dev->active = src->active;
 	dev->act_stage = src->act_stage;
 	dev->strength = src->strength;
+	dev->active_wired_network = src->active_wired_network ? g_strdup (src->active_wired_network) : NULL;
 
 	for (elt = src->networks; elt; elt = g_slist_next (elt))
 	{
@@ -131,11 +133,13 @@
  * Increment the reference count of the network device
  *
  */
-void network_device_ref (NetworkDevice *dev)
+NetworkDevice *network_device_ref (NetworkDevice *dev)
 {
 	g_return_if_fail (dev != NULL);
 
 	dev->refcount++;
+
+	return dev;
 }
 
 
@@ -166,6 +170,7 @@
 		g_free (dev->ip4addr);
 		g_free (dev->primary_dns);
 		g_free (dev->secondary_dns);
+		g_free (dev->active_wired_network);
 		memset (dev, 0, sizeof (NetworkDevice));
 		g_free (dev);
 	}
@@ -406,6 +411,25 @@
 }
 
 
+void network_device_set_active_wired_network	(NetworkDevice *dev, const char *network_id)
+{
+	g_return_if_fail (dev != NULL);
+	g_return_if_fail (dev->type == DEVICE_TYPE_802_3_ETHERNET);
+
+	g_free (dev->active_wired_network);
+	dev->active_wired_network = network_id ? g_strdup (network_id) : NULL;
+}
+
+
+const char *network_device_get_active_wired_network (NetworkDevice *dev)
+{
+	g_return_val_if_fail (dev != NULL, NULL);
+	g_return_val_if_fail (dev->type == DEVICE_TYPE_802_3_ETHERNET, NULL);
+
+	return dev->active_wired_network;
+}
+
+
 /*
  * Accessors for driver name
  */
@@ -713,6 +737,9 @@
 	g_return_if_fail (dev != NULL);
 
 	dev->active = active;
+
+	if (!active && network_device_is_wired (dev))
+		network_device_set_active_wired_network (dev, NULL);
 }
 
 /*

Modified: branches/network-manager-applet-0-6/src/nm-device.h
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-device.h	(original)
+++ branches/network-manager-applet-0-6/src/nm-device.h	Wed Jan 30 20:32:27 2008
@@ -34,7 +34,7 @@
 NetworkDevice *		network_device_new						(const char *iface, NMDeviceType type, const char *nm_path);
 NetworkDevice *		network_device_copy						(NetworkDevice *src);
 
-void					network_device_ref						(NetworkDevice *dev);
+NetworkDevice *		network_device_ref						(NetworkDevice *dev);
 void					network_device_unref					(NetworkDevice *dev);
 
 gboolean				network_device_is_wired					(NetworkDevice *dev);
@@ -57,6 +57,10 @@
 
 guint				network_device_get_num_wireless_networks	(NetworkDevice *dev);
 
+void					network_device_set_active_wired_network		(NetworkDevice *dev, const char *network_id);
+const char *			network_device_get_active_wired_network		(NetworkDevice *dev);
+
+
 const char *			network_device_get_address				(NetworkDevice *dev);
 void					network_device_set_address				(NetworkDevice *dev, const char *addr);
 

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.c
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.c	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.c	Wed Jan 30 20:32:27 2008
@@ -72,13 +72,14 @@
 
 
 NMGConfWSOLEAP *
-nm_gconf_wso_leap_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher)
+nm_gconf_wso_leap_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher)
 {
 	NMGConfWSOLEAP *	security = NULL;
 	char *			username = NULL;
 	char *			key_mgmt = NULL;
 
 	g_return_val_if_fail (client != NULL, NULL);
+	g_return_val_if_fail (type == NETWORK_TYPE_ALLOWED, NULL);
 	g_return_val_if_fail (network != NULL, NULL);
 	g_return_val_if_fail ((we_cipher == NM_AUTH_TYPE_LEAP), NULL);
 
@@ -116,11 +117,13 @@
 }
 
 static gboolean 
-real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *network)
+real_serialize_gconf (NMGConfWSO *instance, NMNetworkType type, GConfClient *client, const char *network)
 {
 	NMGConfWSOLEAP *	self = NM_GCONF_WSO_LEAP (instance);
 	char *			key;
 
+	g_return_val_if_fail (type == NETWORK_TYPE_ALLOWED, FALSE);
+
 	key = g_strdup_printf ("%s/%s/%susername", GCONF_PATH_WIRELESS_NETWORKS, network, LEAP_PREFIX);
 	gconf_client_set_string (client, key, self->priv->username, NULL);
 	g_free (key);

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.h
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.h	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-leap.h	Wed Jan 30 20:32:27 2008
@@ -55,6 +55,6 @@
 
 NMGConfWSOLEAP * nm_gconf_wso_leap_new_deserialize_dbus (DBusMessageIter *iter, int we_cipher);
 
-NMGConfWSOLEAP * nm_gconf_wso_leap_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher);
+NMGConfWSOLEAP * nm_gconf_wso_leap_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher);
 
 #endif	/* NM_GCONF_WSO_LEAP_H */

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.c
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.c	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.c	Wed Jan 30 20:32:27 2008
@@ -67,12 +67,13 @@
 }
 
 NMGConfWSOWEP *
-nm_gconf_wso_wep_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher)
+nm_gconf_wso_wep_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher)
 {
 	NMGConfWSOWEP *	security = NULL;
 	int				auth_algorithm;
 
 	g_return_val_if_fail (client != NULL, NULL);
+	g_return_val_if_fail (type == NETWORK_TYPE_ALLOWED, NULL);
 	g_return_val_if_fail (network != NULL, NULL);
 	g_return_val_if_fail ((we_cipher == IW_AUTH_CIPHER_WEP40) || (we_cipher == IW_AUTH_CIPHER_WEP104), NULL);
 
@@ -105,11 +106,13 @@
 }
 
 static gboolean 
-real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *network)
+real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, NMNetworkType type, const char *network)
 {
 	NMGConfWSOWEP *self = NM_GCONF_WSO_WEP (instance);
 	char *		key;
 
+	g_return_val_if_fail (type == NETWORK_TYPE_ALLOWED, FALSE);
+
 	key = g_strdup_printf ("%s/%s/%sauth_algorithm", GCONF_PATH_WIRELESS_NETWORKS, network, WEP_PREFIX);
 	gconf_client_set_int (client, key, self->priv->auth_algorithm, NULL);
 	g_free (key);

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.h
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.h	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-wep.h	Wed Jan 30 20:32:27 2008
@@ -58,6 +58,7 @@
                                                         int we_cipher);
 
 NMGConfWSOWEP * nm_gconf_wso_wep_new_deserialize_gconf (GConfClient *client,
+														NMNetworkType type,
                                                         const char *network,
                                                         int we_cipher);
 

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.c
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.c	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.c	Wed Jan 30 20:32:27 2008
@@ -102,9 +102,10 @@
 
 
 NMGConfWSOWPA_EAP *
-nm_gconf_wso_wpa_eap_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher)
+nm_gconf_wso_wpa_eap_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher)
 {
 	NMGConfWSOWPA_EAP *	security = NULL;
+	const char *gconf_prefix;
 	char *			identity = NULL;
 	char *			anon_identity = NULL;
 	char *			private_key_file = NULL;
@@ -120,62 +121,71 @@
 	g_return_val_if_fail (network != NULL, NULL);
 	g_return_val_if_fail ((we_cipher == NM_AUTH_TYPE_WPA_EAP), NULL);
 
+	if (type == NETWORK_TYPE_ALLOWED)
+		gconf_prefix = GCONF_PATH_WIRELESS_NETWORKS;
+	else if (type == NETWORK_TYPE_WIRED)
+		gconf_prefix = GCONF_PATH_WIRED_NETWORKS;
+	else {
+		nm_warning ("Invalid network type");
+		return NULL;
+	}
+
 	nm_gconf_get_int_helper (client,
-						GCONF_PATH_WIRELESS_NETWORKS,
+						gconf_prefix,
 						WPA_EAP_PREFIX"eap_method",
 						network,
 						&eap_method);
 
 	nm_gconf_get_int_helper (client,
-						GCONF_PATH_WIRELESS_NETWORKS,
+						gconf_prefix,
 						WPA_EAP_PREFIX"key_type",
 						network,
 						&key_type);
 
 	nm_gconf_get_int_helper (client,
-						GCONF_PATH_WIRELESS_NETWORKS,
+						gconf_prefix,
 						WPA_EAP_PREFIX"phase2_type",
 						network,
 						&phase2_type);
 
 	nm_gconf_get_int_helper (client,
-						GCONF_PATH_WIRELESS_NETWORKS,
+						gconf_prefix,
 						WPA_EAP_PREFIX"wpa_version",
 						network,
 						&wpa_version);
 
 	nm_gconf_get_int_helper (client,
-						GCONF_PATH_WIRELESS_NETWORKS,
+						gconf_prefix,
 						WPA_EAP_PREFIX"key_mgt",
 						network,
 						&key_mgmt);
 
 	nm_gconf_get_string_helper (client,
-						   GCONF_PATH_WIRELESS_NETWORKS,
+						   gconf_prefix,
 						   WPA_EAP_PREFIX"identity",
 						   network,
 						   &identity);
 
 	nm_gconf_get_string_helper (client,
-						   GCONF_PATH_WIRELESS_NETWORKS,
+						   gconf_prefix,
 						   WPA_EAP_PREFIX"anon_identity",
 						   network,
 						   &anon_identity);
 
 	nm_gconf_get_string_helper (client,
-						   GCONF_PATH_WIRELESS_NETWORKS,
+						   gconf_prefix,
 						   WPA_EAP_PREFIX"private_key_file",
 						   network,
 						   &private_key_file);
 
 	nm_gconf_get_string_helper (client,
-						   GCONF_PATH_WIRELESS_NETWORKS,
+						   gconf_prefix,
 						   WPA_EAP_PREFIX"client_cert_file",
 						   network,
 						   &client_cert_file);
 
 	nm_gconf_get_string_helper (client,
-						   GCONF_PATH_WIRELESS_NETWORKS,
+						   gconf_prefix,
 						   WPA_EAP_PREFIX"ca_cert_file",
 						   network,
 						   &ca_cert_file);
@@ -225,62 +235,72 @@
 }
 
 static gboolean 
-real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *network)
+real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, NMNetworkType type, const char *network)
 {
 	NMGConfWSOWPA_EAP *	self = NM_GCONF_WSO_WPA_EAP (instance);
+	const char *gconf_prefix;
 	char *			key;
 
-	key = g_strdup_printf ("%s/%s/%seap_method", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+	if (type == NETWORK_TYPE_ALLOWED)
+		gconf_prefix = GCONF_PATH_WIRELESS_NETWORKS;
+	else if (type == NETWORK_TYPE_WIRED)
+		gconf_prefix = GCONF_PATH_WIRED_NETWORKS;
+	else {
+		nm_warning ("Invalid network type");
+		return FALSE;
+	}
+
+	key = g_strdup_printf ("%s/%s/%seap_method", gconf_prefix, network, WPA_EAP_PREFIX);
 	gconf_client_set_int (client, key, self->priv->eap_method, NULL);
 	g_free (key);
 
-	key = g_strdup_printf ("%s/%s/%skey_type", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+	key = g_strdup_printf ("%s/%s/%skey_type", gconf_prefix, network, WPA_EAP_PREFIX);
 	gconf_client_set_int (client, key, self->priv->key_type, NULL);
 	g_free (key);
 
-	key = g_strdup_printf ("%s/%s/%sphase2_type", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+	key = g_strdup_printf ("%s/%s/%sphase2_type", gconf_prefix, network, WPA_EAP_PREFIX);
 	gconf_client_set_int (client, key, self->priv->phase2_type, NULL);
 	g_free (key);
 
-	key = g_strdup_printf ("%s/%s/%swpa_version", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+	key = g_strdup_printf ("%s/%s/%swpa_version", gconf_prefix, network, WPA_EAP_PREFIX);
 	gconf_client_set_int (client, key, self->priv->wpa_version, NULL);
 	g_free (key);
 
-	key = g_strdup_printf ("%s/%s/%skey_mgt", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+	key = g_strdup_printf ("%s/%s/%skey_mgt", gconf_prefix, network, WPA_EAP_PREFIX);
 	gconf_client_set_int (client, key, self->priv->key_mgmt, NULL);
 	g_free (key);
 
 	if (self->priv->identity && strlen (self->priv->identity) > 0)
 	{
-		key = g_strdup_printf ("%s/%s/%sidentity", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+		key = g_strdup_printf ("%s/%s/%sidentity", gconf_prefix, network, WPA_EAP_PREFIX);
 		gconf_client_set_string (client, key, self->priv->identity, NULL);
 		g_free (key);
 	}
 
 	if (self->priv->anon_identity && strlen (self->priv->anon_identity) > 0)
 	{
-		key = g_strdup_printf ("%s/%s/%sanon_identity", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+		key = g_strdup_printf ("%s/%s/%sanon_identity", gconf_prefix, network, WPA_EAP_PREFIX);
 		gconf_client_set_string (client, key, self->priv->anon_identity, NULL);
 		g_free (key);
 	}
 
 	if (self->priv->private_key_file && strlen (self->priv->private_key_file) > 0)
 	{
-		key = g_strdup_printf ("%s/%s/%sprivate_key_file", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+		key = g_strdup_printf ("%s/%s/%sprivate_key_file", gconf_prefix, network, WPA_EAP_PREFIX);
 		gconf_client_set_string (client, key, self->priv->private_key_file, NULL);
 		g_free (key);
 	}
 
 	if (self->priv->client_cert_file && strlen (self->priv->client_cert_file) > 0)
 	{
-		key = g_strdup_printf ("%s/%s/%sclient_cert_file", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+		key = g_strdup_printf ("%s/%s/%sclient_cert_file", gconf_prefix, network, WPA_EAP_PREFIX);
 		gconf_client_set_string (client, key, self->priv->client_cert_file, NULL);
 		g_free (key);
 	}
 
 	if (self->priv->ca_cert_file && strlen (self->priv->ca_cert_file) > 0)
 	{
-		key = g_strdup_printf ("%s/%s/%sca_cert_file", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_EAP_PREFIX);
+		key = g_strdup_printf ("%s/%s/%sca_cert_file", gconf_prefix, network, WPA_EAP_PREFIX);
 		gconf_client_set_string (client, key, self->priv->ca_cert_file, NULL);
 		g_free (key);
 	}

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.h
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.h	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-eap.h	Wed Jan 30 20:32:27 2008
@@ -57,6 +57,6 @@
 
 NMGConfWSOWPA_EAP * nm_gconf_wso_wpa_eap_new_deserialize_dbus (DBusMessageIter *iter, int we_cipher);
 
-NMGConfWSOWPA_EAP * nm_gconf_wso_wpa_eap_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher);
+NMGConfWSOWPA_EAP * nm_gconf_wso_wpa_eap_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher);
 
 #endif	/* NM_GCONF_WSO_WPA_EAP_H */

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.c
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.c	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.c	Wed Jan 30 20:32:27 2008
@@ -68,13 +68,14 @@
 }
 
 NMGConfWSOWPA_PSK *
-nm_gconf_wso_wpa_psk_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher)
+nm_gconf_wso_wpa_psk_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher)
 {
 	NMGConfWSOWPA_PSK *	security = NULL;
 	int				wpa_version;
 	int				key_mgt;
 
 	g_return_val_if_fail (client != NULL, NULL);
+	g_return_val_if_fail (type == NETWORK_TYPE_ALLOWED, NULL);
 	g_return_val_if_fail (network != NULL, NULL);
 	g_return_val_if_fail ((we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO || we_cipher == IW_AUTH_CIPHER_TKIP) || (we_cipher == IW_AUTH_CIPHER_CCMP), NULL);
 
@@ -116,11 +117,13 @@
 }
 
 static gboolean 
-real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, const char *network)
+real_serialize_gconf (NMGConfWSO *instance, GConfClient *client, NMNetworkType type, const char *network)
 {
 	NMGConfWSOWPA_PSK *	self = NM_GCONF_WSO_WPA_PSK (instance);
 	char *			key;
 
+	g_return_val_if_fail (type == NETWORK_TYPE_ALLOWED, FALSE);
+
 	key = g_strdup_printf ("%s/%s/%swpa_version", GCONF_PATH_WIRELESS_NETWORKS, network, WPA_PSK_PREFIX);
 	gconf_client_set_int (client, key, self->priv->wpa_version, NULL);
 	g_free (key);

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.h
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.h	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso-wpa-psk.h	Wed Jan 30 20:32:27 2008
@@ -56,6 +56,6 @@
 
 NMGConfWSOWPA_PSK * nm_gconf_wso_wpa_psk_new_deserialize_dbus (DBusMessageIter *iter, int we_cipher);
 
-NMGConfWSOWPA_PSK * nm_gconf_wso_wpa_psk_new_deserialize_gconf (GConfClient *client, const char *network, int we_cipher);
+NMGConfWSOWPA_PSK * nm_gconf_wso_wpa_psk_new_deserialize_gconf (GConfClient *client, NMNetworkType type, const char *network, int we_cipher);
 
 #endif	/* NM_GCONF_WSO_WPA_PSK_H */

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso.c
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso.c	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso.c	Wed Jan 30 20:32:27 2008
@@ -115,15 +115,27 @@
 
 NMGConfWSO *
 nm_gconf_wso_new_deserialize_gconf (GConfClient *client,
+							 NMNetworkType type,
                                     const char *network)
 {
 	NMGConfWSO * security = NULL;
 	int we_cipher;
+	const char *gconf_prefix;
 
 	g_return_val_if_fail (client != NULL, NULL);
 	g_return_val_if_fail (network != NULL, NULL);
+
+	if (type == NETWORK_TYPE_ALLOWED)
+		gconf_prefix = GCONF_PATH_WIRELESS_NETWORKS;
+	else if (type == NETWORK_TYPE_WIRED)
+		gconf_prefix = GCONF_PATH_WIRED_NETWORKS;
+	else {
+		nm_warning ("Invalid network type");
+		return FALSE;
+	}
+
 	if (!nm_gconf_get_int_helper (client,
-							GCONF_PATH_WIRELESS_NETWORKS,
+							gconf_prefix,
 							"we_cipher",
 							network,
 							&we_cipher))
@@ -137,21 +149,21 @@
 		{
 			case IW_AUTH_CIPHER_WEP40:
 			case IW_AUTH_CIPHER_WEP104:
-				security = NM_GCONF_WSO (nm_gconf_wso_wep_new_deserialize_gconf (client, network, we_cipher));
+				security = NM_GCONF_WSO (nm_gconf_wso_wep_new_deserialize_gconf (client, type, network, we_cipher));
 				break;
 
 			case NM_AUTH_TYPE_WPA_PSK_AUTO:
 			case IW_AUTH_CIPHER_TKIP:
 			case IW_AUTH_CIPHER_CCMP:
-				security = NM_GCONF_WSO (nm_gconf_wso_wpa_psk_new_deserialize_gconf (client, network, we_cipher));
+				security = NM_GCONF_WSO (nm_gconf_wso_wpa_psk_new_deserialize_gconf (client, type, network, we_cipher));
 				break;
 
 			case NM_AUTH_TYPE_WPA_EAP:
-				security = NM_GCONF_WSO (nm_gconf_wso_wpa_eap_new_deserialize_gconf (client, network, we_cipher));
+				security = NM_GCONF_WSO (nm_gconf_wso_wpa_eap_new_deserialize_gconf (client, type, network, we_cipher));
 				break;
 
 			case NM_AUTH_TYPE_LEAP:
-				security = NM_GCONF_WSO (nm_gconf_wso_leap_new_deserialize_gconf (client, network, we_cipher));
+				security = NM_GCONF_WSO (nm_gconf_wso_leap_new_deserialize_gconf (client, type, network, we_cipher));
 				break;
 
 			default:
@@ -236,6 +248,7 @@
 static int 
 real_serialize_gconf (NMGConfWSO *self,
                       GConfClient *client,
+				  NMNetworkType type,
                       const char *network)
 {
 	/* Nothing to do */
@@ -280,9 +293,11 @@
 gboolean
 nm_gconf_wso_serialize_gconf (NMGConfWSO *self,
                               GConfClient *client,
+						NMNetworkType type,
                               const char *network)
 {
 	char *		key;
+	const char *gconf_prefix;
 
 	g_return_val_if_fail (self != NULL, FALSE);
 	g_return_val_if_fail (client != NULL, FALSE);
@@ -291,13 +306,22 @@
 	if (self->priv->dispose_has_run)
 		return FALSE;
 
-	key = g_strdup_printf ("%s/%s/we_cipher", GCONF_PATH_WIRELESS_NETWORKS, network);
+	if (type == NETWORK_TYPE_ALLOWED)
+		gconf_prefix = GCONF_PATH_WIRELESS_NETWORKS;
+	else if (type == NETWORK_TYPE_WIRED)
+		gconf_prefix = GCONF_PATH_WIRED_NETWORKS;
+	else {
+		nm_warning ("Invalid network type");
+		return FALSE;
+	}
+
+	key = g_strdup_printf ("%s/%s/we_cipher", gconf_prefix, network);
 	gconf_client_set_int (client, key, self->priv->we_cipher, NULL);
 	g_free (key);
 
 	/* Encryption key doesn't get serialized since its stored in the keyring */
 
-	return NM_GCONF_WSO_GET_CLASS (self)->serialize_gconf_func (self, client, network);
+	return NM_GCONF_WSO_GET_CLASS (self)->serialize_gconf_func (self, client, type, network);
 }
 
 gboolean

Modified: branches/network-manager-applet-0-6/src/nm-gconf-wso.h
==============================================================================
--- branches/network-manager-applet-0-6/src/nm-gconf-wso.h	(original)
+++ branches/network-manager-applet-0-6/src/nm-gconf-wso.h	Wed Jan 30 20:32:27 2008
@@ -1,3 +1,5 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
 /* NetworkManager -- Network link manager
  *
  * Dan Williams <dcbw redhat com>
@@ -26,6 +28,7 @@
 #include <gconf/gconf-client.h>
 #include <dbus/dbus.h>
 
+#include <NetworkManager.h>
 #include "wireless-security-option.h"
 
 #define NM_TYPE_GCONF_WSO			(nm_gconf_wso_get_type ())
@@ -56,7 +59,10 @@
 	/* class members */
 	gboolean	(*serialize_dbus_func)	(NMGConfWSO *self, DBusMessageIter *iter);
 
-	gboolean	(*serialize_gconf_func)	(NMGConfWSO *self, GConfClient *client, const char *network);
+	gboolean	(*serialize_gconf_func)	(NMGConfWSO *self,
+								 GConfClient *client,
+								 NMNetworkType type,
+								 const char *network);
 
 	gboolean	(*read_secrets_func)	(NMGConfWSO *self, const char *ssid);
 
@@ -68,7 +74,9 @@
 
 NMGConfWSO * nm_gconf_wso_new_deserialize_dbus (DBusMessageIter *iter);
 
-NMGConfWSO * nm_gconf_wso_new_deserialize_gconf (GConfClient *client, const char *network);
+NMGConfWSO * nm_gconf_wso_new_deserialize_gconf (GConfClient *client,
+									    NMNetworkType type,
+									    const char *network);
 
 NMGConfWSO * nm_gconf_wso_new_from_wso (WirelessSecurityOption *opt, const char *ssid);
 
@@ -80,7 +88,10 @@
 
 gboolean nm_gconf_wso_serialize_dbus (NMGConfWSO *self, DBusMessageIter *iter);
 
-gboolean nm_gconf_wso_serialize_gconf (NMGConfWSO *self, GConfClient *client, const char *network);
+gboolean nm_gconf_wso_serialize_gconf (NMGConfWSO *self,
+							    GConfClient *client,
+							    NMNetworkType type,
+							    const char *network);
 
 gboolean nm_gconf_wso_read_secrets (NMGConfWSO *self, const char *ssid);
 

Added: branches/network-manager-applet-0-6/src/nm-wired-dialog.c
==============================================================================
--- (empty file)
+++ branches/network-manager-applet-0-6/src/nm-wired-dialog.c	Wed Jan 30 20:32:27 2008
@@ -0,0 +1,375 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
+#include <config.h>
+#include <string.h>
+#include <glade/glade.h>
+#include <glib/gi18n.h>
+
+#include "nm-wired-dialog.h"
+#include "applet-dbus-info.h"
+#include "applet-dbus-devices.h"
+#include "nm-utils.h"
+#include "NetworkManager.h"
+#include "wso-wpa-eap.h"
+
+
+#define WIRED_DIALOG_INFO_TAG "wired-dialog-info-tag"
+
+typedef struct {
+	NMApplet *applet;
+	GladeXML *xml;
+	WirelessSecurityOption *opt;
+
+	char *network_id;
+	DBusMessage *message;
+} WiredDialogInfo;
+
+static void
+wired_dialog_info_destroy (gpointer data)
+{
+	WiredDialogInfo *info = (WiredDialogInfo *) data;
+
+	g_object_unref (info->xml);
+	wso_free (info->opt);
+	g_free (info->network_id);
+
+	if (info->message)
+		dbus_message_unref (info->message);
+
+	g_free (data);
+}
+
+static void
+wired_dialog_destroyed (gpointer data, GObject *destroyed_object)
+{
+	NMApplet *applet = (NMApplet *) data;
+
+	applet->passphrase_dialog = NULL;
+}
+
+static void
+create_response (GtkDialog *dialog, gint response, gpointer data)
+{
+	WiredDialogInfo *info;
+
+	info = (WiredDialogInfo *) g_object_get_data (G_OBJECT (dialog), WIRED_DIALOG_INFO_TAG);
+	g_assert (info);
+
+	if (response == GTK_RESPONSE_OK) {
+		const char *network_id;
+		GSList *iter;
+		NetworkDevice *dev = NULL;
+
+		for (iter = info->applet->device_list; iter; iter = iter->next) {
+			dev = (NetworkDevice *) iter->data;
+			if (network_device_is_wired (dev) && network_device_get_link (dev))
+				break;
+
+			dev = NULL;
+		}
+
+		g_assert (dev);
+
+		network_id = gtk_entry_get_text (GTK_ENTRY (glade_xml_get_widget (info->xml, "network_name_entry")));
+		nma_dbus_set_device (info->applet->connection, dev, network_id, info->opt);
+	}
+
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+ask_password_response (GtkDialog *dialog, gint response, gpointer data)
+{
+	WiredDialogInfo *info;
+	NMGConfWSO *gconf_wso;
+
+	info = (WiredDialogInfo *) g_object_get_data (G_OBJECT (dialog), WIRED_DIALOG_INFO_TAG);
+	g_assert (info);
+
+	if (response != GTK_RESPONSE_OK) {
+		DBusMessage *reply;
+
+		reply = dbus_message_new_error (info->message, NMI_DBUS_USER_KEY_CANCELED_ERROR, "Request was cancelled.");
+		dbus_connection_send (info->applet->connection, reply, NULL);
+		goto out;
+	}
+
+	gconf_wso = nm_gconf_wso_new_from_wso (info->opt, info->network_id);
+
+	/* Return new security information to NM */
+	nmi_dbus_return_user_key (info->applet->connection, info->message, gconf_wso);
+	g_object_unref (gconf_wso);
+
+out:
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+wired_dialog_modified (GtkWidget *widget, gpointer user_data)
+{
+	WiredDialogInfo *info = (WiredDialogInfo *) user_data;
+	const char *network_id;
+	gboolean enabled = FALSE;
+
+	network_id = gtk_entry_get_text (GTK_ENTRY (glade_xml_get_widget (info->xml, "network_name_entry")));
+	if (network_id && strlen (network_id) > 0)
+		enabled = wso_validate_input (info->opt, network_id, NULL);
+
+	gtk_widget_set_sensitive (glade_xml_get_widget (info->xml, "ok_button"), enabled);
+}
+
+static GtkDialog *
+wired_dialog_init (NMApplet *applet, const char *network_id, DBusMessage *message)
+{
+	GladeXML *xml;
+	GtkDialog *dialog;
+	GtkWidget *w;
+	char *label;
+	GtkWidget *wso_widget;
+	WiredDialogInfo *info;
+
+	xml = glade_xml_new (applet->glade_file, "other_network_dialog", NULL);
+	if (!xml) {
+		nma_schedule_warning_dialog (applet, _("The NetworkManager Applet could not find some required resources (the glade file was not found)."));
+		return NULL;
+	}
+
+	dialog = GTK_DIALOG (glade_xml_get_widget (xml, "other_network_dialog"));
+	if (!dialog) {
+		g_object_unref (xml);
+		return NULL;
+	}
+
+	gtk_window_set_title (GTK_WINDOW (dialog), _("Connect to 802.1X protected wired network"));
+	gtk_widget_hide (glade_xml_get_widget (xml, "security_combo_label"));
+	gtk_widget_hide (glade_xml_get_widget (xml, "security_combo"));
+
+	/* FIXME: For now, hide the device selector and use the first wired device */
+	gtk_widget_hide (glade_xml_get_widget (xml, "wireless_adapter_label"));
+	gtk_widget_hide (glade_xml_get_widget (xml, "wireless_adapter_combo"));
+
+	if (network_id) {
+		label = g_strdup_printf (_("<span size=\"larger\" weight=\"bold\">Connect to a 802.1X protected wired network</span>\n\n"
+							  "A passphrase or encryption key is required to access the network '%s'."), network_id);
+		gtk_label_set_markup (GTK_LABEL (glade_xml_get_widget (xml, "caption_label")), label);
+		g_free (label);
+	} else {
+		label = _("<span size=\"larger\" weight=\"bold\">Connect to a 802.1X protected wired network</span>\n\n"
+				"Enter the name and security settings of the network you wish to join.");
+		gtk_label_set_markup (GTK_LABEL (glade_xml_get_widget (xml, "caption_label")), label);
+	}
+
+	info = g_new (WiredDialogInfo, 1);
+	info->applet = applet;
+	info->xml = xml;
+	info->opt = wso_wpa_eap_new (applet->glade_file, NM_802_11_CAP_KEY_MGMT_802_1X, FALSE);
+	info->network_id = network_id ? g_strdup (network_id) : NULL;
+	info->message = message ? dbus_message_ref (message) : NULL;
+
+	g_object_set_data_full (G_OBJECT (dialog), WIRED_DIALOG_INFO_TAG,
+					    info, wired_dialog_info_destroy);
+
+	wso_widget = wso_get_widget (info->opt, GTK_SIGNAL_FUNC (wired_dialog_modified), info);
+	if (wso_widget) {
+		gtk_container_add (GTK_CONTAINER (glade_xml_get_widget (xml, "wireless_security_vbox")), wso_widget);
+		wso_wpa_eap_set_wired (info->opt);
+	}
+
+	w = glade_xml_get_widget (xml, "ok_button");
+	gtk_widget_grab_default (w);
+	gtk_widget_set_sensitive (w, FALSE);
+
+#if GTK_CHECK_VERSION(2,6,0)
+	{
+		GtkWidget *connect_image = gtk_image_new_from_stock (GTK_STOCK_CONNECT, GTK_ICON_SIZE_BUTTON);
+		gtk_button_set_image (GTK_BUTTON (w), connect_image);
+	}
+#endif
+
+	w = glade_xml_get_widget (xml, "network_name_entry");
+	if (network_id)
+		gtk_entry_set_text (GTK_ENTRY (w), network_id);
+
+	gtk_widget_grab_focus (w);
+	g_signal_connect (w, "changed", G_CALLBACK (wired_dialog_modified), info);
+
+	return dialog;
+}
+
+void
+nma_wired_dialog_create (NMApplet *applet)
+{
+	GtkWidget *dialog;
+
+	g_return_if_fail (applet != NULL);
+
+	dialog = GTK_WIDGET (wired_dialog_init (applet, NULL, NULL));
+	if (!dialog)
+		return;
+
+	g_signal_connect (dialog, "response", G_CALLBACK (create_response), NULL);
+
+	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS);
+	gtk_widget_realize (GTK_WIDGET (dialog));
+	gdk_x11_window_set_user_time (dialog->window, gdk_x11_get_server_time (dialog->window));
+	gtk_window_present (GTK_WINDOW (dialog));
+}
+
+void
+nma_wired_dialog_ask_password (NMApplet *applet,
+						 const char *network_id,
+						 DBusMessage *message)
+{
+	GtkWidget *dialog;
+
+	g_return_if_fail (applet != NULL);
+
+	if (applet->passphrase_dialog)
+		gtk_widget_destroy (applet->passphrase_dialog);
+
+	dialog = GTK_WIDGET (wired_dialog_init (applet, network_id, message));
+	if (!dialog)
+		return;
+
+	applet->passphrase_dialog = dialog;
+	g_object_weak_ref (G_OBJECT (dialog), wired_dialog_destroyed, applet);
+
+	g_signal_connect (dialog, "response", G_CALLBACK (ask_password_response), NULL);
+
+	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS);
+	gtk_widget_realize (dialog);
+	gdk_x11_window_set_user_time (dialog->window, gdk_x11_get_server_time (dialog->window));
+	gtk_window_present (GTK_WINDOW (dialog));
+}
+
+/*****************************************************************************/
+
+GSList *
+nma_wired_read_networks (GConfClient *gconf_client)
+{
+	g_return_val_if_fail (gconf_client != NULL, NULL);
+
+	GSList *networks = NULL;
+	GSList *dir_list;
+	GSList *iter;
+
+	dir_list = gconf_client_all_dirs (gconf_client, GCONF_PATH_WIRED_NETWORKS, NULL);
+
+	for (iter = dir_list; iter; iter = iter->next) {
+		char *dir = (char *) iter->data;
+		char key[100];
+		GConfValue *value;
+
+		g_snprintf (&key[0], 99, "%s/essid", dir);
+		if ((value = gconf_client_get (gconf_client, key, NULL))) {
+			if (value->type == GCONF_VALUE_STRING)
+				networks = g_slist_prepend (networks, g_strdup (gconf_value_get_string (value)));
+
+			gconf_value_free (value);
+		}
+		g_free (dir);
+	}
+
+	g_slist_free (dir_list);
+
+	networks = g_slist_sort (networks, (GCompareFunc) strcmp);
+
+	return networks;
+}
+
+/*****************************************************************************/
+
+typedef struct {
+	NMApplet *applet;
+	NetworkDevice *device;
+	char *network_id;
+	NMGConfWSO *opt;
+} WiredMenuItemInfo;
+
+static void
+wired_menu_item_activate (GtkMenuItem *item, gpointer user_data)
+{
+	WiredMenuItemInfo *info = (WiredMenuItemInfo *) user_data;
+
+	g_print ("Activate!\n");
+	nma_dbus_set_device_with_gconf_wso (info->applet->connection, info->device, info->network_id, info->opt);
+}
+
+static void
+wired_menu_item_info_destroy (gpointer data, GObject *destroyed_object)
+{
+	WiredMenuItemInfo *info = (WiredMenuItemInfo *) data;
+
+	g_free (info->network_id);
+	g_object_unref (info->opt);
+	g_free (info);
+}
+
+static GtkWidget *
+wired_menu_item_get_image ()
+{
+	GtkWidget *image;
+	GtkIconTheme *icon_theme;
+	GdkPixbuf *pixbuf = NULL;
+
+	icon_theme = gtk_icon_theme_get_default ();
+
+	if (gtk_icon_theme_has_icon (icon_theme, "network-wireless-encrypted"))
+		pixbuf = gtk_icon_theme_load_icon (icon_theme, "network-wireless-encrypted", GTK_ICON_SIZE_MENU, 0, NULL);
+	if (!pixbuf)
+		pixbuf = gtk_icon_theme_load_icon (icon_theme, "gnome-lockscreen", GTK_ICON_SIZE_MENU, 0, NULL);
+
+	image = gtk_image_new_from_pixbuf (pixbuf);
+	g_object_unref (pixbuf);
+
+	return image;
+}
+
+/* Takes over the ownership of network_id and wireless option. */
+GtkWidget *
+nma_wired_menu_item_new (NMApplet *applet,
+					NetworkDevice *device,
+					char *network_id,
+					NMGConfWSO *opt)
+{
+	GtkWidget *menu_item;
+	GtkWidget *hbox;
+	GtkWidget *w;
+	WiredMenuItemInfo *info;
+
+	g_return_val_if_fail (applet != NULL, NULL);
+	g_return_val_if_fail (device != NULL, NULL);
+	g_return_val_if_fail (network_id != NULL, NULL);
+	g_return_val_if_fail (opt != NULL, NULL);
+
+	menu_item = gtk_check_menu_item_new ();
+	gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_container_add (GTK_CONTAINER (menu_item), hbox);
+
+	w = gtk_label_new (network_id);
+	gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
+	gtk_box_pack_start_defaults (GTK_BOX (hbox), w);
+
+	w = wired_menu_item_get_image ();
+	gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+
+	if (network_device_get_active (device)) {
+		const char *active_network_id = network_device_get_active_wired_network (device);
+
+		if (active_network_id && !strcmp (active_network_id, network_id))
+			gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+	}
+
+	info = g_new (WiredMenuItemInfo, 1);
+	info->applet = applet;
+	info->device = device;
+	info->network_id = network_id;
+	info->opt = opt;
+
+	g_object_weak_ref (G_OBJECT (menu_item), wired_menu_item_info_destroy, info);
+	g_signal_connect (menu_item, "activate", G_CALLBACK (wired_menu_item_activate), info);
+
+	return menu_item;
+}

Added: branches/network-manager-applet-0-6/src/nm-wired-dialog.h
==============================================================================
--- (empty file)
+++ branches/network-manager-applet-0-6/src/nm-wired-dialog.h	Wed Jan 30 20:32:27 2008
@@ -0,0 +1,21 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
+#ifndef NM_WIRED_DIALOG_H
+#define NM_WIRED_DIALOG_H 1
+
+#include "applet.h"
+#include "nm-gconf-wso.h"
+
+void nma_wired_dialog_create       (NMApplet *applet);
+void nma_wired_dialog_ask_password (NMApplet *applet,
+							 const char *network_id,
+							 DBusMessage *message);
+
+GSList *nma_wired_read_networks    (GConfClient *gconf_client);
+
+GtkWidget *nma_wired_menu_item_new (NMApplet *applet,
+							 NetworkDevice *device,
+							 char *network_id,
+							 NMGConfWSO *opt);
+
+#endif /* NM_WIRED_DIALOG_H */

Modified: branches/network-manager-applet-0-6/src/other-network-dialog.c
==============================================================================
--- branches/network-manager-applet-0-6/src/other-network-dialog.c	(original)
+++ branches/network-manager-applet-0-6/src/other-network-dialog.c	Wed Jan 30 20:32:27 2008
@@ -1,3 +1,5 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
 /* NetworkManager Wireless Applet -- Display wireless access points and allow user control
  *
  * Dan Williams <dcbw redhat com>

Modified: branches/network-manager-applet-0-6/src/passphrase-dialog.c
==============================================================================
--- branches/network-manager-applet-0-6/src/passphrase-dialog.c	(original)
+++ branches/network-manager-applet-0-6/src/passphrase-dialog.c	Wed Jan 30 20:32:27 2008
@@ -1,3 +1,5 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
 /* NetworkManager Wireless Applet -- Display wireless access points and allow user control
  *
  * Dan Williams <dcbw redhat com>
@@ -37,38 +39,46 @@
 #include "NetworkManager.h"
 #include "wireless-security-manager.h"
 
-static GladeXML *get_dialog_xml (GtkWidget *dialog)
+typedef struct {
+	NMApplet *applet;
+	DBusMessage *message;
+	GladeXML *xml;
+	NetworkDevice *device;
+	WirelessNetwork *net;
+	WirelessSecurityManager *wsm;
+} PassphraseDialogInfo;
+
+static void
+passphrase_dialog_destroy (gpointer data, GObject *destroyed_object)
 {
-	g_return_val_if_fail (dialog != NULL, NULL);
+	PassphraseDialogInfo *info = (PassphraseDialogInfo *) data;
+
+	info->applet->passphrase_dialog = NULL;
+
+	network_device_unref (info->device);
+	wireless_network_unref (info->net);
+	dbus_message_unref (info->message);
+	wsm_free (info->wsm);
+	g_object_unref (info->xml);
 
-	return (GladeXML *) g_object_get_data (G_OBJECT (dialog), "glade-xml");
+	g_free (info);
 }
 
-static void update_button_cb (GtkWidget *unused, GtkDialog *dialog)
+static void update_button_cb (GtkWidget *unused, PassphraseDialogInfo *info)
 {
 	gboolean		enable = FALSE;
 	const char *	ssid = NULL;
 	GtkWidget *	button;
-	GladeXML *	xml;
-	WirelessSecurityManager * wsm;
 	GtkComboBox *	security_combo;
-	WirelessNetwork *net;
-
-	g_return_if_fail (dialog != NULL);
-	xml = get_dialog_xml (GTK_WIDGET (dialog));
-	g_return_if_fail (xml != NULL);
-	wsm = (WirelessSecurityManager *) g_object_get_data (G_OBJECT (dialog), "wireless-security-manager");
-	g_return_if_fail (wsm != NULL);
 
-	if ((net = g_object_get_data (G_OBJECT (dialog), "network")) &&
-	    (ssid = wireless_network_get_essid (net)))
+	if ((ssid = wireless_network_get_essid (info->net)) != NULL)
 	{
 		/* Validate the wireless security choices */
-		security_combo = GTK_COMBO_BOX (glade_xml_get_widget (xml, "security_combo"));
-		enable = wsm_validate_active (wsm, security_combo, ssid);
+		security_combo = GTK_COMBO_BOX (glade_xml_get_widget (info->xml, "security_combo"));
+		enable = wsm_validate_active (info->wsm, security_combo, ssid);
 	}
 
-	button = glade_xml_get_widget (xml, "login_button");
+	button = glade_xml_get_widget (info->xml, "login_button");
 	gtk_widget_set_sensitive (button, enable);
 }
 
@@ -81,22 +91,13 @@
  */
 static void nmi_passphrase_dialog_security_combo_changed (GtkWidget *security_combo, gpointer user_data)
 {
-	GtkDialog *	dialog = (GtkDialog *) user_data;
-	WirelessSecurityManager * wsm;
+	PassphraseDialogInfo *info = (PassphraseDialogInfo *) user_data;
 	GtkWidget *	wso_widget;
-	GladeXML *	xml;
 	GtkWidget *	vbox;
 	GList *		children;
 	GList *		elt;
 
-	g_return_if_fail (dialog != NULL);
-	xml = get_dialog_xml (GTK_WIDGET (dialog));
-	g_return_if_fail (xml != NULL);
-
-	wsm = g_object_get_data (G_OBJECT (dialog), "wireless-security-manager");
-	g_return_if_fail (wsm != NULL);
-
-	vbox = GTK_WIDGET (glade_xml_get_widget (xml, "wireless_security_vbox"));
+	vbox = GTK_WIDGET (glade_xml_get_widget (info->xml, "wireless_security_vbox"));
 
 	/* Remove any previous wireless security widgets */
 	children = gtk_container_get_children (GTK_CONTAINER (vbox));
@@ -111,11 +112,12 @@
 	g_list_free (children);
 
 	/* Determine and add the correct wireless security widget to the dialog */
-	wso_widget = wsm_get_widget_for_active (wsm, GTK_COMBO_BOX (security_combo), GTK_SIGNAL_FUNC (update_button_cb), dialog);
+	wso_widget = wsm_get_widget_for_active (info->wsm, GTK_COMBO_BOX (security_combo),
+									GTK_SIGNAL_FUNC (update_button_cb), info);
 	if (wso_widget)
 		gtk_container_add (GTK_CONTAINER (vbox), wso_widget);
 
-	update_button_cb (NULL, dialog);
+	update_button_cb (NULL, info);
 }
 
 
@@ -132,61 +134,41 @@
                                          gint response,
                                          gpointer user_data)
 {
-	NMApplet *	applet;
-	GladeXML *		xml;
+	PassphraseDialogInfo *info = (PassphraseDialogInfo *) user_data;
 	GtkComboBox *		security_combo;
-	DBusMessage *		message;
-	WirelessSecurityManager *wsm;
 	WirelessSecurityOption *	opt;
-	WirelessNetwork *	net;
 	NMGConfWSO *		gconf_wso;
 
-	message = (DBusMessage *) g_object_get_data (G_OBJECT (dialog), "dbus-message");
-	g_assert (message);
-
-	applet = (NMApplet *) g_object_get_data (G_OBJECT (dialog), "applet");
-	g_assert (applet);
-
 	if (response != GTK_RESPONSE_OK)
 	{
 		DBusMessage *	reply;
 
-		reply = dbus_message_new_error (message, NMI_DBUS_USER_KEY_CANCELED_ERROR, "Request was cancelled.");
-		dbus_connection_send (applet->connection, reply, NULL);
+		reply = dbus_message_new_error (info->message, NMI_DBUS_USER_KEY_CANCELED_ERROR, "Request was cancelled.");
+		dbus_connection_send (info->applet->connection, reply, NULL);
 		goto out;
 	}
 
-	xml = get_dialog_xml (dialog);
-	g_assert (xml);
-
-	wsm = g_object_get_data (G_OBJECT (dialog), "wireless-security-manager");
-	g_assert (wsm);
-
-	security_combo = GTK_COMBO_BOX (glade_xml_get_widget (xml, "security_combo"));
-	opt = wsm_get_option_for_active (wsm, security_combo);
+	security_combo = GTK_COMBO_BOX (glade_xml_get_widget (info->xml, "security_combo"));
+	opt = wsm_get_option_for_active (info->wsm, security_combo);
 
-	net = (WirelessNetwork *) g_object_get_data (G_OBJECT (dialog), "network");
-	g_assert (net);
-	gconf_wso = nm_gconf_wso_new_from_wso (opt, wireless_network_get_essid (net));
+	gconf_wso = nm_gconf_wso_new_from_wso (opt, wireless_network_get_essid (info->net));
 
 	/* Return new security information to NM */
-	nmi_dbus_return_user_key (applet->connection, message, gconf_wso);
-	g_object_unref (G_OBJECT (gconf_wso));
+	nmi_dbus_return_user_key (info->applet->connection, info->message, gconf_wso);
+	g_object_unref (gconf_wso);
 
 out:
-	nmi_passphrase_dialog_destroy (applet);
+	gtk_widget_destroy (dialog);
 }
 
 
 /*
  * nmi_passphrase_dialog_new
  *
- * Create a new passphrase dialog instance and tie it
- * to the given UID.
+ * Create a new passphrase dialog instance.
  */
 GtkWidget *
 nmi_passphrase_dialog_new (NMApplet *applet,
-                           guint32 uid,
                            NetworkDevice *dev,
                            WirelessNetwork *net,
                            DBusMessage *message)
@@ -200,12 +182,16 @@
 	const char *				orig_label_text;
 	char *					new_label_text;
 	guint32					caps;
+	PassphraseDialogInfo *info;
 
 	g_return_val_if_fail (applet != NULL, NULL);
 	g_return_val_if_fail (dev != NULL, NULL);
 	g_return_val_if_fail (net != NULL, NULL);
 	g_return_val_if_fail (message != NULL, NULL);
 
+	if (applet->passphrase_dialog)
+		gtk_widget_destroy (applet->passphrase_dialog);
+
 	wsm = wsm_new (applet->glade_file);
 
 	caps = network_device_get_type_capabilities (dev);
@@ -237,10 +223,15 @@
 	dialog = glade_xml_get_widget (xml, "passphrase_dialog");
 	gtk_widget_hide (dialog);
 
-	g_object_set_data (G_OBJECT (dialog), "wireless-security-manager", (gpointer) wsm);
-	g_object_set_data (G_OBJECT (dialog), "glade-xml", xml);
-	g_object_set_data (G_OBJECT (dialog), "applet", applet);
-	g_object_set_data (G_OBJECT (dialog), "uid", GINT_TO_POINTER (uid));
+	info = g_new (PassphraseDialogInfo, 1);
+	info->applet = applet;
+	info->message = dbus_message_ref (message);
+	info->xml = xml;
+	info->device = network_device_ref (dev);
+	info->net = wireless_network_ref (net);
+	info->wsm = wsm;
+
+	g_object_weak_ref (G_OBJECT (dialog), passphrase_dialog_destroy, info);
 
 	ok_button = GTK_BUTTON (glade_xml_get_widget (xml, "login_button"));
 	gtk_widget_grab_default (GTK_WIDGET (ok_button));
@@ -252,22 +243,15 @@
 	gtk_label_set_label (GTK_LABEL (label), new_label_text);
 	g_free (new_label_text);
 
-	network_device_ref (dev);
-	g_object_set_data (G_OBJECT (dialog), "device", dev);
-	wireless_network_ref (net);
-	g_object_set_data (G_OBJECT (dialog), "network", net);
-	dbus_message_ref (message);
-	g_object_set_data (G_OBJECT (dialog), "dbus-message", message);
-
 	gtk_widget_set_sensitive (GTK_WIDGET (ok_button), FALSE);
 
 	security_combo = GTK_COMBO_BOX (glade_xml_get_widget (xml, "security_combo"));
 	wsm_update_combo (wsm, security_combo);
 
-	g_signal_connect (G_OBJECT (security_combo), "changed", GTK_SIGNAL_FUNC (nmi_passphrase_dialog_security_combo_changed), dialog);
-	nmi_passphrase_dialog_security_combo_changed (GTK_WIDGET (security_combo), dialog);
+	g_signal_connect (security_combo, "changed", GTK_SIGNAL_FUNC (nmi_passphrase_dialog_security_combo_changed), info);
+	nmi_passphrase_dialog_security_combo_changed (GTK_WIDGET (security_combo), info);
 
-	g_signal_connect (G_OBJECT (dialog), "response", GTK_SIGNAL_FUNC (nmi_passphrase_dialog_response_received), dialog);
+	g_signal_connect (dialog, "response", GTK_SIGNAL_FUNC (nmi_passphrase_dialog_response_received), info);
 
 	/* Bash focus-stealing prevention in the face */
 	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ALWAYS);
@@ -275,59 +259,7 @@
 	gdk_x11_window_set_user_time (dialog->window, gdk_x11_get_server_time (dialog->window));
 	gtk_window_present (GTK_WINDOW (dialog));
 
-	return dialog;
-}
-
+	applet->passphrase_dialog = dialog;
 
-/*
- * nmi_passphrase_dialog_destroy
- *
- * Dispose of the passphrase dialog and its data
- *
- */
-void nmi_passphrase_dialog_destroy (NMApplet *applet)
-{
-	char *		data;
-	GtkWidget *	dialog;
-
-	g_return_if_fail (applet != NULL);
-
-	if (!applet->passphrase_dialog)
-		return;
-
-	dialog = applet->passphrase_dialog;
-	gtk_widget_hide (dialog);
-
-	if ((data = g_object_get_data (G_OBJECT (dialog), "device")))
-	{
-		network_device_unref ((NetworkDevice *) data);
-		g_object_set_data (G_OBJECT (dialog), "device", NULL);
-	}
-
-	if ((data = g_object_get_data (G_OBJECT (dialog), "network")))
-	{
-		wireless_network_unref ((WirelessNetwork *) data);
-		g_object_set_data (G_OBJECT (dialog), "network", NULL);
-	}
-
-	if ((data = g_object_get_data (G_OBJECT (dialog), "dbus-message")))
-	{
-		dbus_message_unref ((DBusMessage *) data);
-		g_object_set_data (G_OBJECT (dialog), "dbus-message", NULL);
-	}
-
-	if ((data = g_object_get_data (G_OBJECT (dialog), "wireless-security-manager")))
-	{
-		wsm_free ((WirelessSecurityManager *) data);
-		g_object_set_data (G_OBJECT (dialog), "wireless-security-manager", NULL);
-	}
-
-	if ((data = g_object_get_data (G_OBJECT (dialog), "glade-xml")))
-	{
-		g_object_unref (G_OBJECT (data));
-		g_object_set_data (G_OBJECT (dialog), "glade-xml", NULL);
-	}
-
-	gtk_widget_destroy (dialog);
-	applet->passphrase_dialog = NULL;
+	return dialog;
 }

Modified: branches/network-manager-applet-0-6/src/passphrase-dialog.h
==============================================================================
--- branches/network-manager-applet-0-6/src/passphrase-dialog.h	(original)
+++ branches/network-manager-applet-0-6/src/passphrase-dialog.h	Wed Jan 30 20:32:27 2008
@@ -27,12 +27,9 @@
 #include "wireless-network.h"
 
 GtkWidget *	nmi_passphrase_dialog_new (NMApplet *applet,
-                                          guint32 uid,
                                           NetworkDevice *dev,
                                           WirelessNetwork *net,
                                           DBusMessage *message);
 
-void			nmi_passphrase_dialog_destroy	(NMApplet *applet);
-
 #endif	/* PASSPHRASE_DIALOG_H */
 

Modified: branches/network-manager-applet-0-6/src/wireless-network.c
==============================================================================
--- branches/network-manager-applet-0-6/src/wireless-network.c	(original)
+++ branches/network-manager-applet-0-6/src/wireless-network.c	Wed Jan 30 20:32:27 2008
@@ -93,11 +93,13 @@
  * Increment the reference count of the wireless network
  *
  */
-void wireless_network_ref (WirelessNetwork *net)
+WirelessNetwork *wireless_network_ref (WirelessNetwork *net)
 {
 	g_return_if_fail (net != NULL);
 
 	net->refcount++;
+
+	return net;
 }
 
 

Modified: branches/network-manager-applet-0-6/src/wireless-network.h
==============================================================================
--- branches/network-manager-applet-0-6/src/wireless-network.h	(original)
+++ branches/network-manager-applet-0-6/src/wireless-network.h	Wed Jan 30 20:32:27 2008
@@ -28,7 +28,7 @@
 WirelessNetwork *	wireless_network_new			(const char *essid, const char *nm_path);
 WirelessNetwork *	wireless_network_copy			(WirelessNetwork *src);
 
-void				wireless_network_ref			(WirelessNetwork *net);
+WirelessNetwork *	wireless_network_ref			(WirelessNetwork *net);
 void				wireless_network_unref			(WirelessNetwork *net);
 
 gboolean			wireless_network_get_active		(WirelessNetwork *net);

Modified: branches/network-manager-applet-0-6/src/wso-wpa-eap.c
==============================================================================
--- branches/network-manager-applet-0-6/src/wso-wpa-eap.c	(original)
+++ branches/network-manager-applet-0-6/src/wso-wpa-eap.c	Wed Jan 30 20:32:27 2008
@@ -313,3 +313,33 @@
 	return opt;
 }
 
+void
+wso_wpa_eap_set_wired (WirelessSecurityOption *opt)
+{
+	GtkTreeModel *model;
+	GtkComboBox *combo;
+	GtkTreeIter iter;
+	gboolean valid;
+
+	g_return_if_fail (opt != NULL);
+
+	/* Select the 802.1X key type */
+	combo = GTK_COMBO_BOX (glade_xml_get_widget (opt->uixml, "wpa_eap_key_type_combo"));
+	model = gtk_combo_box_get_model (combo);
+	valid = gtk_tree_model_get_iter_first (model, &iter);
+	while (valid) {
+		int cipher;
+
+		gtk_tree_model_get (model, &iter, WPA_KEY_TYPE_CIPHER_COL, &cipher, -1);
+		if (cipher == IW_AUTH_CIPHER_WEP104) {
+			gtk_combo_box_set_active_iter (combo, &iter);
+			break;
+		}
+
+		valid = gtk_tree_model_iter_next (model, &iter);
+	}
+
+	/* And hide it */
+	gtk_widget_hide (GTK_WIDGET (combo));
+	gtk_widget_hide (glade_xml_get_widget (opt->uixml, "wpa-key-type-label"));
+}

Modified: branches/network-manager-applet-0-6/src/wso-wpa-eap.h
==============================================================================
--- branches/network-manager-applet-0-6/src/wso-wpa-eap.h	(original)
+++ branches/network-manager-applet-0-6/src/wso-wpa-eap.h	Wed Jan 30 20:32:27 2008
@@ -25,4 +25,6 @@
 
 WirelessSecurityOption * wso_wpa_eap_new (const char *glade_file, int capabilities, gboolean wpa2);
 
+void wso_wpa_eap_set_wired (WirelessSecurityOption *opt);
+
 #endif	/* WSO_WPA_EAP_H */



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