Auto-configuration: set port only when not default
[claws.git] / src / gtk / gtkutils.c
index 4b227e70709d16b9f81547ab3d2d6e8ab4b043fd..4eabff0556363e3c9b2de949445ff965c730114e 100644 (file)
@@ -57,7 +57,6 @@
 #include "prefs_account.h"
 #include "prefs_common.h"
 #include "manage_window.h"
-#include "base64.h"
 #include "manual.h"
 #include "combobox.h"
 
@@ -350,8 +349,12 @@ GtkCMCTreeNode *gtkut_ctree_find_collapsed_parent(GtkCMCTree *ctree,
 
 void gtkut_ctree_expand_parent_all(GtkCMCTree *ctree, GtkCMCTreeNode *node)
 {
+       gtk_cmclist_freeze(GTK_CMCLIST(ctree));
+
        while ((node = gtkut_ctree_find_collapsed_parent(ctree, node)) != NULL)
                gtk_cmctree_expand(ctree, node);
+
+       gtk_cmclist_thaw(GTK_CMCLIST(ctree));
 }
 
 gboolean gtkut_ctree_node_is_parent(GtkCMCTreeNode *parent, GtkCMCTreeNode *node)
@@ -682,34 +685,19 @@ void gtkut_widget_init(void)
 
        clist = gtk_cmclist_new(1);
        g_object_ref(G_OBJECT(clist));
-#if GLIB_CHECK_VERSION(2,10,0)
        g_object_ref_sink (G_OBJECT(clist));
-#else
-       gtk_object_ref (G_OBJECT(clist));
-       gtk_object_sink (G_OBJECT(clist));
-#endif
        gtkut_clist_bindings_add(clist);
        g_object_unref(G_OBJECT(clist));
 
        clist = gtk_cmctree_new(1, 0);
        g_object_ref(G_OBJECT(clist));
-#if GLIB_CHECK_VERSION(2,10,0)
        g_object_ref_sink (G_OBJECT(clist));
-#else
-       gtk_object_ref (G_OBJECT(clist));
-       gtk_object_sink (G_OBJECT(clist));
-#endif
        gtkut_clist_bindings_add(clist);
        g_object_unref(G_OBJECT(clist));
 
        clist = gtk_sctree_new_with_titles(1, 0, NULL);
        g_object_ref(G_OBJECT(clist));
-#if GLIB_CHECK_VERSION(2,10,0)
        g_object_ref_sink (G_OBJECT(clist));
-#else
-       gtk_object_ref (G_OBJECT(clist));
-       gtk_object_sink (G_OBJECT(clist));
-#endif
        gtkut_clist_bindings_add(clist);
        g_object_unref(G_OBJECT(clist));
 }
@@ -1095,7 +1083,8 @@ GtkWidget *xface_get_from_header(const gchar *o_xface)
        static gchar *xpm_xface[XPM_XFACE_HEIGHT];
        static gboolean xpm_xface_init = TRUE;
        gchar xface[2048];
-       strncpy(xface, o_xface, sizeof(xface));
+       strncpy(xface, o_xface, sizeof(xface) - 1);
+       xface[sizeof(xface) - 1] = '\0';
 
        if (uncompface(xface) < 0) {
                g_warning("uncompface failed\n");
@@ -1122,8 +1111,8 @@ GtkWidget *xface_get_from_header(const gchar *o_xface)
 GtkWidget *face_get_from_header(const gchar *o_face)
 {
        gchar face[2048];
-       gchar face_png[2048];
-       gint pngsize;
+       gchar *face_png;
+       gsize pngsize;
        GdkPixbuf *pixbuf;
        GError *error = NULL;
        GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
@@ -1137,14 +1126,17 @@ GtkWidget *face_get_from_header(const gchar *o_face)
        unfold_line(face); /* strip all whitespace and linebreaks */
        remove_space(face);
 
-       pngsize = base64_decode(face_png, face, strlen(face));
+       face_png = g_base64_decode(face, &pngsize);
+       debug_print("---------------------- loaded face png\n");
 
        if (!gdk_pixbuf_loader_write (loader, face_png, pngsize, &error) ||
            !gdk_pixbuf_loader_close (loader, &error)) {
                g_warning("loading face failed\n");
                g_object_unref(loader);
+               g_free(face_png);
                return NULL;
        }
+       g_free(face_png);
 
        pixbuf = g_object_ref(gdk_pixbuf_loader_get_pixbuf(loader));
 
@@ -1586,8 +1578,8 @@ gint gtkut_list_view_get_selected_row(GtkWidget *list_view)
        for (row = 0; row < n_rows; row++) {
                GtkTreeIter itern;
 
-               gtk_tree_model_iter_nth_child(model, &itern, NULL, row);
-               if (gtkut_tree_iter_comp(model, &iter, &itern))
+               if (gtk_tree_model_iter_nth_child(model, &itern, NULL, row)
+                && gtkut_tree_iter_comp(model, &iter, &itern))
                        return row;
        }
        
@@ -1886,13 +1878,16 @@ static void auto_configure_done(const gchar *hostname, gint port, gboolean ssl,
                        gtk_entry_set_text(data->hostname_entry, hostname);
                if (data->set_port)
                        gtk_toggle_button_set_active(data->set_port,
-                               (ssl && port == data->default_ssl_port) || (!ssl && port == data->default_port));
+                               (ssl && port != data->default_ssl_port) || (!ssl && port != data->default_port));
                if (data->port)
                        gtk_spin_button_set_value(data->port, port);
                else if (data->hostname_entry) {
-                       gchar *tmp = g_strdup_printf("%s:%d", hostname, port);
-                       gtk_entry_set_text(data->hostname_entry, tmp);
-                       g_free(tmp);
+                       if ((ssl && port != data->default_ssl_port) || (!ssl && port != data->default_port)) {
+                               gchar *tmp = g_strdup_printf("%s:%d", hostname, port);
+                               gtk_entry_set_text(data->hostname_entry, tmp);
+                               g_free(tmp);
+                       } else
+                               gtk_entry_set_text(data->hostname_entry, hostname);
                }
 
                if (ssl && data->ssl_checkbtn) {
@@ -1912,13 +1907,19 @@ static void auto_configure_done(const gchar *hostname, gint port, gboolean ssl,
                if (data->auth_checkbtn)
                        gtk_toggle_button_set_active(data->auth_checkbtn, TRUE);
 
+               /* Set user ID to full email address, which is used by the
+                * majority of providers where auto-configuration works.
+                */
+               if (data->uid_entry)
+                       gtk_entry_set_text(data->uid_entry, data->address);
+
                gtk_label_set_text(data->info_label, _("Done."));
        } else {
        gtk_label_set_text(data->info_label, _("Failed."));
        }
        gtk_widget_show(GTK_WIDGET(data->configure_button));
        gtk_widget_hide(GTK_WIDGET(data->cancel_button));
-       g_free(data->domain);
+       g_free(data->address);
        g_free(data);
 }
 
@@ -1973,14 +1974,16 @@ void auto_configure_service(AutoConfigureData *data)
        const gchar *cur_service = data->ssl_service != NULL ? data->ssl_service : data->tls_service;
 
        cm_return_if_fail(cur_service != NULL);
-       cm_return_if_fail(data->domain != NULL);
+       cm_return_if_fail(data->address != NULL);
 
        resolver = g_resolver_get_default();
        if (resolver != NULL) {
+               const gchar *domain = strchr(data->address, '@') + 1;
+
                gtk_label_set_text(data->info_label, _("Configuring..."));
                gtk_widget_hide(GTK_WIDGET(data->configure_button));
                gtk_widget_show(GTK_WIDGET(data->cancel_button));
-               g_resolver_lookup_service_async(resolver, cur_service, "tcp", data->domain,
+               g_resolver_lookup_service_async(resolver, cur_service, "tcp", domain,
                                        data->cancel, resolve_done, data);
        }
 }
@@ -2024,4 +2027,4 @@ gboolean auto_configure_service_sync(const gchar *service, const gchar *domain,
        g_object_unref(resolver);
        return result;
 }
-#endif
\ No newline at end of file
+#endif