void e_mail_session_unsubscribe_folder (EMailSession *session, const gchar *folder_uri, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; AsyncContext *context; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (folder_uri != NULL); context = g_slice_new0 (AsyncContext); context->folder_uri = g_strdup (folder_uri); simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_unsubscribe_folder); g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); g_simple_async_result_run_in_thread ( simple, (GSimpleAsyncThreadFunc) mail_session_unsubscribe_folder_thread, io_priority, cancellable); g_object_unref (simple); }
void filter_gui_add_from_message (EMailSession *session, CamelMimeMessage *msg, const gchar *source, gint flags) { EMFilterContext *fc; const gchar *config_dir; gchar *user, *system; EFilterRule *rule; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (msg)); fc = em_filter_context_new (session); config_dir = mail_session_get_config_dir (); user = g_build_filename (config_dir, "filters.xml", NULL); system = g_build_filename (EVOLUTION_PRIVDATADIR, "filtertypes.xml", NULL); e_rule_context_load ((ERuleContext *) fc, system, user); g_free (system); rule = filter_rule_from_message (fc, msg, flags); e_filter_rule_set_source (rule, source); e_rule_context_add_rule_gui ( (ERuleContext *) fc, rule, _("Add Filter Rule"), user); g_free (user); g_object_unref (fc); }
/** * e_mail_session_ref_transport_for_message: * @session: an #EMailSession * @message: a #CamelMimeMessage * * Returns the preferred transport #CamelService instance for @message by * first checking @message for an "X-Evolution-Identity" header, and then * an "X-Evolution-Transport" header. Failing that, the function returns * the default transport #CamelService instance (if available). * * The returned #CamelService is referenced for thread-safety and must be * unreferenced with g_object_unref() when finished with it. * * Returns: a #CamelService, or %NULL **/ CamelService * e_mail_session_ref_transport_for_message (EMailSession *session, CamelMimeMessage *message) { CamelService *transport = NULL; g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); /* Check for "X-Evolution-Identity" header. */ if (transport == NULL) transport = mail_session_ref_transport_from_x_identity ( session, message); /* Check for "X-Evolution-Transport" header. */ if (transport == NULL) transport = mail_session_ref_transport_from_x_transport ( session, message); /* Fall back to the default mail transport. */ if (transport == NULL) transport = e_mail_session_ref_default_transport (session); return transport; }
gboolean e_mail_session_append_to_local_folder_sync (EMailSession *session, EMailLocalFolder local_id, CamelMimeMessage *message, CamelMessageInfo *info, gchar **appended_uid, GCancellable *cancellable, GError **error) { CamelFolder *folder; const gchar *folder_uri; gboolean success = FALSE; g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); folder_uri = e_mail_session_get_local_folder_uri (session, local_id); g_return_val_if_fail (folder_uri != NULL, FALSE); folder = e_mail_session_uri_to_folder_sync ( session, folder_uri, CAMEL_STORE_FOLDER_CREATE, cancellable, error); if (folder != NULL) { success = e_mail_folder_append_message_sync ( folder, message, info, appended_uid, cancellable, error); g_object_unref (folder); } return success; }
void e_mail_session_handle_source_headers (EMailSession *session, CamelMimeMessage *message, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; AsyncContext *context; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); context = g_slice_new0 (AsyncContext); context->message = g_object_ref (message); simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_handle_source_headers); g_simple_async_result_set_check_cancellable (simple, cancellable); g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); g_simple_async_result_run_in_thread ( simple, (GSimpleAsyncThreadFunc) mail_session_handle_source_headers_thread, io_priority, cancellable); g_object_unref (simple); }
void mail_config_reload_junk_headers (EMailSession *session) { g_return_if_fail (E_IS_MAIL_SESSION (session)); /* It automatically sets in the session */ if (config == NULL) mail_config_init (session); else { settings_jh_check_changed (mail_settings, NULL, session); } }
gboolean e_mail_session_handle_draft_headers_sync (EMailSession *session, CamelMimeMessage *message, GCancellable *cancellable, GError **error) { CamelFolder *folder; CamelMedium *medium; const gchar *folder_uri; const gchar *message_uid; const gchar *header_name; gboolean success; g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); medium = CAMEL_MEDIUM (message); header_name = "X-Evolution-Draft-Folder"; folder_uri = camel_medium_get_header (medium, header_name); header_name = "X-Evolution-Draft-Message"; message_uid = camel_medium_get_header (medium, header_name); /* Don't report errors about missing X-Evolution-Draft * headers. These headers are optional, so their absence * is handled by doing nothing. */ if (folder_uri == NULL || message_uid == NULL) return TRUE; folder = e_mail_session_uri_to_folder_sync ( session, folder_uri, 0, cancellable, error); if (folder == NULL) return FALSE; camel_folder_set_message_flags ( folder, message_uid, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN); success = camel_folder_synchronize_message_sync ( folder, message_uid, cancellable, error); g_object_unref (folder); return success; }
/** * e_mail_session_ref_default_transport: * @session: an #EMailSession * * Returns the default transport #CamelService instance according to * #ESourceRegistry's #ESourceRegistry:default-mail-identity setting, * verifying first that the #ESourceMailSubmission:transport-uid named by * the #ESourceRegistry:default-mail-identity is indeed a mail transport, * and that the corresponding #ESource is enabled. If these checks fail, * the function returns %NULL. * * The returned #CamelService is referenced for thread-safety and must be * unreferenced with g_object_unref() when finished with it. * * Returns: a #CamelService, or %NULL **/ CamelService * e_mail_session_ref_default_transport (EMailSession *session) { ESource *source; ESourceRegistry *registry; CamelService *transport; g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); registry = e_mail_session_get_registry (session); source = e_source_registry_ref_default_mail_identity (registry); transport = mail_session_ref_transport_for_identity (session, source); g_clear_object (&source); return transport; }
void mail_config_reload_junk_headers (EMailSession *session) { g_return_if_fail (E_IS_MAIL_SESSION (session)); /* It automatically sets in the session */ if (config == NULL) mail_config_init (session); else { GConfClient *client; client = gconf_client_get_default (); gconf_jh_check_changed (client, 0, NULL, session); g_object_unref (client); } }
gboolean e_mail_session_unsubscribe_folder_sync (EMailSession *session, const gchar *folder_uri, GCancellable *cancellable, GError **error) { CamelStore *store = NULL; gchar *folder_name = NULL; const gchar *message; gboolean success = FALSE; g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); g_return_val_if_fail (folder_uri != NULL, FALSE); success = e_mail_folder_uri_parse ( CAMEL_SESSION (session), folder_uri, &store, &folder_name, error); if (!success) return FALSE; message = _("Unsubscribing from folder '%s'"); camel_operation_push_message (cancellable, message, folder_name); /* FIXME This should take our GCancellable. */ success = em_utils_connect_service_sync ( CAMEL_SERVICE (store), cancellable, error) && camel_subscribable_unsubscribe_folder_sync ( CAMEL_SUBSCRIBABLE (store), folder_name, cancellable, error); camel_operation_pop_message (cancellable); g_object_unref (store); g_free (folder_name); return success; }
void e_mail_session_append_to_local_folder (EMailSession *session, EMailLocalFolder local_id, CamelMimeMessage *message, CamelMessageInfo *info, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; AsyncContext *context; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); context = g_slice_new0 (AsyncContext); context->local_id = local_id; context->message = g_object_ref (message); if (info != NULL) context->info = camel_message_info_ref (info); simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_append_to_local_folder); g_simple_async_result_set_check_cancellable (simple, cancellable); g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); g_simple_async_result_run_in_thread ( simple, mail_session_append_to_local_folder_thread, io_priority, cancellable); g_object_unref (simple); }
/** * e_mail_session_ref_transport: * @session: an #EMailSession * @transport_uid: the UID of a mail transport * * Returns the transport #CamelService instance for @transport_uid, * verifying first that the @transport_uid is indeed a mail transport and * that the corresponding #ESource is enabled. If these checks fail, the * function returns %NULL. * * The returned #CamelService is referenced for thread-safety and must be * unreferenced with g_object_unref() when finished with it. * * Returns: a #CamelService, or %NULL **/ CamelService * e_mail_session_ref_transport (EMailSession *session, const gchar *transport_uid) { ESourceRegistry *registry; ESource *source = NULL; CamelService *transport = NULL; const gchar *extension_name; g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); g_return_val_if_fail (transport_uid != NULL, NULL); registry = e_mail_session_get_registry (session); extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT; source = e_source_registry_ref_source (registry, transport_uid); if (source == NULL) goto exit; if (!e_source_registry_check_enabled (registry, source)) goto exit; if (!e_source_has_extension (source, extension_name)) goto exit; transport = camel_session_ref_service ( CAMEL_SESSION (session), transport_uid); /* Sanity check. */ if (transport != NULL) g_warn_if_fail (CAMEL_IS_TRANSPORT (transport)); exit: g_clear_object (&source); return transport; }
gboolean e_mail_session_handle_source_headers_sync (EMailSession *session, CamelMimeMessage *message, GCancellable *cancellable, GError **error) { CamelFolder *folder; CamelMedium *medium; CamelMessageFlags flags = 0; const gchar *folder_uri; const gchar *message_uid; const gchar *flag_string; const gchar *header_name; gboolean success; guint length, ii; gchar **tokens; gchar *string; g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); medium = CAMEL_MEDIUM (message); header_name = "X-Evolution-Source-Folder"; folder_uri = camel_medium_get_header (medium, header_name); header_name = "X-Evolution-Source-Message"; message_uid = camel_medium_get_header (medium, header_name); header_name = "X-Evolution-Source-Flags"; flag_string = camel_medium_get_header (medium, header_name); /* Don't report errors about missing X-Evolution-Source * headers. These headers are optional, so their absence * is handled by doing nothing. */ if (folder_uri == NULL || message_uid == NULL || flag_string == NULL) return TRUE; /* Convert the flag string to CamelMessageFlags. */ string = g_strstrip (g_strdup (flag_string)); tokens = g_strsplit (string, " ", 0); g_free (string); /* If tokens is NULL, a length of 0 will skip the loop. */ length = (tokens != NULL) ? g_strv_length (tokens) : 0; for (ii = 0; ii < length; ii++) { /* Note: We're only checking for flags known to * be used in X-Evolution-Source-Flags headers. * Add more as needed. */ if (g_strcmp0 (tokens[ii], "ANSWERED") == 0) flags |= CAMEL_MESSAGE_ANSWERED; else if (g_strcmp0 (tokens[ii], "ANSWERED_ALL") == 0) flags |= CAMEL_MESSAGE_ANSWERED_ALL; else if (g_strcmp0 (tokens[ii], "FORWARDED") == 0) flags |= CAMEL_MESSAGE_FORWARDED; else if (g_strcmp0 (tokens[ii], "SEEN") == 0) flags |= CAMEL_MESSAGE_SEEN; else g_warning ( "Unknown flag '%s' in %s", tokens[ii], header_name); } g_strfreev (tokens); folder = e_mail_session_uri_to_folder_sync ( session, folder_uri, 0, cancellable, error); if (folder == NULL) return FALSE; camel_folder_set_message_flags ( folder, message_uid, flags, flags); success = camel_folder_synchronize_message_sync ( folder, message_uid, cancellable, error); g_object_unref (folder); return success; }
static gboolean ews_transport_can_server_side_sent_folder (CamelService *service, EwsFolderId **folder_id, GCancellable *cancellable) { CamelSession *session; ESourceRegistry *registry; ESource *sibling, *source = NULL; gboolean is_server_side = FALSE; g_return_val_if_fail (CAMEL_IS_EWS_TRANSPORT (service), FALSE); g_return_val_if_fail (folder_id != NULL, FALSE); session = camel_service_ref_session (service); if (session && E_IS_MAIL_SESSION (session)) registry = g_object_ref (e_mail_session_get_registry (E_MAIL_SESSION (session))); else registry = e_source_registry_new_sync (cancellable, NULL); if (!registry) { g_clear_object (&session); return FALSE; } sibling = e_source_registry_ref_source (registry, camel_service_get_uid (service)); if (sibling) { GList *sources, *siter; sources = e_source_registry_list_sources (registry, E_SOURCE_EXTENSION_MAIL_SUBMISSION); for (siter = sources; siter; siter = siter->next) { source = siter->data; if (!source || g_strcmp0 (e_source_get_parent (source), e_source_get_parent (sibling)) != 0 || !e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION) || !e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION)) source = NULL; else break; } if (source && e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION) && e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION)) { ESourceMailSubmission *subm_extension; CamelStore *store = NULL; gchar *folder_name = NULL; subm_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION); /* Copy messages on the server side only if the replies might not be saved to the original folder, which is handled by the evolution itself. */ if (!e_source_mail_submission_get_replies_to_origin_folder (subm_extension) && e_source_mail_submission_get_sent_folder (subm_extension) && e_mail_folder_uri_parse (session, e_source_mail_submission_get_sent_folder (subm_extension), &store, &folder_name, NULL) & CAMEL_IS_EWS_STORE (store)) { CamelEwsStore *ews_store = CAMEL_EWS_STORE (store); gchar *folder_id_str; folder_id_str = camel_ews_store_summary_get_folder_id_from_name ( ews_store->summary, folder_name); if (folder_id_str) { gchar *change_key; change_key = camel_ews_store_summary_get_change_key (ews_store->summary, folder_name, NULL); *folder_id = e_ews_folder_id_new (folder_id_str, change_key, FALSE); g_free (change_key); is_server_side = *folder_id != NULL; } g_free (folder_id_str); } g_clear_object (&store); g_free (folder_name); } g_list_free_full (sources, g_object_unref); g_object_unref (sibling); } g_object_unref (registry); g_clear_object (&session); return is_server_side; }
void e_mail_session_send_to (EMailSession *session, CamelMimeMessage *message, gint io_priority, GCancellable *cancellable, CamelFilterGetFolderFunc get_folder_func, gpointer get_folder_data, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; AsyncContext *context; CamelAddress *from; CamelAddress *recipients; CamelMedium *medium; CamelMessageInfo *info; EAccount *account = NULL; GPtrArray *post_to_uris; struct _camel_header_raw *xev; struct _camel_header_raw *header; const gchar *string; const gchar *resent_from; gchar *transport_uid = NULL; gchar *sent_folder_uri = NULL; GError *error = NULL; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); medium = CAMEL_MEDIUM (message); camel_medium_set_header (medium, "X-Mailer", X_MAILER); xev = mail_tool_remove_xevolution_headers (message); /* Extract directives from X-Evolution headers. */ string = camel_header_raw_find (&xev, "X-Evolution-Account", NULL); if (string != NULL) { gchar *account_uid; account_uid = g_strstrip (g_strdup (string)); account = e_get_account_by_uid (account_uid); g_free (account_uid); } if (account != NULL) { if (account->transport != NULL) { /* XXX Transport UIDs are kludgy right now. We * use the EAccount's regular UID and tack on * "-transport". Will be better soon. */ transport_uid = g_strconcat ( account->uid, "-transport", NULL); /* to reprompt password on sending if needed */ account->transport->get_password_canceled = FALSE; } sent_folder_uri = g_strdup (account->sent_folder_uri); } string = camel_header_raw_find (&xev, "X-Evolution-Fcc", NULL); if (sent_folder_uri == NULL && string != NULL) sent_folder_uri = g_strstrip (g_strdup (string)); string = camel_header_raw_find (&xev, "X-Evolution-Transport", NULL); if (transport_uid == NULL && string != NULL) transport_uid = g_strstrip (g_strdup (string)); post_to_uris = g_ptr_array_new (); for (header = xev; header != NULL; header = header->next) { gchar *folder_uri; if (g_strcmp0 (header->name, "X-Evolution-PostTo") != 0) continue; folder_uri = g_strstrip (g_strdup (header->value)); g_ptr_array_add (post_to_uris, folder_uri); } /* Collect sender and recipients from headers. */ from = (CamelAddress *) camel_internet_address_new (); recipients = (CamelAddress *) camel_internet_address_new (); resent_from = camel_medium_get_header (medium, "Resent-From"); if (resent_from != NULL) { const CamelInternetAddress *addr; const gchar *type; camel_address_decode (from, resent_from); type = CAMEL_RECIPIENT_TYPE_RESENT_TO; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_RESENT_CC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_RESENT_BCC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); } else { const CamelInternetAddress *addr; const gchar *type; addr = camel_mime_message_get_from (message); camel_address_copy (from, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_TO; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_CC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_BCC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); } /* Miscellaneous preparations. */ info = camel_message_info_new (NULL); camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, ~0); /* The rest of the processing happens in a thread. */ context = g_slice_new0 (AsyncContext); context->message = g_object_ref (message); context->io_priority = io_priority; context->from = from; context->recipients = recipients; context->message = g_object_ref (message); context->info = info; context->xev = xev; context->post_to_uris = post_to_uris; context->transport_uid = transport_uid; context->sent_folder_uri = sent_folder_uri; if (G_IS_CANCELLABLE (cancellable)) context->cancellable = g_object_ref (cancellable); /* Failure here emits a runtime warning but is non-fatal. */ context->driver = camel_session_get_filter_driver ( CAMEL_SESSION (session), E_FILTER_SOURCE_OUTGOING, &error); if (context->driver != NULL && get_folder_func) camel_filter_driver_set_folder_func ( context->driver, get_folder_func, get_folder_data); if (error != NULL) { g_warn_if_fail (context->driver == NULL); g_warning ("%s", error->message); g_error_free (error); } /* This gets popped in async_context_free(). */ camel_operation_push_message ( context->cancellable, _("Sending message")); simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_send_to); g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); g_simple_async_result_run_in_thread ( simple, (GSimpleAsyncThreadFunc) mail_session_send_to_thread, context->io_priority, context->cancellable); g_object_unref (simple); }
/* Config struct routines */ void mail_config_init (EMailSession *session) { g_return_if_fail (E_IS_MAIL_SESSION (session)); if (config) return; config = g_new0 (MailConfig, 1); mail_settings = g_settings_new ("org.gnome.evolution.mail"); /* Composer Configuration */ settings_outlook_filenames_changed ( mail_settings, "composer-outlook-filenames", NULL); g_signal_connect ( mail_settings, "changed::composer-outlook-filenames", G_CALLBACK (settings_outlook_filenames_changed), NULL); /* Display Configuration */ g_signal_connect ( mail_settings, "changed::address-compress", G_CALLBACK (settings_bool_value_changed), &config->address_compress); config->address_compress = g_settings_get_boolean ( mail_settings, "address-compress"); g_signal_connect ( mail_settings, "changed::address-count", G_CALLBACK (settings_int_value_changed), &config->address_count); config->address_count = g_settings_get_int ( mail_settings, "address-count"); /* Junk Configuration */ g_signal_connect ( mail_settings, "changed::junk-check-custom-header", G_CALLBACK (settings_jh_check_changed), session); config->jh_check = g_settings_get_boolean ( mail_settings, "junk-check-custom-header"); g_signal_connect ( mail_settings, "changed::junk-custom-header", G_CALLBACK (settings_jh_headers_changed), session); g_signal_connect ( mail_settings, "changed::junk-lookup-addressbook", G_CALLBACK (settings_bool_value_changed), &config->book_lookup); config->book_lookup = g_settings_get_boolean ( mail_settings, "junk-lookup-addressbook"); g_signal_connect ( mail_settings, "changed::junk-lookup-addressbook-local-only", G_CALLBACK (settings_bool_value_changed), &config->book_lookup_local_only); config->book_lookup_local_only = g_settings_get_boolean ( mail_settings, "junk-lookup-addressbook-local-only"); settings_jh_check_changed (mail_settings, NULL, session); }
/* Config struct routines */ void mail_config_init (EMailSession *session) { GConfClient *client; GConfClientNotifyFunc func; const gchar *key; g_return_if_fail (E_IS_MAIL_SESSION (session)); if (config) return; config = g_new0 (MailConfig, 1); client = gconf_client_get_default (); gconf_client_add_dir ( client, "/apps/evolution/mail/prompts", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); /* Composer Configuration */ gconf_client_add_dir ( client, "/apps/evolution/mail/composer", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); key = "/apps/evolution/mail/composer/outlook_filenames"; func = (GConfClientNotifyFunc) gconf_outlook_filenames_changed; gconf_outlook_filenames_changed (client, 0, NULL, NULL); gconf_client_notify_add (client, key, func, NULL, NULL, NULL); /* Display Configuration */ gconf_client_add_dir ( client, "/apps/evolution/mail/display", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); key = "/apps/evolution/mail/display/address_compress"; func = (GConfClientNotifyFunc) gconf_bool_value_changed; gconf_client_notify_add ( client, key, func, &config->address_compress, NULL, NULL); config->address_compress = gconf_client_get_bool (client, key, NULL); key = "/apps/evolution/mail/display/address_count"; func = (GConfClientNotifyFunc) gconf_int_value_changed; gconf_client_notify_add ( client, key, func, &config->address_count, NULL, NULL); config->address_count = gconf_client_get_int (client, key, NULL); /* Font Configuration */ gconf_client_add_dir ( client, "/apps/evolution/mail/display/fonts", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); /* Junk Configuration */ gconf_client_add_dir ( client, "/apps/evolution/mail/junk", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); key = "/apps/evolution/mail/junk/check_custom_header"; func = (GConfClientNotifyFunc) gconf_jh_check_changed; gconf_client_notify_add (client, key, func, session, NULL, NULL); config->jh_check = gconf_client_get_bool (client, key, NULL); key = "/apps/evolution/mail/junk/custom_header"; func = (GConfClientNotifyFunc) gconf_jh_headers_changed; gconf_client_notify_add (client, key, func, session, NULL, NULL); key = "/apps/evolution/mail/junk/lookup_addressbook"; func = (GConfClientNotifyFunc) gconf_bool_value_changed; gconf_client_notify_add ( client, key, func, &config->book_lookup, NULL, NULL); config->book_lookup = gconf_client_get_bool (client, key, NULL); key = "/apps/evolution/mail/junk/lookup_addressbook_local_only"; func = (GConfClientNotifyFunc) gconf_bool_value_changed; gconf_client_notify_add ( client, key, func, &config->book_lookup_local_only, NULL, NULL); config->book_lookup_local_only = gconf_client_get_bool (client, key, NULL); gconf_jh_check_changed (client, 0, NULL, session); g_object_unref (client); }
void e_mail_session_send_to (EMailSession *session, CamelMimeMessage *message, gint io_priority, GCancellable *cancellable, CamelFilterGetFolderFunc get_folder_func, gpointer get_folder_data, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; AsyncContext *context; CamelAddress *from; CamelAddress *recipients; CamelMedium *medium; CamelMessageInfo *info; CamelService *transport; GPtrArray *post_to_uris; struct _camel_header_raw *xev; struct _camel_header_raw *header; const gchar *resent_from; GError *error = NULL; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); medium = CAMEL_MEDIUM (message); camel_medium_set_header (medium, "X-Mailer", X_MAILER); /* Do this before removing "X-Evolution" headers. */ transport = e_mail_session_ref_transport_for_message ( session, message); xev = mail_tool_remove_xevolution_headers (message); /* Extract directives from X-Evolution headers. */ post_to_uris = g_ptr_array_new (); for (header = xev; header != NULL; header = header->next) { gchar *folder_uri; if (g_strcmp0 (header->name, "X-Evolution-PostTo") != 0) continue; folder_uri = g_strstrip (g_strdup (header->value)); g_ptr_array_add (post_to_uris, folder_uri); } /* Collect sender and recipients from headers. */ from = (CamelAddress *) camel_internet_address_new (); recipients = (CamelAddress *) camel_internet_address_new (); resent_from = camel_medium_get_header (medium, "Resent-From"); if (resent_from != NULL) { const CamelInternetAddress *addr; const gchar *type; camel_address_decode (from, resent_from); type = CAMEL_RECIPIENT_TYPE_RESENT_TO; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_RESENT_CC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_RESENT_BCC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); } else { const CamelInternetAddress *addr; const gchar *type; addr = camel_mime_message_get_from (message); camel_address_copy (from, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_TO; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_CC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); type = CAMEL_RECIPIENT_TYPE_BCC; addr = camel_mime_message_get_recipients (message, type); camel_address_cat (recipients, CAMEL_ADDRESS (addr)); } /* Miscellaneous preparations. */ info = camel_message_info_new_from_header ( NULL, CAMEL_MIME_PART (message)->headers); ((CamelMessageInfoBase *) info)->size = get_message_size (message, cancellable); camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, ~0); /* expand, or remove empty, group addresses */ em_utils_expand_groups (CAMEL_INTERNET_ADDRESS (recipients)); /* The rest of the processing happens in a thread. */ context = g_slice_new0 (AsyncContext); context->message = g_object_ref (message); context->io_priority = io_priority; context->from = from; context->recipients = recipients; context->info = info; context->xev = xev; context->post_to_uris = post_to_uris; context->transport = transport; if (G_IS_CANCELLABLE (cancellable)) context->cancellable = g_object_ref (cancellable); /* Failure here emits a runtime warning but is non-fatal. */ context->driver = camel_session_get_filter_driver ( CAMEL_SESSION (session), E_FILTER_SOURCE_OUTGOING, &error); if (context->driver != NULL && get_folder_func) camel_filter_driver_set_folder_func ( context->driver, get_folder_func, get_folder_data); if (error != NULL) { g_warn_if_fail (context->driver == NULL); g_warning ("%s", error->message); g_error_free (error); } /* This gets popped in async_context_free(). */ camel_operation_push_message ( context->cancellable, _("Sending message")); simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_send_to); g_simple_async_result_set_check_cancellable (simple, cancellable); g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); g_simple_async_result_run_in_thread ( simple, (GSimpleAsyncThreadFunc) mail_session_send_to_thread, context->io_priority, context->cancellable); g_object_unref (simple); }
/** * e_mail_session_get_fcc_for_message_sync: * @session: an #EMailSession * @message: a #CamelMimeMessage * @cancellable: optional #GCancellable object, or %NULL * @error: return location for a #GError, or %NULL * * Obtains the preferred "carbon-copy" folder (a.k.a Fcc) for @message * by first checking @message for an "X-Evolution-Identity" header, and * then an "X-Evolution-Fcc" header. Failing that, the function checks * the default mail identity (if available), and failing even that, the * function falls back to the Sent folder from the built-in mail store. * * Where applicable, the function attempts to honor the * #ESourceMailSubmission:replies-to-origin-folder preference. * * The returned #CamelFolder is referenced for thread-safety and must be * unreferenced with g_object_unref() when finished with it. * * If a non-recoverable error occurs, the function sets @error and returns * %NULL. * * Returns: a #CamelFolder, or %NULL **/ CamelFolder * e_mail_session_get_fcc_for_message_sync (EMailSession *session, CamelMimeMessage *message, GCancellable *cancellable, GError **error) { CamelFolder *folder = NULL; g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL); /* Check for "X-Evolution-Identity" header. */ if (folder == NULL) { GError *local_error = NULL; /* This may return NULL without setting a GError. */ folder = mail_session_ref_fcc_from_x_identity ( session, message, cancellable, &local_error); if (local_error != NULL) { g_warn_if_fail (folder == NULL); g_propagate_error (error, local_error); return NULL; } } /* Check for "X-Evolution-Fcc" header. */ if (folder == NULL) { GError *local_error = NULL; /* This may return NULL without setting a GError. */ folder = mail_session_ref_fcc_from_x_fcc ( session, message, cancellable, &local_error); if (local_error != NULL) { g_warn_if_fail (folder == NULL); g_propagate_error (error, local_error); return NULL; } } /* Check the default mail identity. */ if (folder == NULL) { GError *local_error = NULL; /* This may return NULL without setting a GError. */ folder = mail_session_ref_fcc_from_default_identity ( session, message, cancellable, &local_error); if (local_error != NULL) { g_warn_if_fail (folder == NULL); g_propagate_error (error, local_error); return NULL; } } /* Last resort - local Sent folder. */ if (folder == NULL) { folder = e_mail_session_get_local_folder ( session, E_MAIL_LOCAL_FOLDER_SENT); g_object_ref (folder); } return folder; }