From c3205a427adcc910f0614cb83249622816440c56 Mon Sep 17 00:00:00 2001 From: Srinivasa Ragavan Date: Fri, 22 May 2009 17:30:14 +0530 Subject: Mail changes required for Anjal. --- composer/e-msg-composer.c | 27 ++++++ composer/e-msg-composer.h | 3 + mail/Makefile.am | 12 +-- mail/e-mail-shell-backend.c | 3 + mail/em-account-editor.c | 200 +++++++++++++++++++++++++++++++++++++++----- mail/em-account-editor.h | 8 +- mail/em-composer-utils.c | 74 +++++++++++++--- mail/em-composer-utils.h | 10 ++- mail/em-folder-tree.c | 10 +++ mail/em-folder-tree.h | 1 + mail/mail-ops.c | 13 +-- mail/mail-ops.h | 2 +- 12 files changed, 319 insertions(+), 44 deletions(-) diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 93bd6fdd3e..80ee19d9f4 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -100,6 +100,8 @@ enum { LAST_SIGNAL }; +gboolean composer_lite = FALSE; + static gpointer parent_class; static guint signals[LAST_SIGNAL]; @@ -2209,6 +2211,31 @@ e_msg_composer_new (void) return g_object_new (E_TYPE_MSG_COMPOSER, NULL); } +void +e_msg_composer_set_lite (void) +{ + composer_lite = TRUE; +} + +gboolean +e_msg_composer_get_lite (void) +{ + return composer_lite; +} + +EMsgComposer * +e_msg_composer_lite_new (void) +{ + EMsgComposer *composer; + + /* Init lite-composer for ever for the session */ + composer_lite = TRUE; + + composer = e_msg_composer_new (); + + return composer; +} + static void e_msg_composer_set_pending_body (EMsgComposer *composer, gchar *text, diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h index c32342c7c0..334a7cf35d 100644 --- a/composer/e-msg-composer.h +++ b/composer/e-msg-composer.h @@ -69,6 +69,9 @@ struct _EMsgComposerClass { GType e_msg_composer_get_type (void); EMsgComposer * e_msg_composer_new (void); +void e_msg_composer_set_lite (void); +gboolean e_msg_composer_get_lite (void); +EMsgComposer * e_msg_composer_lite_new (void); EMsgComposer * e_msg_composer_new_with_message (CamelMimeMessage *msg); EMsgComposer * e_msg_composer_new_from_url (const gchar *url); EMsgComposer * e_msg_composer_new_redirect (CamelMimeMessage *message, diff --git a/mail/Makefile.am b/mail/Makefile.am index 56a946480b..3df61647f1 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -181,6 +181,12 @@ libevolution_module_mail_la_SOURCES = \ importers/pine-importer.c \ importers/evolution-mbox-importer.c +if ENABLE_SMIME +SMIME_LIBS = \ + $(top_builddir)/smime/lib/libessmime.la \ + $(top_builddir)/smime/gui/libevolution-smime.la +endif + libevolution_module_mail_la_LIBADD = \ $(top_builddir)/e-util/libeutil.la \ $(top_builddir)/shell/libeshell.la \ @@ -192,12 +198,6 @@ libevolution_module_mail_la_LIBADD = \ $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ $(SMIME_LIBS) -if ENABLE_SMIME -SMIME_LIBS = \ - $(top_builddir)/smime/lib/libessmime.la \ - $(top_builddir)/smime/gui/libevolution-smime.la -endif - #libevolution_mail_la_LIBADD = \ # $(top_builddir)/widgets/misc/libefilterbar.la \ # $(top_builddir)/filter/libfilter.la \ diff --git a/mail/e-mail-shell-backend.c b/mail/e-mail-shell-backend.c index 15d9e0d063..3fa066a3e8 100644 --- a/mail/e-mail-shell-backend.c +++ b/mail/e-mail-shell-backend.c @@ -105,6 +105,9 @@ struct _EMailShellBackendPrivate { guint mail_sync_timeout_source_id; }; +/* XXX Make this a preprocessor definition. */ +const gchar *x_mailer = "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT; + static gpointer parent_class; static GType mail_shell_backend_type; diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 72e8881863..a9ba161122 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -278,6 +278,26 @@ EMAccountEditor *em_account_editor_new(EAccount *account, em_account_editor_t ty return emae; } +/** + * em_account_editor_new_for_pages: + * @account: + * @type: + * + * Create a new account editor. If @account is NULL then this is to + * create a new account, else @account is copied to a working + * structure and is for editing an existing account. + * + * Return value: + **/ +EMAccountEditor *em_account_editor_new_for_pages(EAccount *account, em_account_editor_t type, char *id, GtkWidget **pages) +{ + EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL); + emae->pages = pages; + em_account_editor_construct(emae, account, type, id); + + return emae; +} + /* ********************************************************************** */ static struct { @@ -403,7 +423,7 @@ emae_display_license(EMAccountEditor *emae, CamelProvider *prov) gtk_text_view_set_editable((GtkTextView *)w, FALSE); response = gtk_dialog_run((GtkDialog *)dialog); } else { - e_error_run((GtkWindow *)gtk_widget_get_toplevel(emae->editor), + e_error_run(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL, "mail:no-load-license", prov->license_file, NULL); } @@ -1038,7 +1058,8 @@ emae_url_set_hostport(CamelURL *url, const char *txt) } g_strstrip(host); - camel_url_set_host(url, host); + if (txt && *txt) + camel_url_set_host(url, host); g_free(host); } @@ -1401,7 +1422,8 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) int active = 0, i; struct _service_info *info = &emae_service_info[service->type]; const char *uri = e_account_get_string(account, info->account_uri_key); - char *current = NULL; + char *current = NULL, *tmp; + CamelURL *url; dropdown = service->providers; gtk_widget_show((GtkWidget *)dropdown); @@ -1416,8 +1438,10 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) memcpy(current, uri, len); current[len] = 0; } + } else { + current = g_strdup("imap"); } - + store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); i = 0; @@ -1443,7 +1467,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, provider->name, 1, provider, -1); - + /* find the displayed and set default */ if (i == 0 || (current && strcmp(provider->protocol, current) == 0)) { service->provider = provider; @@ -1461,13 +1485,30 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) i++; } + + gtk_cell_layout_clear((GtkCellLayout *)dropdown); gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store); gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE); gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL); + g_signal_handlers_disconnect_by_func(dropdown, emae_provider_changed, service); gtk_combo_box_set_active(dropdown, -1); /* needed for gtkcombo bug(?) */ gtk_combo_box_set_active(dropdown, active); g_signal_connect(dropdown, "changed", G_CALLBACK(emae_provider_changed), service); + + if (!uri || (url = camel_url_new(uri, NULL)) == NULL) { + return; + } + + tmp = (char *)camel_url_get_param(url, "use_ssl"); + if (tmp == NULL) + tmp = "never"; + for (i=0;iuse_ssl, i); + break; + } + } } static void @@ -1623,11 +1664,12 @@ static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service) uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key); g_object_ref(emae); - service->check_dialog = e_error_new((GtkWindow *)gtk_widget_get_toplevel(emae->editor), + service->check_dialog = e_error_new(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL, "mail:checking-service", NULL); g_signal_connect(service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service); gtk_widget_show(service->check_dialog); - gtk_widget_set_sensitive(emae->editor, FALSE); + if (emae->editor) + gtk_widget_set_sensitive(emae->editor, FALSE); service->check_id = mail_check_service(uri, service->type, emae_check_authtype_done, service); } @@ -1641,7 +1683,6 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade int i; service->provider = uri?camel_provider_get(uri, NULL):NULL; - service->frame = glade_xml_get_widget(xml, info->frame); service->container = glade_xml_get_widget(xml, info->container); service->description = GTK_LABEL (glade_xml_get_widget (xml, info->description)); @@ -1670,8 +1711,9 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade } else gtk_entry_set_text(service->hostname, url->host); } - if (url->user) + if (url->user && *url->user) { gtk_entry_set_text(service->username, url->user); + } if (service->pathentry) { GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; @@ -1809,7 +1851,9 @@ emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } w = glade_xml_get_widget(xml, item->label); - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; @@ -1858,7 +1902,9 @@ emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, str emae_setup_service(emae, &gui->source, xml); w = glade_xml_get_widget(xml, item->label); - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; @@ -2326,7 +2372,9 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct emae_setup_service(emae, &gui->transport, xml); w = glade_xml_get_widget(xml, item->label); - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; @@ -2341,7 +2389,7 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); w = page; g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); + gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); } else { gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Sending Email"))); } @@ -2562,6 +2610,10 @@ emae_widget_druid_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *paren GladeXML *druidxml; GtkWidget *w; char *gladefile; + EMAccountEditor *emae = (EMAccountEditor *)data; + + if (emae->type == EMAE_PAGES) + return NULL; gladefile = g_build_filename (EVOLUTION_GLADEDIR, "mail-config.glade", @@ -2651,10 +2703,12 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) if (uri == NULL || (url = camel_url_new(uri, NULL)) == NULL) return FALSE; - if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST) - && (url->host == NULL || url->host[0] == 0)) - ok = FALSE; - + if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) { + if (url->host == NULL || url->host[0] == 0) + ok = FALSE; + else + gtk_entry_set_text(service->hostname, url->host); + } /* We only need the user if the service needs auth as well, i think */ if (ok && (service->needs_auth == NULL @@ -2674,6 +2728,37 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) return ok; } +enum { + GMAIL = 0, + YAHOO, + AOL +}; +struct _server_prefill { + char *key; + char *recv; + char *send; + char *proto; + char *ssl; +} mail_servers [] = { + {"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"}, + {"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"}, + {"aol", "imap.aol.com", "smtp.aol.com", "pop", "never"}, + {"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"} +}; + +static int +check_servers (char *server) +{ + int len = G_N_ELEMENTS(mail_servers), i; + + for (i=0; ipriv->receive_set) { char *user, *at; + int index; + char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL); + CamelURL *url; emae->priv->receive_set = 1; - tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); + tmp = (char *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); at = strchr(tmp, '@'); user = g_alloca(at-tmp+1); memcpy(user, tmp, at-tmp); user[at-tmp] = 0; + at++; + + index = check_servers(at); gtk_entry_set_text(emae->priv->source.username, user); gtk_entry_set_text(emae->priv->transport.username, user); + if (uri && (url = camel_url_new(uri, NULL)) != NULL) { + refresh = TRUE; + camel_url_set_protocol(url, mail_servers[index].proto); + camel_url_set_param(url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].recv); + camel_url_set_user (url, user); + gtk_entry_set_text(emae->priv->source.hostname, mail_servers[index].recv); + gtk_entry_set_text(emae->priv->transport.hostname, mail_servers[index].send); + uri = camel_url_to_string(url, 0); + e_account_set_string(emae->account, E_ACCOUNT_SOURCE_URL, uri); + + g_free(uri); + camel_url_free(url); + } else { + g_warning("buz1\n"); + } + } + } else if (!strcmp(pageid, "30.send")) { + CamelURL *url; + char *at, *user; + int index; + char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL); + + tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); + at = strchr(tmp, '@'); + user = g_alloca(at-tmp+1); + memcpy(user, tmp, at-tmp); + user[at-tmp] = 0; + at++; + + index = check_servers(at); + if (uri && (url = camel_url_new(uri, NULL)) != NULL) { + refresh = TRUE; + camel_url_set_protocol (url, "smtp"); + camel_url_set_param(url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].send); + camel_url_set_user (url, user); + uri = camel_url_to_string(url, 0); + e_account_set_string(emae->account, E_ACCOUNT_TRANSPORT_URL, uri); + g_free(uri); + camel_url_free(url); + } else { + g_warning("buz2\n"); + } + + } else if (!strcmp(pageid, "20.receive_options")) { if (emae->priv->source.provider && emae->priv->extra_provider != emae->priv->source.provider) { @@ -2760,12 +2898,18 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } if (ok && (pageid == NULL || !strcmp(pageid, "10.receive"))) { + if (emae->type == EMAE_PAGES && refresh) { + emae_refresh_providers(emae, &emae->priv->source); + } ok = emae_service_complete(emae, &emae->priv->source); if (!ok) d(printf("receive page incomplete\n")); } if (ok && (pageid == NULL || !strcmp(pageid, "30.send"))) { + if (emae->type == EMAE_PAGES && refresh) { + emae_refresh_providers(emae, &emae->priv->transport); + } ok = emae_service_complete(emae, &emae->priv->transport); if (!ok) d(printf("send page incomplete\n")); @@ -2783,6 +2927,12 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) return ok; } +void +em_account_editor_check (EMAccountEditor *emae, const char *page) +{ + emae_check_complete((EConfig *)emae->config, page, emae); +} + /* HACK: FIXME: the component should listen to the account object directly */ static void add_new_store (char *uri, CamelStore *store, void *user_data) @@ -2831,6 +2981,12 @@ emae_commit(EConfig *ec, GSList *items, void *data) e_account_list_save(accounts); } +void +em_account_editor_commit (EMAccountEditor *emae) +{ + emae_commit ((EConfig *)emae->config, NULL, emae); +} + static void emae_editor_destroyed(GtkWidget *dialog, EMAccountEditor *emae) { @@ -2958,7 +3114,11 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account target = em_config_target_new_account(ec, emae->account); e_config_set_target((EConfig *)ec, (EConfigTarget *)target); - emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant")); - g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); + if (type != EMAE_PAGES) { + emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant")); + g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); + } else { + e_config_create_widget((EConfig *)ec); + } } diff --git a/mail/em-account-editor.h b/mail/em-account-editor.h index 43e5c0652c..41da661089 100644 --- a/mail/em-account-editor.h +++ b/mail/em-account-editor.h @@ -38,7 +38,8 @@ typedef struct _EMAccountEditorClass EMAccountEditorClass; typedef enum { EMAE_NOTEBOOK, - EMAE_DRUID + EMAE_DRUID, + EMAE_PAGES } em_account_editor_t; struct _EMAccountEditor { @@ -54,6 +55,8 @@ struct _EMAccountEditor { struct _EAccount *account; /* working account, must instant apply to this */ struct _EAccount *original; /* original account, not changed unless commit is invoked */ + GtkWidget **pages; /* Pages for Anjal's page type editor */ + guint do_signature:1; /* allow editing signature */ }; @@ -64,6 +67,9 @@ struct _EMAccountEditorClass { GType em_account_editor_get_type(void); EMAccountEditor *em_account_editor_new(struct _EAccount *account, em_account_editor_t type, char *id); +EMAccountEditor *em_account_editor_new_for_pages(struct _EAccount *account, em_account_editor_t type, char *id, struct _GtkWidget **pages); +void em_account_editor_commit (EMAccountEditor *emae); +void em_account_editor_check (EMAccountEditor *emae, const char *page); gboolean em_account_editor_save (EMAccountEditor *gui); void em_account_editor_destroy (EMAccountEditor *gui); diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 20193465a3..f6ea663a40 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -665,13 +665,16 @@ em_utils_composer_print_cb (EMsgComposer *composer, /* Composing messages... */ static EMsgComposer * -create_new_composer (const char *subject, const char *fromuri) +create_new_composer (const char *subject, const char *fromuri, gboolean lite) { EMsgComposer *composer; EComposerHeaderTable *table; EAccount *account = NULL; - composer = e_msg_composer_new (); + if (lite) + composer = e_msg_composer_lite_new (); + else + composer = e_msg_composer_new (); table = e_msg_composer_get_header_table (composer); if (fromuri != NULL) { @@ -701,7 +704,7 @@ em_utils_compose_new_message (const char *fromuri) { GtkWidget *composer; - composer = (GtkWidget *) create_new_composer ("", fromuri); + composer = (GtkWidget *) create_new_composer ("", fromuri, FALSE); if (composer == NULL) return; @@ -710,6 +713,26 @@ em_utils_compose_new_message (const char *fromuri) gtk_widget_show (composer); } +/** + * em_utils_compose_lite_new_message: + * + * Opens a new composer window as a child window of @parent's toplevel + * window. + **/ +struct _EMsgComposer * +em_utils_compose_lite_new_message (const char *fromuri) +{ + GtkWidget *composer; + + composer = (GtkWidget *) create_new_composer ("", fromuri, TRUE); + if (composer == NULL) + return NULL; + + composer_set_no_change (E_MSG_COMPOSER (composer), TRUE, TRUE); + + return (struct _EMsgComposer *)composer; +} + /** * em_utils_compose_new_message_with_mailto: * @url: mailto url @@ -1012,7 +1035,7 @@ forward_attached (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, Cam { EMsgComposer *composer; - composer = create_new_composer (subject, fromuri); + composer = create_new_composer (subject, fromuri, FALSE); if (composer == NULL) return; @@ -1091,7 +1114,7 @@ forward_non_attached (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, text = em_utils_message_to_html (message, _("-------- Forwarded Message --------"), flags, &len, NULL, NULL); if (text) { - composer = create_new_composer (subject, fromuri); + composer = create_new_composer (subject, fromuri, FALSE); if (composer) { if (CAMEL_IS_MULTIPART(camel_medium_get_content_object((CamelMedium *)message))) @@ -1656,7 +1679,7 @@ generate_account_hash (void) return account_hash; } -static EDestination ** +EDestination ** em_utils_camel_address_to_destination (CamelInternetAddress *iaddr) { EDestination *dest, **destv; @@ -1860,6 +1883,12 @@ get_reply_sender (CamelMimeMessage *message, CamelInternetAddress *to, CamelNNTP } } +void +em_utils_get_reply_sender (CamelMimeMessage *message, CamelInternetAddress *to, CamelNNTPAddress *postto) +{ + get_reply_sender (message, to, postto); +} + static gboolean get_reply_list (CamelMimeMessage *message, CamelInternetAddress *to) { @@ -1973,6 +2002,13 @@ get_reply_all (CamelMimeMessage *message, CamelInternetAddress *to, CamelInterne g_hash_table_destroy (rcpt_hash); } +void +em_utils_get_reply_all (CamelMimeMessage *message, CamelInternetAddress *to, CamelInternetAddress *cc, CamelNNTPAddress *postto) +{ + get_reply_all (message, to, cc, postto); +} + + enum { ATTRIB_UNKNOWN, ATTRIB_CUSTOM, @@ -2230,6 +2266,21 @@ struct _reply_data { int mode; }; +char * +em_utils_construct_composer_text (CamelMimeMessage *message, EMFormat *source) +{ + char *text, *credits; + ssize_t len = 0; + gboolean start_bottom = 0; + + credits = attribution_format (ATTRIBUTION, message); + text = em_utils_message_to_html (message, credits, EM_FORMAT_QUOTE_CITE, &len, source, start_bottom ? "
" : NULL); + + g_free (credits); + return text; +} + + static void reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage *message, void *user_data) { @@ -2260,7 +2311,7 @@ reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage *message * may be supplied in order to update the message flags once it has * been replied to. **/ -void +struct _EMsgComposer * em_utils_reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage *message, int mode, EMFormat *source) { CamelInternetAddress *to, *cc; @@ -2281,10 +2332,10 @@ em_utils_reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage g_object_ref(rd->source); mail_get_message(folder, uid, reply_to_message, rd, mail_msg_unordered_push); - return; + return NULL; } - g_return_if_fail(message != NULL); + g_return_val_if_fail(message != NULL, NULL); /** @Event: message.replying * @Title: Message being replied to @@ -2340,7 +2391,10 @@ em_utils_reply_to_message(CamelFolder *folder, const char *uid, CamelMimeMessage composer_set_no_change (composer, TRUE, FALSE); - gtk_widget_show (GTK_WIDGET (composer)); + if (!e_msg_composer_get_lite()) + gtk_widget_show (GTK_WIDGET (composer)); + + return composer; } static void diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h index 45df05194a..37fd185eaa 100644 --- a/mail/em-composer-utils.h +++ b/mail/em-composer-utils.h @@ -34,11 +34,15 @@ extern "C" { struct _CamelFolder; struct _CamelMimeMessage; struct _CamelException; +struct _CamelInternetAddress; +struct _CamelNNTPAddress; struct _EMsgComposer; struct _EMFormat; struct _EAccount; +struct _EDestination; void em_utils_compose_new_message (const char *fromuri); +struct _EMsgComposer * em_utils_compose_lite_new_message (const char *fromuri); /* FIXME: mailto? url? should make up its mind what its called. imho use 'uri' */ void em_utils_compose_new_message_with_mailto (const char *url, const char *fromuri); @@ -67,7 +71,11 @@ enum { REPLY_MODE_LIST }; -void em_utils_reply_to_message (struct _CamelFolder *, const char *uid, struct _CamelMimeMessage *message, int mode, struct _EMFormat *source); +char *em_utils_construct_composer_text (struct _CamelMimeMessage *message, struct _EMFormat *source); +void em_utils_get_reply_sender (struct _CamelMimeMessage *message, struct _CamelInternetAddress *to, struct _CamelNNTPAddress *postto); +void em_utils_get_reply_all (struct _CamelMimeMessage *message, struct _CamelInternetAddress *to, struct _CamelInternetAddress *cc, struct _CamelNNTPAddress *postto); +struct _EMsgComposer * em_utils_reply_to_message (struct _CamelFolder *, const char *uid, struct _CamelMimeMessage *message, int mode, struct _EMFormat *source); +struct _EDestination ** em_utils_camel_address_to_destination (struct _CamelInternetAddress *iaddr); void em_configure_new_composer (struct _EMsgComposer *composer); diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index 128e2fe164..07aedc2c8c 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -114,6 +114,7 @@ struct _EMFolderTreePrivate { guint loaded_row_id; GtkTreeRowReference *drag_row; + gboolean skip_double_click; }; enum { @@ -1991,6 +1992,9 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr gtk_tree_view_set_cursor (treeview, tree_path, NULL, FALSE); if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { + if (emft->priv->skip_double_click) { + return FALSE; + } emft_tree_row_activated (treeview, tree_path, NULL, emft); gtk_tree_path_free (tree_path); return TRUE; @@ -2361,3 +2365,9 @@ emft_queue_save_state (EMFolderTree *emft) priv->save_state_id = g_timeout_add_seconds (1, (GSourceFunc) emft_save_state, emft); } + +void +em_folder_tree_set_skip_double_click (EMFolderTree *emft, gboolean skip) +{ + emft->priv->skip_double_click = skip; +} diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h index d84b173db5..232a15e59a 100644 --- a/mail/em-folder-tree.h +++ b/mail/em-folder-tree.h @@ -109,6 +109,7 @@ EMFolderTreeModel *em_folder_tree_get_model (EMFolderTree *emft); EMFolderTreeModelStoreInfo *em_folder_tree_get_model_storeinfo (EMFolderTree *emft, CamelStore *store); gboolean em_folder_tree_create_folder (EMFolderTree *emft, const char *full_name, const char *uri); +void em_folder_tree_set_skip_double_click (EMFolderTree *emft, gboolean skip); G_END_DECLS diff --git a/mail/mail-ops.c b/mail/mail-ops.c index aaef8b9069..a762e75676 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -74,6 +74,8 @@ #define w(x) #define d(x) +extern const char *x_mailer; + /* used for both just filtering a folder + uid's, and for filtering a whole folder */ /* used both for fetching mail, and for filtering mail */ struct _filter_mail_msg { @@ -468,7 +470,7 @@ mail_send_message(CamelFolder *queue, const char *uid, const char *destination, if (!message) return; - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT); + camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", x_mailer); err = g_string_new(""); xev = mail_tool_remove_xevolution_headers (message); @@ -930,8 +932,7 @@ mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageIn g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); if (!camel_medium_get_header (CAMEL_MEDIUM (message), "X-Mailer")) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", - "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT); + camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", x_mailer); m = mail_msg_new (&append_mail_info); m->folder = folder; @@ -1897,7 +1898,7 @@ typedef void (*get_done)(CamelFolder *folder, const char *uid, CamelMimeMessage static void get_messagex_done (struct _get_message_msg *m) { - if (m->done) { + if (m->done && !camel_operation_cancel_check (m->cancel)) { get_done done = (get_done)m->done; done(m->folder, m->uid, m->message, m->data, &m->base.ex); } @@ -1913,7 +1914,7 @@ static MailMsgInfo get_messagex_info = { /* This is temporary, to avoid having to rewrite everything that uses mail_get_message; it adds an exception argument to the callback */ -void +CamelOperation * mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *), void *data, MailMsgDispatchFunc dispatch) { @@ -1928,6 +1929,8 @@ mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolde m->cancel = camel_operation_new(NULL, NULL); dispatch (m); + + return m->cancel; } /* ********************************************************************** */ diff --git a/mail/mail-ops.h b/mail/mail-ops.h index 68ae9037df..327a35174b 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -57,7 +57,7 @@ void mail_get_message (CamelFolder *folder, const char *uid, void *data, MailMsgDispatchFunc dispatch); -void +CamelOperation * mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *), void *data, MailMsgDispatchFunc dispatch); -- cgit