diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bplist.c | 10 | ||||
| -rw-r--r-- | src/plist.c | 74 | 
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)  		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;  	} 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 *  			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; +} | 
