diff options
| author | 2009-01-29 20:49:00 +0100 | |
|---|---|---|
| committer | 2009-01-29 20:49:00 +0100 | |
| commit | f1d587b73eb3d8a7379e7c44f03257e6e553ca1b (patch) | |
| tree | d5fd5843816d6e23275f53eb0e213a565995088f /src/plist.c | |
| parent | 296a38509d12306e423800ed2c583a94a31eddff (diff) | |
| download | libplist-f1d587b73eb3d8a7379e7c44f03257e6e553ca1b.tar.gz libplist-f1d587b73eb3d8a7379e7c44f03257e6e553ca1b.tar.bz2 | |
Add setter and getter for Date and Unicode types.
Diffstat (limited to 'src/plist.c')
| -rw-r--r-- | src/plist.c | 74 |
1 files changed, 65 insertions, 9 deletions
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 | } | ||
