From 516aee1304eef6e5b885a1c5d00a2b80a36fd87a Mon Sep 17 00:00:00 2001 From: Not Zed Date: Thu, 24 Feb 2005 02:20:32 +0000 Subject: ** See bug #71528. 2005-02-21 Not Zed ** See bug #71528. * em-migrate.c (remove_system_searches, em_migrate_1_4): remove all 'system' searches when upgrading from pre 2.0. svn path=/trunk/; revision=28876 --- mail/ChangeLog | 7 ++++ mail/em-migrate.c | 120 +++++++++++++++++++++++++++++++++++------------------- 2 files changed, 85 insertions(+), 42 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 7171984338..453d753bd8 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,10 @@ +2005-02-21 Not Zed + + ** See bug #71528. + + * em-migrate.c (remove_system_searches, em_migrate_1_4): remove + all 'system' searches when upgrading from pre 2.0. + 2005-02-21 Not Zed ** See bug #71967 diff --git a/mail/em-migrate.c b/mail/em-migrate.c index d2c9c1909c..c767e2fa05 100644 --- a/mail/em-migrate.c +++ b/mail/em-migrate.c @@ -69,6 +69,36 @@ #define d(x) x /* upgrade helper functions */ +static xmlDocPtr +emm_load_xml (const char *dirname, const char *filename) +{ + xmlDocPtr doc; + struct stat st; + char *path; + + path = g_strdup_printf ("%s/%s", dirname, filename); + if (stat (path, &st) == -1 || !(doc = xmlParseFile (path))) { + g_free (path); + return NULL; + } + + g_free (path); + + return doc; +} + +static int +emm_save_xml (xmlDocPtr doc, const char *dirname, const char *filename) +{ + char *path; + int retval; + + path = g_strdup_printf ("%s/%s", dirname, filename); + retval = e_xml_save_file (path, doc); + g_free (path); + + return retval; +} static xmlNodePtr xml_find_node (xmlNodePtr parent, const char *name) @@ -2470,6 +2500,42 @@ em_migrate_imap_cmeta_1_4(const char *evolution_dir, CamelException *ex) return 0; } +static void +remove_system_searches(xmlDocPtr searches) +{ + xmlNodePtr node; + + /* in pre 2.0, system searches were stored in the user + * searches.xml file with the source set to 'demand'. In 2.0+ + * the system searches are stored in the system + * searchtypes.xml file instead */ + + node = xmlDocGetRootElement(searches); + if (!node->name || strcmp(node->name, "filteroptions")) + return; + + if (!(node = xml_find_node(node, "ruleset"))) + return; + + node = node->children; + while (node != NULL) { + xmlNodePtr nnode = node->next; + + if (node->name && !strcmp (node->name, "rule")) { + char *src; + + src = xmlGetProp(node, "source"); + if (src && !strcmp(src, "demand")) { + xmlUnlinkNode(node); + xmlFreeNodeList(node); + } + xmlFree (src); + } + + node = nnode; + } +} + static int em_migrate_1_4 (const char *evolution_dir, xmlDocPtr filters, xmlDocPtr vfolders, CamelException *ex) { @@ -2477,7 +2543,8 @@ em_migrate_1_4 (const char *evolution_dir, xmlDocPtr filters, xmlDocPtr vfolders CamelException lex; struct stat st; char *path; - + xmlDocPtr searches; + path = g_build_filename (evolution_dir, "mail", NULL); camel_init (path, TRUE); @@ -2526,16 +2593,17 @@ em_migrate_1_4 (const char *evolution_dir, xmlDocPtr filters, xmlDocPtr vfolders upgrade_xml_uris(filters, upgrade_xml_uris_1_4); upgrade_vfolder_sources_1_4(vfolders); upgrade_xml_uris(vfolders, upgrade_xml_uris_1_4); - - path = g_build_filename (g_get_home_dir (), "evolution", "searches.xml", NULL); - if (stat (path, &st) == 0 && S_ISREG (st.st_mode)) { - char *dest; - - dest = g_build_filename (evolution_dir, "mail", "searches.xml", NULL); - cp (path, dest, FALSE, CP_UNIQUE); - g_free (dest); + + path = g_build_filename(g_get_home_dir(), "evolution", NULL); + searches = emm_load_xml(path, "searches.xml"); + g_free(path); + if (searches) { + remove_system_searches(searches); + path = g_build_filename(evolution_dir, "mail", NULL); + emm_save_xml(searches, path, "searches.xml"); + g_free(path); + xmlFreeDoc(searches); } - g_free (path); if (em_migrate_pop_uid_caches_1_4 (evolution_dir, ex) == -1) return -1; @@ -2553,38 +2621,6 @@ em_migrate_1_4 (const char *evolution_dir, xmlDocPtr filters, xmlDocPtr vfolders return 0; } - -static xmlDocPtr -emm_load_xml (const char *dirname, const char *filename) -{ - xmlDocPtr doc; - struct stat st; - char *path; - - path = g_strdup_printf ("%s/%s", dirname, filename); - if (stat (path, &st) == -1 || !(doc = xmlParseFile (path))) { - g_free (path); - return NULL; - } - - g_free (path); - - return doc; -} - -static int -emm_save_xml (xmlDocPtr doc, const char *dirname, const char *filename) -{ - char *path; - int retval; - - path = g_strdup_printf ("%s/%s", dirname, filename); - retval = e_xml_save_file (path, doc); - g_free (path); - - return retval; -} - static int emm_setup_initial(const char *evolution_dir) { -- cgit v1.2.3