From: Thadeu Lima de Souza Cascardo Date: Sun, 12 Oct 2008 02:34:37 +0000 (-0300) Subject: Allow more than one author, as required by specification X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fatompub.git;a=commitdiff_plain;h=ee2d7dfb4a703544abbe9d0769f064aa1deaa383 Allow more than one author, as required by specification The Atom RFC allows more than one author, which we didn't. Now, an entry have an array of authors, which can be added to or retrieved. The header also had the wrong function names. --- diff --git a/atom/entry.c b/atom/entry.c index 069207b..7faccd3 100644 --- a/atom/entry.c +++ b/atom/entry.c @@ -28,10 +28,13 @@ 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) { @@ -40,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; } @@ -77,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); } @@ -93,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); @@ -128,18 +132,33 @@ atom_entry_title_set (AtomEntry *entry, char *title) entry->title = g_strdup (entry); } -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->authors == NULL) + { + entry->authors = g_ptr_array_new (); + } + g_ptr_array_add (entry->authors, author); +} + +static void +atom_entry_authors_delete (AtomEntry *entry) { - if (entry->author) - atom_person_delete (entry->author); - entry->author = author; + 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 * diff --git a/include/atompub/entry.h b/include/atompub/entry.h index e531e96..70557ef 100644 --- a/include/atompub/entry.h +++ b/include/atompub/entry.h @@ -32,8 +32,8 @@ char * atom_entry_id (AtomEntry *); void atom_entry_id_set (AtomEntry *, char *); char * atom_entry_title (AtomEntry *); void atom_entry_title_set (AtomEntry *, char *); -AtomPerson * atom_entry_person (AtomEntry *); -void atom_entry_person_set (AtomEntry *, AtomPerson *); +void atom_entry_authors (AtomEntry *, AtomPerson ***, size_t *); +void atom_entry_author_add (AtomEntry *, AtomPerson *); char * atom_entry_summary (AtomEntry *); void atom_entry_summary_set (AtomEntry *, char *); void atom_entry_string (AtomEntry *, char **, size_t *);