network: teach the panel about nameservers and routes

This commit is contained in:
Richard Hughes 2010-12-17 10:58:56 +00:00
parent 39d9ed9976
commit 1ce24314ad
2 changed files with 507 additions and 53 deletions

View file

@ -648,7 +648,6 @@ panel_got_device_proxy_ip4_cb (GObject *source_object,
gpointer user_data)
{
GError *error = NULL;
GVariant *result = NULL;
PanelDeviceItem *item = (PanelDeviceItem *) user_data;
item->proxy_ip4 = g_dbus_proxy_new_for_bus_finish (res, &error);
@ -658,20 +657,10 @@ panel_got_device_proxy_ip4_cb (GObject *source_object,
goto out;
}
/* get the Address */
result = g_dbus_proxy_get_cached_property (item->proxy_ip4, "Addresses");
//Addresses = array of (array of uint32)
//Routes = array of (array of uint32)
//Domains = array of string
//Nameservers = array of uint32
//WinsServers = array of uint32
/* add device if there are no more pending actions */
if (--item->device_add_refcount == 0)
panel_add_device_to_listview (item);
out:
if (result != NULL)
g_variant_unref (result);
return;
}
@ -684,7 +673,6 @@ panel_got_device_proxy_ip6_cb (GObject *source_object,
gpointer user_data)
{
GError *error = NULL;
GVariant *result = NULL;
PanelDeviceItem *item = (PanelDeviceItem *) user_data;
item->proxy_ip6 = g_dbus_proxy_new_for_bus_finish (res, &error);
@ -694,19 +682,10 @@ panel_got_device_proxy_ip6_cb (GObject *source_object,
goto out;
}
/* get the Address */
result = g_dbus_proxy_get_cached_property (item->proxy_ip6, "Addresses");
//Addresses = array of (struct of (array of (byte), uint32, array of (byte)))
//Routes = array of (struct of (array of (byte), uint32, array of (byte)))
//Nameservers = array of (array of byte)
//Domains = array of string
/* add device if there are no more pending actions */
if (--item->device_add_refcount == 0)
panel_add_device_to_listview (item);
out:
if (result != NULL)
g_variant_unref (result);
return;
}
@ -1121,14 +1100,15 @@ panel_set_label_for_variant_ipv4 (GtkWidget *widget, GVariant *variant)
}
/**
* panel_set_label_for_variant_ipv4_array:
* panel_set_label_for_variant_ipv4_array_array:
*
* This is some crazy shit. NM sends us the following data type:
* "array of [array of [uint32]]"
**/
static void
panel_set_label_for_variant_ipv4_array (GtkWidget *widget, GVariant *variant)
static gboolean
panel_set_label_for_variant_ipv4_array_array (GtkWidget *widget, GVariant *variant)
{
gboolean ret;
gchar *tmp;
gsize len;
GString *string;
@ -1141,10 +1121,6 @@ panel_set_label_for_variant_ipv4_array (GtkWidget *widget, GVariant *variant)
/* get an iter of the outer array */
len = g_variant_iter_init (&iter, variant);
if (len != 1) {
g_warning ("invalid ipv4 address?!");
goto out;
}
/* unwrap the outer array */
outer = g_variant_iter_next_value (&iter);
@ -1182,17 +1158,68 @@ panel_set_label_for_variant_ipv4_array (GtkWidget *widget, GVariant *variant)
/* set label */
gtk_label_set_label (GTK_LABEL (widget), string->str);
out:
ret = string->len > 0;
g_string_free (string, TRUE);
return ret;
}
/**
* panel_set_label_for_variant_ipv4_array:
*
* TNM sends us the following data type "array of [uint32]"
**/
static void
panel_set_label_for_variant_ipv4_array (GtkWidget *widget, GVariant *variant)
{
gchar *tmp;
gsize len;
GString *string;
guint i;
GVariant *value;
string = g_string_new ("");
/* unwrap the array */
len = g_variant_n_children (variant);
if (len == 0) {
g_warning ("invalid ipv4 address on inner?!");
goto out;
}
for (i=0; i<len; i++) {
value = g_variant_get_child_value (variant, i);
tmp = panel_ipv4_to_string (value);
/* ignore invalid entries: TODO why? */
if (g_str_has_suffix (tmp, ".0")) {
g_debug ("ignoring IP %s", tmp);
} else {
g_debug ("got IP %s", tmp);
g_string_append_printf (string,
"%s, ",
tmp);
}
g_free (tmp);
g_variant_unref (value);
}
/* remove trailing space comma */
if (string->len > 2)
g_string_set_size (string, string->len - 2);
/* set label */
gtk_label_set_label (GTK_LABEL (widget), string->str);
out:
g_string_free (string, TRUE);
}
/**
* panel_set_label_for_variant_ipv6_prefixed_array:
*
* This is some crazy shit. NM sends us the following data type:
* "array of [struct of (array of [byte], uint32, array of [byte])]"
**/
static void
panel_set_label_for_variant_ipv6_array (GtkWidget *widget, GVariant *variant)
static gboolean
panel_set_label_for_variant_ipv6_prefixed_array (GtkWidget *widget, GVariant *variant)
{
GString *string;
gchar *tmp;
@ -1201,13 +1228,14 @@ panel_set_label_for_variant_ipv6_array (GtkWidget *widget, GVariant *variant)
gsize len;
GVariant *address;
guint32 prefix;
gboolean ret = FALSE;
string = g_string_new ("");
/* get an iter of the outer array */
len = g_variant_iter_init (&iter, variant);
if (len == 0) {
g_warning ("invalid ipv6 address?!");
g_debug ("no ipv6 address");
goto out;
}
@ -1231,7 +1259,57 @@ panel_set_label_for_variant_ipv6_array (GtkWidget *widget, GVariant *variant)
/* set label */
gtk_label_set_label (GTK_LABEL (widget), string->str);
out:
ret = string->len > 0;
g_string_free (string, TRUE);
return ret;
}
/**
* panel_set_label_for_variant_ipv6_array:
*
* NM sends us the following data type:
* "array of [array of (byte)]"
**/
static gboolean
panel_set_label_for_variant_ipv6_array (GtkWidget *widget, GVariant *variant)
{
gboolean ret = FALSE;
GString *string;
gchar *tmp;
GVariantIter iter;
gsize len;
GVariant *address;
string = g_string_new ("");
/* get an iter of the outer array */
len = g_variant_iter_init (&iter, variant);
if (len == 0) {
g_debug ("no ipv6 address");
goto out;
}
/* unwrap the outer array */
address = g_variant_iter_next_value (&iter);
while (address != NULL) {
/* format the address and add to the string */
tmp = panel_ipv6_to_string (address);
g_string_append_printf (string, "%s, ", tmp);
address = g_variant_iter_next_value (&iter);
}
/* remove trailing space comma */
if (string->len > 2)
g_string_set_size (string, string->len - 2);
/* set label */
gtk_label_set_label (GTK_LABEL (widget), string->str);
out:
ret = string->len > 0;
g_string_free (string, TRUE);
return ret;
}
/**
@ -1240,10 +1318,13 @@ out:
static void
panel_populate_wired_device (PanelDeviceItem *item)
{
gboolean ret;
GtkWidget *widget;
GVariant *hw_address;
GVariant *ip4 = NULL;
GVariant *ip6 = NULL;
GVariant *hw_address;
GVariant *nameservers = NULL;
GVariant *routes = NULL;
GVariant *speed;
CcNetworkPanelPrivate *priv = item->panel->priv;
@ -1252,26 +1333,99 @@ panel_populate_wired_device (PanelDeviceItem *item)
"hbox_wired_ip6"));
if (item->proxy_ip6 != NULL) {
gtk_widget_show (widget);
/* array of (ipdata, prefix, route) */
ip6 = g_dbus_proxy_get_cached_property (item->proxy_ip6,
"Addresses");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_ip6"));
panel_set_label_for_variant_ipv6_array (widget, ip6);
panel_set_label_for_variant_ipv6_prefixed_array (widget, ip6);
/* array of (ipdata, prefix, route) */
routes = g_dbus_proxy_get_cached_property (item->proxy_ip6,
"Routes");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_route"));
ret = panel_set_label_for_variant_ipv6_prefixed_array (widget, routes);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_route"));
gtk_widget_set_visible (widget, ret);
/* array of ipdata */
nameservers = g_dbus_proxy_get_cached_property (item->proxy_ip6,
"Nameservers");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_dns"));
ret = panel_set_label_for_variant_ipv6_array (widget, nameservers);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_dns"));
gtk_widget_set_visible (widget, ret);
/* Domains = array of string */
//no widget
/* i'm not sure how to get this yet */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_subnet"));
gtk_widget_hide (widget);
} else {
gtk_widget_hide (widget);
}
/* set IPv4 */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_ip4"));
if (item->proxy_ip4 != NULL) {
/* array of (array of uint32) */
ip4 = g_dbus_proxy_get_cached_property (item->proxy_ip4,
"Addresses");
panel_set_label_for_variant_ipv4_array (widget, ip4);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_ip4"));
panel_set_label_for_variant_ipv4_array_array (widget, ip4);
/* array of (array of uint32) */
routes = g_dbus_proxy_get_cached_property (item->proxy_ip4,
"Routes");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_route"));
ret = panel_set_label_for_variant_ipv4_array_array (widget, routes);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_route"));
gtk_widget_set_visible (widget, ret);
/* array of uint32 */
nameservers = g_dbus_proxy_get_cached_property (item->proxy_ip4,
"Nameservers");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_dns"));
panel_set_label_for_variant_ipv4_array (widget, nameservers);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_dns"));
gtk_widget_show (widget);
/* Domains = array of string */
//no widget
/* WinsServers = array of uint32 */
//no widget
/* i'm not sure how to get this yet */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_subnet"));
gtk_widget_hide (widget);
} else {
ip4 = g_dbus_proxy_get_cached_property (item->proxy,
"Ip4Address");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_ip4"));
panel_set_label_for_variant_ipv4 (widget, ip4);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_route"));
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_dns"));
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wired_subnet"));
gtk_widget_hide (widget);
}
/* set MAC */
@ -1291,6 +1445,10 @@ panel_populate_wired_device (PanelDeviceItem *item)
g_variant_unref (ip4);
if (ip6 != NULL)
g_variant_unref (ip6);
if (routes != NULL)
g_variant_unref (routes);
if (nameservers != NULL)
g_variant_unref (nameservers);
g_variant_unref (hw_address);
g_variant_unref (speed);
}
@ -1301,11 +1459,14 @@ panel_populate_wired_device (PanelDeviceItem *item)
static void
panel_populate_wireless_device (PanelDeviceItem *item)
{
gboolean ret;
GtkWidget *widget;
GVariant *bitrate;
GVariant *hw_address;
GVariant *ip4;
GVariant *ip6;
GVariant *nameservers = NULL;
GVariant *routes = NULL;
CcNetworkPanelPrivate *priv = item->panel->priv;
/* set IPv6 */
@ -1313,26 +1474,86 @@ panel_populate_wireless_device (PanelDeviceItem *item)
"hbox_wireless_ip6"));
if (item->proxy_ip6 != NULL) {
gtk_widget_show (widget);
/* array of (ipdata, prefix, route) */
ip6 = g_dbus_proxy_get_cached_property (item->proxy_ip6,
"Addresses");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_ip6"));
panel_set_label_for_variant_ipv6_array (widget, ip6);
panel_set_label_for_variant_ipv6_prefixed_array (widget, ip6);
/* array of (ipdata, prefix, route) */
routes = g_dbus_proxy_get_cached_property (item->proxy_ip6,
"Routes");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_route"));
ret = panel_set_label_for_variant_ipv6_prefixed_array (widget, routes);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wireless_route"));
gtk_widget_set_visible (widget, ret);
/* array of ipdata */
nameservers = g_dbus_proxy_get_cached_property (item->proxy_ip6,
"Nameservers");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_dns"));
ret = panel_set_label_for_variant_ipv6_array (widget, nameservers);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wireless_dns"));
gtk_widget_set_visible (widget, ret);
/* Domains = array of string */
//no widget
} else {
gtk_widget_hide (widget);
}
/* set IPv4 */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_ip4"));
if (item->proxy_ip4 != NULL) {
/* array of (array of uint32) */
ip4 = g_dbus_proxy_get_cached_property (item->proxy_ip4,
"Addresses");
panel_set_label_for_variant_ipv4_array (widget, ip4);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_ip4"));
panel_set_label_for_variant_ipv4_array_array (widget, ip4);
/* array of (array of uint32) */
routes = g_dbus_proxy_get_cached_property (item->proxy_ip4,
"Routes");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_route"));
panel_set_label_for_variant_ipv4_array_array (widget, routes);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wireless_route"));
gtk_widget_show (widget);
/* array of uint32 */
nameservers = g_dbus_proxy_get_cached_property (item->proxy_ip4,
"Nameservers");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_dns"));
panel_set_label_for_variant_ipv4_array (widget, nameservers);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wireless_dns"));
gtk_widget_show (widget);
/* Domains = array of string */
//no widget
/* WinsServers = array of uint32 */
//no widget
} else {
ip4 = g_dbus_proxy_get_cached_property (item->proxy,
"Ip4Address");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_ip4"));
panel_set_label_for_variant_ipv4 (widget, ip4);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wireless_route"));
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"hbox_wireless_dns"));
gtk_widget_hide (widget);
}
/* set MAC */
@ -1351,6 +1572,10 @@ panel_populate_wireless_device (PanelDeviceItem *item)
g_variant_unref (ip4);
if (ip6 != NULL)
g_variant_unref (ip6);
if (routes != NULL)
g_variant_unref (routes);
if (nameservers != NULL)
g_variant_unref (nameservers);
g_variant_unref (hw_address);
g_variant_unref (bitrate);
}

View file

@ -374,6 +374,141 @@
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox_wired_subnet">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
<object class="GtkHBox" id="hbox13">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="label" translatable="yes">Subnet Mast:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_wired_subnet">
<property name="visible">True</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox_wired_route">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
<object class="GtkHBox" id="hbox19">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="label" translatable="yes">Default Route:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_wired_route">
<property name="visible">True</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox_wired_dns">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
<object class="GtkHBox" id="hbox21">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">DNS:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_wired_dns">
<property name="visible">True</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">6</property>
</packing>
</child>
</object>
</child>
<child type="tab">
@ -525,6 +660,50 @@
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox15">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
<object class="GtkHBox" id="hbox16">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label15">
<property name="visible">True</property>
<property name="label" translatable="yes">Network Name:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="combobox_network_name">
<property name="visible">True</property>
<property name="model">liststore_wireless_network</property>
<property name="has_entry">True</property>
<property name="entry_text_column">1</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox_wireless_ip4">
<property name="visible">True</property>
@ -567,7 +746,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
<property name="position">4</property>
</packing>
</child>
<child>
@ -612,20 +791,20 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox15">
<object class="GtkHBox" id="hbox_wireless_route">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
<object class="GtkHBox" id="hbox16">
<object class="GtkHBox" id="hbox23">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label15">
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="label" translatable="yes">Network Name:</property>
<property name="label" translatable="yes">Default Route:</property>
</object>
<packing>
<property name="expand">False</property>
@ -642,14 +821,14 @@
</packing>
</child>
<child>
<object class="GtkComboBox" id="combobox_network_name">
<object class="GtkLabel" id="label_wireless_route">
<property name="visible">True</property>
<property name="model">liststore_wireless_network</property>
<property name="has_entry">True</property>
<property name="entry_text_column">1</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
@ -657,7 +836,52 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">5</property>
<property name="position">6</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox_wireless_dns">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
<object class="GtkHBox" id="hbox25">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="label" translatable="yes">DNS:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_wireless_dns">
<property name="visible">True</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">7</property>
</packing>
</child>
</object>
@ -999,8 +1223,8 @@
<child>
<object class="GtkLabel" id="label_vpn_group_password">
<property name="visible">True</property>
<property name="selectable">True</property>
<property name="label">***********</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -1044,8 +1268,8 @@
<child>
<object class="GtkLabel" id="label_vpn_username">
<property name="visible">True</property>
<property name="selectable">True</property>
<property name="label">smithy</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -1578,6 +1802,11 @@
<widget name="hbox47"/>
<widget name="hbox49"/>
<widget name="hbox3"/>
<widget name="hbox13"/>
<widget name="hbox19"/>
<widget name="hbox21"/>
<widget name="hbox23"/>
<widget name="hbox25"/>
</widgets>
</object>
<object class="GtkListStore" id="liststore_proxy_method">