summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bplist.c10
-rw-r--r--src/plist.c74
2 files changed, 75 insertions, 9 deletions
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
317void 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
322void 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
293void plist_get_key_val(plist_t node, char **val) 328void 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)
338void plist_get_data_val(plist_t node, char **val, uint64_t * length) 373void 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
380void 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
389void 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}