diff options
| author | 2008-12-12 22:05:44 +0100 | |
|---|---|---|
| committer | 2008-12-12 22:05:44 +0100 | |
| commit | 9ca887308d59e6cb5bf684f9f3bd968118e8014f (patch) | |
| tree | 14dd1cffa8e082ea71fcc8e7fdf878655cd98a3e /src/xplist.c | |
| parent | 31379321cec6bf6c6d670e0738d1b1e23dc92ac1 (diff) | |
| download | libimobiledevice-9ca887308d59e6cb5bf684f9f3bd968118e8014f.tar.gz libimobiledevice-9ca887308d59e6cb5bf684f9f3bd968118e8014f.tar.bz2 | |
Fix some bugs in binary plist generation.
Diffstat (limited to 'src/xplist.c')
| -rw-r--r-- | src/xplist.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/xplist.c b/src/xplist.c index a87b259..3e975f6 100644 --- a/src/xplist.c +++ b/src/xplist.c | |||
| @@ -89,7 +89,7 @@ struct xml_node { | |||
| 89 | * | 89 | * |
| 90 | * @return The plist XML document. | 90 | * @return The plist XML document. |
| 91 | */ | 91 | */ |
| 92 | xmlDocPtr new_plist() | 92 | xmlDocPtr new_xml_plist() |
| 93 | { | 93 | { |
| 94 | char *plist = strdup(plist_base); | 94 | char *plist = strdup(plist_base); |
| 95 | xmlDocPtr plist_xml = xmlReadMemory(plist, strlen(plist), NULL, NULL, 0); | 95 | xmlDocPtr plist_xml = xmlReadMemory(plist, strlen(plist), NULL, NULL, 0); |
| @@ -207,7 +207,7 @@ void node_to_xml(GNode * node, gpointer xml_struct) | |||
| 207 | return; | 207 | return; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | void xml_to_node(xmlNodePtr xml_node, GNode * plist_node) | 210 | void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node) |
| 211 | { | 211 | { |
| 212 | xmlNodePtr node = NULL; | 212 | xmlNodePtr node = NULL; |
| 213 | 213 | ||
| @@ -220,7 +220,10 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node) | |||
| 220 | 220 | ||
| 221 | struct plist_data *data = (struct plist_data *) calloc(sizeof(struct plist_data), 1); | 221 | struct plist_data *data = (struct plist_data *) calloc(sizeof(struct plist_data), 1); |
| 222 | GNode *subnode = g_node_new(data); | 222 | GNode *subnode = g_node_new(data); |
| 223 | g_node_append(plist_node, subnode); | 223 | if (*plist_node) |
| 224 | g_node_append(*plist_node, subnode); | ||
| 225 | else | ||
| 226 | *plist_node = subnode; | ||
| 224 | 227 | ||
| 225 | if (!xmlStrcmp(node->name, "true")) { | 228 | if (!xmlStrcmp(node->name, "true")) { |
| 226 | data->boolval = 1; | 229 | data->boolval = 1; |
| @@ -236,7 +239,7 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node) | |||
| 236 | 239 | ||
| 237 | if (!xmlStrcmp(node->name, "integer")) { | 240 | if (!xmlStrcmp(node->name, "integer")) { |
| 238 | char *strval = xmlNodeGetContent(node); | 241 | char *strval = xmlNodeGetContent(node); |
| 239 | data->intval = atoi(strval); | 242 | data->intval = g_ascii_strtoull(strval, NULL, 0); |
| 240 | data->type = PLIST_UINT; | 243 | data->type = PLIST_UINT; |
| 241 | continue; | 244 | continue; |
| 242 | } | 245 | } |
| @@ -271,13 +274,13 @@ void xml_to_node(xmlNodePtr xml_node, GNode * plist_node) | |||
| 271 | 274 | ||
| 272 | if (!xmlStrcmp(node->name, "array")) { | 275 | if (!xmlStrcmp(node->name, "array")) { |
| 273 | data->type = PLIST_ARRAY; | 276 | data->type = PLIST_ARRAY; |
| 274 | xml_to_node(node, subnode); | 277 | xml_to_node(node, &subnode); |
| 275 | continue; | 278 | continue; |
| 276 | } | 279 | } |
| 277 | 280 | ||
| 278 | if (!xmlStrcmp(node->name, "dict")) { | 281 | if (!xmlStrcmp(node->name, "dict")) { |
| 279 | data->type = PLIST_DICT; | 282 | data->type = PLIST_DICT; |
| 280 | xml_to_node(node, subnode); | 283 | xml_to_node(node, &subnode); |
| 281 | continue; | 284 | continue; |
| 282 | } | 285 | } |
| 283 | } | 286 | } |
| @@ -287,10 +290,12 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length) | |||
| 287 | { | 290 | { |
| 288 | if (!plist || !plist_xml || *plist_xml) | 291 | if (!plist || !plist_xml || *plist_xml) |
| 289 | return; | 292 | return; |
| 290 | xmlDocPtr plist_doc = new_plist(); | 293 | xmlDocPtr plist_doc = new_xml_plist(); |
| 291 | xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); | 294 | xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); |
| 292 | struct xml_node root = { root_node, 0 }; | 295 | struct xml_node root = { root_node, 0 }; |
| 293 | g_node_children_foreach(plist, G_TRAVERSE_ALL, node_to_xml, &root); | 296 | |
| 297 | node_to_xml(plist, &root); | ||
| 298 | |||
| 294 | xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, length); | 299 | xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, length); |
| 295 | } | 300 | } |
| 296 | 301 | ||
| @@ -299,8 +304,5 @@ void xml_to_plist(const char *plist_xml, uint32_t length, plist_t * plist) | |||
| 299 | xmlDocPtr plist_doc = xmlReadMemory(plist_xml, length, NULL, NULL, 0); | 304 | xmlDocPtr plist_doc = xmlReadMemory(plist_xml, length, NULL, NULL, 0); |
| 300 | xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); | 305 | xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); |
| 301 | 306 | ||
| 302 | struct plist_data *data = (struct plist_data *) calloc(sizeof(struct plist_data), 1); | 307 | xml_to_node(root_node, plist); |
| 303 | *plist = g_node_new(data); | ||
| 304 | data->type = PLIST_DICT; | ||
| 305 | xml_to_node(root_node, *plist); | ||
| 306 | } | 308 | } |
