aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog29
-rw-r--r--mail/mail-config-gui.c195
-rw-r--r--mail/mail-ops.c25
-rw-r--r--mail/message-list.c2
4 files changed, 204 insertions, 47 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index e5852981b5..5b09940faa 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,11 @@
+2000-09-05 Peter Williams <peterw@helixcode.com>
+
+ * mail-ops.c (cleanup_load_folder): Check for NULL folder.
+ (mail_do_setup_folder): Copy the 'name' parameter so that
+ we can free it.
+
+ * message-list.c (nuke_uids): Depth '-1' means "unlimited", not 0.
+
2000-09-05 Dan Winship <danw@helixcode.com>
* component-factory.c (owner_set_cb): Re-rename "Sent".
@@ -130,6 +138,27 @@
needed by `evolution_storage_new_folder()'.
* mail-vfolder.c (vfolder_refresh): Likewise.
+2000-08-31 Peter Williams <peterw@helixcode.com>
+
+ * folder-browser.c (folder_browser_new): Don't ref the shell:
+ causes a race upon exit.
+ (folder_browser_destroy): Don't unref it.
+
+ * mail-config-gui.c (service_page_item_new): Add a checkbutton
+ "use default port" to make life simple.
+ (service_page_get_url): Honor use_default_port.
+ (service_page_set_url): Set use_default_port based on the input
+ URL.
+ (toggle_port): New function, sets the sensitivity of the
+ port entry based on "use default port"
+
+ (config_do_query_authtypes): Make this asynchronous, as it
+ may involve connecting to a server.
+ (service_page_detect): Call the async auth querier.
+ (service_page_item_new): Put the authentication stuff in if
+ the url_flags have URL_ALLOW_AUTH. Call the async auth querier
+ to get the info.
+
2000-08-30 Ettore Perazzoli <ettore@helixcode.com>
* mail-view.c (mail_view_create): Make the HTML widget grab the
diff --git a/mail/mail-config-gui.c b/mail/mail-config-gui.c
index abe582fe27..49466b64a4 100644
--- a/mail/mail-config-gui.c
+++ b/mail/mail-config-gui.c
@@ -36,6 +36,7 @@
#include "e-util/e-unicode.h"
#include "mail.h"
#include "mail-threads.h"
+#include "mail-tools.h"
#include "mail-config.h"
#include "mail-config-gui.h"
@@ -50,7 +51,6 @@ typedef struct
CamelProvider *provider;
CamelService *service;
CamelProviderType type;
- GList *authtypes;
} MailService;
struct _MailDialogIdentityPage
@@ -86,6 +86,7 @@ typedef struct
GtkWidget *keep_on_server;
gint pnum;
gint default_port;
+ GtkWidget *use_default_port;
} MailDialogServicePageItem;
struct _MailDialogServicePage
@@ -178,6 +179,7 @@ typedef struct
/* private prototypes - these are ugly, rename some of them? */
static void config_do_test_service (const char *url, CamelProviderType type);
+static void config_do_query_authtypes (MailDialogServicePage *page, const char *url, CamelProviderType type);
static void html_size_req (GtkWidget *widget, GtkRequisition *requisition);
static GtkWidget *html_new (gboolean white);
@@ -306,18 +308,15 @@ provider_list_add (GSList *services, CamelProviderType type,
url = g_strdup_printf ("%s:", prov->protocol);
service = camel_session_get_service (session, url, type, ex);
+ camel_exception_free (ex);
g_free (url);
- if (!service) {
- camel_exception_free (ex);
+ if (!service)
return services;
- }
mcs = g_new (MailService, 1);
mcs->provider = prov;
mcs->service = service;
mcs->type = type;
- mcs->authtypes = camel_service_query_auth_types (mcs->service, ex);
- camel_exception_free (ex);
return g_slist_prepend (services, mcs);
}
@@ -589,7 +588,7 @@ service_page_get_url (MailDialogServicePage *page)
url->user = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (spitem->user), 0, -1);
if (spitem->host)
url->host = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (spitem->host), 0, -1);
- if (spitem->port) {
+ if (spitem->port && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (spitem->use_default_port))) {
gchar *val;
val = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (spitem->port), 0, -1);
@@ -600,7 +599,10 @@ service_page_get_url (MailDialogServicePage *page)
url->port = 0;
g_free (val);
+ } else {
+ url->port = 0;
}
+
if (spitem->path) {
gchar *path;
path = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (spitem->path),
@@ -665,6 +667,8 @@ service_page_set_url (MailDialogServicePage *page, MailConfigService *service)
if (url && url->port) {
tmp = g_strdup_printf ("%d", url->port);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (spitem->use_default_port),
+ FALSE);
} else if (spitem->default_port) {
tmp = g_strdup_printf ("%d", spitem->default_port);
} else {
@@ -839,33 +843,11 @@ service_page_detect (GtkWidget *button, MailDialogServicePage *page)
{
MailDialogServicePageItem *spitem;
char *url = NULL;
- CamelException *ex;
- CamelService *service;
- GList *authtypes;
spitem = page->spitem;
url = service_page_get_url (page);
- ex = camel_exception_new ();
- service = camel_session_get_service (session, url, spitem->type, ex);
- g_free (url);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- goto error;
-
- authtypes = camel_service_query_auth_types (service, ex);
- if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE)
- goto error;
-
- service_page_item_auth_fill (page, spitem, authtypes);
-
- camel_exception_free (ex);
-
- return;
-
- error:
- error_dialog (button, "Could not detect supported authentication "
- "types:\n%s", camel_exception_get_description (ex));
- camel_exception_free (ex);
+ config_do_query_authtypes (page, url, spitem->type);
}
static void
@@ -895,6 +877,18 @@ service_page_add_elem (MailDialogServicePage *page, GtkWidget *table,
return entry;
}
+static void
+toggle_port (GtkWidget *w, gpointer user_data)
+{
+ MailDialogServicePage *page;
+ gboolean val;
+
+ page = (MailDialogServicePage *) user_data;
+
+ val = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+ gtk_widget_set_sensitive (page->spitem->port, val);
+}
+
static MailDialogServicePageItem *
service_page_item_new (MailDialogServicePage *page, MailService *mcs)
{
@@ -926,11 +920,39 @@ service_page_item_new (MailDialogServicePage *page, MailService *mcs)
service_flags = mcs->service->url_flags & ~CAMEL_SERVICE_URL_NEED_AUTH;
if (service_flags & CAMEL_SERVICE_URL_ALLOW_HOST) {
+ GtkWidget *w;
+
item->host = service_page_add_elem (page, table, row++, _("Server:"));
item->hostneed = ((service_flags & CAMEL_SERVICE_URL_NEED_HOST)
== CAMEL_SERVICE_URL_NEED_HOST);
- item->port = service_page_add_elem (page, table, row++, _("Port:"));
+
item->default_port = mcs->provider->default_ports[mcs->type];
+
+ w = gtk_label_new (_("Port:"));
+ gtk_table_attach (GTK_TABLE (table), w, 0, 1,
+ row, row + 1, GTK_FILL, 0, 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (w), 1, 0.5);
+
+ item->port = gtk_entry_new();
+ gtk_table_attach (GTK_TABLE (table), item->port,
+ 1, 2, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
+ 0, 0);
+ gtk_signal_connect (GTK_OBJECT (item->port), "changed",
+ GTK_SIGNAL_FUNC (service_page_item_changed), page);
+ gtk_widget_set_sensitive (item->port, FALSE);
+
+ item->use_default_port = gtk_check_button_new_with_label (_("Use default port"));
+ gtk_table_attach (GTK_TABLE (table), item->use_default_port,
+ 2, 3, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
+ 0, 0);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->use_default_port),
+ TRUE);
+ gtk_signal_connect (GTK_OBJECT (item->use_default_port), "toggled",
+ GTK_SIGNAL_FUNC (toggle_port),
+ page);
+ row++;
}
if (service_flags & CAMEL_SERVICE_URL_ALLOW_USER) {
@@ -945,8 +967,9 @@ service_page_item_new (MailDialogServicePage *page, MailService *mcs)
== CAMEL_SERVICE_URL_NEED_PATH);
}
- if (mcs->authtypes) {
+ if (mcs->service->url_flags & CAMEL_SERVICE_URL_ALLOW_AUTH) {
GtkWidget *label;
+ gchar *url;
label = gtk_label_new (_("Authentication:"));
gtk_table_attach (GTK_TABLE (table), label, 0, 1,
@@ -977,8 +1000,10 @@ service_page_item_new (MailDialogServicePage *page, MailService *mcs)
0, 3, row + 1, row + 2,
GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
- service_page_item_auth_fill (page, item, mcs->authtypes);
-
+ /* this is done async */
+ url = camel_url_to_string (mcs->service->url, FALSE);
+ config_do_query_authtypes (page, url, mcs->type);
+ g_free (url);
row += 2;
}
@@ -2317,3 +2342,105 @@ config_do_test_service (const char *url, CamelProviderType type)
mail_operation_queue (&op_test_service, input, TRUE);
}
+
+/* ************************************************************************ */
+
+typedef struct query_authtypes_input_s {
+ MailDialogServicePage *page;
+ gchar *url;
+ CamelProviderType type;
+} query_authtypes_input_t;
+
+typedef struct query_authtypes_data_s {
+ CamelService *service;
+ GList *items;
+} query_authtypes_data_t;
+
+static gchar *describe_query_authtypes (gpointer in_data, gboolean gerund);
+static void setup_query_authtypes (gpointer in_data, gpointer op_data, CamelException *ex);
+static void do_query_authtypes (gpointer in_data, gpointer op_data, CamelException *ex);
+static void cleanup_query_authtypes (gpointer in_data, gpointer op_data, CamelException *ex);
+
+static gchar *describe_query_authtypes (gpointer in_data, gboolean gerund)
+{
+ query_authtypes_input_t *input = (query_authtypes_input_t *) in_data;
+
+ if (gerund) {
+ return g_strdup_printf (_("Querying authorization capabilities of \"%s\""), input->url);
+ } else {
+ return g_strdup_printf (_("Query authorization at \"%s\""), input->url);
+ }
+}
+
+static void setup_query_authtypes (gpointer in_data, gpointer op_data, CamelException *ex)
+{
+ query_authtypes_input_t *input = (query_authtypes_input_t *) in_data;
+ query_authtypes_data_t *data = (query_authtypes_data_t *) op_data;
+
+ if (!input->page) {
+ camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
+ "No service page was provided to test");
+ return;
+ }
+
+ if (!input->url) {
+ camel_exception_set (ex, CAMEL_EXCEPTION_INVALID_PARAM,
+ "No URL was provided to test");
+ return;
+ }
+
+ data->items = NULL;
+ data->service = NULL;
+}
+
+static void do_query_authtypes (gpointer in_data, gpointer op_data, CamelException *ex)
+{
+ query_authtypes_input_t *input = (query_authtypes_input_t *) in_data;
+ query_authtypes_data_t *data = (query_authtypes_data_t *) op_data;
+
+ data->service = camel_session_get_service (session, input->url, input->type, ex);
+ if (!data->service)
+ return;
+
+ data->items = camel_service_query_auth_types (data->service, ex);
+}
+
+static void cleanup_query_authtypes (gpointer in_data, gpointer op_data, CamelException *ex)
+{
+ query_authtypes_input_t *input = (query_authtypes_input_t *) in_data;
+ query_authtypes_data_t *data = (query_authtypes_data_t *) op_data;
+
+ if (data->items && input->page->spitem->auth_optionmenu &&
+ GTK_WIDGET_VISIBLE (input->page->spitem->auth_optionmenu))
+ service_page_item_auth_fill (input->page, input->page->spitem, data->items);
+
+ if (data->service) {
+ mail_tool_camel_lock_up();
+ camel_service_free_auth_types (data->service, data->items);
+ camel_object_unref (CAMEL_OBJECT (data->service));
+ mail_tool_camel_lock_down();
+ }
+
+ g_free (input->url);
+}
+
+static const mail_operation_spec op_query_authtypes = {
+ describe_query_authtypes,
+ sizeof (query_authtypes_data_t),
+ setup_query_authtypes,
+ do_query_authtypes,
+ cleanup_query_authtypes
+};
+
+static void
+config_do_query_authtypes (MailDialogServicePage *page, const char *url, CamelProviderType type)
+{
+ query_authtypes_input_t *input;
+
+ input = g_new (query_authtypes_input_t, 1);
+ input->page = page;
+ input->url = g_strdup (url);
+ input->type = type;
+
+ mail_operation_queue (&op_query_authtypes, input, TRUE);
+}
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index a122f19a33..5cb1287ff1 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -1594,16 +1594,17 @@ cleanup_load_folder (gpointer in_data, gpointer op_data, CamelException *ex)
{
load_folder_input_t *input = (load_folder_input_t *) in_data;
- gtk_widget_set_sensitive (GTK_WIDGET (input->fb->search_entry),
- camel_folder_has_search_capability (input->
- fb->
- folder));
- gtk_widget_set_sensitive (GTK_WIDGET (input->fb->search_menu),
- camel_folder_has_search_capability (input->
- fb->
- folder));
-
- message_list_set_folder (input->fb->message_list, input->fb->folder);
+ if (input->fb->folder) {
+ gtk_widget_set_sensitive (GTK_WIDGET (input->fb->search_entry),
+ camel_folder_has_search_capability (input->
+ fb->
+ folder));
+ gtk_widget_set_sensitive (GTK_WIDGET (input->fb->search_menu),
+ camel_folder_has_search_capability (input->
+ fb->
+ folder));
+ message_list_set_folder (input->fb->message_list, input->fb->folder);
+ }
/*g_free (input->url); = fb->uri now */
}
@@ -2104,7 +2105,7 @@ mail_do_edit_messages (CamelFolder *folder, GPtrArray *uids,
/* ** SETUP FOLDER ****************************************************** */
typedef struct setup_folder_input_s {
- const char *name;
+ gchar *name;
CamelFolder **folder;
} setup_folder_input_t;
@@ -2167,7 +2168,7 @@ mail_do_setup_folder (const char *name, CamelFolder **folder)
setup_folder_input_t *input;
input = g_new (setup_folder_input_t, 1);
- input->name = name;
+ input->name = g_strdup (name);
input->folder = folder;
mail_operation_queue (&op_setup_folder, input, TRUE);
}
diff --git a/mail/message-list.c b/mail/message-list.c
index 8ee4541248..004163c0d5 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -862,7 +862,7 @@ nuke_uids (GtkObject *o)
ETreeModel *etm = E_TREE_MODEL (o);
g_node_traverse (etm->root, G_IN_ORDER,
- G_TRAVERSE_ALL, 0,
+ G_TRAVERSE_ALL, -1,
nuke_uids_cb, etm);
}