/*
 * data specific functions
 */
static int data_compare(const idmef_value_type_t *t1, const idmef_value_type_t *t2,
                        size_t len, idmef_criterion_operator_t op)
{
        int ret;
        size_t s1_len, s2_len;
        const void *s1 = NULL, *s2 = NULL;

        if ( t1->data.data_val )
                s1 = idmef_data_get_data(t1->data.data_val);

        if ( t2->data.string_val )
                s2 = idmef_data_get_data(t2->data.data_val);

        if ( ! s1 || ! s2 )
                return (s1) ? 1 : -1;

        if ( op & IDMEF_CRITERION_OPERATOR_SUBSTR ) {
                s1_len = idmef_data_get_len(t1->data.data_val);
                s2_len = idmef_data_get_len(t2->data.data_val);
                return ( memmem(s1, s1_len, s2, s2_len) ) ? 0 : -1;
        }

        ret = idmef_data_compare(t1->data.data_val, t2->data.data_val);
        if ( ret == 0 && op & IDMEF_CRITERION_OPERATOR_EQUAL )
                return 0;

        else if ( ret < 0 && op & IDMEF_CRITERION_OPERATOR_LESSER )
                return 0;

        else if ( ret > 0 && op & IDMEF_CRITERION_OPERATOR_GREATER )
                return 0;


        return -1;
}
int idmef_message_get_data(idmef_message_t *message, const char *path, unsigned char **data, size_t *size)
{
        int ret;
        idmef_data_t *dp;
        idmef_value_t *iv;

        ret = idmef_message_get_value(message, path, &iv);
        if ( ret <= 0 )
                return ret;

        if ( idmef_value_get_type(iv) != IDMEF_VALUE_TYPE_DATA || ! (dp = idmef_value_get_data(iv)) ) {
                ret = -1;
                goto err;
        }

        *size = idmef_data_get_len(dp);
        *data = malloc(*size);
        if ( ! *data ) {
                ret = -1;
                goto err;
        }

        memcpy(*data, idmef_data_get_data(dp), *size);

err:
        idmef_value_destroy(iv);
        return ret;
}
static void cast_string(void)
{
        idmef_data_t *data;
        idmef_value_t *value;
        requiem_string_t *str;

        assert(requiem_string_new_ref(&str, "abcdefgh") == 0);
        assert(idmef_value_new_string(&value, str) == 0);
        idmef_value_dont_have_own_data(value);

        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT8, -1) < 0);
//        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT8, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT16, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT16, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT32, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT32, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT64, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT64, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_FLOAT, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_DOUBLE, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_TIME, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_ENUM, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_LIST, -1) < 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_CLASS, -1) < 0);

        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_DATA, -1) == 0);
        assert(idmef_value_get_type(value) == IDMEF_VALUE_TYPE_DATA);
        assert(data = idmef_value_get_data(value));
        assert(idmef_data_get_len(data) == (requiem_string_get_len(str) + 1));
        assert(memcmp(requiem_string_get_string(str), idmef_data_get_data(data), idmef_data_get_len(data)) == 0);
        requiem_string_destroy(str);

        cast_data(value);
        idmef_value_destroy(value);

        assert(requiem_string_new_ref(&str, "2008-01-01 20:42:31") == 0);
        assert(idmef_value_new_string(&value, str) == 0);
        assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_TIME, -1) == 0);
        idmef_value_destroy(value);
}