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; }
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; }