1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <cx/printf.h>
33 #include <cx/hash_map.h>
34 #include <cx/buffer.h>
35
36 #include <libidav/xml.h>
37
38 #include "xml.h"
39
40
41
42
43 void property_xml2str(DavXmlNode *content,
const char *namespace, cxmutstr *out_xmlstr, cxmutstr *out_nsdef) {
44 CxBuffer buf;
45 cxBufferInit(&buf,
NULL,
2048, cxDefaultAllocator,
CX_BUFFER_AUTO_EXTEND);
46
47 CxMap *nsmap = cxHashMapCreate(cxDefaultAllocator,
CX_STORE_POINTERS,
16);
48 cxMapPut(nsmap, namespace, strdup(
"x0"));
49
50 dav_print_node(&buf, (cx_write_func)cxBufferWrite, nsmap, content);
51
52 cxmutstr ret = cx_mutstrn(buf.space, buf.size);
53 cxBufferPut(&buf,
0);
54
55
56 CxBuffer nsbuf;
57 cxBufferInit(&nsbuf,
NULL,
2048, cxDefaultAllocator,
CX_BUFFER_AUTO_EXTEND);
58 CxIterator i = cxMapIterator(nsmap);
59 int addSpace =
0;
60 cx_foreach(CxMapEntry *, entry, i) {
61 const char *ns = entry->key->data;
62 const char *pre = entry->value;
63 if(addSpace) {
64 cxBufferPut(&nsbuf,
' ');
65 }
else {
66 addSpace =
1;
67 }
68 cx_bprintf(&nsbuf,
"xmlns:%s=\"%s\"", pre, ns);
69 }
70 cxmutstr nsdef = cx_mutstrn(nsbuf.space, nsbuf.size);
71 cxBufferPut(&nsbuf,
0);
72
73
74 cxMapDestroy(nsmap);
75
76
77 *out_xmlstr = ret;
78 *out_nsdef = nsdef;
79 }
80