/** * em_utils_folder_is_drafts: * @registry: an #ESourceRegistry * @folder: a #CamelFolder * * Decides if @folder is a Drafts folder. * * Returns %TRUE if this is a Drafts folder or %FALSE otherwise. **/ gboolean em_utils_folder_is_drafts (ESourceRegistry *registry, CamelFolder *folder) { CamelFolder *local_drafts_folder; CamelSession *session; CamelStore *store; GList *list, *iter; gchar *folder_uri; gboolean is_drafts = FALSE; const gchar *extension_name; g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); store = camel_folder_get_parent_store (folder); session = camel_service_ref_session (CAMEL_SERVICE (store)); local_drafts_folder = e_mail_session_get_local_folder ( E_MAIL_SESSION (session), E_MAIL_LOCAL_FOLDER_DRAFTS); if (folder == local_drafts_folder) { is_drafts = TRUE; goto exit; } folder_uri = e_mail_folder_uri_from_folder (folder); store = camel_folder_get_parent_store (folder); extension_name = E_SOURCE_EXTENSION_MAIL_COMPOSITION; list = e_source_registry_list_sources (registry, extension_name); for (iter = list; iter != NULL; iter = g_list_next (iter)) { ESource *source = E_SOURCE (iter->data); ESourceExtension *extension; const gchar *drafts_folder_uri; extension = e_source_get_extension (source, extension_name); drafts_folder_uri = e_source_mail_composition_get_drafts_folder ( E_SOURCE_MAIL_COMPOSITION (extension)); if (drafts_folder_uri != NULL) is_drafts = e_mail_folder_uri_equal ( session, folder_uri, drafts_folder_uri); if (is_drafts) break; } g_list_free_full (list, (GDestroyNotify) g_object_unref); g_free (folder_uri); exit: g_object_unref (session); return is_drafts; }
void mail_filter_rename_folder (CamelStore *store, const gchar *old_folder_name, const gchar *new_folder_name) { CamelSession *session; EMFilterContext *fc; const gchar *config_dir; gchar *user, *system; GList *changed; gchar *old_uri; gchar *new_uri; g_return_if_fail (CAMEL_IS_STORE (store)); g_return_if_fail (old_folder_name != NULL); g_return_if_fail (new_folder_name != NULL); session = camel_service_ref_session (CAMEL_SERVICE (store)); old_uri = e_mail_folder_uri_build (store, old_folder_name); new_uri = e_mail_folder_uri_build (store, new_folder_name); fc = em_filter_context_new (E_MAIL_SESSION (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); changed = e_rule_context_rename_uri ( (ERuleContext *) fc, old_uri, new_uri, g_str_equal); if (changed) { if (e_rule_context_save ((ERuleContext *) fc, user) == -1) g_warning ("Could not write out changed filter rules\n"); e_rule_context_free_uri_list ((ERuleContext *) fc, changed); } g_free (user); g_object_unref (fc); g_free (old_uri); g_free (new_uri); g_object_unref (session); }
/* Helper for e_mail_session_get_fcc_for_message() */ static void mail_session_get_fcc_for_message_thread (GSimpleAsyncResult *simple, GObject *source_object, GCancellable *cancellable) { AsyncContext *async_context; GError *local_error = NULL; async_context = g_simple_async_result_get_op_res_gpointer (simple); async_context->folder = e_mail_session_get_fcc_for_message_sync ( E_MAIL_SESSION (source_object), async_context->message, cancellable, &local_error); if (local_error != NULL) g_simple_async_result_take_error (simple, local_error); }
static void mail_session_append_to_local_folder_thread (GSimpleAsyncResult *simple, GObject *object, GCancellable *cancellable) { AsyncContext *context; GError *error = NULL; context = g_simple_async_result_get_op_res_gpointer (simple); e_mail_session_append_to_local_folder_sync ( E_MAIL_SESSION (object), context->local_id, context->message, context->info, &context->message_uid, cancellable, &error); if (error != NULL) g_simple_async_result_take_error (simple, error); }
/** * em_utils_folder_is_outbox: * @registry: an #ESourceRegistry * @folder: a #CamelFolder * * Decides if @folder is an Outbox folder. * * Returns %TRUE if this is an Outbox folder or %FALSE otherwise. **/ gboolean em_utils_folder_is_outbox (ESourceRegistry *registry, CamelFolder *folder) { CamelStore *store; CamelSession *session; CamelFolder *local_outbox_folder; gboolean is_outbox; g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); store = camel_folder_get_parent_store (folder); session = camel_service_ref_session (CAMEL_SERVICE (store)); local_outbox_folder = e_mail_session_get_local_folder ( E_MAIL_SESSION (session), E_MAIL_LOCAL_FOLDER_OUTBOX); is_outbox = (folder == local_outbox_folder); g_object_unref (session); return is_outbox; }
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 mail_filter_delete_folder (CamelStore *store, const gchar *folder_name, EAlertSink *alert_sink) { CamelSession *session; EMFilterContext *fc; const gchar *config_dir; gchar *user, *system; GList *deleted; gchar *uri; g_return_if_fail (CAMEL_IS_STORE (store)); g_return_if_fail (folder_name != NULL); g_return_if_fail (E_IS_ALERT_SINK (alert_sink)); session = camel_service_ref_session (CAMEL_SERVICE (store)); uri = e_mail_folder_uri_build (store, folder_name); fc = em_filter_context_new (E_MAIL_SESSION (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); deleted = e_rule_context_delete_uri ( (ERuleContext *) fc, uri, g_str_equal); if (deleted) { GString *s; guint s_count; gchar *info; GList *l; s = g_string_new (""); s_count = 0; for (l = deleted; l; l = l->next) { const gchar *name = (const gchar *) l->data; if (s_count == 0) { g_string_append (s, name); } else { if (s_count == 1) { g_string_prepend (s, " "); g_string_append (s, "\n"); } g_string_append_printf (s, " %s\n", name); } s_count++; } info = g_strdup_printf (ngettext ( /* Translators: The first %s is name of the affected * filter rule(s), the second %s is URI of the removed * folder. For more than one filter rule is each of * them on a separate line, with four spaces in front * of its name, without quotes. */ "The filter rule \"%s\" has been modified to account " "for the deleted folder\n\"%s\".", "The following filter rules\n%s have been modified " "to account for the deleted folder\n\"%s\".", s_count), s->str, folder_name); e_alert_submit ( alert_sink, "mail:filter-updated", info, NULL); g_string_free (s, TRUE); g_free (info); if (e_rule_context_save ((ERuleContext *) fc, user) == -1) g_warning ("Could not write out changed filter rules\n"); e_rule_context_free_uri_list ((ERuleContext *) fc, deleted); } g_free (user); g_object_unref (fc); g_free (uri); g_object_unref (session); }