22 #include "opensync_internals.h"
24 xmlNode *osxml_node_add_root(xmlDoc *doc,
const char *name)
26 doc->children = xmlNewDocNode(doc, NULL, (xmlChar*)name, NULL);
30 xmlNode *osxml_node_get_root(xmlDoc *doc,
const char *name,
OSyncError **error)
32 xmlNode *cur = xmlDocGetRootElement(doc);
34 osync_error_set(error, OSYNC_ERROR_GENERIC,
"Unable to get xml root element");
38 if (xmlStrcmp((cur)->name, (
const xmlChar *) name)) {
43 cur = (cur)->xmlChildrenNode;
47 void osxml_node_set(xmlNode *node,
const char *name,
const char *data,
OSyncXMLEncoding encoding)
50 xmlNodeSetName(node, (xmlChar*)name);
53 xmlNewTextChild(node, NULL, (xmlChar*)
"Content", (xmlChar*)data);
56 xmlNode *osxml_node_add(xmlNode *parent,
const char *name,
const char *data)
60 if (strlen(data) == 0)
62 xmlNode *node = xmlNewTextChild(parent, NULL, (xmlChar*)name, (xmlChar*)data);
66 void osxml_node_add_property(xmlNode *parent,
const char *name,
const char *data)
68 xmlNewProp(parent, (xmlChar*)name, (xmlChar*)data);
71 void osxml_node_mark_unknown(xmlNode *parent)
73 if (!xmlHasProp(parent, (xmlChar*)
"Type"))
74 xmlNewProp(parent, (xmlChar*)
"Type", (xmlChar*)
"Unknown");
77 void osxml_node_remove_unknown_mark(xmlNode *node)
79 xmlAttr *attr = xmlHasProp(node, (xmlChar*)
"Type");
85 xmlNode *osxml_get_node(xmlNode *parent,
const char *name)
87 xmlNode *cur = (parent)->xmlChildrenNode;
89 if (!xmlStrcmp(cur->name, (
const xmlChar *)name))
96 char *osxml_find_node(xmlNode *parent,
const char *name)
98 return (
char*)xmlNodeGetContent(osxml_get_node(parent, name));
101 xmlXPathObject *osxml_get_nodeset(xmlDoc *doc,
const char *expression)
103 xmlXPathContext *xpathCtx = NULL;
104 xmlXPathObject *xpathObj = NULL;
107 xpathCtx = xmlXPathNewContext(doc);
108 if(xpathCtx == NULL) {
109 fprintf(stderr,
"Error: unable to create new XPath context\n");
114 xpathObj = xmlXPathEvalExpression((xmlChar*)expression, xpathCtx);
115 if(xpathObj == NULL) {
116 fprintf(stderr,
"Error: unable to evaluate xpath expression \"%s\"\n", expression);
117 xmlXPathFreeContext(xpathCtx);
121 xmlXPathFreeContext(xpathCtx);
127 xmlXPathObject *osxml_get_unknown_nodes(xmlDoc *doc)
129 return osxml_get_nodeset(doc,
"/*/*[@Type='Unknown']");
132 void osxml_map_unknown_param(xmlNode *node,
const char *paramname,
const char *newname)
134 xmlNode *cur = node->xmlChildrenNode;
136 if (xmlStrcmp(cur->name, (
const xmlChar *)
"UnknownParam"))
139 char *name = osxml_find_node(cur,
"ParamName");
140 char *content = osxml_find_node(cur,
"Content");
141 if (!strcmp(name, paramname)) {
142 osxml_node_add(node, newname, content);
143 osxml_node_remove_unknown_mark(node);
160 osync_bool osxml_has_property_full(xmlNode *parent,
const char *name,
const char *data)
162 if (osxml_has_property(parent, name))
163 return (strcmp((
char*)xmlGetProp(parent, (xmlChar*)name), data) == 0);
167 char *osxml_find_property(xmlNode *parent,
const char *name)
169 return (
char*)xmlGetProp(parent, (xmlChar*)name);
172 osync_bool osxml_has_property(xmlNode *parent,
const char *name)
174 return (xmlHasProp(parent, (xmlChar*)name) != NULL);
177 xmlChar *osxml_write_to_string(xmlDoc *doc)
179 xmlKeepBlanksDefault(0);
180 xmlChar *temp = NULL;
182 xmlDocDumpFormatMemoryEnc(doc, &temp, &size, NULL, 1);
186 osync_bool osxml_copy(
const char *input,
int inpsize,
char **output,
int *outpsize)
188 xmlDoc *doc = (xmlDoc *)(input);
189 xmlDoc *newdoc = xmlCopyDoc(doc, TRUE);
190 *output = (
char *)newdoc;
191 *outpsize =
sizeof(newdoc);
195 osync_bool osxml_marshall(
const char *input,
int inpsize,
char **output,
int *outpsize,
OSyncError **error)
197 xmlDoc *doc = (xmlDoc*)input;
200 xmlDocDumpMemory(doc, &result, &size);
201 *output = (
char*)result;
206 osync_bool osxml_demarshall(
const char *input,
int inpsize,
char **output,
int *outpsize,
OSyncError **error)
208 xmlDoc *doc = xmlParseMemory(input, inpsize);
210 osync_error_set(error, OSYNC_ERROR_GENERIC,
"Invalid XML data received");
214 *output = (
char*)doc;
215 *outpsize =
sizeof(*doc);