X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=atom%2Fentry.c;h=fac28f27f75725ed340e1081448006f2b031863c;hb=7fa16fb4f5b5ad842368a0b7e1f20e7971fbf7c7;hp=d9d1f2a9a05529a80a6a2309c10ca23154773096;hpb=60dc710828934c2af906dd5e6c0b2d5e19279f15;p=cascardo%2Fatompub.git diff --git a/atom/entry.c b/atom/entry.c index d9d1f2a..fac28f2 100644 --- a/atom/entry.c +++ b/atom/entry.c @@ -23,17 +23,18 @@ #include #include -#define ATOM_NAMESPACE "http://www.w3.org/2005/Atom" - struct _atom_entry { xmlDocPtr doc; char *id; char *title; - AtomPerson *author; + GPtrArray *authors; char *summary; }; +void atom_entry_author_add (AtomEntry *, AtomPerson *); +static void atom_entry_authors_delete (AtomEntry *); + AtomEntry * atom_entry_new (char *title, AtomPerson *author) { @@ -42,7 +43,8 @@ atom_entry_new (char *title, AtomPerson *author) entry->doc = NULL; entry->id = NULL; entry->title = g_strdup (title); - entry->author = author; + entry->authors = NULL; + atom_entry_author_add (entry, author); entry->summary = NULL; return entry; } @@ -54,8 +56,14 @@ atom_entry_new_data_len (char *data, size_t len) xmlNodePtr root; xmlNodePtr child; entry = g_slice_new0 (AtomEntry); - entry->doc = xmlReadMemory (data, len, NULL, NULL, XML_PARSE_RECOVER); - root = xmlDocGetRootElement (entry->doc); + entry->doc = xmlReadMemory (data, len, NULL, NULL, + XML_PARSE_RECOVER | XML_PARSE_NOERROR); + if (entry->doc == NULL || + (root = xmlDocGetRootElement (entry->doc)) == NULL) + { + g_slice_free (AtomEntry, entry); + return NULL; + } if (xmlStrcmp (root->name, "entry")) { xmlFreeDoc (entry->doc); @@ -73,7 +81,7 @@ atom_entry_new_data_len (char *data, size_t len) else if (!xmlStrcmp (child->name, "summary")) entry->summary = content; else if (!xmlStrcmp (child->name, "author")) - entry->author = atom_person_new_from_xmlnode (child); + atom_entry_author_add (entry, atom_person_new_from_xmlnode (child)); else xmlFree (content); } @@ -89,8 +97,8 @@ atom_entry_delete (AtomEntry *entry) g_free (entry->id); if (entry->title) g_free (entry->title); - if (entry->author) - atom_person_delete (entry->author); + if (entry->authors) + atom_entry_authors_delete (entry); if (entry->summary) g_free (entry->summary); g_slice_free (AtomEntry, entry); @@ -121,21 +129,36 @@ atom_entry_title_set (AtomEntry *entry, char *title) { if (entry->title) g_free (title); - entry->title = g_strdup (entry); + entry->title = g_strdup (title); } -AtomPerson * -atom_entry_author (AtomEntry *entry) +void +atom_entry_authors (AtomEntry *entry, AtomPerson *** authors, size_t *len) { - return entry->author; + if (len) + *len = entry->authors->len; + if (authors) + *authors = entry->authors->pdata; } void -atom_entry_author_set (AtomEntry *entry, AtomPerson *author) +atom_entry_author_add (AtomEntry *entry, AtomPerson *author) { - if (entry->author) - atom_person_delete (entry->author); - entry->author = author; + if (entry->authors == NULL) + { + entry->authors = g_ptr_array_new (); + } + g_ptr_array_add (entry->authors, author); +} + +static void +atom_entry_authors_delete (AtomEntry *entry) +{ + size_t len = entry->authors->len; + int i; + for (i = 0; i < len; i++) + atom_person_delete (g_ptr_array_index (entry->authors, i)); + g_ptr_array_free (entry->authors, TRUE); } char * @@ -152,21 +175,16 @@ atom_entry_summary_set (AtomEntry *entry, char *summary) entry->summary = g_strdup (summary); } -char * -atom_entry_string (AtomEntry *entry) +void +atom_entry_string (AtomEntry *entry, char **buffer, size_t *len) { - char *buffer; - int size; - xmlDocDumpMemory (entry->doc, &buffer, &size); - return buffer; + xmlDocDumpMemory (entry->doc, buffer, len); } -size_t -atom_entry_len (AtomEntry *entry) +xmlNodePtr +atom_entry_to_xmlnode (AtomEntry *entry) { - char *buffer; - int size; - xmlDocDumpMemory (entry->doc, &buffer, &size); - xmlFree (buffer); - return size; + if (entry->doc) + return xmlCopyNodeList (xmlDocGetRootElement (entry->doc)); + return NULL; }