Update entry xml node before using it
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 12 Oct 2008 16:33:57 +0000 (13:33 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 12 Oct 2008 16:33:57 +0000 (13:33 -0300)
atom/entry.c

index fac28f2..99ab439 100644 (file)
@@ -175,16 +175,65 @@ atom_entry_summary_set (AtomEntry *entry, char *summary)
   entry->summary = g_strdup (summary);
 }
 
+static void
+atom_entry_update_xmlnode (AtomEntry *entry)
+{
+  xmlNodePtr root;
+  xmlNodePtr id;
+  xmlNodePtr title;
+  xmlNodePtr summary;
+  xmlNodePtr author;
+  int i;
+  if (entry->doc == NULL)
+    {
+      entry->doc = xmlNewDoc ("1.0");
+      root = xmlNewNode (NULL, "entry");
+      xmlNewNs (root, ATOM_NAMESPACE, NULL);
+      xmlDocSetRootElement (entry->doc, root);
+    }
+  else
+    {
+      xmlNodePtr child;
+      xmlNodePtr next;
+      root = xmlDocGetRootElement (entry->doc);
+      child = root->xmlChildrenNode;
+      while (child != NULL)
+        {
+          next = child->next;
+          if (!xmlStrcmp (child->name, "id") ||
+              !xmlStrcmp (child->name, "title") ||
+              !xmlStrcmp (child->name, "summary") ||
+              !xmlStrcmp (child->name, "author"))
+            {
+              xmlUnlinkNode (child);
+              xmlFreeNode (child);
+            }
+          child = next;
+        }
+    }
+  id = xmlNewTextChild (root, NULL, "id", entry->id);
+  title = xmlNewTextChild (root, NULL, "title", entry->title);
+  if (entry->summary)
+    summary = xmlNewTextChild (root, NULL, "summary", entry->summary);
+  for (i = 0; i < entry->authors->len; i++)
+    {
+      AtomPerson *person;
+      person = g_ptr_array_index (entry->authors, i);
+      author = atom_person_to_xmlnode (person, "author");
+      xmlAddChild (root, author);
+    }
+}
+
 void
 atom_entry_string (AtomEntry *entry, char **buffer, size_t *len)
 {
+  atom_entry_update_xmlnode (entry);
   xmlDocDumpMemory (entry->doc, buffer, len);
 }
 
 xmlNodePtr
 atom_entry_to_xmlnode (AtomEntry *entry)
 {
-  if (entry->doc)
-    return xmlCopyNodeList (xmlDocGetRootElement (entry->doc));
-  return NULL;
+  atom_entry_update_xmlnode (entry);
+  return xmlCopyNodeList (xmlDocGetRootElement (entry->doc));
 }