network-manager-applet r561 - in trunk: . src/connection-editor



Author: dcbw
Date: Wed Feb 27 16:06:12 2008
New Revision: 561
URL: http://svn.gnome.org/viewvc/network-manager-applet?rev=561&view=rev

Log:
2008-02-27  Dan Williams  <dcbw redhat com>

	Refactor connection editor page handling in preparation
	for making Add/Edit work.

	* src/connection-editor/Makefile.am
	  connection-editor/ce-page.c
	  connection-editor/ce-page.h
		- Add the base CEPage class from which all other connection editor pages
			derive

	* connection-editor/page-ip4-address.c
	  connection-editor/page-ip4-address.h
	  connection-editor/page-ip4.c
	  connection-editor/page-ip4.h
	  connection-editor/page-wired.c
	  connection-editor/page-wired.h
	  connection-editor/page-wireless-security.c
	  connection-editor/page-wireless-security.h
	  connection-editor/page-wireless.c
	  connection-editor/page-wireless.h
		- Make each page a subclass of CEPage

	* connection-editor/nm-connection-editor.c
	  connection-editor/nm-connection-editor.h
		- Update for these changes; handle CEPage objects instead of just
			GtkWidgets



Added:
   trunk/src/connection-editor/ce-page.c
   trunk/src/connection-editor/ce-page.h
Modified:
   trunk/ChangeLog
   trunk/src/connection-editor/Makefile.am
   trunk/src/connection-editor/nm-connection-editor.c
   trunk/src/connection-editor/nm-connection-editor.h
   trunk/src/connection-editor/page-ip4-address.c
   trunk/src/connection-editor/page-ip4-address.h
   trunk/src/connection-editor/page-ip4.c
   trunk/src/connection-editor/page-ip4.h
   trunk/src/connection-editor/page-wired.c
   trunk/src/connection-editor/page-wired.h
   trunk/src/connection-editor/page-wireless-security.c
   trunk/src/connection-editor/page-wireless-security.h
   trunk/src/connection-editor/page-wireless.c
   trunk/src/connection-editor/page-wireless.h

Modified: trunk/src/connection-editor/Makefile.am
==============================================================================
--- trunk/src/connection-editor/Makefile.am	(original)
+++ trunk/src/connection-editor/Makefile.am	Wed Feb 27 16:06:12 2008
@@ -24,6 +24,8 @@
 	nm-connection-list.c \
 	nm-connection-list.h \
 	main.c \
+	ce-page.h \
+	ce-page.c \
 	page-wired.h \
 	page-wired.c \
 	page-wireless.h \

Added: trunk/src/connection-editor/ce-page.c
==============================================================================
--- (empty file)
+++ trunk/src/connection-editor/ce-page.c	Wed Feb 27 16:06:12 2008
@@ -0,0 +1,103 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager Connection editor -- Connection editor for NetworkManager
+ *
+ * Dan Williams <dcbw redhat com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * (C) Copyright 2008 Red Hat, Inc.
+ */
+
+#include "ce-page.h"
+
+G_DEFINE_ABSTRACT_TYPE (CEPage, ce_page, G_TYPE_OBJECT)
+
+gboolean
+ce_page_validate (CEPage *self)
+{
+	if (CE_PAGE_GET_CLASS (self)->validate)
+		return CE_PAGE_GET_CLASS (self)->validate (self);
+
+	return TRUE;
+}
+
+void
+ce_page_update_connection (CEPage *self, NMConnection *connection)
+{
+	CE_PAGE_GET_CLASS (self)->update_connection (self, connection);
+}
+
+static void
+ce_page_init (CEPage *self)
+{
+	self->disposed = FALSE;
+}
+
+static void
+dispose (GObject *object)
+{
+	CEPage *self = CE_PAGE (object);
+
+	if (self->disposed)
+		return;
+
+	self->disposed = TRUE;
+
+	if (self->page)
+		g_object_unref (self->page);
+
+	if (self->xml)
+		g_object_unref (self->xml);
+
+	G_OBJECT_CLASS (ce_page_parent_class)->dispose (object);
+}
+
+static void
+finalize (GObject *object)
+{
+	CEPage *self = CE_PAGE (object);
+
+	if (self->title)
+		g_free (self->title);
+
+	G_OBJECT_CLASS (ce_page_parent_class)->finalize (object);
+}
+
+GtkWidget *
+ce_page_get_page (CEPage *self)
+{
+	g_return_val_if_fail (CE_IS_PAGE (self), NULL);
+
+	return self->page;
+}
+
+const char *
+ce_page_get_title (CEPage *self)
+{
+	g_return_val_if_fail (CE_IS_PAGE (self), NULL);
+
+	return self->title;
+}
+
+static void
+ce_page_class_init (CEPageClass *page_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (page_class);
+
+	/* virtual methods */
+	object_class->dispose     = dispose;
+	object_class->finalize    = finalize;
+}
+

Added: trunk/src/connection-editor/ce-page.h
==============================================================================
--- (empty file)
+++ trunk/src/connection-editor/ce-page.h	Wed Feb 27 16:06:12 2008
@@ -0,0 +1,71 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager Connection editor -- Connection editor for NetworkManager
+ *
+ * Dan Williams <dcbw redhat com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * (C) Copyright 2008 Red Hat, Inc.
+ */
+
+#ifndef __CE_PAGE_H__
+#define __CE_PAGE_H__
+
+#include <glib/gtypes.h>
+#include <glib-object.h>
+
+#include <gtk/gtkwidget.h>
+#include <glade/glade.h>
+
+#include <nm-connection.h>
+
+#define CE_TYPE_PAGE            (ce_page_get_type ())
+#define CE_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE, CEPage))
+#define CE_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE, CEPageClass))
+#define CE_IS_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE))
+#define CE_IS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE))
+#define CE_PAGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE, CEPageClass))
+
+typedef struct {
+	GObject parent;
+
+	GladeXML *xml;
+	GtkWidget *page;
+	char *title;
+
+	gboolean disposed;
+} CEPage;
+
+typedef struct {
+	GObjectClass parent;
+
+	/* Virtual functions */
+	gboolean    (*validate)            (CEPage *self);
+
+	void        (*update_connection)   (CEPage *self, NMConnection *connection);
+} CEPageClass;
+
+GType ce_page_get_type (void);
+
+GtkWidget *  ce_page_get_page (CEPage *self);
+
+const char * ce_page_get_title (CEPage *self);
+
+gboolean ce_page_validate (CEPage *self);
+
+void ce_page_update_connection (CEPage *self, NMConnection *connection);
+
+#endif  /* __CE_PAGE_H__ */
+

Modified: trunk/src/connection-editor/nm-connection-editor.c
==============================================================================
--- trunk/src/connection-editor/nm-connection-editor.c	(original)
+++ trunk/src/connection-editor/nm-connection-editor.c	Wed Feb 27 16:06:12 2008
@@ -44,6 +44,7 @@
 #include "nm-connection-editor.h"
 #include "utils.h"
 
+#include "ce-page.h"
 #include "page-wired.h"
 #include "page-wireless.h"
 #include "page-wireless-security.h"
@@ -91,19 +92,6 @@
 }
 
 static void
-add_page (NMConnectionEditor *editor,
-          GtkWidget *page,
-          const char *title)
-{
-	GtkWidget *notebook;
-	GtkWidget *label;
-
-	notebook = glade_xml_get_widget (editor->xml, "notebook");
-	label = gtk_label_new (title);
-	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, label);
-}
-
-static void
 nm_connection_editor_update_title (NMConnectionEditor *editor)
 {
 	NMSettingConnection *s_con;
@@ -170,20 +158,26 @@
 	widget = glade_xml_get_widget (editor->xml, "connection_name");
 	g_signal_connect (G_OBJECT (widget), "changed",
 	                  G_CALLBACK (connection_name_changed), editor);
+
+	editor->pages = NULL;
 }
 
 static void
-nm_connection_editor_finalize (GObject *object)
+dispose (GObject *object)
 {
 	NMConnectionEditor *editor = NM_CONNECTION_EDITOR (object);
 
+	g_slist_foreach (editor->pages, (GFunc) g_object_unref, NULL);
+	g_slist_free (editor->pages);
+	editor->pages = NULL;
+
 	if (editor->connection)
 		g_object_unref (editor->connection);
 
 	gtk_widget_destroy (editor->dialog);
 	g_object_unref (editor->xml);
 
-	G_OBJECT_CLASS (nm_connection_editor_parent_class)->finalize (object);
+	G_OBJECT_CLASS (nm_connection_editor_parent_class)->dispose (object);
 }
 
 static void
@@ -192,7 +186,7 @@
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
 	/* virtual methods */
-	object_class->finalize = nm_connection_editor_finalize;
+	object_class->dispose = dispose;
 }
 
 NMConnectionEditor *
@@ -256,13 +250,25 @@
 	}
 }
 
+static void
+add_page (NMConnectionEditor *editor, CEPage *page)
+{
+	GtkWidget *widget;
+	GtkWidget *notebook;
+	GtkWidget *label;
+
+	notebook = glade_xml_get_widget (editor->xml, "notebook");
+	label = gtk_label_new (ce_page_get_title (page));
+	widget = ce_page_get_page (page);
+	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), widget, label);
+
+	editor->pages = g_slist_append (editor->pages, page);
+}
+
 void
 nm_connection_editor_set_connection (NMConnectionEditor *editor, NMConnection *connection)
 {
 	NMSettingConnection *s_con;
-	GtkWidget *widget;
-	char *title = NULL;
-	GtkWidget *ok_button;
 
 	g_return_if_fail (NM_IS_CONNECTION_EDITOR (editor));
 	g_return_if_fail (connection != NULL);
@@ -276,49 +282,30 @@
 	editor->connection = (NMConnection *) g_object_ref (connection);
 	nm_connection_editor_update_title (editor);
 
-	ok_button = glade_xml_get_widget (editor->xml, "ok_button");
-
 	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
 	g_assert (s_con);
 
 	if (!strcmp (s_con->type, NM_SETTING_WIRED_SETTING_NAME)) {
-		widget = page_wired_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
-
-		widget = page_ip4_address_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
-
-		widget = page_ip4_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
+		add_page (editor, CE_PAGE (ce_page_wired_new (editor->connection)));
+		add_page (editor, CE_PAGE (ce_page_ip4_address_new (editor->connection)));
+		add_page (editor, CE_PAGE (ce_page_ip4_new (editor->connection)));
 	} else if (!strcmp (s_con->type, NM_SETTING_WIRELESS_SETTING_NAME)) {
-		GtkWidget *wireless_page;
+		CEPageWireless *wireless_page;
+		CEPageWirelessSecurity *wireless_security_page;
+		GtkWidget *ok_button;
+
+		wireless_page = ce_page_wireless_new (editor->connection);
+		add_page (editor, CE_PAGE (wireless_page));
+
+		ok_button = glade_xml_get_widget (editor->xml, "ok_button");
+		wireless_security_page = ce_page_wireless_security_new (editor->connection, ok_button, wireless_page);
+		add_page (editor, CE_PAGE (wireless_security_page));
 
-		wireless_page = page_wireless_new (editor->connection, (const char **) &title);
-		if (wireless_page)
-			add_page (editor, wireless_page, title);
-
-		widget = page_wireless_security_new (editor->connection, ok_button, wireless_page, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
-
-		widget = page_ip4_address_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
-
-		widget = page_ip4_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
+		add_page (editor, CE_PAGE (ce_page_ip4_address_new (editor->connection)));
+		add_page (editor, CE_PAGE (ce_page_ip4_new (editor->connection)));
 	} else if (!strcmp (s_con->type, NM_SETTING_VPN_SETTING_NAME)) {
-		widget = page_ip4_address_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
-
-		widget = page_ip4_new (editor->connection, (const char **) &title);
-		if (widget)
-			add_page (editor, widget, title);
+		add_page (editor, CE_PAGE (ce_page_ip4_address_new (editor->connection)));
+		add_page (editor, CE_PAGE (ce_page_ip4_new (editor->connection)));
 	} else {
 		g_warning ("Unhandled setting type '%s'", s_con->type);
 	}

Modified: trunk/src/connection-editor/nm-connection-editor.h
==============================================================================
--- trunk/src/connection-editor/nm-connection-editor.h	(original)
+++ trunk/src/connection-editor/nm-connection-editor.h	Wed Feb 27 16:06:12 2008
@@ -38,7 +38,7 @@
 
 	/* private data */
 	NMConnection *connection;
-	GHashTable *pages;
+	GSList *pages;
 	GtkWidget *dialog;
 	GladeXML *xml;
 } NMConnectionEditor;

Modified: trunk/src/connection-editor/page-ip4-address.c
==============================================================================
--- trunk/src/connection-editor/page-ip4-address.c	(original)
+++ trunk/src/connection-editor/page-ip4-address.c	Wed Feb 27 16:06:12 2008
@@ -30,29 +30,53 @@
 
 #include "page-ip4-address.h"
 
-GtkWidget *
-page_ip4_address_new (NMConnection *connection, const char **title)
+G_DEFINE_TYPE (CEPageIP4Address, ce_page_ip4_address, CE_TYPE_PAGE)
+
+CEPageIP4Address *
+ce_page_ip4_address_new (NMConnection *connection)
 {
-	GladeXML *xml;
-	GtkWidget *page;
+	CEPageIP4Address *self;
+	CEPage *parent;
 	NMSettingIP4Config *s_ip4;
 
-	xml = glade_xml_new (GLADEDIR "/ce-page-ip4-address.glade", "IP4AddressPage", NULL);
-	g_return_val_if_fail (xml != NULL, NULL);
-	*title = _("IPv4 Addresses");
-
-	page = glade_xml_get_widget (xml, "IP4AddressPage");
-	g_return_val_if_fail (page != NULL, NULL);
-	g_object_set_data_full (G_OBJECT (page),
-	                        "glade-xml", xml,
-	                        (GDestroyNotify) g_object_unref);
+	self = CE_PAGE_IP4_ADDRESS (g_object_new (CE_TYPE_PAGE_IP4_ADDRESS, NULL));
+	parent = CE_PAGE (self);
+
+	parent->xml = glade_xml_new (GLADEDIR "/ce-page-ip4-address.glade", "IP4AddressPage", NULL);
+	if (!parent->xml) {
+		g_warning ("%s: Couldn't load wired page glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+
+	parent->page = glade_xml_get_widget (parent->xml, "IP4AddressPage");
+	if (!parent->page) {
+		g_warning ("%s: Couldn't load wired page from glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+	g_object_ref_sink (parent->page);
+
+	parent->title = g_strdup (_("IPv4 Addresses"));
 
 	s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting (connection, NM_TYPE_SETTING_IP4_CONFIG));
 	if (s_ip4 == NULL)
 		goto out;
 
+	// FIXME: fill in the UI
+
 out:
-	return page;
+	return self;
+}
+
+
+static void
+ce_page_ip4_address_init (CEPageIP4Address *self)
+{
 }
 
+static void
+ce_page_ip4_address_class_init (CEPageIP4AddressClass *ip4_address_class)
+{
+}
 

Modified: trunk/src/connection-editor/page-ip4-address.h
==============================================================================
--- trunk/src/connection-editor/page-ip4-address.h	(original)
+++ trunk/src/connection-editor/page-ip4-address.h	Wed Feb 27 16:06:12 2008
@@ -23,10 +23,31 @@
 #ifndef __PAGE_IP4_ADDRESS_H__
 #define __PAGE_IP4_ADDRESS_H__
 
-#include "nm-connection-editor.h"
+#include <nm-connection.h>
 
-GtkWidget *page_ip4_address_new (NMConnection *connection, const char **title);
+#include <glib/gtypes.h>
+#include <glib-object.h>
 
+#include "ce-page.h"
+
+#define CE_TYPE_PAGE_IP4_ADDRESS            (ce_page_ip4_address_get_type ())
+#define CE_PAGE_IP4_ADDRESS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE_IP4_ADDRESS, CEPageIP4Address))
+#define CE_PAGE_IP4_ADDRESS_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE_IP4_ADDRESS, CEPageIP4AddressClass))
+#define CE_IS_PAGE_IP4_ADDRESS(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE_IP4_ADDRESS))
+#define CE_IS_PAGE_IP4_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE_IP4_ADDRESS))
+#define CE_PAGE_IP4_ADDRESS_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE_IP4_ADDRESS, CEPageIP4AddressClass))
+
+typedef struct {
+	CEPage parent;
+} CEPageIP4Address;
+
+typedef struct {
+	CEPageClass parent;
+} CEPageIP4AddressClass;
+
+GType ce_page_ip4_address_get_type (void);
+
+CEPageIP4Address *ce_page_ip4_address_new (NMConnection *connection);
 
 #endif  /* __PAGE_IP4_ADDRESS_H__ */
 

Modified: trunk/src/connection-editor/page-ip4.c
==============================================================================
--- trunk/src/connection-editor/page-ip4.c	(original)
+++ trunk/src/connection-editor/page-ip4.c	Wed Feb 27 16:06:12 2008
@@ -30,29 +30,53 @@
 
 #include "page-ip4.h"
 
-GtkWidget *
-page_ip4_new (NMConnection *connection, const char **title)
+G_DEFINE_TYPE (CEPageIP4, ce_page_ip4, CE_TYPE_PAGE)
+
+CEPageIP4 *
+ce_page_ip4_new (NMConnection *connection)
 {
-	GladeXML *xml;
-	GtkWidget *page;
+	CEPageIP4 *self;
+	CEPage *parent;
 	NMSettingIP4Config *s_ip4;
 
-	xml = glade_xml_new (GLADEDIR "/ce-page-ip4.glade", "IP4Page", NULL);
-	g_return_val_if_fail (xml != NULL, NULL);
-	*title = _("IPv4 Settings");
-
-	page = glade_xml_get_widget (xml, "IP4Page");
-	g_return_val_if_fail (page != NULL, NULL);
-	g_object_set_data_full (G_OBJECT (page),
-	                        "glade-xml", xml,
-	                        (GDestroyNotify) g_object_unref);
+	self = CE_PAGE_IP4 (g_object_new (CE_TYPE_PAGE_IP4, NULL));
+	parent = CE_PAGE (self);
+
+	parent->xml = glade_xml_new (GLADEDIR "/ce-page-ip4.glade", "IP4Page", NULL);
+	if (!parent->xml) {
+		g_warning ("%s: Couldn't load wired page glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+
+	parent->page = glade_xml_get_widget (parent->xml, "IP4Page");
+	if (!parent->page) {
+		g_warning ("%s: Couldn't load wired page from glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+	g_object_ref_sink (parent->page);
+
+	parent->title = g_strdup (_("IPv4 Settings"));
 
 	s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting (connection, NM_TYPE_SETTING_IP4_CONFIG));
 	if (s_ip4 == NULL)
 		goto out;
 
+	// FIXME: fill in UI from setting
+
 out:
-	return page;
+	return self;
+}
+
+
+static void
+ce_page_ip4_init (CEPageIP4 *self)
+{
 }
 
+static void
+ce_page_ip4_class_init (CEPageIP4Class *ip4_class)
+{
+}
 

Modified: trunk/src/connection-editor/page-ip4.h
==============================================================================
--- trunk/src/connection-editor/page-ip4.h	(original)
+++ trunk/src/connection-editor/page-ip4.h	Wed Feb 27 16:06:12 2008
@@ -23,10 +23,31 @@
 #ifndef __PAGE_IP4_H__
 #define __PAGE_IP4_H__
 
-#include "nm-connection-editor.h"
+#include <nm-connection.h>
 
-GtkWidget *page_ip4_new (NMConnection *connection, const char **title);
+#include <glib/gtypes.h>
+#include <glib-object.h>
 
+#include "ce-page.h"
+
+#define CE_TYPE_PAGE_IP4            (ce_page_ip4_get_type ())
+#define CE_PAGE_IP4(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE_IP4, CEPageIP4))
+#define CE_PAGE_IP4_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE_IP4, CEPageIP4Class))
+#define CE_IS_PAGE_IP4(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE_IP4))
+#define CE_IS_PAGE_IP4_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE_IP4))
+#define CE_PAGE_IP4_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE_IP4, CEPageIP4Class))
+
+typedef struct {
+	CEPage parent;
+} CEPageIP4;
+
+typedef struct {
+	CEPageClass parent;
+} CEPageIP4Class;
+
+GType ce_page_ip4_get_type (void);
+
+CEPageIP4 *ce_page_ip4_new (NMConnection *connection);
 
 #endif  /* __PAGE_IP4_H__ */
 

Modified: trunk/src/connection-editor/page-wired.c
==============================================================================
--- trunk/src/connection-editor/page-wired.c	(original)
+++ trunk/src/connection-editor/page-wired.c	Wed Feb 27 16:06:12 2008
@@ -29,12 +29,15 @@
 #include <nm-setting-wired.h>
 
 #include "page-wired.h"
+#include "nm-connection-editor.h"
 
-GtkWidget *
-page_wired_new (NMConnection *connection, const char **title)
+G_DEFINE_TYPE (CEPageWired, ce_page_wired, CE_TYPE_PAGE)
+
+CEPageWired *
+ce_page_wired_new (NMConnection *connection)
 {
-	GladeXML *xml;
-	GtkWidget *page;
+	CEPageWired *self;
+	CEPage *parent;
 	NMSettingWired *s_wired;
 	GtkWidget *port;
 	int port_idx = 0;
@@ -45,25 +48,39 @@
 	GtkWidget *mtu;
 	int mtu_def;
 
+	self = CE_PAGE_WIRED (g_object_new (CE_TYPE_PAGE_WIRED, NULL));
+	parent = CE_PAGE (self);
+
 	s_wired = NM_SETTING_WIRED (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED));
-	g_return_val_if_fail (s_wired != NULL, NULL);
+	if (!s_wired) {
+		g_warning ("%s: Connection didn't have a wired setting!", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+
+	parent->xml = glade_xml_new (GLADEDIR "/ce-page-wired.glade", "WiredPage", NULL);
+	if (!parent->xml) {
+		g_warning ("%s: Couldn't load wired page glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+
+	parent->page = glade_xml_get_widget (parent->xml, "WiredPage");
+	if (!parent->page) {
+		g_warning ("%s: Couldn't load wired page from glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+	g_object_ref_sink (parent->page);
 
-	xml = glade_xml_new (GLADEDIR "/ce-page-wired.glade", "WiredPage", NULL);
-	g_return_val_if_fail (xml != NULL, NULL);
-	*title = _("Wired");
-
-	page = glade_xml_get_widget (xml, "WiredPage");
-	g_return_val_if_fail (page != NULL, NULL);
-	g_object_set_data_full (G_OBJECT (page),
-	                        "glade-xml", xml,
-	                        (GDestroyNotify) g_object_unref);
-
-	port = glade_xml_get_widget (xml, "wired_port");
-	speed = glade_xml_get_widget (xml, "wired_speed");
-	duplex = glade_xml_get_widget (xml, "wired_duplex");
-	autoneg = glade_xml_get_widget (xml, "wired_autonegotiate");
+	parent->title = g_strdup (_("Wired"));
 
-	mtu = glade_xml_get_widget (xml, "wired_mtu");
+	port = glade_xml_get_widget (parent->xml, "wired_port");
+	speed = glade_xml_get_widget (parent->xml, "wired_speed");
+	duplex = glade_xml_get_widget (parent->xml, "wired_duplex");
+	autoneg = glade_xml_get_widget (parent->xml, "wired_autonegotiate");
+
+	mtu = glade_xml_get_widget (parent->xml, "wired_mtu");
 	mtu_def = ce_get_property_default (NM_SETTING (s_wired), NM_SETTING_WIRED_MTU);
 	g_signal_connect (G_OBJECT (mtu), "output",
 	                  (GCallback) ce_spin_output_with_default,
@@ -109,7 +126,17 @@
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (mtu), (gdouble) s_wired->mtu);
 
 	/* FIXME: MAC address */
-	return page;
+
+	return self;
 }
 
+static void
+ce_page_wired_init (CEPageWired *self)
+{
+}
+
+static void
+ce_page_wired_class_init (CEPageWiredClass *wired_class)
+{
+}
 

Modified: trunk/src/connection-editor/page-wired.h
==============================================================================
--- trunk/src/connection-editor/page-wired.h	(original)
+++ trunk/src/connection-editor/page-wired.h	Wed Feb 27 16:06:12 2008
@@ -23,10 +23,31 @@
 #ifndef __PAGE_WIRED_H__
 #define __PAGE_WIRED_H__
 
-#include "nm-connection-editor.h"
+#include <nm-connection.h>
 
-GtkWidget *page_wired_new (NMConnection *connection, const char **title);
+#include <glib/gtypes.h>
+#include <glib-object.h>
 
+#include "ce-page.h"
+
+#define CE_TYPE_PAGE_WIRED            (ce_page_wired_get_type ())
+#define CE_PAGE_WIRED(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE_WIRED, CEPageWired))
+#define CE_PAGE_WIRED_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE_WIRED, CEPageWiredClass))
+#define CE_IS_PAGE_WIRED(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE_WIRED))
+#define CE_IS_PAGE_WIRED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE_WIRED))
+#define CE_PAGE_WIRED_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE_WIRED, CEPageWiredClass))
+
+typedef struct {
+	CEPage parent;
+} CEPageWired;
+
+typedef struct {
+	CEPageClass parent;
+} CEPageWiredClass;
+
+GType ce_page_wired_get_type (void);
+
+CEPageWired *ce_page_wired_new (NMConnection *connection);
 
 #endif  /* __PAGE_WIRED_H__ */
 

Modified: trunk/src/connection-editor/page-wireless-security.c
==============================================================================
--- trunk/src/connection-editor/page-wireless-security.c	(original)
+++ trunk/src/connection-editor/page-wireless-security.c	Wed Feb 27 16:06:12 2008
@@ -32,7 +32,13 @@
 #include <nm-utils.h>
 
 #include "wireless-security.h"
+#include "page-wireless.h"
 #include "page-wireless-security.h"
+#include "nm-connection-editor.h"
+
+
+G_DEFINE_TYPE (CEPageWirelessSecurity, ce_page_wireless_security, CE_TYPE_PAGE)
+
 
 #define S_NAME_COLUMN		0
 #define S_SEC_COLUMN		1
@@ -89,29 +95,17 @@
 static void
 stuff_changed_cb (WirelessSecurity *sec, gpointer user_data)
 {
-	GtkWidget *page = GTK_WIDGET (user_data);
-	GtkWidget *wireless_page;
-	GtkWidget *widget;
-	GladeXML *xml;
-	const char *txt_ssid;
+	CEPageWirelessSecurity *self = CE_PAGE_WIRELESS_SECURITY (user_data);
 	GByteArray *ssid = NULL;
 	gboolean valid = FALSE;
 
-	// FIXME: hack until a real per-page validation system gets implemented
-	wireless_page = g_object_get_data (G_OBJECT (page), "wireless-page");
-	xml = g_object_get_data (G_OBJECT (wireless_page), "glade-xml");
-	widget = glade_xml_get_widget (xml, "wireless_ssid");
-
-	txt_ssid = gtk_entry_get_text (GTK_ENTRY (widget));
-	if (txt_ssid && strlen (txt_ssid)) {
-		ssid = g_byte_array_sized_new (strlen (txt_ssid));
-		g_byte_array_append (ssid, (const guint8 *) txt_ssid, strlen (txt_ssid));
+	ssid = ce_page_wireless_get_ssid (self->wireless_page);
+	if (ssid) {
 		valid = wireless_security_validate (sec, ssid);
 		g_byte_array_free (ssid, TRUE);
 	}
 
-	widget = g_object_get_data (G_OBJECT (page), "ok-button");
-	gtk_widget_set_sensitive (widget, valid);
+	gtk_widget_set_sensitive (self->ok_button, valid);
 }
 
 static void
@@ -131,22 +125,17 @@
 wireless_security_combo_changed (GtkWidget *combo,
                                  gpointer user_data)
 {
-	GtkWidget *page = GTK_WIDGET (user_data);
+	CEPageWirelessSecurity *self = CE_PAGE_WIRELESS_SECURITY (user_data);
 	GtkWidget *vbox;
 	GList *elt, *children;
 	GtkTreeIter iter;
 	GtkTreeModel *model;
 	WirelessSecurity *sec = NULL;
-	GladeXML *xml;
-	GtkSizeGroup *wsec_group;
-
-	xml = g_object_get_data (G_OBJECT (page), "glade-xml");
-	wsec_group = g_object_get_data (G_OBJECT (page), "size-group");
 
-	vbox = glade_xml_get_widget (xml, "wireless_security_vbox");
+	vbox = glade_xml_get_widget (CE_PAGE (self)->xml, "wireless_security_vbox");
 	g_assert (vbox);
 
-	wsec_size_group_clear (wsec_group);
+	wsec_size_group_clear (self->group);
 
 	/* Remove any previous wireless security widgets */
 	children = gtk_container_get_children (GTK_CONTAINER (vbox));
@@ -163,9 +152,9 @@
 		sec_widget = wireless_security_get_widget (sec);
 		g_assert (sec_widget);
 
-		widget = glade_xml_get_widget (xml, "wireless_security_combo_label");
-		gtk_size_group_add_widget (wsec_group, widget);
-		wireless_security_add_to_size_group (sec, wsec_group);
+		widget = glade_xml_get_widget (CE_PAGE (self)->xml, "wireless_security_combo_label");
+		gtk_size_group_add_widget (self->group, widget);
+		wireless_security_add_to_size_group (sec, self->group);
 
 		gtk_container_add (GTK_CONTAINER (vbox), sec_widget);
 		wireless_security_unref (sec);
@@ -173,26 +162,25 @@
 }
 
 static void
-add_security_item (GtkWidget *page,
+add_security_item (CEPageWirelessSecurity *self,
                    WirelessSecurity *sec,
                    GtkListStore *model,
                    GtkTreeIter *iter,
                    const char *text)
 {
-	wireless_security_set_changed_notify (sec, stuff_changed_cb, page);
+	wireless_security_set_changed_notify (sec, stuff_changed_cb, self);
 	gtk_list_store_append (model, iter);
 	gtk_list_store_set (model, iter, S_NAME_COLUMN, text, S_SEC_COLUMN, sec, -1);
 	wireless_security_unref (sec);
 }
 
-GtkWidget *
-page_wireless_security_new (NMConnection *connection,
-                            GtkWidget *ok_button,
-                            GtkWidget *wireless_page,
-                            const char **title)
+CEPageWirelessSecurity *
+ce_page_wireless_security_new (NMConnection *connection,
+                               GtkWidget *ok_button,
+                               CEPageWireless *wireless_page)
 {
-	GladeXML *xml;
-	GtkWidget *page;
+	CEPageWirelessSecurity *self;
+	CEPage *parent;
 	NMSettingWireless *s_wireless;
 	NMSettingWirelessSecurity *s_wireless_sec;
 	gboolean is_adhoc = FALSE;
@@ -204,30 +192,40 @@
 	int item = 0;
 	const char *glade_file = GLADEDIR "/applet.glade";
 	GtkWidget *combo;
-	GtkSizeGroup *wsec_group;
+
+	self = CE_PAGE_WIRELESS_SECURITY (g_object_new (CE_TYPE_PAGE_WIRELESS_SECURITY, NULL));
+	parent = CE_PAGE (self);
 
 	s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS));
-	g_assert (s_wireless);
+	if (!s_wireless) {
+		g_warning ("%s: Connection didn't have a wireless setting!", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
 
-	xml = glade_xml_new (GLADEDIR "/ce-page-wireless-security.glade", "WirelessSecurityPage", NULL);
-	g_return_val_if_fail (xml != NULL, NULL);
-	*title = _("Wireless Security");
-
-	page = glade_xml_get_widget (xml, "WirelessSecurityPage");
-	g_return_val_if_fail (page != NULL, NULL);
-	g_object_set_data_full (G_OBJECT (page),
-	                        "glade-xml", xml,
-	                        (GDestroyNotify) g_object_unref);
-
-	wsec_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-	g_object_set_data_full (G_OBJECT (page),
-	                        "size-group", wsec_group,
-	                        (GDestroyNotify) g_object_unref);
+	parent->xml = glade_xml_new (GLADEDIR "/ce-page-wireless-security.glade", "WirelessSecurityPage", NULL);
+	if (!parent->xml) {
+		g_warning ("%s: Couldn't load wireless security page glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
 
-	g_object_set_data (G_OBJECT (page), "ok-button", ok_button);
-	g_object_set_data (G_OBJECT (page), "wireless-page", wireless_page);
+	parent->page = glade_xml_get_widget (parent->xml, "WirelessSecurityPage");
+	if (!parent->page) {
+		g_warning ("%s: Couldn't load wireless security page from glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+	g_object_ref_sink (parent->page);
 
-	combo = glade_xml_get_widget (xml, "wireless_security_combo");
+	parent->title = g_strdup (_("Wireless Security"));
+
+	self->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+	self->wireless_page = g_object_ref (wireless_page);
+	self->ok_button = g_object_ref (ok_button);
+
+	combo = glade_xml_get_widget (parent->xml, "wireless_security_combo");
 
 	dev_caps =   NM_802_11_DEVICE_CAP_CIPHER_WEP40
 	           | NM_802_11_DEVICE_CAP_CIPHER_WEP104
@@ -261,7 +259,7 @@
 
 		ws_wep_passphrase = ws_wep_passphrase_new (glade_file, connection);
 		if (ws_wep_passphrase) {
-			add_security_item (page, WIRELESS_SECURITY (ws_wep_passphrase), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_wep_passphrase), sec_model,
 			                   &iter, _("WEP 128-bit Passphrase"));
 			if ((active < 0) && (default_type == NMU_SEC_STATIC_WEP))
 				active = item++;
@@ -269,7 +267,7 @@
 
 		ws_wep_hex = ws_wep_key_new (glade_file, connection, WEP_KEY_TYPE_HEX);
 		if (ws_wep_hex) {
-			add_security_item (page, WIRELESS_SECURITY (ws_wep_hex), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_wep_hex), sec_model,
 			                   &iter, _("WEP 40/128-bit Hexadecimal"));
 			if ((active < 0) && (default_type == NMU_SEC_STATIC_WEP))
 				active = item++;
@@ -277,7 +275,7 @@
 
 		ws_wep_ascii = ws_wep_key_new (glade_file, connection, WEP_KEY_TYPE_ASCII);
 		if (ws_wep_ascii) {
-			add_security_item (page, WIRELESS_SECURITY (ws_wep_ascii), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_wep_ascii), sec_model,
 			                   &iter, _("WEP 40/128-bit ASCII"));
 			if ((active < 0) && (default_type == NMU_SEC_STATIC_WEP))
 				active = item++;
@@ -289,7 +287,7 @@
 
 		ws_leap = ws_leap_new (glade_file, connection);
 		if (ws_leap) {
-			add_security_item (page, WIRELESS_SECURITY (ws_leap), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_leap), sec_model,
 			                   &iter, _("LEAP"));
 			if ((active < 0) && (default_type == NMU_SEC_LEAP))
 				active = item++;
@@ -301,7 +299,7 @@
 
 		ws_dynamic_wep = ws_dynamic_wep_new (glade_file, connection);
 		if (ws_dynamic_wep) {
-			add_security_item (page, WIRELESS_SECURITY (ws_dynamic_wep), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_dynamic_wep), sec_model,
 			                   &iter, _("Dynamic WEP (802.1x)"));
 			if ((active < 0) && (default_type == NMU_SEC_DYNAMIC_WEP))
 				active = item++;
@@ -314,7 +312,7 @@
 
 		ws_wpa_psk = ws_wpa_psk_new (glade_file, connection);
 		if (ws_wpa_psk) {
-			add_security_item (page, WIRELESS_SECURITY (ws_wpa_psk), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_wpa_psk), sec_model,
 			                   &iter, _("WPA & WPA2 Personal"));
 			if ((active < 0) && ((default_type == NMU_SEC_WPA_PSK) || (default_type == NMU_SEC_WPA2_PSK)))
 				active = item++;
@@ -327,7 +325,7 @@
 
 		ws_wpa_eap = ws_wpa_eap_new (glade_file, connection);
 		if (ws_wpa_eap) {
-			add_security_item (page, WIRELESS_SECURITY (ws_wpa_eap), sec_model,
+			add_security_item (self, WIRELESS_SECURITY (ws_wpa_eap), sec_model,
 			                   &iter, _("WPA & WPA2 Enterprise"));
 			if ((active < 0) && ((default_type == NMU_SEC_WPA_ENTERPRISE) || (default_type == NMU_SEC_WPA2_ENTERPRISE)))
 				active = item++;
@@ -338,13 +336,49 @@
 	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), active < 0 ? 0 : (guint32) active);
 	g_object_unref (G_OBJECT (sec_model));
 
-	wireless_security_combo_changed (combo, page);
+	wireless_security_combo_changed (combo, self);
 	g_signal_connect (G_OBJECT (combo),
 	                  "changed",
 	                  GTK_SIGNAL_FUNC (wireless_security_combo_changed),
-	                  page);
+	                  self);
 
-	return page;
+	return self;
+}
+
+static void
+ce_page_wireless_security_init (CEPageWirelessSecurity *self)
+{
+	self->disposed = FALSE;
 }
 
+static void
+dispose (GObject *object)
+{
+	CEPageWirelessSecurity *self = CE_PAGE_WIRELESS_SECURITY (object);
+
+	if (self->disposed)
+		return;
+
+	self->disposed = TRUE;
+
+	if (self->group)
+		g_object_unref (self->group);
+
+	if (self->ok_button)
+		g_object_unref (self->ok_button);
+
+	if (self->wireless_page)
+		g_object_unref (self->wireless_page);
+
+	G_OBJECT_CLASS (ce_page_wireless_security_parent_class)->dispose (object);
+}
+
+static void
+ce_page_wireless_security_class_init (CEPageWirelessSecurityClass *wireless_security_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (wireless_security_class);
+
+	/* virtual methods */
+	object_class->dispose = dispose;
+}
 

Modified: trunk/src/connection-editor/page-wireless-security.h
==============================================================================
--- trunk/src/connection-editor/page-wireless-security.h	(original)
+++ trunk/src/connection-editor/page-wireless-security.h	Wed Feb 27 16:06:12 2008
@@ -25,10 +25,38 @@
 
 #include "nm-connection-editor.h"
 
-GtkWidget * page_wireless_security_new (NMConnection *connection,
-                                        GtkWidget *ok_button,
-                                        GtkWidget *wireless_page,
-                                        const char **title);
+#include <nm-connection.h>
+
+#include <glib/gtypes.h>
+#include <glib-object.h>
+
+#include "ce-page.h"
+
+#define CE_TYPE_PAGE_WIRELESS_SECURITY            (ce_page_wireless_security_get_type ())
+#define CE_PAGE_WIRELESS_SECURITY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE_WIRELESS_SECURITY, CEPageWirelessSecurity))
+#define CE_PAGE_WIRELESS_SECURITY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE_WIRELESS_SECURITY, CEPageWirelessSecurityClass))
+#define CE_IS_PAGE_WIRELESS_SECURITY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE_WIRELESS_SECURITY))
+#define CE_IS_PAGE_WIRELESS_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE_WIRELESS_SECURITY))
+#define CE_PAGE_WIRELESS_SECURITY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE_WIRELESS_SECURITY, CEPageWirelessSecurityClass))
+
+typedef struct {
+	CEPage parent;
+
+	gboolean disposed;
+	GtkSizeGroup *group;
+	GtkWidget *ok_button;
+	CEPageWireless *wireless_page;
+} CEPageWirelessSecurity;
+
+typedef struct {
+	CEPageClass parent;
+} CEPageWirelessSecurityClass;
+
+GType ce_page_wireless_security_get_type (void);
+
+CEPageWirelessSecurity *ce_page_wireless_security_new (NMConnection *connection,
+                                                       GtkWidget *ok_button,
+                                                       CEPageWireless *wireless_page);
 
 #endif  /* __PAGE_WIRELESS_SECURITY_H__ */
 

Modified: trunk/src/connection-editor/page-wireless.c
==============================================================================
--- trunk/src/connection-editor/page-wireless.c	(original)
+++ trunk/src/connection-editor/page-wireless.c	Wed Feb 27 16:06:12 2008
@@ -32,15 +32,16 @@
 
 #include "page-wireless.h"
 #include "utils.h"
+#include "nm-connection-editor.h"
+
+G_DEFINE_TYPE (CEPageWireless, ce_page_wireless, CE_TYPE_PAGE)
 
 static gboolean
-band_helper (GtkWidget *page, gboolean *aband, gboolean *gband)
+band_helper (CEPageWireless *self, gboolean *aband, gboolean *gband)
 {
-	GladeXML *xml;
 	GtkWidget *band_combo;
 
-	xml = g_object_get_data (G_OBJECT (page), "glade-xml");
-	band_combo = glade_xml_get_widget (xml, "wireless_band");
+	band_combo = glade_xml_get_widget (CE_PAGE (self)->xml, "wireless_band");
 
 	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (band_combo))) {
 	case 1: /* A */
@@ -57,13 +58,13 @@
 static gint
 channel_spin_input_cb (GtkSpinButton *spin, gdouble *new_val, gpointer user_data)
 {
-	GtkWidget *page = GTK_WIDGET (user_data);
+	CEPageWireless *self = CE_PAGE_WIRELESS (user_data);
 	gdouble channel;
 	guint32 int_channel = 0;
 	gboolean aband = TRUE;
 	gboolean gband = TRUE;
 
-	if (!band_helper (page, &aband, &gband))
+	if (!band_helper (self, &aband, &gband))
 		return GTK_INPUT_ERROR;
 
 	channel = g_strtod (gtk_entry_get_text (GTK_ENTRY (spin)), NULL);
@@ -82,17 +83,14 @@
 static gint
 channel_spin_output_cb (GtkSpinButton *spin, gpointer user_data)
 {
-	GtkWidget *page = GTK_WIDGET (user_data);
+	CEPageWireless *self = CE_PAGE_WIRELESS (user_data);
 	int channel;
 	gchar *buf = NULL;
 	guint32 freq;
 	gboolean aband = TRUE;
 	gboolean gband = TRUE;
-	guint32 last_channel;
-
-	last_channel = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (page), "last-channel"));
 
-	if (!band_helper (page, &aband, &gband))
+	if (!band_helper (self, &aband, &gband))
 		buf = g_strdup (_("default"));
 	else {
 		channel = gtk_spin_button_get_value_as_int (spin);
@@ -103,9 +101,9 @@
 			if (freq == -1) {
 				int direction = 0;
 
-				if (last_channel < channel)
+				if (self->last_channel < channel)
 					direction = 1;
-				else if (last_channel > channel)
+				else if (self->last_channel > channel)
 					direction = -1;
 				channel = utils_find_next_channel (channel, direction, aband ? "a" : "bg");
 				freq = utils_channel_to_freq (channel, aband ? "a" : "bg");
@@ -117,7 +115,7 @@
 			}
 			buf = g_strdup_printf (_("%u (%u MHz)"), channel, freq);
 		}
-		g_object_set_data (G_OBJECT (page), "last-channel", GUINT_TO_POINTER (channel));
+		self->last_channel = channel;
 	}
 
 	if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin))))
@@ -131,14 +129,12 @@
 static void
 band_value_changed_cb (GtkComboBox *box, gpointer user_data)
 {
-	GtkWidget *page = GTK_WIDGET (user_data);
+	CEPageWireless *self = CE_PAGE_WIRELESS (user_data);
 	GtkWidget *widget;
-	GladeXML *xml;
 
-	g_object_set_data (G_OBJECT (page), "last-channel", GUINT_TO_POINTER (0));
+	self->last_channel = 0;
 
-	xml = g_object_get_data (G_OBJECT (page), "glade-xml");
-	widget = glade_xml_get_widget (xml, "wireless_channel");
+	widget = glade_xml_get_widget (CE_PAGE (self)->xml, "wireless_channel");
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), 0);
 
 	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (box))) {
@@ -152,12 +148,12 @@
 	}
 }
 
-GtkWidget *
-page_wireless_new (NMConnection *connection, const char **title)
+CEPageWireless *
+ce_page_wireless_new (NMConnection *connection)
 {
-	GladeXML *xml;
+	CEPageWireless *self;
+	CEPage *parent;
 	NMSettingWireless *s_wireless;
-	GtkWidget *page;
 	GtkWidget *mode;
 	GtkWidget *band;
 	GtkWidget *channel;
@@ -171,43 +167,57 @@
 	int mtu_def;
 	char *utf8_ssid;
 
+	self = CE_PAGE_WIRELESS (g_object_new (CE_TYPE_PAGE_WIRELESS, NULL));
+	parent = CE_PAGE (self);
+
 	s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS));
-	g_return_val_if_fail (s_wireless != NULL, NULL);
+	if (!s_wireless) {
+		g_warning ("%s: Connection didn't have a wireless setting!", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+
+	parent->xml = glade_xml_new (GLADEDIR "/ce-page-wireless.glade", "WirelessPage", NULL);
+	if (!parent->xml) {
+		g_warning ("%s: Couldn't load wireless page glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
 
-	xml = glade_xml_new (GLADEDIR "/ce-page-wireless.glade", "WirelessPage", NULL);
-	g_return_val_if_fail (xml != NULL, NULL);
-	*title = _("Wireless");
-
-	page = glade_xml_get_widget (xml, "WirelessPage");
-	g_return_val_if_fail (page != NULL, NULL);
-	g_object_set_data_full (G_OBJECT (page),
-	                        "glade-xml", xml,
-	                        (GDestroyNotify) g_object_unref);
+	parent->page = glade_xml_get_widget (parent->xml, "WirelessPage");
+	if (!parent->page) {
+		g_warning ("%s: Couldn't load wireless page from glade file.", __func__);
+		g_object_unref (self);
+		return NULL;
+	}
+	g_object_ref_sink (parent->page);
+
+	parent->title = g_strdup (_("Wireless"));
 
-	rate = glade_xml_get_widget (xml, "wireless_rate");
+	rate = glade_xml_get_widget (parent->xml, "wireless_rate");
 	rate_def = ce_get_property_default (NM_SETTING (s_wireless), NM_SETTING_WIRELESS_RATE);
 	g_signal_connect (G_OBJECT (rate), "output",
 	                  (GCallback) ce_spin_output_with_default,
 	                  GINT_TO_POINTER (rate_def));
 
-	tx_power = glade_xml_get_widget (xml, "wireless_tx_power");
+	tx_power = glade_xml_get_widget (parent->xml, "wireless_tx_power");
 	tx_power_def = ce_get_property_default (NM_SETTING (s_wireless), NM_SETTING_WIRELESS_TX_POWER);
 	g_signal_connect (G_OBJECT (tx_power), "output",
 	                  (GCallback) ce_spin_output_with_default,
 	                  GINT_TO_POINTER (tx_power_def));
 
-	mtu = glade_xml_get_widget (xml, "wireless_mtu");
+	mtu = glade_xml_get_widget (parent->xml, "wireless_mtu");
 	mtu_def = ce_get_property_default (NM_SETTING (s_wireless), NM_SETTING_WIRELESS_MTU);
 	g_signal_connect (G_OBJECT (mtu), "output",
 	                  (GCallback) ce_spin_output_with_default,
 	                  GINT_TO_POINTER (mtu_def));
 
-	ssid = glade_xml_get_widget (xml, "wireless_ssid");
+	ssid = glade_xml_get_widget (parent->xml, "wireless_ssid");
 	utf8_ssid = nm_utils_ssid_to_utf8 ((const char *) s_wireless->ssid->data, s_wireless->ssid->len);
 	gtk_entry_set_text (GTK_ENTRY (ssid), utf8_ssid);
 	g_free (utf8_ssid);
 
-	mode = glade_xml_get_widget (xml, "wireless_mode");
+	mode = glade_xml_get_widget (parent->xml, "wireless_mode");
 	if (!strcmp (s_wireless->mode ? s_wireless->mode : "", "infrastructure"))
 		gtk_combo_box_set_active (GTK_COMBO_BOX (mode), 0);
 	else if (!strcmp (s_wireless->mode ? s_wireless->mode : "", "adhoc"))
@@ -215,13 +225,13 @@
 	else
 		gtk_combo_box_set_active (GTK_COMBO_BOX (mode), -1);
 
-	channel = glade_xml_get_widget (xml, "wireless_channel");
+	channel = glade_xml_get_widget (parent->xml, "wireless_channel");
 	g_signal_connect (G_OBJECT (channel), "output",
 	                  (GCallback) channel_spin_output_cb,
-	                  page);
+	                  self);
 	g_signal_connect (G_OBJECT (channel), "input",
 	                  (GCallback) channel_spin_input_cb,
-	                  page);
+	                  self);
 
 	gtk_widget_set_sensitive (channel, FALSE);
 	if (s_wireless->band) {
@@ -233,15 +243,15 @@
 			gtk_widget_set_sensitive (channel, TRUE);
 		}
 	}
-	band = glade_xml_get_widget (xml, "wireless_band");
+	band = glade_xml_get_widget (parent->xml, "wireless_band");
 	gtk_combo_box_set_active (GTK_COMBO_BOX (band), band_idx);
 	g_signal_connect (G_OBJECT (band), "changed",
 	                  (GCallback) band_value_changed_cb,
-	                  page);
+	                  self);
 
 	/* Update the channel _after_ the band has been set so that it gets
 	 * the right values */
-	g_object_set_data (G_OBJECT (page), "last-channel", GUINT_TO_POINTER (s_wireless->channel));
+	self->last_channel = s_wireless->channel;
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (channel), (gdouble) s_wireless->channel);
 
 	/* FIXME: BSSID */
@@ -251,7 +261,37 @@
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (tx_power), (gdouble) s_wireless->tx_power);
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (mtu), (gdouble) s_wireless->mtu);
 
-	return page;
+	return self;
 }
 
+GByteArray *
+ce_page_wireless_get_ssid (CEPageWireless *self)
+{
+	GtkWidget *widget;
+	const char *txt_ssid;
+	GByteArray *ssid;
+
+	g_return_val_if_fail (CE_IS_PAGE_WIRELESS (self), NULL);
+
+	widget = glade_xml_get_widget (CE_PAGE (self)->xml, "wireless_ssid");
+	g_return_val_if_fail (widget != NULL, NULL);
+
+	txt_ssid = gtk_entry_get_text (GTK_ENTRY (widget));
+	if (!txt_ssid || !strlen (txt_ssid))
+		return NULL;
+
+	ssid = g_byte_array_sized_new (strlen (txt_ssid));
+	g_byte_array_append (ssid, (const guint8 *) txt_ssid, strlen (txt_ssid));
+	return ssid;
+}
+
+static void
+ce_page_wireless_init (CEPageWireless *self)
+{
+}
+
+static void
+ce_page_wireless_class_init (CEPageWirelessClass *wired_class)
+{
+}
 

Modified: trunk/src/connection-editor/page-wireless.h
==============================================================================
--- trunk/src/connection-editor/page-wireless.h	(original)
+++ trunk/src/connection-editor/page-wireless.h	Wed Feb 27 16:06:12 2008
@@ -23,10 +23,36 @@
 #ifndef __PAGE_WIRELESS_H__
 #define __PAGE_WIRELESS_H__
 
-#include "nm-connection-editor.h"
+#include <nm-connection.h>
 
-GtkWidget *page_wireless_new (NMConnection *connection, const char **title);
+#include <glib/gtypes.h>
+#include <glib-object.h>
 
+#include "ce-page.h"
+
+#define CE_TYPE_PAGE_WIRELESS            (ce_page_wireless_get_type ())
+#define CE_PAGE_WIRELESS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE_WIRELESS, CEPageWireless))
+#define CE_PAGE_WIRELESS_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE_WIRELESS, CEPageWirelessClass))
+#define CE_IS_PAGE_WIRELESS(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE_WIRELESS))
+#define CE_IS_PAGE_WIRELESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE_WIRELESS))
+#define CE_PAGE_WIRELESS_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE_WIRELESS, CEPageWirelessClass))
+
+typedef struct {
+	CEPage parent;
+
+	int last_channel;
+} CEPageWireless;
+
+typedef struct {
+	CEPageClass parent;
+} CEPageWirelessClass;
+
+GType ce_page_wireless_get_type (void);
+
+CEPageWireless *ce_page_wireless_new (NMConnection *connection);
+
+/* Caller must free returned array */
+GByteArray *ce_page_wireless_get_ssid (CEPageWireless *self);
 
 #endif  /* __PAGE_WIRELESS_H__ */
 



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