[network-manager-netbook] (Re)implement support for static IP



commit d60fe3d507daede92b52135ab9edb97f0d690ad0
Author: Tambet Ingo <tambet gmail com>
Date:   Thu Jan 28 11:36:23 2010 -0400

    (Re)implement support for static IP
    
    It got lost with the new design and now it's back.

 src/nmn-item-renderer.c |   59 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 55 insertions(+), 4 deletions(-)
---
diff --git a/src/nmn-item-renderer.c b/src/nmn-item-renderer.c
index 8f2a692..af4d5b5 100644
--- a/src/nmn-item-renderer.c
+++ b/src/nmn-item-renderer.c
@@ -61,6 +61,9 @@ typedef struct {
     gboolean disposed;
 } NmnItemRendererPrivate;
 
+static NmnConnectionDetails *get_details (NmnItemRenderer *self);
+
+
 GtkWidget *
 nmn_item_renderer_new (void)
 {
@@ -193,15 +196,63 @@ item_changed (NMListItem *item,
 }
 
 static void
+update_connection_cb (NMSettingsConnectionInterface *connection,
+                      GError *error,
+                      gpointer user_data)
+{
+    NmnItemRenderer *self = NMN_ITEM_RENDERER (user_data);
+    NmnItemRendererPrivate *priv = GET_PRIVATE (self);
+
+    if (error)
+        g_warning ("Couldn't update connection: %s", error->message);
+    else
+        nm_list_item_connect (nmn_item_renderer_get_item (self));
+}
+
+static gboolean
+details_need_updating (NmnItemRenderer *self)
+{
+    NmnItemRendererPrivate *priv = GET_PRIVATE (self);
+    NmnConnectionDetails *details;
+    NMSettingsConnectionInterface *connection;
+    NMSetting *current_config;
+    NMSetting *new_config;
+
+    connection = nm_connection_item_get_connection (NM_CONNECTION_ITEM (priv->item));
+    if (!connection)
+        /* FIXME: Now this is wrong - need to use the IP configuration still */
+        return FALSE;
+
+    current_config = nm_connection_get_setting (NM_CONNECTION (connection), NM_TYPE_SETTING_IP4_CONFIG);
+
+    details = get_details (self);
+    new_config = NM_SETTING (nmn_connection_details_get_data (NMN_CONNECTION_DETAILS (details)));
+    g_assert (new_config);
+
+    if (current_config == NULL || nm_setting_compare (current_config, new_config, 0) == FALSE) {
+        nm_connection_add_setting (NM_CONNECTION (connection), new_config);
+        nm_connection_dump (NM_CONNECTION (connection));
+        nm_settings_connection_interface_update (connection,
+                                                 update_connection_cb,
+                                                 self);
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static void
 connect_button_clicked (GtkButton *button, gpointer user_data)
 {
     NmnItemRenderer *self = NMN_ITEM_RENDERER (user_data);
     NMListItem *item;
 
     item = nmn_item_renderer_get_item (self);
-    if (nm_list_item_get_status (item) == NM_LIST_ITEM_STATUS_DISCONNECTED)
-        nm_list_item_connect (item);
-    else
+    if (nm_list_item_get_status (item) == NM_LIST_ITEM_STATUS_DISCONNECTED) {
+        if (!details_need_updating (self))
+            nm_list_item_connect (item);
+    } else
         nm_list_item_disconnect (item);
 }
 
@@ -215,7 +266,7 @@ details_changed (NmnConnectionDetails *details,
     gtk_widget_set_sensitive (GTK_WIDGET (priv->connect_button), complete);
 }
 
-NmnConnectionDetails *
+static NmnConnectionDetails *
 get_details (NmnItemRenderer *self)
 {
     NmnItemRendererPrivate *priv = GET_PRIVATE (self);



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