2 * Copyright (C) 2009 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/content.h>
21 #include <atompub/content-xml.h>
24 #include <libxml/tree.h>
33 xmlNodePtr xmlcontent;
37 atom_content_new (char *type, char *buffer, size_t len)
40 content = g_slice_new0 (AtomContent);
41 content->type = g_strdup (type);
42 content->content = g_malloc (len);
43 memcpy (content->content, buffer, len);
44 content->content_len = len;
49 atom_content_new_src (char *type, char *src)
52 content = g_slice_new0 (AtomContent);
53 content->type = g_strdup (type);
54 content->src = g_strdup (src);
59 atom_content_new_from_xmlnode (xmlNodePtr root)
63 if (xmlStrcmp (root->name, "content"))
67 content = g_slice_new0 (AtomContent);
68 if ((content->type = xmlGetProp (root, "type")) == NULL)
70 g_slice_free (AtomContent, content);
73 content->src = xmlGetProp (root, "src");
74 if (content->src == NULL)
76 /* libxml2 does not help a lot here. We must decide between a
77 XML child or a content child. Using the type attribute might
78 be a good idead. Let's just ask that the current method
80 child = root->children;
81 while (child && child->type != XML_ELEMENT_NODE)
85 content->xmlcontent = xmlCopyNodeList (root->children);
89 content->content = xmlNodeGetContent (root);
90 content->content_len = xmlStrlen (content->content);
97 atom_content_new_data_len (char * buffer, size_t len)
102 doc = xmlReadMemory (buffer, len, NULL, NULL,
103 XML_PARSE_RECOVER | XML_PARSE_NOERROR);
104 if (doc == NULL || (root = xmlDocGetRootElement (doc)) == NULL)
106 content = atom_content_new_from_xmlnode (root);
112 atom_content_delete (AtomContent *content)
115 g_free (content->type);
117 g_free (content->src);
118 if (content->content)
119 g_free (content->content);
120 if (content->xmlcontent)
121 xmlFreeNode (content->xmlcontent);
122 g_slice_free (AtomContent, content);
126 atom_content_type (AtomContent *content)
128 return content->type;
132 atom_content_type_set (AtomContent *content, char *type)
135 g_free (content->type);
136 content->type = g_strdup (type);
140 atom_content_src (AtomContent *content)
146 atom_content_src_set (AtomContent *content, char *src)
149 g_free (content->src);
150 if (content->content)
152 g_free (content->content);
153 content->content = NULL;
155 if (content->xmlcontent)
157 xmlFreeNode (content->xmlcontent);
158 content->xmlcontent = NULL;
160 content->src = g_strdup (src);
164 atom_content_content (AtomContent *content, char **buffer, size_t *len)
166 if (content->content == NULL)
177 *buffer = g_malloc (content->content_len);
178 memcpy (*buffer, content->content, content->content_len);
181 *len = content->content_len;
186 atom_content_content_set (AtomContent *content, char *buffer, size_t len)
188 if (content->content)
189 g_free (content->content);
192 g_free (content->src);
195 if (content->xmlcontent)
197 xmlFreeNode (content->xmlcontent);
198 content->xmlcontent = NULL;
200 content->content = g_malloc (len);
201 memcpy (content->content, buffer, len);
202 content->content_len = len;
206 atom_content_string (AtomContent *content, char **buffer, size_t *len)
210 node = atom_content_to_xmlnode (content);
219 doc = xmlNewDoc ("1.0");
220 xmlDocSetRootElement (doc, node);
221 xmlDocDumpMemory (doc, buffer, len);
226 atom_content_new_xmlnode (char *type, xmlNodePtr node)
228 AtomContent *content;
229 content = g_slice_new0 (AtomContent);
230 content->type = g_strdup (type);
231 content->xmlcontent = xmlCopyNodeList (node);
236 atom_content_to_xmlnode (AtomContent *content)
239 node = xmlNewNode (NULL, "content");
240 xmlNewProp (node, "type", content->type);
243 xmlNewProp (node, "src", content->src);
246 else if (content->content)
248 xmlNodeSetContentLen (node, content->content, content->content_len);
251 else if (content->xmlcontent)
253 xmlAddChild (node, xmlCopyNodeList (content->xmlcontent));
260 atom_content_xmlcontent (AtomContent *content)
262 return content->xmlcontent;
266 atom_content_xmlcontent_set (AtomContent *content, xmlNodePtr node)
268 if (content->xmlcontent)
269 xmlFreeNode (content->xmlcontent);
270 if (content->content)
272 g_free (content->content);
273 content->content = NULL;
277 g_free (content->src);
280 content->xmlcontent = xmlCopyNodeList (node);