diff options
Diffstat (limited to 'src/xplist.c')
| -rw-r--r-- | src/xplist.c | 91 |
1 files changed, 53 insertions, 38 deletions
diff --git a/src/xplist.c b/src/xplist.c index abc448d..3487f96 100644 --- a/src/xplist.c +++ b/src/xplist.c | |||
| @@ -32,6 +32,17 @@ | |||
| 32 | #include <libxml/parser.h> | 32 | #include <libxml/parser.h> |
| 33 | #include <libxml/tree.h> | 33 | #include <libxml/tree.h> |
| 34 | 34 | ||
| 35 | #define XPLIST_TEXT BAD_CAST("text") | ||
| 36 | #define XPLIST_KEY BAD_CAST("key") | ||
| 37 | #define XPLIST_FALSE BAD_CAST("false") | ||
| 38 | #define XPLIST_TRUE BAD_CAST("true") | ||
| 39 | #define XPLIST_INT BAD_CAST("integer") | ||
| 40 | #define XPLIST_REAL BAD_CAST("real") | ||
| 41 | #define XPLIST_DATE BAD_CAST("date") | ||
| 42 | #define XPLIST_DATA BAD_CAST("data") | ||
| 43 | #define XPLIST_STRING BAD_CAST("string") | ||
| 44 | #define XPLIST_ARRAY BAD_CAST("array") | ||
| 45 | #define XPLIST_DICT BAD_CAST("dict") | ||
| 35 | 46 | ||
| 36 | const char *plist_base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\ | 47 | const char *plist_base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\ |
| 37 | <!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\ | 48 | <!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\ |
| @@ -125,56 +136,56 @@ static void node_to_xml(GNode * node, gpointer xml_struct) | |||
| 125 | xmlNodePtr child_node = NULL; | 136 | xmlNodePtr child_node = NULL; |
| 126 | char isStruct = FALSE; | 137 | char isStruct = FALSE; |
| 127 | 138 | ||
| 128 | const gchar *tag = NULL; | 139 | const xmlChar *tag = NULL; |
| 129 | const gchar *val = NULL; | 140 | gchar *val = NULL; |
| 130 | 141 | ||
| 131 | switch (node_data->type) { | 142 | switch (node_data->type) { |
| 132 | case PLIST_BOOLEAN: | 143 | case PLIST_BOOLEAN: |
| 133 | { | 144 | { |
| 134 | if (node_data->boolval) | 145 | if (node_data->boolval) |
| 135 | tag = "true"; | 146 | tag = XPLIST_TRUE; |
| 136 | else | 147 | else |
| 137 | tag = "false"; | 148 | tag = XPLIST_FALSE; |
| 138 | } | 149 | } |
| 139 | break; | 150 | break; |
| 140 | 151 | ||
| 141 | case PLIST_UINT: | 152 | case PLIST_UINT: |
| 142 | tag = "integer"; | 153 | tag = XPLIST_INT; |
| 143 | val = g_strdup_printf("%lu", (long unsigned int) node_data->intval); | 154 | val = g_strdup_printf("%lu", (long unsigned int) node_data->intval); |
| 144 | break; | 155 | break; |
| 145 | 156 | ||
| 146 | case PLIST_REAL: | 157 | case PLIST_REAL: |
| 147 | tag = "real"; | 158 | tag = XPLIST_REAL; |
| 148 | val = g_strdup_printf("%Lf", (long double) node_data->realval); | 159 | val = g_strdup_printf("%Lf", (long double) node_data->realval); |
| 149 | break; | 160 | break; |
| 150 | 161 | ||
| 151 | case PLIST_STRING: | 162 | case PLIST_STRING: |
| 152 | tag = "string"; | 163 | tag = XPLIST_STRING; |
| 153 | val = g_strdup(node_data->strval); | 164 | val = g_strdup(node_data->strval); |
| 154 | break; | 165 | break; |
| 155 | 166 | ||
| 156 | case PLIST_UNICODE: | 167 | case PLIST_UNICODE: |
| 157 | tag = "string"; | 168 | tag = XPLIST_STRING; |
| 158 | val = g_strdup((gchar *) node_data->unicodeval); | 169 | val = g_strdup((gchar *) node_data->unicodeval); |
| 159 | break; | 170 | break; |
| 160 | 171 | ||
| 161 | case PLIST_KEY: | 172 | case PLIST_KEY: |
| 162 | tag = "key"; | 173 | tag = XPLIST_KEY; |
| 163 | val = g_strdup((gchar *) node_data->strval); | 174 | val = g_strdup((gchar *) node_data->strval); |
| 164 | break; | 175 | break; |
| 165 | 176 | ||
| 166 | case PLIST_DATA: | 177 | case PLIST_DATA: |
| 167 | tag = "data"; | 178 | tag = XPLIST_DATA; |
| 168 | gchar *valtmp = g_base64_encode(node_data->buff, node_data->length); | 179 | gchar *valtmp = g_base64_encode(node_data->buff, node_data->length); |
| 169 | val = format_string(valtmp, 68, xstruct->depth); | 180 | val = format_string(valtmp, 68, xstruct->depth); |
| 170 | g_free(valtmp); | 181 | g_free(valtmp); |
| 171 | break; | 182 | break; |
| 172 | case PLIST_ARRAY: | 183 | case PLIST_ARRAY: |
| 173 | tag = "array"; | 184 | tag = XPLIST_ARRAY; |
| 174 | isStruct = TRUE; | 185 | isStruct = TRUE; |
| 175 | break; | 186 | break; |
| 176 | case PLIST_DICT: | 187 | case PLIST_DICT: |
| 177 | tag = "dict"; | 188 | tag = XPLIST_DICT; |
| 178 | isStruct = TRUE; | 189 | isStruct = TRUE; |
| 179 | break; | 190 | break; |
| 180 | case PLIST_DATE: //TODO : handle date tag | 191 | case PLIST_DATE: //TODO : handle date tag |
| @@ -182,17 +193,17 @@ static void node_to_xml(GNode * node, gpointer xml_struct) | |||
| 182 | break; | 193 | break; |
| 183 | } | 194 | } |
| 184 | 195 | ||
| 185 | int i = 0; | 196 | uint32_t i = 0; |
| 186 | for (i = 0; i < xstruct->depth; i++) { | 197 | for (i = 0; i < xstruct->depth; i++) { |
| 187 | xmlNodeAddContent(xstruct->xml, "\t"); | 198 | xmlNodeAddContent(xstruct->xml, BAD_CAST("\t")); |
| 188 | } | 199 | } |
| 189 | child_node = xmlNewChild(xstruct->xml, NULL, tag, val); | 200 | child_node = xmlNewChild(xstruct->xml, NULL, tag, BAD_CAST(val)); |
| 190 | xmlNodeAddContent(xstruct->xml, "\n"); | 201 | xmlNodeAddContent(xstruct->xml, BAD_CAST("\n")); |
| 191 | g_free(val); | 202 | g_free(val); |
| 192 | 203 | ||
| 193 | //add return for structured types | 204 | //add return for structured types |
| 194 | if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) | 205 | if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) |
| 195 | xmlNodeAddContent(child_node, "\n"); | 206 | xmlNodeAddContent(child_node, BAD_CAST("\n")); |
| 196 | 207 | ||
| 197 | if (isStruct) { | 208 | if (isStruct) { |
| 198 | struct xml_node child = { child_node, xstruct->depth + 1 }; | 209 | struct xml_node child = { child_node, xstruct->depth + 1 }; |
| @@ -202,20 +213,20 @@ static void node_to_xml(GNode * node, gpointer xml_struct) | |||
| 202 | if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) { | 213 | if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) { |
| 203 | 214 | ||
| 204 | for (i = 0; i < xstruct->depth; i++) { | 215 | for (i = 0; i < xstruct->depth; i++) { |
| 205 | xmlNodeAddContent(child_node, "\t"); | 216 | xmlNodeAddContent(child_node, BAD_CAST("\t")); |
| 206 | } | 217 | } |
| 207 | } | 218 | } |
| 208 | 219 | ||
| 209 | return; | 220 | return; |
| 210 | } | 221 | } |
| 211 | 222 | ||
| 212 | void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node) | 223 | static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node) |
| 213 | { | 224 | { |
| 214 | xmlNodePtr node = NULL; | 225 | xmlNodePtr node = NULL; |
| 215 | 226 | ||
| 216 | for (node = xml_node->children; node; node = node->next) { | 227 | for (node = xml_node->children; node; node = node->next) { |
| 217 | 228 | ||
| 218 | while (node && !xmlStrcmp(node->name, "text")) | 229 | while (node && !xmlStrcmp(node->name, XPLIST_TEXT)) |
| 219 | node = node->next; | 230 | node = node->next; |
| 220 | if (!node) | 231 | if (!node) |
| 221 | break; | 232 | break; |
| @@ -227,68 +238,68 @@ void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node) | |||
| 227 | else | 238 | else |
| 228 | *plist_node = subnode; | 239 | *plist_node = subnode; |
| 229 | 240 | ||
| 230 | if (!xmlStrcmp(node->name, "true")) { | 241 | if (!xmlStrcmp(node->name, XPLIST_TRUE)) { |
| 231 | data->boolval = 1; | 242 | data->boolval = TRUE; |
| 232 | data->type = PLIST_BOOLEAN; | 243 | data->type = PLIST_BOOLEAN; |
| 233 | data->length = 1; | 244 | data->length = 1; |
| 234 | continue; | 245 | continue; |
| 235 | } | 246 | } |
| 236 | 247 | ||
| 237 | if (!xmlStrcmp(node->name, "false")) { | 248 | if (!xmlStrcmp(node->name, XPLIST_FALSE)) { |
| 238 | data->boolval = 0; | 249 | data->boolval = FALSE; |
| 239 | data->type = PLIST_BOOLEAN; | 250 | data->type = PLIST_BOOLEAN; |
| 240 | data->length = 1; | 251 | data->length = 1; |
| 241 | continue; | 252 | continue; |
| 242 | } | 253 | } |
| 243 | 254 | ||
| 244 | if (!xmlStrcmp(node->name, "integer")) { | 255 | if (!xmlStrcmp(node->name, XPLIST_INT)) { |
| 245 | char *strval = xmlNodeGetContent(node); | 256 | char *strval = (char*)xmlNodeGetContent(node); |
| 246 | data->intval = g_ascii_strtoull(strval, NULL, 0); | 257 | data->intval = g_ascii_strtoull(strval, NULL, 0); |
| 247 | data->type = PLIST_UINT; | 258 | data->type = PLIST_UINT; |
| 248 | data->length = 8; | 259 | data->length = 8; |
| 249 | continue; | 260 | continue; |
| 250 | } | 261 | } |
| 251 | 262 | ||
| 252 | if (!xmlStrcmp(node->name, "real")) { | 263 | if (!xmlStrcmp(node->name, XPLIST_REAL)) { |
| 253 | char *strval = xmlNodeGetContent(node); | 264 | char *strval = (char*)xmlNodeGetContent(node); |
| 254 | data->realval = atof(strval); | 265 | data->realval = atof(strval); |
| 255 | data->type = PLIST_REAL; | 266 | data->type = PLIST_REAL; |
| 256 | data->length = 8; | 267 | data->length = 8; |
| 257 | continue; | 268 | continue; |
| 258 | } | 269 | } |
| 259 | 270 | ||
| 260 | if (!xmlStrcmp(node->name, "date")) | 271 | if (!xmlStrcmp(node->name, XPLIST_DATE)) |
| 261 | continue; //TODO : handle date tag | 272 | continue; //TODO : handle date tag |
| 262 | 273 | ||
| 263 | if (!xmlStrcmp(node->name, "string")) { | 274 | if (!xmlStrcmp(node->name, XPLIST_STRING)) { |
| 264 | data->strval = strdup(xmlNodeGetContent(node)); | 275 | data->strval = strdup( (char*) xmlNodeGetContent(node)); |
| 265 | data->type = PLIST_STRING; | 276 | data->type = PLIST_STRING; |
| 266 | data->length = strlen(data->strval); | 277 | data->length = strlen(data->strval); |
| 267 | continue; | 278 | continue; |
| 268 | } | 279 | } |
| 269 | 280 | ||
| 270 | if (!xmlStrcmp(node->name, "key")) { | 281 | if (!xmlStrcmp(node->name, XPLIST_KEY)) { |
| 271 | data->strval = strdup(xmlNodeGetContent(node)); | 282 | data->strval = strdup( (char*) xmlNodeGetContent(node)); |
| 272 | data->type = PLIST_KEY; | 283 | data->type = PLIST_KEY; |
| 273 | data->length = strlen(data->strval); | 284 | data->length = strlen(data->strval); |
| 274 | continue; | 285 | continue; |
| 275 | } | 286 | } |
| 276 | 287 | ||
| 277 | if (!xmlStrcmp(node->name, "data")) { | 288 | if (!xmlStrcmp(node->name, XPLIST_DATA)) { |
| 278 | gsize size = 0; | 289 | gsize size = 0; |
| 279 | data->buff = g_base64_decode(xmlNodeGetContent(node), &size); | 290 | data->buff = g_base64_decode((char*)xmlNodeGetContent(node), &size); |
| 280 | data->length = size; | 291 | data->length = size; |
| 281 | data->type = PLIST_DATA; | 292 | data->type = PLIST_DATA; |
| 282 | continue; | 293 | continue; |
| 283 | } | 294 | } |
| 284 | 295 | ||
| 285 | if (!xmlStrcmp(node->name, "array")) { | 296 | if (!xmlStrcmp(node->name, XPLIST_ARRAY)) { |
| 286 | data->type = PLIST_ARRAY; | 297 | data->type = PLIST_ARRAY; |
| 287 | xml_to_node(node, &subnode); | 298 | xml_to_node(node, &subnode); |
| 288 | continue; | 299 | continue; |
| 289 | } | 300 | } |
| 290 | 301 | ||
| 291 | if (!xmlStrcmp(node->name, "dict")) { | 302 | if (!xmlStrcmp(node->name, XPLIST_DICT)) { |
| 292 | data->type = PLIST_DICT; | 303 | data->type = PLIST_DICT; |
| 293 | xml_to_node(node, &subnode); | 304 | xml_to_node(node, &subnode); |
| 294 | continue; | 305 | continue; |
| @@ -306,7 +317,11 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length) | |||
| 306 | 317 | ||
| 307 | node_to_xml(plist, &root); | 318 | node_to_xml(plist, &root); |
| 308 | 319 | ||
| 309 | xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, length); | 320 | int size = 0; |
| 321 | xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, &size); | ||
| 322 | if (size >=0 ) | ||
| 323 | *length = size; | ||
| 324 | free_plist(plist_doc); | ||
| 310 | } | 325 | } |
| 311 | 326 | ||
| 312 | void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist) | 327 | void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist) |
