#include <libxml/tree.h>
#include <libxml/parser.h>
-#define ATOM_NAMESPACE "http://www.w3.org/2005/Atom"
-
struct _atom_entry
{
xmlDocPtr doc;
+ char *id;
+ char *title;
+ AtomPerson *author;
+ char *summary;
};
AtomEntry *
-atom_entry_new_with_prefix (char *prefix)
+atom_entry_new (char *title, AtomPerson *author)
{
AtomEntry *entry;
- xmlDocPtr doc;
- xmlNsPtr ns;
- xmlNodePtr node;
- doc = xmlNewDoc ("1.0");
- node = xmlNewNode (ns, "entry");
- xmlNewNs (node, ATOM_NAMESPACE, prefix);
- xmlDocSetRootElement (doc, node);
entry = g_slice_new (AtomEntry);
- entry->doc = doc;
+ entry->doc = NULL;
+ entry->id = NULL;
+ entry->title = g_strdup (title);
+ entry->author = author;
+ entry->summary = NULL;
return entry;
}
-AtomEntry *
-atom_entry_new (void)
-{
- return atom_entry_new_with_prefix (NULL);
-}
-
AtomEntry *
atom_entry_new_data_len (char *data, size_t len)
{
AtomEntry *entry;
- entry = g_slice_new (AtomEntry);
+ xmlNodePtr root;
+ xmlNodePtr child;
+ entry = g_slice_new0 (AtomEntry);
entry->doc = xmlReadMemory (data, len, NULL, NULL, XML_PARSE_RECOVER);
+ if (entry->doc == NULL ||
+ (root = xmlDocGetRootElement (entry->doc)) == NULL)
+ {
+ g_slice_free (AtomEntry, entry);
+ return NULL;
+ }
+ if (xmlStrcmp (root->name, "entry"))
+ {
+ xmlFreeDoc (entry->doc);
+ g_slice_free (AtomEntry, entry);
+ return NULL;
+ }
+ for (child = root->xmlChildrenNode; child != NULL; child = child->next)
+ {
+ char * content;
+ content = xmlNodeGetContent (child->xmlChildrenNode);
+ if (!xmlStrcmp (child->name, "id"))
+ entry->id = content;
+ else if (!xmlStrcmp (child->name, "title"))
+ entry->title = content;
+ else if (!xmlStrcmp (child->name, "summary"))
+ entry->summary = content;
+ else if (!xmlStrcmp (child->name, "author"))
+ entry->author = atom_person_new_from_xmlnode (child);
+ else
+ xmlFree (content);
+ }
return entry;
}
{
if (entry->doc)
xmlFreeDoc (entry->doc);
+ if (entry->id)
+ g_free (entry->id);
+ if (entry->title)
+ g_free (entry->title);
+ if (entry->author)
+ atom_person_delete (entry->author);
+ if (entry->summary)
+ g_free (entry->summary);
g_slice_free (AtomEntry, entry);
}
char *
-atom_entry_string (AtomEntry *entry)
+atom_entry_id (AtomEntry *entry)
+{
+ return entry->id;
+}
+
+void
+atom_entry_id_set (AtomEntry *entry, char *id)
+{
+ if (entry->id)
+ g_free (entry->id);
+ entry->id = g_strdup (id);
+}
+
+char *
+atom_entry_title (AtomEntry *entry)
{
- char *buffer;
- int size;
- xmlDocDumpMemory (entry->doc, &buffer, &size);
- return buffer;
+ return entry->title;
}
-size_t
-atom_entry_len (AtomEntry *entry)
+void
+atom_entry_title_set (AtomEntry *entry, char *title)
{
- char *buffer;
- int size;
- xmlDocDumpMemory (entry->doc, &buffer, &size);
- xmlFree (buffer);
- return size;
+ if (entry->title)
+ g_free (title);
+ entry->title = g_strdup (entry);
+}
+
+AtomPerson *
+atom_entry_author (AtomEntry *entry)
+{
+ return entry->author;
+}
+
+void
+atom_entry_author_set (AtomEntry *entry, AtomPerson *author)
+{
+ if (entry->author)
+ atom_person_delete (entry->author);
+ entry->author = author;
+}
+
+char *
+atom_entry_summary (AtomEntry *entry)
+{
+ return entry->summary;
+}
+
+void
+atom_entry_summary_set (AtomEntry *entry, char *summary)
+{
+ if (entry->summary)
+ g_free (entry->summary);
+ entry->summary = g_strdup (summary);
+}
+
+void
+atom_entry_string (AtomEntry *entry, char **buffer, size_t *len)
+{
+ xmlDocDumpMemory (entry->doc, buffer, len);
+}
+
+xmlNodePtr
+atom_entry_to_xmlnode (AtomEntry *entry)
+{
+ if (entry->doc)
+ return xmlDocGetRootElement (entry->doc);
+ return NULL;
}