0.9.8claws16
authorChristoph Hohmann <reboot@gmx.ch>
Thu, 1 Jan 2004 19:55:42 +0000 (19:55 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Thu, 1 Jan 2004 19:55:42 +0000 (19:55 +0000)
* src/common/xml.[ch]
        o add xml_new_tag() to manage usage counts of strings correctly
        o correct xml_copy_tree() function name

* src/folder.c
* src/main.c
        allow registering and unregistering of FolderClasses anytime

ChangeLog.claws
configure.ac
src/common/xml.c
src/common/xml.h
src/folder.c
src/main.c

index ac0443872c62ad6972abed4672b3f18898e3f2f4..bbf38ccf5073dcdceecc7402329a2d210a79667c 100644 (file)
@@ -1,3 +1,13 @@
+2004-01-01 [christoph] 0.9.8claws16
+
+       * src/common/xml.[ch]
+               o add xml_new_tag() to manage usage counts of strings correctly
+               o correct xml_copy_tree() function name
+
+       * src/folder.c
+       * src/main.c
+               allow registering and unregistering of FolderClasses anytime
+
 2003-12-31 [christoph] 0.9.8claws15
 
        * src/folder.[ch]
index fa4af2f7d58dc033d940ff77bc1a28163d93c58e..429565d81f87b5ceebbab70066e7d6722b54634f 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=8
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=15
+EXTRA_VERSION=16
 if test $EXTRA_VERSION -eq 0; then
     VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
 else
index aa495c7010550ba25fbf39d96b79db05db32d80f..7fd59086c47848b40ba65416ca079f145834929b 100644 (file)
@@ -377,6 +377,17 @@ gboolean xml_compare_tag(XMLFile *file, const gchar *name)
                return FALSE;
 }
 
+XMLTag *xml_new_tag(const gchar        *tag)
+{
+       XMLTag *new_tag;
+
+       new_tag = g_new(XMLTag, 1);
+       new_tag->tag = XML_STRING_ADD(tag);
+       new_tag->attr = NULL;
+
+       return new_tag;
+}
+
 XMLTag *xml_copy_tag(XMLTag *tag)
 {
        XMLTag *new_tag;
@@ -620,7 +631,7 @@ static gpointer copy_node_func(gpointer nodedata, gpointer data)
        return newxmlnode;
 }
 
-GNode *xml_tree_copy(GNode *node)
+GNode *xml_copy_tree(GNode *node)
 {
        return g_node_map(node, copy_node_func, NULL);
 }
index ba588d2e11d67302a353eecec5944a16d7e73405..b9036cee5638e1b0d88915a9de72d946ccbb7f1d 100644 (file)
@@ -81,6 +81,7 @@ void xml_truncate_buf         (XMLFile        *file);
 gboolean  xml_compare_tag      (XMLFile        *file,
                                 const gchar    *name);
 
+XMLTag *xml_new_tag            (const gchar    *tag);
 XMLTag  *xml_copy_tag          (XMLTag         *tag);
 XMLAttr *xml_copy_attr         (XMLAttr        *attr);
 
index 6fe1750f14987510e33b6a557b9664a5c014437c..2a7b10c556ce4b741eff4b2c3a5eb58cd3008649 100644 (file)
@@ -87,26 +87,56 @@ GSList *folder_get_class_list(void)
 
 void folder_register_class(FolderClass *klass)
 {
+       GSList *xmllist, *cur;
+
        debug_print("registering folder class %s\n", klass->idstr);
+
        class_list = g_slist_append(class_list, klass);
+
+       xmllist = g_slist_copy(folder_unloaded_list);
+       for (cur = xmllist; cur != NULL; cur = g_slist_next(cur)) {
+               GNode *node = (GNode *) cur->data;
+               XMLNode *xmlnode = (XMLNode *) node->data;
+               GList *cur = xmlnode->tag->attr;
+
+               for (; cur != NULL; cur = g_list_next(cur)) {
+                       XMLAttr *attr = (XMLAttr *) cur->data;
+
+                       if (!attr || !attr->name || !attr->value) continue;
+                       if (!strcmp(attr->name, "type") && !strcmp(attr->value, klass->idstr)) {
+                               Folder *folder;
+
+                               folder = folder_get_from_xml(node);
+                               folder_add(folder);
+                               folder_unloaded_list = g_slist_remove(folder_unloaded_list, node);
+
+                               cur = NULL;
+                               continue;
+                       }
+               }
+       }
+       g_slist_free(xmllist);
 }
 
 void folder_unregister_class(FolderClass *klass)
 {
-/*
        GList *folderlist, *cur;
-*/
+
        debug_print("unregistering folder class %s\n", klass->idstr);
-/*
+
+       class_list = g_slist_remove(class_list, klass);
+
        folderlist = g_list_copy(folder_get_list());
        for (cur = folderlist; cur != NULL; cur = g_list_next(cur)) {
                Folder *folder = (Folder *) cur->data;
 
                if (folder->klass == klass) {
-                       GNode *xmlnode = folder_
+                       GNode *xmlnode = folder_get_xml_node(folder);
+                       folder_unloaded_list = g_slist_append(folder_unloaded_list, xmlnode);
+                       folder_destroy(folder);
                }
        }
-*/
+       g_list_free(folderlist);
 }
 
 Folder *folder_new(FolderClass *klass, const gchar *name, const gchar *path)
@@ -163,8 +193,6 @@ void folder_destroy(Folder *folder)
 
        g_free(folder->name);
        g_free(folder);
-
-       folder_write_list();
 }
 
 void folder_set_xml(Folder *folder, XMLTag *tag)
@@ -209,8 +237,7 @@ XMLTag *folder_get_xml(Folder *folder)
 {
        XMLTag *tag;
 
-       tag = g_new0(XMLTag, 1);
-       tag->tag = g_strdup("folder");
+       tag = xml_new_tag("folder");
 
        if (folder->name)
                xml_tag_add_attr(tag, "name", g_strdup(folder->name));
@@ -485,8 +512,7 @@ XMLTag *folder_item_get_xml(Folder *folder, FolderItem *item)
                                        "locked"};
        XMLTag *tag;
 
-       tag = g_new0(XMLTag, 1);
-       tag->tag = g_strdup("folderitem");
+       tag = xml_new_tag("folderitem");
 
        xml_tag_add_attr(tag, "type", g_strdup(folder_item_stype_str[item->stype]));
        if (item->name)
@@ -598,12 +624,12 @@ void folder_add(Folder *folder)
                }
        }
 
+       folder_list = g_list_insert(folder_list, folder, i);
+
        hookdata.folder = folder;
        hookdata.update_flags = FOLDER_NEW_FOLDER;
        hookdata.item = NULL;
        hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
-
-       folder_list = g_list_insert(folder_list, folder, i);
 }
 
 GList *folder_get_list(void)
@@ -638,7 +664,7 @@ gint folder_read_list(void)
                        folder_add(folder);
                else
                        folder_unloaded_list = g_slist_append(folder_unloaded_list,
-                               (gpointer) xml_tree_copy(cur));
+                               (gpointer) xml_copy_tree(cur));
                cur = cur->next;
        }
 
@@ -665,9 +691,7 @@ void folder_write_list(void)
 
        fprintf(pfile->fp, "<?xml version=\"1.0\" encoding=\"%s\"?>\n",
                conv_get_current_charset_str());
-       tag = g_new0(XMLTag, 1);
-       tag->tag = g_strdup("folderlist");
-       tag->attr = NULL;
+       tag = xml_new_tag("folderlist");
 
        xmlnode = g_new0(XMLNode, 1);
        xmlnode->tag = tag;
@@ -687,7 +711,7 @@ void folder_write_list(void)
        for (slist = folder_unloaded_list; slist != NULL; slist = g_slist_next(slist)) {
                GNode *node = (GNode *) slist->data;
 
-               g_node_append(rootnode, xml_tree_copy(node));
+               g_node_append(rootnode, (gpointer) xml_copy_tree(node));
        }
 
        xml_write_tree(rootnode, pfile->fp);
index 479e374f3b9919d4403231aab41b7e372ede9662..c78cdef412d32f3148b4827063e1f91f3b526f91 100644 (file)
@@ -369,7 +369,7 @@ static void save_all_caches(FolderItem *item, gpointer data)
 static void exit_sylpheed(MainWindow *mainwin)
 {
        gchar *filename;
-       GList *list;
+       GList *list, *cur;
 
        debug_print("shutting down\n");
 
@@ -390,11 +390,6 @@ static void exit_sylpheed(MainWindow *mainwin)
        /* save all state before exiting */
        folder_write_list();
        folder_func_to_all_folders(save_all_caches, NULL);
-       for (list = folder_get_list(); list != NULL; list = g_list_next(list)) {
-               Folder *folder = FOLDER(list->data);
-
-               folder_tree_destroy(folder);
-       }
 
        main_window_get_size(mainwin);
        main_window_get_position(mainwin);