Commit f1d587b7 authored by Jonathan Beck's avatar Jonathan Beck

Add setter and getter for Date and Unicode types.

parent 296a3850
......@@ -60,7 +60,8 @@ void plist_add_sub_bool_el(plist_t node, uint8_t val);
void plist_add_sub_uint_el(plist_t node, uint64_t val);
void plist_add_sub_real_el(plist_t node, double val);
void plist_add_sub_data_el(plist_t node, const char* val, uint64_t length);
void plist_add_sub_unicode_el(plist_t node, const char* val);
void plist_add_sub_date_el(plist_t node, int32_t sec, int32_t usec);
//plist free
void plist_free(plist_t plist);
......@@ -83,6 +84,9 @@ void plist_get_bool_val(plist_t node, uint8_t* val);
void plist_get_uint_val(plist_t node, uint64_t* val);
void plist_get_real_val(plist_t node, double* val);
void plist_get_data_val(plist_t node, char** val, uint64_t* length);
void plist_get_unicode_val(plist_t node, char** val);
void plist_get_date_val(plist_t node, int32_t* sec, int32_t* usec);
//import and export functions
void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length);
......
......@@ -332,6 +332,9 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data)
dstdata->intval = srcdata->intval;
break;
case PLIST_DATE:
dstdata->timeval.tv_sec = srcdata->timeval.tv_sec;
dstdata->timeval.tv_usec = srcdata->timeval.tv_usec;
break;
case PLIST_REAL:
dstdata->realval = srcdata->realval;
break;
......@@ -495,6 +498,9 @@ static guint plist_data_hash(gconstpointer key)
size = sizeof(gconstpointer);
break;
case PLIST_DATE:
buff = (char *) &(data->timeval);
size = data->length;
break;
default:
break;
}
......@@ -551,6 +557,10 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b)
return FALSE;
break;
case PLIST_DATE:
if (!memcmp(&(val_a->timeval), &(val_b->timeval),sizeof(GTimeVal)))
return TRUE;
else
return FALSE;
default:
break;
}
......
......@@ -82,6 +82,11 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
data->type = type;
data->length = length;
glong len = 0;
glong items_read = 0;
glong items_written = 0;
GError *error = NULL;
switch (type) {
case PLIST_BOOLEAN:
data->boolval = *((char *) value);
......@@ -97,15 +102,19 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
data->strval = strdup((char *) value);
break;
case PLIST_UNICODE:
data->unicodeval = (gunichar2*) malloc(length * sizeof(gunichar2));
memcpy(data->unicodeval, value, length * sizeof(gunichar2));
len = strlen((char*)value);
data->unicodeval = g_utf8_to_utf16((char*) value, len, &items_read, &items_written, &error);
data->length = items_written;
break;
case PLIST_DATA:
memcpy(data->buff, value, length);
break;
case PLIST_DATE:
data->timeval.tv_sec = ((GTimeVal*)value)->tv_sec;
data->timeval.tv_usec = ((GTimeVal*)value)->tv_usec;
break;
case PLIST_ARRAY:
case PLIST_DICT:
case PLIST_DATE:
default:
break;
}
......@@ -161,11 +170,13 @@ static char compare_node_value(plist_type type, plist_data_t data, const void *v
res = !memcpy(data->unicodeval, value, length);
break;
case PLIST_DATA:
res = memcmp(data->buff, (char *) value, length);
res = !memcmp(data->buff, (char *) value, length);
break;
case PLIST_DATE:
res = !memcmp(&(data->timeval), value, sizeof(GTimeVal));
break;
case PLIST_ARRAY:
case PLIST_DICT:
case PLIST_DATE:
default:
break;
}
......@@ -209,6 +220,12 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
if (!node)
return;
//for unicode
glong len = 0;
glong items_read = 0;
glong items_written = 0;
GError *error = NULL;
plist_data_t data = plist_get_data(node);
*type = data->type;
......@@ -229,13 +246,20 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
*((char **) value) = strdup(data->strval);
break;
case PLIST_UNICODE:
*((gunichar2 **) value) = malloc (*length * sizeof(gunichar2));
memcpy(*((gunichar2 **) value), data->unicodeval, *length * sizeof(gunichar2));
len = data->length;
*((char **) value) = g_utf16_to_utf8(data->unicodeval, len, &items_read, &items_written, &error);
break;
case PLIST_DATA:
*((uint8_t**) value) = (uint8_t*) malloc( *length * sizeof(uint8_t));
memcpy(value, data->buff, *length * sizeof(uint8_t));
break;
case PLIST_DATE:
//exception : here we use memory on the stack since it is just a temporary buffer
(*((GTimeVal**) value))->tv_sec = data->timeval.tv_sec;
(*((GTimeVal**) value))->tv_usec = data->timeval.tv_usec;
break;
case PLIST_ARRAY:
case PLIST_DICT:
case PLIST_DATE:
default:
break;
}
......@@ -290,6 +314,17 @@ void plist_add_sub_data_el(plist_t node, const char *val, uint64_t length)
plist_add_sub_element(node, PLIST_DATA, val, length);
}
void plist_add_sub_unicode_el(plist_t node, const char* val)
{
plist_add_sub_element(node, PLIST_UNICODE, val, strlen(val));
}
void plist_add_sub_date_el(plist_t node, int32_t sec, int32_t usec)
{
GTimeVal val = {sec, usec};
plist_add_sub_element(node, PLIST_UNICODE, &val, sizeof(GTimeVal));
}
void plist_get_key_val(plist_t node, char **val)
{
plist_type type = plist_get_node_type(node);
......@@ -338,6 +373,27 @@ void plist_get_real_val(plist_t node, double *val)
void plist_get_data_val(plist_t node, char **val, uint64_t * length)
{
plist_type type = plist_get_node_type(node);
if (PLIST_UINT == type)
if (PLIST_DATA == type)
plist_get_type_and_value(node, &type, (void *) val, length);
}
void plist_get_unicode_val(plist_t node, char** val)
{
plist_type type = plist_get_node_type(node);
uint64_t length = 0;
if (PLIST_UNICODE == type)
plist_get_type_and_value(node, &type, (void *) val, &length);
assert(length == strlen(*val));
}
void plist_get_date_val(plist_t node, int32_t* sec, int32_t* usec)
{
plist_type type = plist_get_node_type(node);
uint64_t length = 0;
GTimeVal val = {0, 0};
if (PLIST_DATE == type)
plist_get_type_and_value(node, &type, (void *) &val, &length);
assert(length == sizeof(GTimeVal));
*sec = val.tv_sec;
*usec = val.tv_usec;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment