aboutsummaryrefslogtreecommitdiffstats
ModeNameSize
-rw-r--r--.cvsignore19logstatsplainblame
d---------CVSROOT915logstatsplain
-rw-r--r--INDEX370036logstatsplainblame
-rw-r--r--LEGAL6115logstatsplainblame
-rw-r--r--Makefile2197logstatsplainblame
d---------Mk172logstatsplain
-rw-r--r--README1410logstatsplainblame
d---------Templates120logstatsplain
d---------Tools74logstatsplain
-rw-r--r--YEAR2000981logstatsplainblame
d---------archivers888logstatsplain
d---------astro469logstatsplain
d---------audio2236logstatsplain
d---------benchmarks471logstatsplain
d---------biology299logstatsplain
d---------cad449logstatsplain
d---------chinese898logstatsplain
d---------comms645logstatsplain
d---------converters578logstatsplain
d---------databases2720logstatsplain
d---------deskutils932logstatsplain
d---------devel6162logstatsplain
d---------dns395logstatsplain
d---------editors2292logstatsplain
d---------emulators1535logstatsplain
d---------finance220logstatsplain
d---------ftp844logstatsplain
d---------games6879logstatsplain
d---------german270logstatsplain
d---------graphics4766logstatsplain
d---------irc590logstatsplain
d---------japanese10113logstatsplain
d---------java159logstatsplain
d---------korean1445logstatsplain
d---------lang4142logstatsplain
d---------mail3011logstatsplain
d---------math2159logstatsplain
d---------mbone352logstatsplain
d---------misc3295logstatsplain
d---------multimedia561logstatsplain
d---------net-im320logstatsplain
d---------net-mgmt562logstatsplain
d---------net6334logstatsplain
d---------news1234logstatsplain
d---------palm290logstatsplain
d---------ports-mgmt104logstatsplain
d---------print3592logstatsplain
d---------russian429logstatsplain
d---------science126logstatsplain
d---------security1930logstatsplain
d---------shells440logstatsplain
d---------sysutils2641logstatsplain
d---------textproc1656logstatsplain
d---------vietnamese299logstatsplain
d---------www4436logstatsplain
d---------x11-clocks576logstatsplain
d---------x11-fm434logstatsplain
d---------x11-fonts408logstatsplain
d---------x11-servers1397logstatsplain
d---------x11-themes111logstatsplain
d---------x11-toolkits1785logstatsplain
d---------x11-wm1297logstatsplain
d---------x113126logstatsplain
{ d(printf("Must reconfigure vfolder with new rule?\n")); g_free(info->query); info->query = g_strdup(expr->str); uri = g_strdup_printf("vfolder:%s", info->name); path = g_strdup_printf("/%s", info->name); evolution_storage_removed_folder(vfolder_storage, path); evolution_storage_new_folder(vfolder_storage, path, g_basename(path), "mail", uri, info->name, FALSE); g_free(uri); g_free(path); } } else { info = g_malloc(sizeof(*info)); info->name = g_strdup(rule->name); info->query = g_strdup(expr->str); gtk_object_ref((GtkObject *)rule); info->rule = rule; info->folder = NULL; d(printf("Adding new vfolder: %s %s\n", rule->name, expr->str)); uri = g_strdup_printf("vfolder:%s", info->name); path = g_strdup_printf("/%s", info->name); evolution_storage_new_folder(vfolder_storage, path, g_basename(path), "mail", uri, info->name, FALSE); g_free(uri); g_free(path); } head = g_list_append(head, info); } /* everything in available_vfolders are to be removed ... */ l = available_vfolders; while (l) { info = l->data; d(printf("removing vfolders %s %s\n", info->name, info->query)); path = g_strdup_printf("/%s", info->name); evolution_storage_removed_folder(vfolder_storage, path); g_free(path); g_free(info->name); g_free(info->query); gtk_object_unref((GtkObject *)info->rule); g_free(info); l = g_list_next(l); } /* setup the virtual unmatched folder */ info = vfolder_find("UNMATCHED"); if (info == NULL) { char *uri, *path; info = g_malloc(sizeof(*info)); info->name = g_strdup("UNMATCHED"); info->query = g_strdup("UNMATCHED"); info->rule = NULL; info->folder = NULL; d(printf("Adding new vfolder: %s %s\n", info->name, info->query)); uri = g_strdup_printf("vfolder:%s", info->name); path = g_strdup_printf("/%s", info->name); evolution_storage_new_folder(vfolder_storage, path, g_basename(path), "mail", uri, info->name, FALSE); g_free(uri); g_free(path); } head = g_list_append(head, info); g_list_free(available_vfolders); available_vfolders = head; g_string_free(expr, TRUE); } static void unlist_vfolder (CamelObject *folder, gpointer event_data, gpointer user_data) { GList *l; l = available_vfolders; while (l) { struct _vfolder_info *info = l->data; if ((CamelObject *)info->folder == folder) { info->folder = NULL; return; } l = l->next; } g_message ("Whoa, unlisting vfolder %p but can't find it", folder); } static int vfolder_remove_cb (EvolutionStorage *storage, const char *path, const char *physical_uri, gpointer user_data) { vfolder_remove (physical_uri); return EVOLUTION_STORAGE_OK; } void vfolder_create_storage (EvolutionShellComponent *shell_component) { EvolutionShellClient *shell_client; GNOME_Evolution_Shell corba_shell; EvolutionStorage *storage; char *user, *system; shell_client = evolution_shell_component_get_owner (shell_component); if (shell_client == NULL) { g_warning ("We have no shell!?"); return; } global_shell_client = shell_client; corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client)); storage = evolution_storage_new (_("VFolders"), NULL, NULL); if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) { g_warning ("Cannot register storage"); return; } vfolder_storage = storage; gtk_signal_connect (GTK_OBJECT (storage), "remove_folder", GTK_SIGNAL_FUNC (vfolder_remove_cb), NULL); user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); system = EVOLUTION_DATADIR "/evolution/vfoldertypes.xml"; context = vfolder_context_new (); printf("loading rules %s %s\n", system, user); if (rule_context_load ((RuleContext *)context, system, user) != 0) { g_warning("cannot load vfolders: %s\n", ((RuleContext *)context)->error); } g_free (user); vfolder_refresh (); } void vfolder_remove (const char *uri) { struct _vfolder_info *info; VfolderRule *rule; char *user; g_warning ("vfolder_remove (\"%s\");", uri); if (strncmp (uri, "vfolder:", 8)) return; info = vfolder_find (uri + 8); if (!info) return; user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); rule = (VfolderRule *)rule_context_find_rule ((RuleContext *) context, info->name, NULL); rule_context_remove_rule ((RuleContext *) context, (FilterRule *) rule); rule_context_save ((RuleContext *) context, user); g_free (user); vfolder_refresh (); } /* maps the shell's uri to the real vfolder uri and open the folder */ CamelFolder * vfolder_uri_to_folder(const char *uri, CamelException *ex) { struct _vfolder_info *info; char *storeuri, *foldername; VfolderRule *rule; CamelFolder *folder = NULL, *sourcefolder; const char *sourceuri; int sources; GList *l; if (strncmp (uri, "vfolder:", 8)) return NULL; info = vfolder_find(uri+8); if (info == NULL) { g_warning("Shell trying to open unknown vFolder: %s", uri); return NULL; } if (info->folder) { camel_object_ref((CamelObject *)info->folder); return (CamelFolder *)info->folder; } d(printf("Opening vfolder: %s\n", uri)); rule = (VfolderRule *)rule_context_find_rule((RuleContext *)context, info->name, NULL); storeuri = g_strdup_printf("vfolder:%s/vfolder/%s", evolution_dir, info->name); foldername = g_strdup_printf("%s?%s", info->name, info->query); /* we dont have indexing on vfolders */ folder = mail_tool_get_folder_from_urlname (storeuri, foldername, CAMEL_STORE_FOLDER_CREATE, ex); info->folder = (CamelVeeFolder *)folder; camel_object_hook_event ((CamelObject *) info->folder, "finalize", unlist_vfolder, NULL); mail_folder_cache_set_update_estorage (uri, vfolder_storage); mail_folder_cache_note_folder (uri, CAMEL_FOLDER (info->folder)); bonobo_object_ref (BONOBO_OBJECT (vfolder_storage)); mail_hash_storage ((CamelService *)folder->parent_store, vfolder_storage); if (strcmp (uri + 8, "UNMATCHED") != 0) { sourceuri = NULL; sources = 0; while ( (sourceuri = vfolder_rule_next_source(rule, sourceuri)) ) { d(printf("adding vfolder source: %s\n", sourceuri)); sourcefolder = mail_tool_uri_to_folder (sourceuri, ex); printf("source folder = %p\n", sourcefolder); if (sourcefolder) { sources++; camel_vee_folder_add_folder((CamelVeeFolder *)folder, sourcefolder); } else { /* we'll just silently ignore now-missing sources */ camel_exception_clear(ex); } } l = source_folders; while (l) { register_new_source(info, l->data); l = l->next; } #if 0 /* if we didn't have any sources, just use Inbox as the default */ if (sources == 0) { char *defaulturi; defaulturi = g_strdup_printf("file://%s/local/Inbox", evolution_dir); d(printf("No sources configured/found, using default: %s\n", defaulturi)); sourcefolder = mail_tool_uri_to_folder (defaulturi, ex); g_free(defaulturi); if (sourcefolder) { camel_vee_folder_add_folder(folder, sourcefolder); } } #endif } g_free(foldername); g_free(storeuri); return folder; } static GtkWidget *vfolder_editor = NULL; static void vfolder_editor_destroy (GtkWidget *widget, gpointer user_data) { vfolder_editor = NULL; } static void vfolder_editor_clicked (GtkWidget *dialog, int button, void *data) { if (button == 0) { char *user; user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); rule_context_save ((RuleContext *)context, user); g_free (user); vfolder_refresh (); } if (button != -1) { gnome_dialog_close (GNOME_DIALOG (dialog)); } } void vfolder_edit (void) { if (vfolder_editor) { gdk_window_raise (GTK_WIDGET (vfolder_editor)->window); return; } vfolder_editor = GTK_WIDGET (vfolder_editor_new (context)); gtk_signal_connect (GTK_OBJECT (vfolder_editor), "clicked", vfolder_editor_clicked, NULL); gtk_signal_connect (GTK_OBJECT (vfolder_editor), "destroy", vfolder_editor_destroy, NULL); gtk_widget_show (vfolder_editor); } static void new_rule_clicked(GtkWidget *w, int button, void *data) { if (button == 0) { char *user; FilterRule *rule = gtk_object_get_data((GtkObject *)w, "rule"); gtk_object_ref((GtkObject *)rule); rule_context_add_rule((RuleContext *)context, rule); user = g_strdup_printf("%s/vfolders.xml", evolution_dir); rule_context_save((RuleContext *)context, user); g_free(user); vfolder_refresh(); } if (button != -1) { gnome_dialog_close((GnomeDialog *)w); } } FilterPart * vfolder_create_part(const char *name) { return rule_context_create_part((RuleContext *)context, name); } /* clones a filter/search rule into a matching vfolder rule (assuming the same system definitions) */ FilterRule * vfolder_clone_rule(FilterRule *in) { FilterRule *rule = (FilterRule *)vfolder_rule_new(); xmlNodePtr xml; xml = filter_rule_xml_encode(in); filter_rule_xml_decode(rule, xml, (RuleContext *)context); xmlFreeNodeList(xml); return rule; } /* adds a rule with a gui */ void vfolder_gui_add_rule(VfolderRule *rule) { GtkWidget *w; GnomeDialog *gd; w = filter_rule_get_widget((FilterRule *)rule, (RuleContext *)context); gd = (GnomeDialog *)gnome_dialog_new(_("New VFolder"), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL); gnome_dialog_set_default (gd, 0); gtk_window_set_policy(GTK_WINDOW(gd), FALSE, TRUE, FALSE); gtk_window_set_default_size (GTK_WINDOW (gd), 500, 500); gtk_box_pack_start((GtkBox *)gd->vbox, w, TRUE, TRUE, 0); gtk_widget_show((GtkWidget *)gd); gtk_object_set_data_full((GtkObject *)gd, "rule", rule, (GtkDestroyNotify)gtk_object_unref); gtk_signal_connect((GtkObject *)gd, "clicked", new_rule_clicked, NULL); gtk_widget_show((GtkWidget *)gd); } void vfolder_gui_add_from_message(CamelMimeMessage *msg, int flags, const char *source) { VfolderRule *rule; g_return_if_fail (msg != NULL); rule = (VfolderRule*)vfolder_rule_from_message(context, msg, flags, source); vfolder_gui_add_rule(rule); } void vfolder_gui_add_from_mlist(CamelMimeMessage *msg, const char *mlist, const char *source) { VfolderRule *rule; g_return_if_fail (msg != NULL); rule = (VfolderRule*)vfolder_rule_from_mlist(context, mlist, source); vfolder_gui_add_rule(rule); } EvolutionStorage * mail_vfolder_get_vfolder_storage (void) { bonobo_object_ref (BONOBO_OBJECT (vfolder_storage)); return vfolder_storage; }