138 } |
138 } |
139 |
139 |
140 void dav_print_node(void *stream, write_func writef, UcxMap *nsmap, DavXmlNode *node) { |
140 void dav_print_node(void *stream, write_func writef, UcxMap *nsmap, DavXmlNode *node) { |
141 while(node) { |
141 while(node) { |
142 if(node->type == DAV_XML_ELEMENT) { |
142 if(node->type == DAV_XML_ELEMENT) { |
143 char *prefix = ucx_map_cstr_get(nsmap, node->namespace); |
|
144 char *tagend = node->children ? ">" : " />"; |
143 char *tagend = node->children ? ">" : " />"; |
145 if(!prefix) { |
144 char *prefix = NULL; |
146 sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count); |
145 if(node->namespace) { |
147 ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr); |
146 prefix = ucx_map_cstr_get(nsmap, node->namespace); |
148 prefix = newpre.ptr; |
147 if(!prefix) { |
149 ucx_fprintf( |
148 sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count); |
150 stream, |
149 ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr); |
151 writef, |
150 prefix = newpre.ptr; |
152 "<%s:%s xmlns:%s=\"%s\"%s", |
151 ucx_fprintf( |
153 prefix, |
152 stream, |
154 node->name, |
153 writef, |
155 prefix, |
154 "<%s:%s xmlns:%s=\"%s\"%s", |
156 node->namespace, |
155 prefix, |
157 tagend); |
156 node->name, |
|
157 prefix, |
|
158 node->namespace, |
|
159 tagend); |
|
160 } else { |
|
161 ucx_fprintf(stream, writef, "<%s:%s%s", prefix, node->name, tagend); |
|
162 } |
158 } else { |
163 } else { |
159 ucx_fprintf(stream, writef, "<%s:%s%s", prefix, node->name, tagend); |
164 ucx_fprintf(stream, writef, "<%s%s", node->name, tagend); |
160 } |
165 } |
161 |
166 |
162 if(node->children) { |
167 if(node->children) { |
163 dav_print_node(stream, writef, nsmap, node->children); |
168 dav_print_node(stream, writef, nsmap, node->children); |
164 ucx_fprintf(stream, writef, "</%s:%s>", prefix, node->name); |
169 if(prefix) { |
|
170 ucx_fprintf(stream, writef, "</%s:%s>", prefix, node->name); |
|
171 } else { |
|
172 ucx_fprintf(stream, writef, "</%s>", node->name); |
|
173 } |
165 } |
174 } |
166 } else if(node->type == DAV_XML_TEXT) { |
175 } else if(node->type == DAV_XML_TEXT) { |
167 writef(node->content, 1, node->contentlength, stream); |
176 writef(node->content, 1, node->contentlength, stream); |
168 } |
177 } |
169 |
178 |
273 child->prev = last_child; |
282 child->prev = last_child; |
274 } else { |
283 } else { |
275 node->children = child; |
284 node->children = child; |
276 } |
285 } |
277 } |
286 } |
|
287 |
|
288 DavXmlNode* dav_parse_xml(DavSession *sn, const char *str, size_t len) { |
|
289 xmlDoc *doc = xmlReadMemory(str, len, NULL, NULL, 0); |
|
290 if(!doc) { |
|
291 return NULL; |
|
292 } |
|
293 xmlNode *xml_root = xmlDocGetRootElement(doc); |
|
294 if(!xml_root) { |
|
295 xmlFreeDoc(doc); |
|
296 return NULL; |
|
297 } |
|
298 DavXmlNode *x = dav_convert_xml(sn, xml_root); |
|
299 xmlFreeDoc(doc); |
|
300 return x; |
|
301 } |