Check smtp auth if autoconfig works. This is probably required.
[claws.git] / src / gtk / gtkutils.c
index 3bb914177979c1257bc268522183a071718ba9b5..e2c0a71554ca6eb416e130899307c7640f8f3ecb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -716,28 +716,40 @@ void gtkut_widget_init(void)
 
 void gtkut_widget_set_app_icon(GtkWidget *widget)
 {
-       static GdkPixbuf *icon = NULL;
-       
+       static GList *icon_list = NULL;
+
        cm_return_if_fail(widget != NULL);
        cm_return_if_fail(gtk_widget_get_window(widget) != NULL);
-       if (!icon) {
+       if (!icon_list) {
+               GdkPixbuf *icon = NULL, *big_icon = NULL;
                stock_pixbuf_gdk(widget, STOCK_PIXMAP_CLAWS_MAIL_ICON, &icon);
-       }               
-       if (icon)
-               gtk_window_set_icon(GTK_WINDOW(widget), icon);
+               stock_pixbuf_gdk(widget, STOCK_PIXMAP_CLAWS_MAIL_LOGO, &big_icon);
+               if (icon)
+                       icon_list = g_list_append(icon_list, icon);
+               if (big_icon)
+                       icon_list = g_list_append(icon_list, big_icon);
+       }
+       if (icon_list)
+               gtk_window_set_icon_list(GTK_WINDOW(widget), icon_list);
 }
 
 void gtkut_widget_set_composer_icon(GtkWidget *widget)
 {
-       static GdkPixbuf *icon = NULL;
-       
+       static GList *icon_list = NULL;
+
        cm_return_if_fail(widget != NULL);
        cm_return_if_fail(gtk_widget_get_window(widget) != NULL);
-       if (!icon) {
+       if (!icon_list) {
+               GdkPixbuf *icon = NULL, *big_icon = NULL;
                stock_pixbuf_gdk(widget, STOCK_PIXMAP_MAIL_COMPOSE, &icon);
-       }               
-       if (icon)
-               gtk_window_set_icon(GTK_WINDOW(widget), icon);
+               stock_pixbuf_gdk(widget, STOCK_PIXMAP_MAIL_COMPOSE_LOGO, &big_icon);
+               if (icon)
+                       icon_list = g_list_append(icon_list, icon);
+               if (big_icon)
+                       icon_list = g_list_append(icon_list, big_icon);
+       }
+       if (icon_list)
+               gtk_window_set_icon_list(GTK_WINDOW(widget), icon_list);
 }
 
 static gboolean move_bar = FALSE;
@@ -1078,18 +1090,13 @@ gboolean get_tag_range(GtkTextIter *iter,
 }
 
 #if HAVE_LIBCOMPFACE
-GtkWidget *xface_get_from_header(const gchar *o_xface, GdkColor *background,
-                                GdkWindow *window)
+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));
 
-       if (!window) {
-               g_warning("no window\n");
-               return NULL;
-       }
        if (uncompface(xface) < 0) {
                g_warning("uncompface failed\n");
                return NULL;
@@ -1282,6 +1289,8 @@ static gboolean _combobox_separator_func(GtkTreeModel *model,
 
        if( txt == NULL )
                return TRUE;
+       
+       g_free(txt);
        return FALSE;
 }
 
@@ -1533,12 +1542,7 @@ gboolean gtkut_tree_model_get_iter_last(GtkTreeModel *model,
 GtkWidget *gtkut_window_new            (GtkWindowType   type,
                                         const gchar    *class)
 {
-#ifndef MAEMO
        GtkWidget *window = gtk_window_new(type);
-#else
-       GtkWidget *window = hildon_window_new();
-       hildon_program_add_window(hildon_program, HILDON_WINDOW(window));
-#endif
        gtk_window_set_role(GTK_WINDOW(window), class);
        return window;
 }
@@ -1873,3 +1877,111 @@ GdkPixbuf *claws_load_pixbuf_fitting(GdkPixbuf *src_pixbuf, int box_width,
 
        return pixbuf;
 }
+
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_done(const gchar *hostname, gint port, gboolean ssl, AutoConfigureData *data)
+{
+       if (hostname != NULL) {
+               if (data->hostname_entry)
+                       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));
+               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 && data->ssl_checkbtn) {
+                       gtk_toggle_button_set_active(data->ssl_checkbtn, TRUE);
+                       gtk_toggle_button_set_active(data->tls_checkbtn, FALSE);
+               } else if (data->tls_checkbtn) {
+                       if (!GTK_IS_RADIO_BUTTON(data->ssl_checkbtn)) {
+                               /* Wizard where TLS is [x]SSL + [x]TLS */
+                               gtk_toggle_button_set_active(data->ssl_checkbtn, TRUE);
+                       }
+                       gtk_toggle_button_set_active(data->tls_checkbtn, TRUE);
+               }
+
+               /* Check authentication by default. This is probably required if
+                * auto-configuration worked.
+                */
+               if (data->auth_checkbtn)
+                       gtk_toggle_button_set_active(data->auth_checkbtn, TRUE);
+
+               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);
+}
+
+static void resolve_done(GObject *source, GAsyncResult *result, gpointer user_data)
+{
+       AutoConfigureData *data = (AutoConfigureData *)user_data;
+       GResolver *resolver = (GResolver *)source;
+       GError *error = NULL;
+       gchar *hostname = NULL;
+       guint16 port;
+       GList *answers, *cur;
+       gboolean found = FALSE;
+       gboolean abort = FALSE;
+
+       answers = g_resolver_lookup_service_finish(resolver, result, &error);
+
+       if (answers) {
+               for (cur = g_srv_target_list_sort(answers); cur; cur = cur->next) {
+                       GSrvTarget *target = (GSrvTarget *)cur->data;
+                       const gchar *h = g_srv_target_get_hostname(target);
+                       port = g_srv_target_get_port(target);
+                       if (h && strcmp(h,"") && port > 0) {
+                               hostname = g_strdup(h);
+                               found = TRUE;
+                               break;
+                       }
+               }
+               g_resolver_free_targets(answers);
+       } else if (error) {
+               if (error->code == G_IO_ERROR_CANCELLED)
+                       abort = TRUE;
+               debug_print("error %s\n", error->message);
+               g_error_free(error);
+       }
+
+       if (found) {
+               auto_configure_done(hostname, port, data->ssl_service != NULL, data);
+       } else if (data->ssl_service && !abort) {
+               /* Fallback to TLS */
+               data->ssl_service = NULL;
+               auto_configure_service(data);
+       } else {
+               auto_configure_done(NULL, 0, FALSE, data);
+       }
+       g_free(hostname);
+       g_object_unref(resolver);
+}
+
+void auto_configure_service(AutoConfigureData *data)
+{
+       GResolver *resolver;
+       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);
+
+       resolver = g_resolver_get_default();
+       if (resolver != NULL) {
+               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,
+                                       data->cancel, resolve_done, data);
+       }
+}
+#endif
\ No newline at end of file