Пример #1
0
const gchar *
_eventd_config_get_best_match(GList *list, EventdEvent *event, GQuark *current_flags)
{
    GList *match_;
    for ( match_ = list ; match_ != NULL ; match_ = g_list_next(match_) )
    {
        EventdConfigMatch *match = match_->data;
        gboolean skip = FALSE;

        if ( match->if_data != NULL )
        {
            gchar **data;
            for ( data = match->if_data ; ( *data != NULL ) && ( ! skip )  ; ++data )
            {
                if ( ! eventd_event_has_data(event, *data) )
                    skip = TRUE;
            }
            if ( skip )
                continue;
        }

        if ( match->if_data_matches != NULL )
        {
            GList *data_match_;
            const gchar *data;
            for ( data_match_ = match->if_data_matches ; ( data_match_ != NULL ) && ( ! skip ) ; data_match_ = g_list_next(data_match_) )
            {
                EventdConfigDataMatch *data_match = data_match_->data;
                if ( ( data = eventd_event_get_data(event, data_match->data) ) == NULL )
                    continue;
                if ( ! g_regex_match(data_match->regex, data, 0, NULL) )
                    skip = TRUE;
            }
            if ( skip )
                continue;
        }

        if ( current_flags != NULL )
        {
            GQuark *flag;
            if ( match->flags_whitelist != NULL )
            {
                GQuark *wflag;
                for ( wflag = match->flags_whitelist ; ( *wflag != 0 ) && ( ! skip ) ; ++wflag )
                {
                    for ( flag = current_flags ; ( *flag != 0 ) && ( ! skip ) ; ++flag )
                    {
                        if ( *flag != *wflag )
                            skip = TRUE;
                    }
                }
                if ( skip )
                    continue;
            }

            if ( match->flags_blacklist != NULL )
            {
                GQuark *bflag;
                for ( bflag = match->flags_blacklist ; ( *bflag != 0 ) && ( ! skip ) ; ++bflag )
                {
                    for ( flag = current_flags ; ( *flag != 0 ) && ( ! skip ) ; ++flag )
                    {
                        if ( *flag == *bflag )
                            skip = TRUE;
                    }
                }
                if ( skip )
                    continue;
            }
        }

        return match->id;
    }

    return NULL;
}
Пример #2
0
static gboolean
_eventd_events_event_matches(EventdEventsEvent *self, EventdEvent *event, GQuark *current_flags)
{
    if ( self->if_data != NULL )
    {
        gchar **data;
        for ( data = self->if_data ; *data != NULL ; ++data )
        {
            if ( ! eventd_event_has_data(event, *data) )
                return FALSE;
        }
    }

    if ( self->if_data_matches != NULL )
    {
        EventdEventsEventDataMatch *match;
        GVariant *data;
        for ( match = self->if_data_matches ; match->data != NULL ; ++match )
        {
            if ( ! eventd_event_has_data(event, match->data) )
                continue;
            if ( ( data = eventd_event_get_data(event, match->data) ) == NULL )
                return FALSE;

            if ( match->key != NULL )
            {
                if ( ! g_variant_is_of_type(data, G_VARIANT_TYPE_VARDICT) )
                    return FALSE;

                data = g_variant_lookup_value(data, match->key, g_variant_get_type(match->value));
                if ( data == NULL )
                    return FALSE;
            }
            else if ( ! g_variant_type_equal(g_variant_get_type(data), g_variant_get_type(match->value)) )
                return FALSE;

            gint ret;
            ret = g_variant_compare(data, match->value);
            ret = CLAMP(ret, -1, 1);
            if ( ( ret != match->accepted[0] ) && ( ret != match->accepted[1] ) )
                return FALSE;
        }
    }

    if ( self->if_data_regexes != NULL )
    {
        EventdEventsEventDataRegex *match;
        const gchar *data;
        for ( match = self->if_data_regexes ; match->data != NULL ; ++match )
        {
            if ( ! eventd_event_has_data(event, match->data) )
                continue;
            if ( ( data = eventd_event_get_data_string(event, match->data) ) == NULL )
                return FALSE;
            if ( ! g_regex_match(match->regex, data, 0, NULL) )
                return FALSE;
        }
    }

    if ( current_flags != NULL )
    {
        GQuark *flag;
        if ( self->flags_whitelist != NULL )
        {
            GQuark *wflag;
            for ( wflag = self->flags_whitelist ; *wflag != 0 ; ++wflag )
            {
                gboolean has = FALSE;
                for ( flag = current_flags ; ( *flag != 0 ) && ( ! has ) ; ++flag )
                {
                    if ( *flag == *wflag )
                        has = TRUE;
                }
                if ( ! has )
                    return FALSE;
            }
        }

        if ( self->flags_blacklist != NULL )
        {
            GQuark *bflag;
            for ( bflag = self->flags_blacklist ; *bflag != 0 ; ++bflag )
            {
                for ( flag = current_flags ; *flag != 0 ; ++flag )
                {
                    if ( *flag == *bflag )
                        return FALSE;
                }
            }
        }
    }

    return TRUE;
}