X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=atom%2Fentry.c;h=eefb3ed537268bca1d2303e58eddcbede93c343d;hb=2392a801e9b0375d6628911270bf764b1300d880;hp=0a6d932c45d7764bc03528222afe67a3b5ffaf90;hpb=dbd671fee3ebb38850bd0e09f9eb25bbc2c76ea1;p=cascardo%2Fatompub.git diff --git a/atom/entry.c b/atom/entry.c index 0a6d932..eefb3ed 100644 --- a/atom/entry.c +++ b/atom/entry.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 Thadeu Lima de Souza Cascardo + * Copyright (C) 2008 Thadeu Lima de Souza Cascardo * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,38 +20,151 @@ #include #include +#include +#include struct _atom_entry { - char *data; - size_t len; + xmlDocPtr doc; + char *id; + char *title; + AtomPerson *author; + char *summary; }; -Atom * -atom_new_data_len (char *data, size_t len) +AtomEntry * +atom_entry_new (char *title, AtomPerson *author) { - Atom *atom = g_slice_new (Atom); - atom->data = g_memdup (data, len); - atom->len = len; - return atom; + AtomEntry *entry; + entry = g_slice_new (AtomEntry); + entry->doc = NULL; + entry->id = NULL; + entry->title = g_strdup (title); + entry->author = author; + entry->summary = NULL; + return entry; +} + +AtomEntry * +atom_entry_new_data_len (char *data, size_t len) +{ + AtomEntry *entry; + 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; +} + +void +atom_entry_delete (AtomEntry *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_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) +{ + return entry->title; +} + +void +atom_entry_title_set (AtomEntry *entry, char *title) +{ + if (entry->title) + g_free (title); + entry->title = g_strdup (entry); +} + +AtomPerson * +atom_entry_author (AtomEntry *entry) +{ + return entry->author; } void -atom_delete (Atom *atom) +atom_entry_author_set (AtomEntry *entry, AtomPerson *author) { - if (atom->data) - g_free (atom->data); - g_slice_free (Atom, atom); + if (entry->author) + atom_person_delete (entry->author); + entry->author = author; } char * -atom_string (Atom *atom) +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) { - return atom->data; + xmlDocDumpMemory (entry->doc, buffer, len); } -size_t -atom_len (Atom *atom) +xmlNodePtr +atom_entry_to_xmlnode (AtomEntry *entry) { - return atom->len; + if (entry->doc) + return xmlDocGetRootElement (entry->doc); + return NULL; }