2 * Copyright (C) 2008 Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include <atompub/atom.h>
23 #include <libxml/tree.h>
24 #include <libxml/parser.h>
34 GPtrArray *categories;
39 static void atom_entry_updated_set_from_iso8601 (AtomEntry *, char *);
41 void atom_entry_author_add (AtomEntry *, AtomPerson *);
42 static void atom_entry_authors_delete (AtomEntry *);
44 void atom_entry_category_add (AtomEntry *, AtomCategory *);
45 static void atom_entry_categories_delete (AtomEntry *);
48 atom_entry_new (char *id, char *title, AtomPerson *author)
51 entry = g_slice_new (AtomEntry);
53 entry->id = atom_id_new (id);
54 entry->title = g_strdup (title);
55 entry->updated = time (0);
56 entry->authors = NULL;
57 entry->categories = NULL;
58 atom_entry_author_add (entry, author);
59 entry->summary = NULL;
60 entry->content = NULL;
65 atom_entry_new_data_len (char *data, size_t len)
70 entry = g_slice_new0 (AtomEntry);
71 entry->doc = xmlReadMemory (data, len, NULL, NULL,
72 XML_PARSE_RECOVER | XML_PARSE_NOERROR);
73 if (entry->doc == NULL ||
74 (root = xmlDocGetRootElement (entry->doc)) == NULL)
76 g_slice_free (AtomEntry, entry);
79 if (xmlStrcmp (root->name, "entry"))
81 xmlFreeDoc (entry->doc);
82 g_slice_free (AtomEntry, entry);
85 for (child = root->xmlChildrenNode; child != NULL; child = child->next)
88 content = xmlNodeGetContent (child->xmlChildrenNode);
89 if (!xmlStrcmp (child->name, "id"))
90 entry->id = atom_id_new (content);
91 else if (!xmlStrcmp (child->name, "title"))
92 entry->title = g_strdup (content);
93 else if (!xmlStrcmp (child->name, "updated"))
94 atom_entry_updated_set_from_iso8601 (entry, content);
95 else if (!xmlStrcmp (child->name, "summary"))
96 entry->summary = g_strdup (content);
97 else if (!xmlStrcmp (child->name, "author"))
98 atom_entry_author_add (entry, atom_person_new_from_xmlnode (child));
99 else if (!xmlStrcmp (child->name, "category"))
100 atom_entry_category_add (entry, atom_category_new_from_xmlnode (child));
101 else if (!xmlStrcmp (child->name, "content"))
102 entry->content = atom_content_new_from_xmlnode (child);
106 if (entry->id == NULL || entry->title == NULL ||
107 entry->updated == 0 || entry->authors == NULL)
109 atom_entry_delete (entry);
116 atom_entry_delete (AtomEntry *entry)
119 xmlFreeDoc (entry->doc);
121 atom_id_delete (entry->id);
123 g_free (entry->title);
125 atom_entry_authors_delete (entry);
126 if (entry->categories)
127 atom_entry_categories_delete (entry);
129 g_free (entry->summary);
130 g_slice_free (AtomEntry, entry);
134 atom_entry_id (AtomEntry *entry)
140 atom_entry_id_set (AtomEntry *entry, AtomID *id)
145 atom_id_delete (entry->id);
150 atom_entry_title (AtomEntry *entry)
156 atom_entry_title_set (AtomEntry *entry, char *title)
162 entry->title = g_strdup (title);
166 atom_entry_updated (AtomEntry *entry)
168 return entry->updated;
172 atom_entry_updated_set (AtomEntry *entry, time_t updated)
174 entry->updated = updated;
178 atom_entry_updated_set_from_iso8601 (AtomEntry *entry, char *updated)
181 g_time_val_from_iso8601 (updated, >v);
182 entry->updated = gtv.tv_sec;
186 atom_entry_updated_to_iso8601 (AtomEntry *entry)
189 gtv.tv_sec = entry->updated;
191 return g_time_val_to_iso8601 (>v);
195 atom_entry_authors (AtomEntry *entry, AtomPerson *** authors, size_t *len)
198 *len = entry->authors->len;
200 *authors = entry->authors->pdata;
204 atom_entry_author_add (AtomEntry *entry, AtomPerson *author)
206 if (entry->authors == NULL)
208 entry->authors = g_ptr_array_new ();
210 g_ptr_array_add (entry->authors, author);
214 atom_entry_authors_delete (AtomEntry *entry)
216 size_t len = entry->authors->len;
218 for (i = 0; i < len; i++)
219 atom_person_delete (g_ptr_array_index (entry->authors, i));
220 g_ptr_array_free (entry->authors, TRUE);
224 atom_entry_categories (AtomEntry *entry, AtomCategory *** categories,
228 *len = entry->categories->len;
230 *categories = entry->categories->pdata;
234 atom_entry_category_add (AtomEntry *entry, AtomCategory *category)
236 g_ptr_array_add (entry->categories, category);
237 if (entry->categories == NULL)
239 entry->categories = g_ptr_array_new ();
241 g_ptr_array_add (entry->categories, category);
245 atom_entry_categories_delete (AtomEntry *entry)
247 size_t len = entry->categories->len;
249 for (i = 0; i < len; i++)
250 atom_category_delete (g_ptr_array_index (entry->categories, i));
251 g_ptr_array_free (entry->categories, TRUE);
255 atom_entry_summary (AtomEntry *entry)
257 return entry->summary;
261 atom_entry_summary_set (AtomEntry *entry, char *summary)
264 g_free (entry->summary);
265 entry->summary = g_strdup (summary);
269 atom_entry_content (AtomEntry *entry)
271 return entry->content;
275 atom_entry_content_set (AtomEntry *entry, AtomContent *content)
278 atom_content_delete (entry->content);
279 entry->content = content;
283 atom_entry_update_xmlnode (AtomEntry *entry)
294 if (entry->doc == NULL)
296 entry->doc = xmlNewDoc ("1.0");
297 root = xmlNewNode (NULL, "entry");
298 xmlNewNs (root, ATOM_NAMESPACE, NULL);
299 xmlDocSetRootElement (entry->doc, root);
305 root = xmlDocGetRootElement (entry->doc);
306 child = root->xmlChildrenNode;
307 while (child != NULL)
310 if (!xmlStrcmp (child->name, "id") ||
311 !xmlStrcmp (child->name, "title") ||
312 !xmlStrcmp (child->name, "updated") ||
313 !xmlStrcmp (child->name, "summary") ||
314 !xmlStrcmp (child->name, "author") ||
315 !xmlStrcmp (child->name, "category") ||
316 !xmlStrcmp (child->name, "content"))
318 xmlUnlinkNode (child);
324 id = xmlNewTextChild (root, NULL, "id", atom_id_string (entry->id));
325 title = xmlNewTextChild (root, NULL, "title", entry->title);
326 updatedstr = atom_entry_updated_to_iso8601 (entry);
327 updated = xmlNewTextChild (root, NULL, "updated", updatedstr);
330 summary = xmlNewTextChild (root, NULL, "summary", entry->summary);
331 for (i = 0; i < entry->authors->len; i++)
334 person = g_ptr_array_index (entry->authors, i);
335 author = atom_person_to_xmlnode (person, "author");
336 xmlAddChild (root, author);
338 for (i = 0; entry->categories && i < entry->categories->len; i++)
340 AtomCategory *category;
341 category = g_ptr_array_index (entry->categories, i);
342 cat = atom_category_to_xmlnode (category, "category");
343 xmlAddChild (root, cat);
346 xmlAddChild (root, atom_content_to_xmlnode (entry->content));
350 atom_entry_string (AtomEntry *entry, char **buffer, size_t *len)
352 atom_entry_update_xmlnode (entry);
353 xmlDocDumpMemory (entry->doc, buffer, len);
357 atom_entry_to_xmlnode (AtomEntry *entry)
359 atom_entry_update_xmlnode (entry);
360 return xmlCopyNodeList (xmlDocGetRootElement (entry->doc));