OSyncXMLField *osync_xmlfield_get_last_child(OSyncXMLField *xmlfield)
{
	OSyncXMLField *last = NULL;
	osync_return_val_if_fail(xmlfield, NULL);
	osync_return_val_if_fail(xmlfield->child, NULL);

	last = xmlfield->child;

	while (last->next)
		last = last->next;
	
	return last;
}
/*! @brief This will return a string describing the type of the error
 * 
 * @param error A pointer to a error struct
 * @returns The description, NULL on error
 * 
 */
const char *osync_error_get_name(OSyncError **error)
{
  osync_return_val_if_fail(error != NULL, NULL);
  if (!*error)
    return osync_error_name_from_type(OSYNC_NO_ERROR);
  return osync_error_name_from_type((*error)->type);
}
osync_bool osync_merger_demerge(OSyncMerger *merger, OSyncChange *change, OSyncCapabilities *caps, OSyncError **error)
{

	char *buffer;
	unsigned int size;

	osync_assert(merger);
	osync_assert(change);
	osync_return_val_if_fail(caps, TRUE);

	OSyncData *data = osync_change_get_data(change);

	osync_data_get_data(data, &buffer, &size);

	if (size == 0) {
		osync_error_set(error, OSYNC_ERROR_GENERIC, "Can't demerge data with 0 size.");
		goto error;
	}

	if (buffer == NULL) {
		osync_error_set(error, OSYNC_ERROR_GENERIC, "No data to demerge.");
		goto error;
	}

	if (!merger->demerge_func(&buffer, &size, caps, NULL /*userdata!*/, error))
		goto error;

	return TRUE;

error:	
	return FALSE;
}
OSyncMerger *osync_merger_ref(OSyncMerger *merger)
{
	osync_return_val_if_fail(merger, NULL);
	
	g_atomic_int_inc(&(merger->ref_count));

	return merger;
}
OSyncMember *osync_sink_engine_get_member(OSyncSinkEngine *engine)
{
    osync_return_val_if_fail(engine, NULL);
    osync_return_val_if_fail(engine->proxy, NULL);
    return osync_client_proxy_get_member(engine->proxy);
}
const OSyncList *osync_sink_engine_get_mapping_entry_engines(OSyncSinkEngine *engine)
{
    osync_return_val_if_fail(engine, NULL);
    return engine->entries;
}
const char *osync_merger_get_objformat(OSyncMerger *merger)
{
	osync_return_val_if_fail(merger, NULL);
	return merger->objformat;
}
const char *osync_xmlfield_get_value(OSyncXMLField *xmlfield)
{
	osync_return_val_if_fail(xmlfield, "");
	return (const char *)osync_xml_node_get_content(xmlfield->node);
}
OSyncXMLField *osync_xmlfield_get_child(OSyncXMLField *xmlfield)
{
	osync_return_val_if_fail(xmlfield, NULL);
	return xmlfield->child;
}
OSyncXMLField *osync_xmlfield_get_parent(OSyncXMLField *xmlfield)
{
	osync_return_val_if_fail(xmlfield, NULL);
	return xmlfield->parent;
}
OSyncXMLField *osync_xmlfield_get_prev(OSyncXMLField *xmlfield)
{
	osync_return_val_if_fail(xmlfield, NULL);
	return xmlfield->prev;
}
OSyncXMLField *osync_xmlfield_get_next(OSyncXMLField *xmlfield)
{
	osync_return_val_if_fail(xmlfield, NULL);
	return xmlfield->next;
}