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); ...@@ -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_uint_el(plist_t node, uint64_t val);
void plist_add_sub_real_el(plist_t node, double 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_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 //plist free
void plist_free(plist_t plist); void plist_free(plist_t plist);
...@@ -83,6 +84,9 @@ void plist_get_bool_val(plist_t node, uint8_t* val); ...@@ -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_uint_val(plist_t node, uint64_t* val);
void plist_get_real_val(plist_t node, double* 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_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 //import and export functions
void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length); 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) ...@@ -332,6 +332,9 @@ static gpointer copy_plist_data(gconstpointer src, gpointer data)
dstdata->intval = srcdata->intval; dstdata->intval = srcdata->intval;
break; break;
case PLIST_DATE: case PLIST_DATE:
dstdata->timeval.tv_sec = srcdata->timeval.tv_sec;
dstdata->timeval.tv_usec = srcdata->timeval.tv_usec;
break;
case PLIST_REAL: case PLIST_REAL:
dstdata->realval = srcdata->realval; dstdata->realval = srcdata->realval;
break; break;
...@@ -495,6 +498,9 @@ static guint plist_data_hash(gconstpointer key) ...@@ -495,6 +498,9 @@ static guint plist_data_hash(gconstpointer key)
size = sizeof(gconstpointer); size = sizeof(gconstpointer);
break; break;
case PLIST_DATE: case PLIST_DATE:
buff = (char *) &(data->timeval);
size = data->length;
break;
default: default:
break; break;
} }
...@@ -551,6 +557,10 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b) ...@@ -551,6 +557,10 @@ static gboolean plist_data_compare(gconstpointer a, gconstpointer b)
return FALSE; return FALSE;
break; break;
case PLIST_DATE: case PLIST_DATE:
if (!memcmp(&(val_a->timeval), &(val_b->timeval),sizeof(GTimeVal)))
return TRUE;
else
return FALSE;
default: default:
break; break;
} }
......
...@@ -82,6 +82,11 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void * ...@@ -82,6 +82,11 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
data->type = type; data->type = type;
data->length = length; data->length = length;
glong len = 0;
glong items_read = 0;
glong items_written = 0;
GError *error = NULL;
switch (type) { switch (type) {
case PLIST_BOOLEAN: case PLIST_BOOLEAN:
data->boolval = *((char *) value); data->boolval = *((char *) value);
...@@ -97,15 +102,19 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void * ...@@ -97,15 +102,19 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
data->strval = strdup((char *) value); data->strval = strdup((char *) value);
break; break;
case PLIST_UNICODE: case PLIST_UNICODE:
data->unicodeval = (gunichar2*) malloc(length * sizeof(gunichar2)); len = strlen((char*)value);
memcpy(data->unicodeval, value, length * sizeof(gunichar2)); data->unicodeval = g_utf8_to_utf16((char*) value, len, &items_read, &items_written, &error);
data->length = items_written;
break; break;
case PLIST_DATA: case PLIST_DATA:
memcpy(data->buff, value, length); memcpy(data->buff, value, length);
break; 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_ARRAY:
case PLIST_DICT: case PLIST_DICT:
case PLIST_DATE:
default: default:
break; break;
} }
...@@ -161,11 +170,13 @@ static char compare_node_value(plist_type type, plist_data_t data, const void *v ...@@ -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); res = !memcpy(data->unicodeval, value, length);
break; break;
case PLIST_DATA: 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; break;
case PLIST_ARRAY: case PLIST_ARRAY:
case PLIST_DICT: case PLIST_DICT:
case PLIST_DATE:
default: default:
break; break;
} }
...@@ -209,6 +220,12 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu ...@@ -209,6 +220,12 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
if (!node) if (!node)
return; 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); plist_data_t data = plist_get_data(node);
*type = data->type; *type = data->type;
...@@ -229,13 +246,20 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu ...@@ -229,13 +246,20 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
*((char **) value) = strdup(data->strval); *((char **) value) = strdup(data->strval);
break; break;
case PLIST_UNICODE: case PLIST_UNICODE:
*((gunichar2 **) value) = malloc (*length * sizeof(gunichar2)); len = data->length;
memcpy(*((gunichar2 **) value), data->unicodeval, *length * sizeof(gunichar2)); *((char **) value) = g_utf16_to_utf8(data->unicodeval, len, &items_read, &items_written, &error);
break; break;
case PLIST_DATA: 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_ARRAY:
case PLIST_DICT: case PLIST_DICT:
case PLIST_DATE:
default: default:
break; break;
} }
...@@ -290,6 +314,17 @@ void plist_add_sub_data_el(plist_t node, const char *val, uint64_t length) ...@@ -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); 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) void plist_get_key_val(plist_t node, char **val)
{ {
plist_type type = plist_get_node_type(node); plist_type type = plist_get_node_type(node);
...@@ -338,6 +373,27 @@ void plist_get_real_val(plist_t node, double *val) ...@@ -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) void plist_get_data_val(plist_t node, char **val, uint64_t * length)
{ {
plist_type type = plist_get_node_type(node); 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); 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