aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog17
-rw-r--r--mail/mail-account-gui.c85
-rw-r--r--mail/mail-config.c35
-rw-r--r--mail/mail-local.c2
4 files changed, 110 insertions, 29 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 9b0e82eac5..4d80c8986a 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,20 @@
+2001-09-28 Jeffrey Stedfast <fejj@ximian.com>
+
+ * mail-local.c (mail_local_provider_init): Setup the url_hash and
+ url_equal functions for the local provider.
+
+ * mail-account-gui.c (mail_account_gui_save): Add code here to
+ check to make sure that the Drafts and Sent folders are pointing
+ to valid urls. This is kinda nasty and only really solves the case
+ where the user changes, say, his imap server or
+ something. Unfortunately we still have the problem where if
+ account A's sent/drafts folders point to account B's store and the
+ user changes the url for account B.
+
+ * mail-config.c (mail_config_get_account_by_source_url): Use Camel
+ to compare the urls rather than using e_url_equal which does all
+ sorts of funky shit that may not work in every case.
+
2001-09-28 Dan Winship <danw@ximian.com>
* mail-mt.c (pass_got): Don't call
diff --git a/mail/mail-account-gui.c b/mail/mail-account-gui.c
index c8281be799..3b048bb86c 100644
--- a/mail/mail-account-gui.c
+++ b/mail/mail-account-gui.c
@@ -40,6 +40,8 @@
#include "mail-send-recv.h"
#include "e-msg-composer.h"
+#define d(x)
+
extern char *default_drafts_folder_uri, *default_sent_folder_uri;
static void save_service (MailAccountGuiService *gsvc, GHashTable *extra_conf, MailConfigService *service);
@@ -119,16 +121,16 @@ service_complete (MailAccountGuiService *service, GtkWidget **incomplete)
const CamelProvider *prov = service->provider;
char *text;
GtkWidget *path;
-
+
if (!prov)
return TRUE;
-
+
/* transports don't have a path */
if (service->path)
path = GTK_WIDGET (service->path);
else
path = NULL;
-
+
if (CAMEL_PROVIDER_NEEDS (prov, CAMEL_URL_PART_HOST)) {
text = gtk_entry_get_text (service->hostname);
if (!text || !*text) {
@@ -155,10 +157,10 @@ service_complete (MailAccountGuiService *service, GtkWidget **incomplete)
if (CAMEL_PROVIDER_NEEDS (prov, CAMEL_URL_PART_PATH)) {
if (!path) {
- printf ("aagh, transports aren't supposed to have paths.\n");
+ d(printf ("aagh, transports aren't supposed to have paths.\n"));
return TRUE;
}
-
+
text = gtk_entry_get_text (service->path);
if (!text || !*text) {
if (incomplete)
@@ -375,7 +377,7 @@ source_type_changed (GtkWidget *widget, gpointer user_data)
gtk_widget_hide (GTK_WIDGET (gui->source.use_ssl));
gtk_widget_show (GTK_WIDGET (gui->source.no_ssl));
#endif
-
+
/* auth */
frame = glade_xml_get_widget (gui->xml, "source_auth_frame");
if (provider && CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH)) {
@@ -454,7 +456,7 @@ transport_type_changed (GtkWidget *widget, gpointer user_data)
gtk_widget_hide (GTK_WIDGET (gui->transport.use_ssl));
gtk_widget_show (GTK_WIDGET (gui->transport.no_ssl));
#endif
-
+
/* auth */
if (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH) &&
!CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_AUTH))
@@ -917,7 +919,7 @@ struct _ESignatureEditor {
MailAccountGui *gui;
GtkWidget *win;
GtkWidget *control;
-
+
gchar *filename;
gboolean html;
gboolean has_changed;
@@ -934,9 +936,9 @@ enum { REPLY_YES = 0, REPLY_NO, REPLY_CANCEL };
static void
destroy_editor (ESignatureEditor *editor)
{
- gtk_widget_destroy (editor->win);
- g_free (editor->filename);
- g_free (editor);
+ gtk_widget_destroy (editor->win);
+ g_free (editor->filename);
+ g_free (editor);
}
static void
@@ -1212,7 +1214,7 @@ mail_account_gui_new (MailConfigAccount *account)
gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_signature), FALSE);
gui->edit_html_signature = GTK_BUTTON (glade_xml_get_widget (gui->xml, "button_edit_html_signature"));
gtk_widget_set_sensitive (GTK_WIDGET (gui->edit_html_signature), FALSE);
-
+
gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (gui->signature)), "changed", signature_changed, gui);
gtk_signal_connect (GTK_OBJECT (gnome_file_entry_gtk_entry (gui->html_signature)), "changed",
html_signature_changed, gui);
@@ -1590,6 +1592,8 @@ mail_account_gui_save (MailAccountGui *gui)
{
MailConfigAccount *account = gui->account;
const MailConfigAccount *old_account;
+ CamelProvider *provider = NULL;
+ CamelURL *source_url = NULL, *url;
gchar *new_name;
gboolean old_enabled;
@@ -1629,8 +1633,13 @@ mail_account_gui_save (MailAccountGui *gui)
service_destroy (account->source);
account->source = g_new0 (MailConfigService, 1);
save_service (&gui->source, gui->extra_config, account->source);
- if (account->source && account->source->url && old_enabled)
- account->source->enabled = TRUE;
+ if (account->source && account->source->url) {
+ provider = camel_session_get_provider (session, account->source->url, NULL);
+ source_url = provider ? camel_url_new (account->source->url, NULL) : NULL;
+
+ if (old_enabled)
+ account->source->enabled = TRUE;
+ }
account->source->auto_check = gtk_toggle_button_get_active (gui->source_auto_check);
if (account->source->auto_check)
account->source->auto_check_time = gtk_spin_button_get_value_as_int (gui->source_auto_check_min);
@@ -1639,14 +1648,46 @@ mail_account_gui_save (MailAccountGui *gui)
account->transport = g_new0 (MailConfigService, 1);
save_service (&gui->transport, NULL, account->transport);
- g_free (account->drafts_folder_name);
- account->drafts_folder_name = g_strdup (gui->drafts_folder.name);
- g_free (account->drafts_folder_uri);
- account->drafts_folder_uri = g_strdup (gui->drafts_folder.uri);
- g_free (account->sent_folder_name);
- account->sent_folder_name = g_strdup (gui->sent_folder.name);
- g_free (account->sent_folder_uri);
- account->sent_folder_uri = g_strdup (gui->sent_folder.uri);
+ /* Check to make sure that the Drafts folder uri is "valid" before assigning it */
+ url = source_url ? camel_url_new (gui->drafts_folder.uri, NULL) : NULL;
+ if (mail_config_get_account_by_source_url (gui->drafts_folder.uri) ||
+ (url && provider->url_equal (source_url, url))) {
+ g_free (account->drafts_folder_name);
+ account->drafts_folder_name = g_strdup (gui->drafts_folder.name);
+ g_free (account->drafts_folder_uri);
+ account->drafts_folder_uri = g_strdup (gui->drafts_folder.uri);
+ } else {
+ /* assign defaults - the uri is unknown to us (probably pointed to an old source url) */
+ g_free (account->drafts_folder_name);
+ account->drafts_folder_name = g_strdup (strrchr (default_drafts_folder_uri, '/') + 1);
+ g_free (account->drafts_folder_uri);
+ account->drafts_folder_uri = g_strdup (default_drafts_folder_uri);
+ }
+
+ if (url)
+ camel_url_free (url);
+
+ /* Check to make sure that the Sent folder uri is "valid" before assigning it */
+ url = camel_url_new (gui->drafts_folder.uri, NULL);
+ if (mail_config_get_account_by_source_url (gui->sent_folder.uri) ||
+ (url && provider->url_equal (source_url, url))) {
+ g_free (account->sent_folder_name);
+ account->sent_folder_name = g_strdup (gui->sent_folder.name);
+ g_free (account->sent_folder_uri);
+ account->sent_folder_uri = g_strdup (gui->sent_folder.uri);
+ } else {
+ /* assign defaults - the uri is unknown to us (probably pointed to an old source url) */
+ g_free (account->sent_folder_name);
+ account->sent_folder_name = g_strdup (strrchr (default_sent_folder_uri, '/') + 1);
+ g_free (account->sent_folder_uri);
+ account->sent_folder_uri = g_strdup (default_sent_folder_uri);
+ }
+
+ if (url)
+ camel_url_free (url);
+
+ if (source_url)
+ camel_url_free (source_url);
g_free (account->pgp_key);
account->pgp_key = e_utf8_gtk_entry_get_text (gui->pgp_key);
diff --git a/mail/mail-config.c b/mail/mail-config.c
index fbdded27c6..512a760034 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -1422,22 +1422,43 @@ const MailConfigAccount *
mail_config_get_account_by_source_url (const char *source_url)
{
const MailConfigAccount *account;
+ CamelProvider *provider;
+ CamelURL *source;
GSList *l;
-
+
g_return_val_if_fail (source_url != NULL, NULL);
-
+
+ provider = camel_session_get_provider (session, source_url, NULL);
+ if (!provider)
+ return NULL;
+
+ source = camel_url_new (source_url, NULL);
+ if (!source)
+ return NULL;
+
l = config->accounts;
while (l) {
account = l->data;
- if (account
- && account->source
- && account->source->url
- && e_url_equal (account->source->url, source_url))
- return account;
+
+ if (account && account->source && account->source->url) {
+ CamelURL *url;
+
+ url = camel_url_new (account->source->url, NULL);
+ if (url && provider->url_equal (url, source)) {
+ camel_url_free (url);
+ camel_url_free (source);
+ return account;
+ }
+
+ if (url)
+ camel_url_free (url);
+ }
l = l->next;
}
+ camel_url_free (source);
+
return NULL;
}
diff --git a/mail/mail-local.c b/mail/mail-local.c
index e0e2c8792c..6af58a87e2 100644
--- a/mail/mail-local.c
+++ b/mail/mail-local.c
@@ -908,6 +908,8 @@ mail_local_provider_init (void)
local_provider.object_types[CAMEL_PROVIDER_STORE] = MAIL_LOCAL_STORE_TYPE;
local_provider.service_cache = g_hash_table_new (non_hash, non_equal);
+ local_provider.url_hash = non_hash;
+ local_provider.url_equal = non_equal;
camel_session_register_provider (session, &local_provider);
}