Commit 583bb249 authored by Jonathan Beck's avatar Jonathan Beck

Add function to change a node's type.

parent 120b7348
......@@ -410,6 +410,14 @@ extern "C" {
* *
********************************************/
/**
* Forces type of node. Changing type of structured nodes is only allowed if node is empty.
* Reset value of node;
* @param node the node
* @param type the key value
*/
PLIST_API void plist_set_type(plist_t node, plist_type type);
/**
* Set the value of a node.
* Forces type of node to #PLIST_KEY
......
......@@ -44,10 +44,8 @@ plist_data_t plist_new_plist_data(void)
return data;
}
static void plist_free_node(GNode * node, gpointer none)
static void plist_free_data(plist_data_t data)
{
g_node_unlink(node);
plist_data_t data = plist_get_data(node);
if (data) {
switch (data->type) {
case PLIST_KEY:
......@@ -62,6 +60,13 @@ static void plist_free_node(GNode * node, gpointer none)
}
free(data);
}
}
static void plist_free_node(GNode * node, gpointer none)
{
g_node_unlink(node);
plist_data_t data = plist_get_data(node);
plist_free_data(data);
node->data = NULL;
g_node_children_foreach(node, G_TRAVERSE_ALL, plist_free_node, NULL);
}
......@@ -664,6 +669,33 @@ static plist_t plist_set_element_val(plist_t node, plist_type type, const void *
}
}
void plist_set_type(plist_t node, plist_type type)
{
if ( g_node_n_children(node) == 0 ) {
plist_data_t data = plist_get_data(node);
plist_free_data( data );
data = plist_new_plist_data();
data->type = type;
switch(type){
case PLIST_BOOLEAN:
data->length = sizeof(uint8_t);
break;
case PLIST_UINT:
data->length = sizeof(uint64_t);
break;
case PLIST_REAL:
data->length = sizeof(double);
break;
case PLIST_DATE:
data->length = sizeof(GTimeVal);
break;
default:
data->length = 0;
break;
}
}
}
void plist_set_key_val(plist_t node, const char *val)
{
plist_set_element_val(node, PLIST_KEY, val, strlen(val));
......
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