summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2010-12-16 20:42:40 +0000
committerRichard Hughes <richard@hughsie.com>2010-12-16 20:42:58 +0000
commitc1fc40050afaa9e77dfefe32fd3a61c2482f603d (patch)
treee8de8e331b6a767af40cea6c3157cd6777b9ab52
parent7ca2a8a3e598b49b9becb104747fa09ee10954b3 (diff)
network: teach the network panel about IPv6
-rw-r--r--panels/network/cc-network-panel.c354
-rw-r--r--panels/network/network.ui108
-rw-r--r--panels/network/panel-common.c58
-rw-r--r--panels/network/panel-common.h2
4 files changed, 486 insertions, 36 deletions
diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c
index 32daca401..91db9e1cc 100644
--- a/panels/network/cc-network-panel.c
+++ b/panels/network/cc-network-panel.c
@@ -46,11 +46,16 @@ typedef struct {
CcNetworkPanel *panel;
gchar *active_access_point;
gchar *device_id;
+ gchar *ip4_config;
+ gchar *ip6_config;
gchar *modem_imei;
gchar *operator_name;
gchar *udi;
GDBusProxy *proxy;
GDBusProxy *proxy_additional;
+ GDBusProxy *proxy_ip4;
+ GDBusProxy *proxy_ip6;
+ guint device_add_refcount;
guint type;
} PanelDeviceItem;
@@ -268,10 +273,16 @@ panel_free_device_item (PanelDeviceItem *item)
g_object_unref (item->proxy);
if (item->proxy_additional != NULL)
g_object_unref (item->proxy_additional);
+ if (item->proxy_ip4 != NULL)
+ g_object_unref (item->proxy_ip4);
+ if (item->proxy_ip6 != NULL)
+ g_object_unref (item->proxy_ip6);
g_free (item->device_id);
g_free (item->active_access_point);
g_free (item->udi);
g_free (item->operator_name);
+ g_free (item->ip4_config);
+ g_free (item->ip6_config);
g_free (item->modem_imei);
g_free (item);
}
@@ -500,7 +511,9 @@ panel_got_device_proxy_additional_cb (GObject *source_object, GAsyncResult *res,
item);
}
- panel_add_device_to_listview (item);
+ /* 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);
@@ -540,7 +553,9 @@ panel_get_registration_info_cb (GObject *source_object, GAsyncResult *res, gpoin
* panel_got_device_proxy_modem_manager_gsm_network_cb:
**/
static void
-panel_got_device_proxy_modem_manager_gsm_network_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+panel_got_device_proxy_modem_manager_gsm_network_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
GError *error = NULL;
GVariant *result = NULL;
@@ -566,7 +581,9 @@ panel_got_device_proxy_modem_manager_gsm_network_cb (GObject *source_object, GAs
panel_get_registration_info_cb,
item);
- panel_add_device_to_listview (item);
+ /* 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);
@@ -577,7 +594,9 @@ out:
* panel_got_device_proxy_modem_manager_cb:
**/
static void
-panel_got_device_proxy_modem_manager_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+panel_got_device_proxy_modem_manager_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
GError *error = NULL;
GVariant *result = NULL;
@@ -593,6 +612,10 @@ panel_got_device_proxy_modem_manager_cb (GObject *source_object, GAsyncResult *r
/* get the IMEI */
result = g_dbus_proxy_get_cached_property (item->proxy_additional, "EquipmentIdentifier");
item->modem_imei = g_variant_dup_string (result, NULL);
+
+ /* 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);
@@ -614,16 +637,90 @@ panel_device_properties_changed_cb (GDBusProxy *proxy,
/* only refresh the selected device */
if (g_strcmp0 (priv->current_device, item->device_id) == 0)
panel_device_refresh_item_ui (item);
-//xxx
+}
+
+/**
+ * panel_got_device_proxy_ip4_cb:
+ **/
+static void
+panel_got_device_proxy_ip4_cb (GObject *source_object,
+ GAsyncResult *res,
+ 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);
+ if (item->proxy_ip4 == NULL) {
+ g_printerr ("Error creating ip4 proxy: %s\n", error->message);
+ g_error_free (error);
+ 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;
+}
+
+/**
+ * panel_got_device_proxy_ip6_cb:
+ **/
+static void
+panel_got_device_proxy_ip6_cb (GObject *source_object,
+ GAsyncResult *res,
+ 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);
+ if (item->proxy_ip6 == NULL) {
+ g_printerr ("Error creating ip6 proxy: %s\n", error->message);
+ g_error_free (error);
+ 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;
}
/**
* panel_got_device_proxy_cb:
**/
static void
-panel_got_device_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+panel_got_device_proxy_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
GError *error = NULL;
+ GVariant *variant_ip4 = NULL;
+ GVariant *variant_ip6 = NULL;
GVariant *variant_type = NULL;
GVariant *variant_udi = NULL;
PanelDeviceItem *item = (PanelDeviceItem *) user_data;
@@ -639,10 +736,43 @@ panel_got_device_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer u
variant_udi = g_dbus_proxy_get_cached_property (item->proxy, "Udi");
g_variant_get (variant_udi, "s", &item->udi);
+ /* get the IP object paths */
+ variant_ip4 = g_dbus_proxy_get_cached_property (item->proxy, "Ip4Config");
+ g_variant_get (variant_ip4, "o", &item->ip4_config);
+ variant_ip6 = g_dbus_proxy_get_cached_property (item->proxy, "Ip6Config");
+ g_variant_get (variant_ip6, "o", &item->ip6_config);
+
+ /* get the IP information */
+ if (g_strcmp0 (item->ip4_config, "/") != 0) {
+ item->device_add_refcount++;
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.NetworkManager",
+ item->ip4_config,
+ "org.freedesktop.NetworkManager.IP4Config",
+ item->panel->priv->cancellable,
+ panel_got_device_proxy_ip4_cb,
+ item);
+ }
+ if (g_strcmp0 (item->ip6_config, "/") != 0) {
+ item->device_add_refcount++;
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.NetworkManager",
+ item->ip6_config,
+ "org.freedesktop.NetworkManager.IP6Config",
+ item->panel->priv->cancellable,
+ panel_got_device_proxy_ip6_cb,
+ item);
+ }
+
/* get the additional interface for this device type */
variant_type = g_dbus_proxy_get_cached_property (item->proxy, "DeviceType");
g_variant_get (variant_type, "u", &item->type);
if (item->type == NM_DEVICE_TYPE_ETHERNET) {
+ item->device_add_refcount++;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
@@ -653,6 +783,7 @@ panel_got_device_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer u
panel_got_device_proxy_additional_cb,
item);
} else if (item->type == NM_DEVICE_TYPE_WIFI) {
+ item->device_add_refcount++;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
@@ -664,6 +795,7 @@ panel_got_device_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer u
item);
} else if (item->type == NM_DEVICE_TYPE_GSM ||
item->type == NM_DEVICE_TYPE_CDMA) {
+ item->device_add_refcount++;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
@@ -673,6 +805,7 @@ panel_got_device_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer u
item->panel->priv->cancellable,
panel_got_device_proxy_modem_manager_cb,
item);
+ item->device_add_refcount++;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
@@ -682,15 +815,21 @@ panel_got_device_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer u
item->panel->priv->cancellable,
panel_got_device_proxy_modem_manager_gsm_network_cb,
item);
- } else {
- panel_add_device_to_listview (item);
}
+ /* add device if there are no more pending actions */
+ if (--item->device_add_refcount == 0)
+ panel_add_device_to_listview (item);
+
/* we want to update the UI */
g_signal_connect (item->proxy, "g-properties-changed",
G_CALLBACK (panel_device_properties_changed_cb),
item);
out:
+ if (variant_ip4 != NULL)
+ g_variant_unref (variant_ip4);
+ if (variant_ip6 != NULL)
+ g_variant_unref (variant_ip6);
if (variant_udi != NULL)
g_variant_unref (variant_udi);
if (variant_type != NULL)
@@ -715,6 +854,7 @@ panel_add_device (CcNetworkPanel *panel, const gchar *device_id)
g_ptr_array_add (panel->priv->devices, item);
/* get initial device state */
+ item->device_add_refcount++;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
@@ -975,38 +1115,168 @@ static void
panel_set_label_for_variant_ipv4 (GtkWidget *widget, GVariant *variant)
{
gchar *ip_str;
- guint32 ip;
-
- g_variant_get (variant, "u", &ip);
- ip_str = g_strdup_printf ("%i.%i.%i.%i",
- ip & 0x000000ff,
- (ip & 0x0000ff00) / 0x100,
- (ip & 0x00ff0000) / 0x10000,
- (ip & 0xff000000) / 0x1000000);
+ ip_str = panel_ipv4_to_string (variant);
gtk_label_set_label (GTK_LABEL (widget), ip_str);
g_free (ip_str);
}
/**
+ * panel_set_label_for_variant_ipv4_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)
+{
+ gchar *tmp;
+ gsize len;
+ GString *string;
+ guint i;
+ GVariantIter iter;
+ GVariant *outer;
+ GVariant *value;
+
+ string = g_string_new ("");
+
+ /* 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);
+ while (outer != NULL) {
+
+ /* unwrap the inner array */
+ len = g_variant_n_children (outer);
+ if (len == 0) {
+ g_warning ("invalid ipv4 address on inner?!");
+ goto out;
+ }
+ for (i=0; i<len; i++) {
+ value = g_variant_get_child_value (outer, 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);
+ }
+ outer = 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:
+ g_string_free (string, TRUE);
+}
+
+/**
+ * panel_set_label_for_variant_ipv4_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)
+{
+ GString *string;
+ gchar *tmp;
+ GVariant *outer;
+ GVariantIter iter;
+ gsize len;
+ GVariant *address;
+ guint32 prefix;
+
+ 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?!");
+ goto out;
+ }
+
+ /* unwrap the outer array */
+ outer = g_variant_iter_next_value (&iter);
+ while (outer != NULL) {
+
+ /* format the address and add to the string */
+ address = g_variant_get_child_value (outer, 0);
+ tmp = panel_ipv6_to_string (address);
+ g_variant_get_child (outer, 1, "u", &prefix);
+ g_string_append_printf (string, "%s/%i, ", tmp, prefix);
+
+ outer = 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:
+ g_string_free (string, TRUE);
+}
+
+/**
* panel_populate_wired_device:
**/
static void
panel_populate_wired_device (PanelDeviceItem *item)
{
GtkWidget *widget;
- GVariant *ip4;
+ GVariant *ip4 = NULL;
+ GVariant *ip6 = NULL;
GVariant *hw_address;
GVariant *speed;
CcNetworkPanelPrivate *priv = item->panel->priv;
- /* set IP */
- ip4 = g_dbus_proxy_get_cached_property (item->proxy, "Ip4Address");
+ /* set IPv6 */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
- "label_wired_ip"));
- panel_set_label_for_variant_ipv4 (widget, ip4);
+ "hbox_wired_ip6"));
+ if (item->proxy_ip6 != NULL) {
+ gtk_widget_show (widget);
+ 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);
+ } else {
+ gtk_widget_hide (widget);
+ }
+
+ /* set IPv4 */
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
+ "label_wired_ip4"));
+ if (item->proxy_ip4 != NULL) {
+ ip4 = g_dbus_proxy_get_cached_property (item->proxy_ip4,
+ "Addresses");
+ panel_set_label_for_variant_ipv4_array (widget, ip4);
+ } else {
+ ip4 = g_dbus_proxy_get_cached_property (item->proxy,
+ "Ip4Address");
+ panel_set_label_for_variant_ipv4 (widget, ip4);
+ }
/* set MAC */
- hw_address = g_dbus_proxy_get_cached_property (item->proxy_additional, "HwAddress");
+ hw_address = g_dbus_proxy_get_cached_property (item->proxy_additional,
+ "HwAddress");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wired_mac"));
panel_set_label_for_variant_string (widget, hw_address);
@@ -1017,7 +1287,10 @@ panel_populate_wired_device (PanelDeviceItem *item)
"label_wired_speed"));
panel_set_label_for_variant_speed (widget, speed);
- g_variant_unref (ip4);
+ if (ip4 != NULL)
+ g_variant_unref (ip4);
+ if (ip6 != NULL)
+ g_variant_unref (ip6);
g_variant_unref (hw_address);
g_variant_unref (speed);
}
@@ -1032,16 +1305,39 @@ panel_populate_wireless_device (PanelDeviceItem *item)
GVariant *bitrate;
GVariant *hw_address;
GVariant *ip4;
+ GVariant *ip6;
CcNetworkPanelPrivate *priv = item->panel->priv;
- /* set IP */
- ip4 = g_dbus_proxy_get_cached_property (item->proxy, "Ip4Address");
+ /* set IPv6 */
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
- "label_wireless_ip"));
- panel_set_label_for_variant_ipv4 (widget, ip4);
+ "hbox_wireless_ip6"));
+ if (item->proxy_ip6 != NULL) {
+ gtk_widget_show (widget);
+ 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);
+ } else {
+ gtk_widget_hide (widget);
+ }
+
+ /* set IPv4 */
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
+ "label_wireless_ip4"));
+ if (item->proxy_ip4 != NULL) {
+ ip4 = g_dbus_proxy_get_cached_property (item->proxy_ip4,
+ "Addresses");
+ panel_set_label_for_variant_ipv4_array (widget, ip4);
+ } else {
+ ip4 = g_dbus_proxy_get_cached_property (item->proxy,
+ "Ip4Address");
+ panel_set_label_for_variant_ipv4 (widget, ip4);
+ }
/* set MAC */
- hw_address = g_dbus_proxy_get_cached_property (item->proxy_additional, "HwAddress");
+ hw_address = g_dbus_proxy_get_cached_property (item->proxy_additional,
+ "HwAddress");
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
"label_wireless_mac"));
panel_set_label_for_variant_string (widget, hw_address);
@@ -1053,6 +1349,8 @@ panel_populate_wireless_device (PanelDeviceItem *item)
panel_set_label_for_variant_bitrate (widget, bitrate);
g_variant_unref (ip4);
+ if (ip6 != NULL)
+ g_variant_unref (ip6);
g_variant_unref (hw_address);
g_variant_unref (bitrate);
}
diff --git a/panels/network/network.ui b/panels/network/network.ui
index 68043ac6d..eaa26e8a3 100644
--- a/panels/network/network.ui
+++ b/panels/network/network.ui
@@ -240,7 +240,7 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox19">
+ <object class="GtkHBox" id="hbox_wired_speed">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
@@ -285,7 +285,7 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox23">
+ <object class="GtkHBox" id="hbox_wired_ip4">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
@@ -294,7 +294,7 @@
<child>
<object class="GtkLabel" id="label25">
<property name="visible">True</property>
- <property name="label" translatable="yes">IP Address:</property>
+ <property name="label" translatable="yes">IPv4 Address:</property>
</object>
<packing>
<property name="expand">False</property>
@@ -311,7 +311,7 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="label_wired_ip">
+ <object class="GtkLabel" id="label_wired_ip4">
<property name="visible">True</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
@@ -329,6 +329,51 @@
<property name="position">2</property>
</packing>
</child>
+ <child>
+ <object class="GtkHBox" id="hbox_wired_ip6">
+ <property name="visible">True</property>
+ <property name="spacing">9</property>
+ <child>
+ <object class="GtkHBox" id="hbox924">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label925">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">IPv6 Address:</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_ip6">
+ <property name="visible">True</property>
+ <property name="label">::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">3</property>
+ </packing>
+ </child>
</object>
</child>
<child type="tab">
@@ -481,7 +526,7 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox13">
+ <object class="GtkHBox" id="hbox_wireless_ip4">
<property name="visible">True</property>
<property name="spacing">9</property>
<child>
@@ -490,7 +535,7 @@
<child>
<object class="GtkLabel" id="label13">
<property name="visible">True</property>
- <property name="label" translatable="yes">IP Address:</property>
+ <property name="label" translatable="yes">IPv4 Address:</property>
</object>
<packing>
<property name="expand">False</property>
@@ -507,7 +552,7 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="label_wireless_ip">
+ <object class="GtkLabel" id="label_wireless_ip4">
<property name="visible">True</property>
<property name="label">127.0.0.1</property>
<property name="selectable">True</property>
@@ -526,6 +571,51 @@
</packing>
</child>
<child>
+ <object class="GtkHBox" id="hbox_wireless_ip6">
+ <property name="visible">True</property>
+ <property name="spacing">9</property>
+ <child>
+ <object class="GtkHBox" id="hbox914">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label913">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">IPv6 Address:</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_ip6">
+ <property name="visible">True</property>
+ <property name="label">::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="hbox15">
<property name="visible">True</property>
<property name="spacing">9</property>
@@ -567,7 +657,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">4</property>
+ <property name="position">5</property>
</packing>
</child>
</object>
@@ -1468,6 +1558,7 @@
<widget name="hbox41"/>
<widget name="hbox39"/>
<widget name="hbox24"/>
+ <widget name="hbox924"/>
<widget name="hbox20"/>
<widget name="hbox18"/>
<widget name="hbox16"/>
@@ -1475,6 +1566,7 @@
<widget name="hbox9"/>
<widget name="hbox10"/>
<widget name="hbox14"/>
+ <widget name="hbox914"/>
<widget name="hbox22"/>
<widget name="hbox26"/>
<widget name="hbox28"/>
diff --git a/panels/network/panel-common.c b/panels/network/panel-common.c
index 07bac6c97..2af8a357a 100644
--- a/panels/network/panel-common.c
+++ b/panels/network/panel-common.c
@@ -205,3 +205,61 @@ panel_device_state_to_localized_string (guint type)
return value;
}
+/**
+ * panel_ipv4_to_string:
+ **/
+gchar *
+panel_ipv4_to_string (GVariant *variant)
+{
+ gchar *ip_str;
+ guint32 ip;
+
+ g_variant_get (variant, "u", &ip);
+ ip_str = g_strdup_printf ("%i.%i.%i.%i",
+ ip & 0x000000ff,
+ (ip & 0x0000ff00) / 0x100,
+ (ip & 0x00ff0000) / 0x10000,
+ (ip & 0xff000000) / 0x1000000);
+ return ip_str;
+}
+
+/**
+ * panel_ipv6_to_string:
+ *
+ * Formats an 'ay' variant into a IPv6 address you recognise, e.g.
+ * "fe80::21c:bfff:fe81:e8de"
+ **/
+gchar *
+panel_ipv6_to_string (GVariant *variant)
+{
+ gchar tmp1;
+ gchar tmp2;
+ guint i = 0;
+ gboolean ret = FALSE;
+ GString *string;
+
+ if (g_variant_n_children (variant) != 16)
+ return NULL;
+
+ string = g_string_new ("");
+ for (i=0; i<16; i+=2) {
+ g_variant_get_child (variant, i+0, "y", &tmp1);
+ g_variant_get_child (variant, i+1, "y", &tmp2);
+ if (tmp1 == 0 && tmp2 == 0) {
+ if (!ret) {
+ g_string_append (string, ":");
+ ret = TRUE;
+ }
+ } else {
+ g_string_append_printf (string,
+ "%x%x%x%x:",
+ (tmp1 & 0xf0) / 16,
+ tmp1 & 0x0f,
+ (tmp2 & 0xf0) / 16,
+ tmp2 & 0x0f);
+ ret = FALSE;
+ }
+ }
+ g_string_set_size (string, string->len - 1);
+ return g_string_free (string, FALSE);
+}
diff --git a/panels/network/panel-common.h b/panels/network/panel-common.h
index 57a7c1792..f903af1ea 100644
--- a/panels/network/panel-common.h
+++ b/panels/network/panel-common.h
@@ -60,6 +60,8 @@ const gchar *panel_device_type_to_localized_string (guint type);
const gchar *panel_device_type_to_sortable_string (guint type);
const gchar *panel_ap_mode_to_localized_string (guint mode);
const gchar *panel_device_state_to_localized_string (guint type);
+gchar *panel_ipv4_to_string (GVariant *variant);
+gchar *panel_ipv6_to_string (GVariant *variant);
G_END_DECLS