void filter_gui_add_from_message (EMailBackend *backend, 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_BACKEND (backend)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (msg)); fc = em_filter_context_new (backend); 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); }
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); }
void mail_filter_delete_folder (EMailBackend *backend, CamelStore *store, const gchar *folder_name) { EMFilterContext *fc; const gchar *config_dir; gchar *user, *system; GList *deleted; gchar *uri; g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (CAMEL_IS_STORE (store)); g_return_if_fail (folder_name != NULL); uri = e_mail_folder_uri_build (store, folder_name); fc = em_filter_context_new (backend); 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_mail_backend_submit_alert ( backend, "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); }
void vfolder_load_storage (EMailBackend *backend) { /* lock for loading storage, it is safe to call it more than once */ G_LOCK_DEFINE_STATIC (vfolder_hash); CamelService *service; const gchar *key; const gchar *data_dir; const gchar *config_dir; gchar *user, *storeuri; EFilterRule *rule; MailFolderCache *folder_cache; EMailSession *session; gchar *xmlfile; GConfClient *client; g_return_if_fail (E_IS_MAIL_BACKEND (backend)); G_LOCK (vfolder_hash); if (vfolder_hash) { /* we have already initialized */ G_UNLOCK (vfolder_hash); return; } vfolder_hash = g_hash_table_new (g_str_hash, g_str_equal); G_UNLOCK (vfolder_hash); data_dir = mail_session_get_data_dir (); config_dir = mail_session_get_config_dir (); session = e_mail_backend_get_session (backend); /* first, create the vfolder store, and set it up */ storeuri = g_strdup_printf("vfolder:%s/vfolder", data_dir); service = camel_session_add_service ( CAMEL_SESSION (session), "vfolder", storeuri, CAMEL_PROVIDER_STORE, NULL); if (service != NULL) { camel_service_set_display_name (service, _("Search Folders")); em_utils_connect_service_sync (service, NULL, NULL); } else { g_warning("Cannot open vfolder store - no vfolders available"); return; } g_return_if_fail (CAMEL_IS_STORE (service)); vfolder_store = CAMEL_STORE (service); g_signal_connect ( service, "folder-deleted", G_CALLBACK (store_folder_deleted_cb), backend); g_signal_connect ( service, "folder-renamed", G_CALLBACK (store_folder_renamed_cb), NULL); /* load our rules */ user = g_build_filename (config_dir, "vfolders.xml", NULL); context = em_vfolder_context_new (backend); xmlfile = g_build_filename (EVOLUTION_PRIVDATADIR, "vfoldertypes.xml", NULL); if (e_rule_context_load ((ERuleContext *) context, xmlfile, user) != 0) { g_warning("cannot load vfolders: %s\n", ((ERuleContext *)context)->error); } g_free (xmlfile); g_free (user); g_signal_connect ( context, "rule_added", G_CALLBACK (context_rule_added), context); g_signal_connect ( context, "rule_removed", G_CALLBACK (context_rule_removed), context); /* load store to mail component */ e_mail_store_add (backend, vfolder_store); /* and setup the rules we have */ rule = NULL; while ((rule = e_rule_context_next_rule ((ERuleContext *) context, rule, NULL))) { if (rule->name) { d(printf("rule added: %s\n", rule->name)); context_rule_added ((ERuleContext *) context, rule); } else { d(printf("invalid rule (%p) encountered: rule->name is NULL\n", rule)); } } g_free (storeuri); /* reenable the feature if required */ client = gconf_client_get_default (); key = "/apps/evolution/mail/display/enable_vfolders"; if (!gconf_client_get_bool (client, key, NULL)) gconf_client_set_bool (client, key, TRUE, NULL); g_object_unref (client); folder_cache = e_mail_session_get_folder_cache (session); g_signal_connect ( folder_cache, "folder-available", G_CALLBACK (folder_available_cb), backend); g_signal_connect ( folder_cache, "folder-unavailable", G_CALLBACK (folder_unavailable_cb), backend); g_signal_connect ( folder_cache, "folder-deleted", G_CALLBACK (folder_deleted_cb), backend); g_signal_connect ( folder_cache, "folder-renamed", G_CALLBACK (folder_renamed_cb), NULL); }