[network-manager-applet/th/proxy-bgo621767: 5/6] nm-c-e/proxy: Support proxy handling similar to nmcli.



commit fb89efbef7618b99f94ed3faa0754f6f41bb76cf
Author: Atul Anand <atulhjp gmail com>
Date:   Tue Dec 6 16:58:46 2016 +0530

    nm-c-e/proxy: Support proxy handling similar to nmcli.
    
    This patch removes multiple entries/widgets following conventional
    GUI and introduces basic features following what nmcli provides for
    proxy handling and manipulation. It is an unfair idea to follow the co-
    ventional GUI and provide entries for http/https/ftp/socks which are
    actually browser protocols and standard browsers have already been
    provinding proxy feature. On the other side we can't provide entries
    for all schemes (there are a lot, smtp://, mail://, gopher://, etc).
    
    Even if nm-c-e provides them, it would only be able to create protocol
    based scripts not general ones because the later one require more pa-
    rameters than just proxy:port and excludes.
    
    NetworkManager is intended to provide systemwide proxy settings, so it
    should look for features that are common for all.

 src/connection-editor/ce-page-proxy.ui |  387 +++-----------------------------
 src/connection-editor/page-proxy.c     |  358 ++++++++----------------------
 2 files changed, 126 insertions(+), 619 deletions(-)
---
diff --git a/src/connection-editor/ce-page-proxy.ui b/src/connection-editor/ce-page-proxy.ui
index dcb6558..b9d431a 100644
--- a/src/connection-editor/ce-page-proxy.ui
+++ b/src/connection-editor/ce-page-proxy.ui
@@ -2,48 +2,6 @@
 <!-- Generated with glade 3.19.0 -->
 <interface>
   <requires lib="gtk+" version="3.4"/>
-  <object class="GtkAdjustment" id="ftp_port_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
-  <object class="GtkAdjustment" id="http_port_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
-  <object class="GtkListStore" id="proxy_method_liststore">
-    <columns>
-      <!-- column-name method -->
-      <column type="gchararray"/>
-      <!-- column-name Value -->
-      <column type="gchararray"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes">Automatic</col>
-        <col id="1" translatable="yes">auto</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">Manual</col>
-        <col id="1" translatable="yes">manual</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">None</col>
-        <col id="1" translatable="yes">none</col>
-      </row>
-    </data>
-  </object>
-  <object class="GtkAdjustment" id="socks_port_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
-  <object class="GtkAdjustment" id="ssl_port_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
   <object class="GtkBox" id="ProxyPage">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -51,7 +9,7 @@
     <property name="orientation">vertical</property>
     <property name="spacing">6</property>
     <child>
-      <object class="GtkBox" id="box2">
+      <object class="GtkBox" id="box1">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="spacing">12</property>
@@ -73,9 +31,8 @@
             <property name="can_focus">False</property>
             <property name="active_id">0</property>
             <items>
-              <item id="0" translatable="yes">Automatic</item>
-              <item id="1" translatable="yes">Manual</item>
-              <item id="2" translatable="yes">None</item>
+              <item id="0" translatable="yes">None</item>
+              <item id="1" translatable="yes">Automatic</item>
             </items>
           </object>
           <packing>
@@ -92,152 +49,32 @@
       </packing>
     </child>
     <child>
-      <object class="GtkBox" id="box1">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkLabel" id="proxy_http_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">HTTP Proxy:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkEntry" id="proxy_http_entry">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="proxy_http_port_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">Port:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkSpinButton" id="proxy_http_port_spin">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="adjustment">http_port_adjustment</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">1</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="proxy_http_default_checkbutton">
-        <property name="label" translatable="yes">Default</property>
+      <object class="GtkCheckButton" id="proxy_browser_only_checkbutton">
+        <property name="label" translatable="yes">For Browser Only</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="receives_default">False</property>
-        <property name="tooltip_text" translatable="yes">Make HTTP proxy default for all 
protocols.</property>
+        <property name="tooltip_text" translatable="yes">Use this Proxy Configuration for Only Browser 
Clients/schemes.</property>
         <property name="halign">start</property>
-        <property name="margin_left">100</property>
         <property name="xalign">0.5</property>
-        <property name="image_position">bottom</property>
         <property name="draw_indicator">True</property>
       </object>
       <packing>
         <property name="expand">False</property>
         <property name="fill">False</property>
-        <property name="position">2</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkBox" id="box5">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkLabel" id="proxy_ssl_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">SSL Proxy:  </property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkEntry" id="proxy_ssl_entry">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="proxy_ssl_port_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">Port:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkSpinButton" id="proxy_ssl_port_spin">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="adjustment">ssl_port_adjustment</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">3</property>
+        <property name="position">1</property>
       </packing>
     </child>
     <child>
-      <object class="GtkBox" id="box6">
+      <object class="GtkBox" id="box2">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="spacing">10</property>
         <child>
-          <object class="GtkLabel" id="proxy_ftp_label">
+          <object class="GtkLabel" id="proxy_pac_url_label">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">FTP Proxy:   </property>
+            <property name="label" translatable="yes">PAC URL:    </property>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -246,9 +83,10 @@
           </packing>
         </child>
         <child>
-          <object class="GtkEntry" id="proxy_ftp_entry">
+          <object class="GtkEntry" id="proxy_pac_url_entry">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
+            <property name="tooltip_text" translatable="yes">URL from where PAC Script is to be 
obtained.</property>
           </object>
           <packing>
             <property name="expand">True</property>
@@ -256,136 +94,36 @@
             <property name="position">1</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkLabel" id="proxy_ftp_port_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">Port:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkSpinButton" id="proxy_ftp_port_spin">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="adjustment">ftp_port_adjustment</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
       </object>
       <packing>
         <property name="expand">False</property>
         <property name="fill">True</property>
-        <property name="position">4</property>
+        <property name="position">2</property>
       </packing>
     </child>
     <child>
-      <object class="GtkBox" id="box7">
+      <object class="GtkBox" id="box3">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkLabel" id="proxy_socks_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">SOCKS Proxy:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkEntry" id="proxy_socks_entry">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
+        <property name="spacing">4</property>
         <child>
-          <object class="GtkLabel" id="proxy_socks_port_label">
+          <object class="GtkLabel" id="proxy_pac_script_label">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">Port:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkSpinButton" id="proxy_socks_port_spin">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="adjustment">socks_port_adjustment</property>
+            <property name="label" translatable="yes">PAC Script:   </property>
           </object>
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">5</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="proxy_socks_version_checkbutton">
-        <property name="label" translatable="yes">SOCKS v5</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
-        <property name="tooltip_text" translatable="yes">Default is SOCKS v4.</property>
-        <property name="halign">start</property>
-        <property name="margin_left">100</property>
-        <property name="xalign">0.5</property>
-        <property name="draw_indicator">True</property>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">False</property>
-        <property name="position">6</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkBox" id="box8">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkLabel" id="proxy_no_proxy_for_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">No Proxy For:</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
             <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="GtkEntry" id="proxy_no_proxy_for_entry">
+          <object class="GtkButton" id="proxy_pac_script_import_button">
+            <property name="label" translatable="yes">Import script from a file...</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="tooltip_text" translatable="yes">List of hosts for proxy exclusion eg: 
"*mydomain.com".</property>
+            <property name="receives_default">True</property>
           </object>
           <packing>
             <property name="expand">True</property>
@@ -397,73 +135,26 @@
       <packing>
         <property name="expand">False</property>
         <property name="fill">True</property>
-        <property name="position">7</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="proxy_browser_only_checkbutton">
-        <property name="label" translatable="yes">For Browser Only</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
-        <property name="tooltip_text" translatable="yes">Use this Proxy Configuration for Only Browser 
Clients/schemes.</property>
-        <property name="halign">start</property>
-        <property name="margin_left">100</property>
-        <property name="xalign">0.5</property>
-        <property name="draw_indicator">True</property>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">False</property>
-        <property name="position">8</property>
+        <property name="position">3</property>
       </packing>
     </child>
     <child>
-      <object class="GtkBox" id="box9">
+      <object class="GtkBox" id="box4">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkLabel" id="proxy_pac_url_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">PAC URL:    </property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
+        <property name="orientation">vertical</property>
         <child>
-          <object class="GtkEntry" id="proxy_pac_url_entry">
+          <object class="GtkScrolledWindow" id="scrolledwindow1">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="tooltip_text" translatable="yes">URL from where PAC Script is to be 
obtained.</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">9</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkBox" id="box3">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="spacing">4</property>
-        <child>
-          <object class="GtkLabel" id="proxy_pac_script_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">PAC Script:   </property>
+            <property name="shadow_type">in</property>
+            <property name="min_content_height">100</property>
+            <child>
+              <object class="GtkTextView" id="proxy_pac_script_window">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </object>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -471,23 +162,11 @@
             <property name="position">0</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkFileChooserButton" id="proxy_pac_script_button">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="title" translatable="yes">Select a PAC File</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
       </object>
       <packing>
         <property name="expand">False</property>
         <property name="fill">True</property>
-        <property name="position">10</property>
+        <property name="position">4</property>
       </packing>
     </child>
   </object>
diff --git a/src/connection-editor/page-proxy.c b/src/connection-editor/page-proxy.c
index 8711f9d..29f18a7 100644
--- a/src/connection-editor/page-proxy.c
+++ b/src/connection-editor/page-proxy.c
@@ -37,32 +37,6 @@ typedef struct {
        /* Method */
        GtkComboBox *method;
 
-       /* HTTP Proxy */
-       GtkWidget *http_proxy_label;
-       GtkEntry *http_proxy;
-       GtkSpinButton *http_port;
-       GtkCheckButton *http_default;
-
-       /* SSL Proxy */
-       GtkWidget *ssl_proxy_label;
-       GtkEntry *ssl_proxy;
-       GtkSpinButton *ssl_port;
-
-       /* FTP Proxy */
-       GtkWidget *ftp_proxy_label;
-       GtkEntry *ftp_proxy;
-       GtkSpinButton *ftp_port;
-
-       /* SOCKS Proxy */
-       GtkWidget *socks_proxy_label;
-       GtkEntry *socks_proxy;
-       GtkSpinButton *socks_port;
-       GtkCheckButton *socks_version_5;
-
-       /* NO PROXY FOR */
-       GtkWidget *no_proxy_for_label;
-       GtkEntry *no_proxy_for;
-
        /* Browser Only */
        GtkCheckButton *browser_only;
 
@@ -72,12 +46,12 @@ typedef struct {
 
        /* PAC Script */
        GtkWidget *pac_script_label;
-       GtkFileChooser *pac_script;
+       GtkButton *pac_script_import_button;
+       GtkTextView *pac_script_window;
 } CEPageProxyPrivate;
 
-#define PROXY_METHOD_AUTO    0
-#define PROXY_METHOD_MANUAL  1
-#define PROXY_METHOD_NONE    2
+#define PROXY_METHOD_NONE    0
+#define PROXY_METHOD_AUTO    1
 
 static void
 proxy_private_init (CEPageProxy *self)
@@ -89,34 +63,14 @@ proxy_private_init (CEPageProxy *self)
 
        priv->method = GTK_COMBO_BOX (gtk_builder_get_object (builder, "proxy_method"));
 
-       priv->http_proxy_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_http_label"));
-       priv->http_proxy = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_http_entry"));
-       priv->http_port = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "proxy_http_port_spin"));
-       priv->http_default = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, 
"proxy_http_default_checkbutton"));
-
-       priv->ssl_proxy_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_ssl_label"));
-       priv->ssl_proxy = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_ssl_entry"));
-       priv->ssl_port = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "proxy_ssl_port_spin"));
-
-       priv->ftp_proxy_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_ftp_label"));
-       priv->ftp_proxy = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_ftp_entry"));
-       priv->ftp_port = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "proxy_ftp_port_spin"));
-
-       priv->socks_proxy_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_socks_label"));
-       priv->socks_proxy = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_socks_entry"));
-       priv->socks_port = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "proxy_socks_port_spin"));
-       priv->socks_version_5 = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, 
"proxy_socks_version_checkbutton"));
-
-       priv->no_proxy_for_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_no_proxy_for_label"));
-       priv->no_proxy_for = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_no_proxy_for_entry"));
-
        priv->browser_only = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, 
"proxy_browser_only_checkbutton"));
 
        priv->pac_url_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_pac_url_label"));
        priv->pac_url = GTK_ENTRY (gtk_builder_get_object (builder, "proxy_pac_url_entry"));
 
        priv->pac_script_label = GTK_WIDGET (gtk_builder_get_object (builder, "proxy_pac_script_label"));
-       priv->pac_script = GTK_FILE_CHOOSER (gtk_builder_get_object (builder, "proxy_pac_script_button"));
+       priv->pac_script_import_button = GTK_BUTTON (gtk_builder_get_object (builder, 
"proxy_pac_script_import_button"));
+       priv->pac_script_window = GTK_TEXT_VIEW (gtk_builder_get_object (builder, "proxy_pac_script_window"));
 }
 
 static void
@@ -124,85 +78,68 @@ method_changed (GtkComboBox *combo, gpointer user_data)
 {
        CEPageProxy *self = user_data;
        CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
-       int method;
-       const char *filename = NULL;
-
-       method = gtk_combo_box_get_active (combo);
-
-       if (method == PROXY_METHOD_AUTO || method == PROXY_METHOD_NONE) {
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_proxy_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_proxy), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_port), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_default), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ssl_proxy_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ssl_proxy), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ssl_port), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ftp_proxy_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ftp_proxy), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ftp_port), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_proxy_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_proxy), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_port), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_version_5), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->no_proxy_for_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->no_proxy_for), FALSE);
+       int method = gtk_combo_box_get_active (combo);
+
+       if (method == PROXY_METHOD_NONE) {
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url_label), FALSE);
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url), FALSE);
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_label), FALSE);
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_import_button), FALSE);
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_window), FALSE);
+       } else {
                gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url_label), TRUE);
                gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url), TRUE);
                gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_label), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script), TRUE);
-
-               gtk_entry_set_text (priv->http_proxy, "");
-               gtk_spin_button_set_value (priv->http_port, 0);
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->http_default), FALSE);
-               gtk_entry_set_text (priv->ssl_proxy, "");
-               gtk_spin_button_set_value (priv->ssl_port, 0);
-               gtk_entry_set_text (priv->ftp_proxy, "");
-               gtk_spin_button_set_value (priv->ftp_port, 0);
-               gtk_entry_set_text (priv->socks_proxy, "");
-               gtk_spin_button_set_value (priv->socks_port, 0);
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->socks_version_5), FALSE);
-               gtk_entry_set_text (priv->no_proxy_for, "");
-
-               if (method == PROXY_METHOD_NONE) {
-                       gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url_label), FALSE);
-                       gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url), FALSE);
-                       gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_label), FALSE);
-                       gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script), FALSE);
-
-                       gtk_entry_set_text (priv->pac_url, "");
-
-                       filename = gtk_file_chooser_get_filename (priv->pac_script);
-                       if (filename)
-                               gtk_file_chooser_unselect_filename (priv->pac_script, filename);
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_import_button), TRUE);
+               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_window), TRUE);
+       }
+}
+
+static void
+import_button_clicked_cb (GtkWidget *widget, CEPageProxy *self)
+{
+       CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
+       GtkWidget *dialog, *toplevel;
+       GtkTextBuffer *buffer;
+       char *filename, *script = NULL;
+       gsize len;
+
+       toplevel = gtk_widget_get_toplevel (CE_PAGE (self)->page);
+       g_return_if_fail (toplevel);
+       g_return_if_fail (gtk_widget_is_toplevel (toplevel));
+
+       dialog = gtk_file_chooser_dialog_new (_("Select file to import"),
+                                             GTK_WINDOW (toplevel),
+                                             GTK_FILE_CHOOSER_ACTION_OPEN,
+                                             GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                             GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                             NULL);
+       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+               if (!filename) {
+                       g_warning ("%s: didn't get a filename back from the chooser!", __func__);
+                       goto out;
                }
-       } else {
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_proxy_label), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_proxy), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_port), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->http_default), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ssl_proxy_label), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ssl_proxy), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ssl_port), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ftp_proxy_label), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ftp_proxy), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->ftp_port), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_proxy_label), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_proxy), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_port), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->socks_version_5), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->no_proxy_for_label), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->no_proxy_for), TRUE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_url), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script_label), FALSE);
-               gtk_widget_set_sensitive (GTK_WIDGET (priv->pac_script), FALSE);
 
-               gtk_entry_set_text (priv->pac_url, "");
+               g_file_get_contents (filename, &script, &len, NULL);
+               if (   len > 100000
+                       || !strstr (script, "FindProxyForURL")
+                       || !g_utf8_validate (script, -1, NULL)) {
+                       g_free (script);
+                       script = NULL;
+               }
 
-               filename = gtk_file_chooser_get_filename (priv->pac_script);
-               if (filename)
-                       gtk_file_chooser_unselect_filename (priv->pac_script, filename);
+               buffer = gtk_text_view_get_buffer (priv->pac_script_window);
+               gtk_text_buffer_set_text (buffer, script ? script : "", -1);
+
+               g_free (filename);
+               g_free (script);
        }
+
+out:
+       gtk_widget_destroy (dialog);
 }
 
 static void
@@ -211,10 +148,8 @@ populate_ui (CEPageProxy *self)
        CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
        NMSettingProxy *setting = priv->setting;
        NMSettingProxyMethod s_method;
-       GString *string = NULL;
-       char **iter, **excludes = NULL;
-       gboolean http_default = FALSE;
-       const char *tmp = NULL, *filename = NULL;
+       GtkTextBuffer *buffer;
+       const char *tmp = NULL;
 
        /* Method */
        s_method = nm_setting_proxy_get_method (setting);
@@ -227,59 +162,9 @@ populate_ui (CEPageProxy *self)
                gtk_entry_set_text (priv->pac_url, tmp ? tmp : "");
 
                /* Pac Script */
-               filename = nm_setting_proxy_get_pac_script (setting);
-               if (filename)
-                       gtk_file_chooser_set_filename (priv->pac_script, filename);
-
-               break;
-       case NM_SETTING_PROXY_METHOD_MANUAL:
-               gtk_combo_box_set_active (priv->method, PROXY_METHOD_MANUAL);
-
-               /* No Proxy For */
-               string = g_string_new ("");
-               excludes = nm_setting_proxy_get_no_proxy_for (setting);
-               if (excludes) {
-                       for (iter = excludes; *iter; iter++) {
-                               if (string->len)
-                                       g_string_append (string, ", ");
-                               g_string_append (string, *iter);
-                       }
-               }
-               gtk_entry_set_text (priv->no_proxy_for, string->str);
-               g_string_free (string, TRUE);
-
-               /* HTTP Proxy */
-               tmp = nm_setting_proxy_get_http_proxy (setting);
-               gtk_entry_set_text (priv->http_proxy, tmp ? tmp : "");
-               gtk_spin_button_set_value (priv->http_port,
-                                         (gdouble) nm_setting_proxy_get_http_port (setting));
-
-               http_default = nm_setting_proxy_get_http_default (setting);
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->http_default), http_default);
-
-               if (http_default)
-                       break;
-
-               /* SSL Proxy */
-               tmp = nm_setting_proxy_get_ssl_proxy (setting);
-               gtk_entry_set_text (priv->ssl_proxy, tmp ? tmp : "");
-               gtk_spin_button_set_value (priv->ssl_port,
-                                         (gdouble) nm_setting_proxy_get_ssl_port (setting));
-
-               /* FTP Proxy */
-               tmp = nm_setting_proxy_get_ftp_proxy (setting);
-               gtk_entry_set_text (priv->ftp_proxy, tmp ? tmp : "");
-               gtk_spin_button_set_value (priv->ftp_port,
-                                         (gdouble) nm_setting_proxy_get_ftp_port (setting));
-
-               /* SOCKS Proxy */
-               tmp = nm_setting_proxy_get_socks_proxy (setting);
-               gtk_entry_set_text (priv->socks_proxy, tmp ? tmp : "");
-               gtk_spin_button_set_value (priv->socks_port,
-                                         (gdouble) nm_setting_proxy_get_socks_port (setting));
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->socks_version_5),
-                                             nm_setting_proxy_get_socks_version_5 (setting));
-
+               tmp = nm_setting_proxy_get_pac_script (setting);
+               buffer = gtk_text_view_get_buffer (priv->pac_script_window);
+               gtk_text_buffer_set_text (buffer, tmp ? tmp : "", -1);
                break;
        case NM_SETTING_PROXY_METHOD_NONE:
                gtk_combo_box_set_active (priv->method, PROXY_METHOD_NONE);
@@ -302,6 +187,7 @@ finish_setup (CEPageProxy *self, gpointer unused, GError *error, gpointer user_d
 
        method_changed (priv->method, self);
        g_signal_connect (priv->method, "changed", G_CALLBACK (method_changed), self);
+       g_signal_connect (priv->pac_script_import_button, "clicked", G_CALLBACK (import_button_clicked_cb), 
self);
 }
 
 CEPage *
@@ -349,108 +235,50 @@ ui_to_setting (CEPageProxy *self)
        CEPageProxyPrivate *priv = CE_PAGE_PROXY_GET_PRIVATE (self);
        NMSettingConnection *s_con;
        int method;
-       NMSettingProxyMethod s_method;
-       const char *http_proxy = NULL;
-       guint32 http_port;
-       gboolean http_default = FALSE;
-       const char *ssl_proxy = NULL;
-       guint32 ssl_port;
-       const char *ftp_proxy = NULL;
-       guint32 ftp_port;
-       const char *socks_proxy = NULL;
-       guint32 socks_port;
-       gboolean socks_version_5 = FALSE;
-       const char *text;
-       GPtrArray *tmp_array = NULL;
-       char **no_proxy_for = NULL;
-       char **items = NULL, **iter;
-       gboolean browser_only = FALSE;
-       const char *pac_url = NULL;
-       const char *pac_script = NULL;
+       gboolean browser_only;
+       const char *pac_url;
+       GtkTextBuffer *buffer;
+       GtkTextIter start, end;
+       char *script = NULL;
 
        s_con = nm_connection_get_setting_connection (CE_PAGE (self)->connection);
        g_return_if_fail (s_con != NULL);
 
        /* Method */
        method = gtk_combo_box_get_active (priv->method);
-       if (method == PROXY_METHOD_AUTO)
-               s_method = NM_SETTING_PROXY_METHOD_AUTO;
-       else if (method == PROXY_METHOD_MANUAL)
-               s_method = NM_SETTING_PROXY_METHOD_MANUAL;
-       else
-               s_method = NM_SETTING_PROXY_METHOD_NONE;
-
-       http_proxy = gtk_entry_get_text (priv->http_proxy);
-       if (http_proxy && strlen (http_proxy) < 1)
-               http_proxy = NULL;
-       http_port = (guint32) gtk_spin_button_get_value_as_int (priv->http_port);
-
-       /* HTTP Default */
-       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->http_default)))
-               http_default = TRUE;
-
-       ssl_proxy = gtk_entry_get_text (priv->ssl_proxy);
-       if (ssl_proxy && strlen (ssl_proxy) < 1)
-               ssl_proxy = NULL;
-       ssl_port = (guint32) gtk_spin_button_get_value_as_int (priv->ssl_port);
-
-       ftp_proxy = gtk_entry_get_text (priv->ftp_proxy);
-       if (ftp_proxy && strlen (ftp_proxy) < 1)
-               ftp_proxy = NULL;
-       ftp_port = (guint32) gtk_spin_button_get_value_as_int (priv->ftp_port);
-
-       socks_proxy = gtk_entry_get_text (priv->socks_proxy);
-       if (socks_proxy && strlen (socks_proxy) < 1)
-               socks_proxy = NULL;
-       socks_port = (guint32) gtk_spin_button_get_value_as_int (priv->socks_port);
-
-       /* SOCKS Version */
-       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->socks_version_5)))
-               socks_version_5 = TRUE;
-
-       /* No Proxy For */
-       tmp_array = g_ptr_array_new ();
-       text = gtk_entry_get_text (GTK_ENTRY (priv->no_proxy_for));
-       if (text && strlen (text)) {
-               items = g_strsplit_set (text, ", ;:", 0);
-               for (iter = items; *iter; iter++) {
-                       char *stripped = g_strstrip (*iter);
-
-                       if (strlen (stripped))
-                               g_ptr_array_add (tmp_array, g_strdup (stripped));
-               }
-               g_strfreev (items);
-       }
-       g_ptr_array_add (tmp_array, NULL);
-       no_proxy_for = (char **) g_ptr_array_free (tmp_array, (tmp_array->len == 1));
 
        /* Browser Only */
-       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->browser_only)))
-               browser_only = TRUE;
+       browser_only = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->browser_only));
+
+       if (method == PROXY_METHOD_NONE) {
+               g_object_set (priv->setting,
+                             NM_SETTING_PROXY_METHOD, NM_SETTING_PROXY_METHOD_NONE,
+                             NM_SETTING_PROXY_BROWSER_ONLY, browser_only,
+                             NM_SETTING_PROXY_PAC_URL, NULL,
+                             NM_SETTING_PROXY_PAC_SCRIPT, NULL,
+                             NULL);
+               return;
+       }
 
+       /* PAC Url */
        pac_url = gtk_entry_get_text (priv->pac_url);
        if (pac_url && strlen (pac_url) < 1)
                pac_url = NULL;
-       pac_script = gtk_file_chooser_get_filename (priv->pac_script);
+
+       /* PAC Script */
+       buffer = gtk_text_view_get_buffer (priv->pac_script_window);
+       gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
+       gtk_text_buffer_get_iter_at_offset (buffer, &end, -1);
+       script = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
 
        /* Update NMSetting */
        g_object_set (priv->setting,
-                     NM_SETTING_PROXY_METHOD, s_method,
-                     NM_SETTING_PROXY_HTTP_PROXY, http_proxy,
-                     NM_SETTING_PROXY_HTTP_PORT, http_port,
-                     NM_SETTING_PROXY_HTTP_DEFAULT, http_default,
-                     NM_SETTING_PROXY_SSL_PROXY, ssl_proxy,
-                     NM_SETTING_PROXY_SSL_PORT, ssl_port,
-                     NM_SETTING_PROXY_FTP_PROXY, ftp_proxy,
-                     NM_SETTING_PROXY_FTP_PORT, ftp_port,
-                     NM_SETTING_PROXY_SOCKS_PROXY, socks_proxy,
-                     NM_SETTING_PROXY_SOCKS_PORT, socks_port,
-                     NM_SETTING_PROXY_SOCKS_VERSION_5, socks_version_5,
-                     NM_SETTING_PROXY_NO_PROXY_FOR, no_proxy_for,
+                     NM_SETTING_PROXY_METHOD, NM_SETTING_PROXY_METHOD_AUTO,
                      NM_SETTING_PROXY_BROWSER_ONLY, browser_only,
                      NM_SETTING_PROXY_PAC_URL, pac_url,
-                     NM_SETTING_PROXY_PAC_SCRIPT, pac_script,
+                     NM_SETTING_PROXY_PAC_SCRIPT, script,
                      NULL);
+       g_free (script);
 }
 
 static gboolean



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