diff options
| -rw-r--r-- | include/plist/plist.h | 6 | ||||
| -rw-r--r-- | src/bplist.c | 10 | ||||
| -rw-r--r-- | src/plist.c | 74 |
3 files changed, 80 insertions, 10 deletions
diff --git a/include/plist/plist.h b/include/plist/plist.h index c06d38b..76ce0ec 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h | |||
| @@ -60,7 +60,8 @@ void plist_add_sub_bool_el(plist_t node, uint8_t val); | |||
| 60 | void plist_add_sub_uint_el(plist_t node, uint64_t val); | 60 | void plist_add_sub_uint_el(plist_t node, uint64_t val); |
| 61 | void plist_add_sub_real_el(plist_t node, double val); | 61 | void plist_add_sub_real_el(plist_t node, double val); |
| 62 | void plist_add_sub_data_el(plist_t node, const char* val, uint64_t length); | 62 | void plist_add_sub_data_el(plist_t node, const char* val, uint64_t length); |
| 63 | 63 | void plist_add_sub_unicode_el(plist_t node, const char* val); | |
| 64 | void plist_add_sub_date_el(plist_t node, int32_t sec, int32_t usec); | ||
| 64 | 65 | ||
| 65 | //plist free | 66 | //plist free |
| 66 | void plist_free(plist_t plist); | 67 | void plist_free(plist_t plist); |
| @@ -83,6 +84,9 @@ void plist_get_bool_val(plist_t node, uint8_t* val); | |||
| 83 | void plist_get_uint_val(plist_t node, uint64_t* val); | 84 | void plist_get_uint_val(plist_t node, uint64_t* val); |
| 84 | void plist_get_real_val(plist_t node, double* val); | 85 | void plist_get_real_val(plist_t node, double* val); |
| 85 | void plist_get_data_val(plist_t node, char** val, uint64_t* length); | 86 | void plist_get_data_val(plist_t node, char** val, uint64_t* length); |
| 87 | void plist_get_unicode_val(plist_t node, char** val); | ||
| 88 | void plist_get_date_val(plist_t node, int32_t* sec, int32_t* usec); | ||
| 89 | |||
| 86 | 90 | ||
| 87 | //import and export functions | 91 | //import and export functions |
| 88 | void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length); | 92 | void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length); |
diff --git a/src/bplist.c b/src/bplist.c index d05c2e5..50840c2 100644 --- a/src/bplist.c +++ b/src/bplist.c | |||
| @@ -332,6 +332,9 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data) | |||
| 332 | dstdata->intval = srcdata->intval; | 332 | dstdata->intval = srcdata->intval; |
| 333 | break; | 333 | break; |
| 334 | case PLIST_DATE: | 334 | case PLIST_DATE: |
| 335 | dstdata->timeval.tv_sec = srcdata->timeval.tv_sec; | ||
| 336 | dstdata->timeval.tv_usec = srcdata->timeval.tv_usec; | ||
| 337 | break; | ||
| 335 | case PLIST_REAL: | 338 | case PLIST_REAL: |
| 336 | dstdata->realval = srcdata->realval; | 339 | dstdata->realval = srcdata->realval; |
| 337 | break; | 340 | break; |
| @@ -495,6 +498,9 @@ static guint plist_data_hash(gconstpointer key) | |||
| 495 | size = sizeof(gconstpointer); | 498 | size = sizeof(gconstpointer); |
| 496 | break; | 499 | break; |
| 497 | case PLIST_DATE: | 500 | case PLIST_DATE: |
| 501 | buff = (char *) &(data->timeval); | ||
| 502 | size = data->length; | ||
| 503 | break; | ||
| 498 | default: | 504 | default: |
| 499 | break; | 505 | break; |
| 500 | } | 506 | } |
| @@ -551,6 +557,10 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b) | |||
| 551 | return FALSE; | 557 | return FALSE; |
| 552 | break; | 558 | break; |
| 553 | case PLIST_DATE: | 559 | case PLIST_DATE: |
| 560 | if (!memcmp(&(val_a->timeval), &(val_b->timeval),sizeof(GTimeVal))) | ||
| 561 | return TRUE; | ||
| 562 | else | ||
| 563 | return FALSE; | ||
| 554 | default: | 564 | default: |
| 555 | break; | 565 | break; |
| 556 | } | 566 | } |
diff --git a/src/plist.c b/src/plist.c index 0f6d741..71059e4 100644 --- a/src/plist.c +++ b/src/plist.c | |||
| @@ -82,6 +82,11 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void * | |||
| 82 | data->type = type; | 82 | data->type = type; |
| 83 | data->length = length; | 83 | data->length = length; |
| 84 | 84 | ||
| 85 | glong len = 0; | ||
| 86 | glong items_read = 0; | ||
| 87 | glong items_written = 0; | ||
| 88 | GError *error = NULL; | ||
| 89 | |||
| 85 | switch (type) { | 90 | switch (type) { |
| 86 | case PLIST_BOOLEAN: | 91 | case PLIST_BOOLEAN: |
| 87 | data->boolval = *((char *) value); | 92 | data->boolval = *((char *) value); |
| @@ -97,15 +102,19 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void * | |||
| 97 | data->strval = strdup((char *) value); | 102 | data->strval = strdup((char *) value); |
| 98 | break; | 103 | break; |
| 99 | case PLIST_UNICODE: | 104 | case PLIST_UNICODE: |
| 100 | data->unicodeval = (gunichar2*) malloc(length * sizeof(gunichar2)); | 105 | len = strlen((char*)value); |
| 101 | memcpy(data->unicodeval, value, length * sizeof(gunichar2)); | 106 | data->unicodeval = g_utf8_to_utf16((char*) value, len, &items_read, &items_written, &error); |
| 107 | data->length = items_written; | ||
| 102 | break; | 108 | break; |
| 103 | case PLIST_DATA: | 109 | case PLIST_DATA: |
| 104 | memcpy(data->buff, value, length); | 110 | memcpy(data->buff, value, length); |
| 105 | break; | 111 | break; |
| 112 | case PLIST_DATE: | ||
| 113 | data->timeval.tv_sec = ((GTimeVal*)value)->tv_sec; | ||
| 114 | data->timeval.tv_usec = ((GTimeVal*)value)->tv_usec; | ||
| 115 | break; | ||
| 106 | case PLIST_ARRAY: | 116 | case PLIST_ARRAY: |
| 107 | case PLIST_DICT: | 117 | case PLIST_DICT: |
| 108 | case PLIST_DATE: | ||
| 109 | default: | 118 | default: |
| 110 | break; | 119 | break; |
| 111 | } | 120 | } |
| @@ -161,11 +170,13 @@ static char compare_node_value(plist_type type, plist_data_t data, const void *v | |||
| 161 | res = !memcpy(data->unicodeval, value, length); | 170 | res = !memcpy(data->unicodeval, value, length); |
| 162 | break; | 171 | break; |
| 163 | case PLIST_DATA: | 172 | case PLIST_DATA: |
| 164 | res = memcmp(data->buff, (char *) value, length); | 173 | res = !memcmp(data->buff, (char *) value, length); |
| 174 | break; | ||
| 175 | case PLIST_DATE: | ||
| 176 | res = !memcmp(&(data->timeval), value, sizeof(GTimeVal)); | ||
| 165 | break; | 177 | break; |
| 166 | case PLIST_ARRAY: | 178 | case PLIST_ARRAY: |
| 167 | case PLIST_DICT: | 179 | case PLIST_DICT: |
| 168 | case PLIST_DATE: | ||
| 169 | default: | 180 | default: |
| 170 | break; | 181 | break; |
| 171 | } | 182 | } |
| @@ -209,6 +220,12 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu | |||
| 209 | if (!node) | 220 | if (!node) |
| 210 | return; | 221 | return; |
| 211 | 222 | ||
| 223 | //for unicode | ||
| 224 | glong len = 0; | ||
| 225 | glong items_read = 0; | ||
| 226 | glong items_written = 0; | ||
| 227 | GError *error = NULL; | ||
| 228 | |||
| 212 | plist_data_t data = plist_get_data(node); | 229 | plist_data_t data = plist_get_data(node); |
| 213 | 230 | ||
| 214 | *type = data->type; | 231 | *type = data->type; |
| @@ -229,13 +246,20 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu | |||
| 229 | *((char **) value) = strdup(data->strval); | 246 | *((char **) value) = strdup(data->strval); |
| 230 | break; | 247 | break; |
| 231 | case PLIST_UNICODE: | 248 | case PLIST_UNICODE: |
| 232 | *((gunichar2 **) value) = malloc (*length * sizeof(gunichar2)); | 249 | len = data->length; |
| 233 | memcpy(*((gunichar2 **) value), data->unicodeval, *length * sizeof(gunichar2)); | 250 | *((char **) value) = g_utf16_to_utf8(data->unicodeval, len, &items_read, &items_written, &error); |
| 234 | break; | 251 | break; |
| 235 | case PLIST_DATA: | 252 | case PLIST_DATA: |
| 253 | *((uint8_t**) value) = (uint8_t*) malloc( *length * sizeof(uint8_t)); | ||
| 254 | memcpy(value, data->buff, *length * sizeof(uint8_t)); | ||
| 255 | break; | ||
| 256 | case PLIST_DATE: | ||
| 257 | //exception : here we use memory on the stack since it is just a temporary buffer | ||
| 258 | (*((GTimeVal**) value))->tv_sec = data->timeval.tv_sec; | ||
| 259 | (*((GTimeVal**) value))->tv_usec = data->timeval.tv_usec; | ||
| 260 | break; | ||
| 236 | case PLIST_ARRAY: | 261 | case PLIST_ARRAY: |
| 237 | case PLIST_DICT: | 262 | case PLIST_DICT: |
| 238 | case PLIST_DATE: | ||
| 239 | default: | 263 | default: |
| 240 | break; | 264 | break; |
| 241 | } | 265 | } |
| @@ -290,6 +314,17 @@ void plist_add_sub_data_el(plist_t node, const char *val, uint64_t length) | |||
| 290 | plist_add_sub_element(node, PLIST_DATA, val, length); | 314 | plist_add_sub_element(node, PLIST_DATA, val, length); |
| 291 | } | 315 | } |
| 292 | 316 | ||
| 317 | void plist_add_sub_unicode_el(plist_t node, const char* val) | ||
| 318 | { | ||
| 319 | plist_add_sub_element(node, PLIST_UNICODE, val, strlen(val)); | ||
| 320 | } | ||
| 321 | |||
| 322 | void plist_add_sub_date_el(plist_t node, int32_t sec, int32_t usec) | ||
| 323 | { | ||
| 324 | GTimeVal val = {sec, usec}; | ||
| 325 | plist_add_sub_element(node, PLIST_UNICODE, &val, sizeof(GTimeVal)); | ||
| 326 | } | ||
| 327 | |||
| 293 | void plist_get_key_val(plist_t node, char **val) | 328 | void plist_get_key_val(plist_t node, char **val) |
| 294 | { | 329 | { |
| 295 | plist_type type = plist_get_node_type(node); | 330 | plist_type type = plist_get_node_type(node); |
| @@ -338,6 +373,27 @@ void plist_get_real_val(plist_t node, double *val) | |||
| 338 | void plist_get_data_val(plist_t node, char **val, uint64_t * length) | 373 | void plist_get_data_val(plist_t node, char **val, uint64_t * length) |
| 339 | { | 374 | { |
| 340 | plist_type type = plist_get_node_type(node); | 375 | plist_type type = plist_get_node_type(node); |
| 341 | if (PLIST_UINT == type) | 376 | if (PLIST_DATA == type) |
| 342 | plist_get_type_and_value(node, &type, (void *) val, length); | 377 | plist_get_type_and_value(node, &type, (void *) val, length); |
| 343 | } | 378 | } |
| 379 | |||
| 380 | void plist_get_unicode_val(plist_t node, char** val) | ||
| 381 | { | ||
| 382 | plist_type type = plist_get_node_type(node); | ||
| 383 | uint64_t length = 0; | ||
| 384 | if (PLIST_UNICODE == type) | ||
| 385 | plist_get_type_and_value(node, &type, (void *) val, &length); | ||
| 386 | assert(length == strlen(*val)); | ||
| 387 | } | ||
| 388 | |||
| 389 | void plist_get_date_val(plist_t node, int32_t* sec, int32_t* usec) | ||
| 390 | { | ||
| 391 | plist_type type = plist_get_node_type(node); | ||
| 392 | uint64_t length = 0; | ||
| 393 | GTimeVal val = {0, 0}; | ||
| 394 | if (PLIST_DATE == type) | ||
| 395 | plist_get_type_and_value(node, &type, (void *) &val, &length); | ||
| 396 | assert(length == sizeof(GTimeVal)); | ||
| 397 | *sec = val.tv_sec; | ||
| 398 | *usec = val.tv_usec; | ||
| 399 | } | ||
