const gchar * eventd_config_get_event_config_id(EventdConfig *config, EventdEvent *event, GQuark *current_flags) { const gchar *category; GList *list; const gchar *match; category = eventd_event_get_category(event); gchar *name; name = _eventd_config_events_get_name(category, eventd_event_get_name(event)); list = g_hash_table_lookup(config->event_ids, name); g_free(name); if ( list != NULL ) { match = _eventd_config_get_best_match(list, event, current_flags); if ( match != NULL ) return match; } list = g_hash_table_lookup(config->event_ids, category); if ( list != NULL ) { match = _eventd_config_get_best_match(list, event, current_flags); if ( match != NULL ) return match; } return NULL; }
static EventdEventsEvent * _eventd_events_get_event(EventdEvents *self, EventdEvent *event, GQuark *current_flags) { const gchar *category, *name; gsize s; GList *list; EventdEventsEvent *match; category = eventd_event_get_category(event); name = eventd_event_get_name(event); s = strlen(category) + strlen(name) + 2; gchar *full_name = g_newa(gchar, s); g_snprintf(full_name, s, "%s %s", category, name); list = g_hash_table_lookup(self->events, full_name); if ( list != NULL ) { match = _eventd_events_get_best_match(list, event, current_flags); if ( match != NULL ) return match; } list = g_hash_table_lookup(self->events, category); if ( list != NULL ) { match = _eventd_events_get_best_match(list, event, current_flags); if ( match != NULL ) return match; } return NULL; }
void eventd_relay_server_event(EventdRelayServer *server, EventdEvent *event) { if ( server->current == event ) /* Do not send back events we just got */ return; const gchar *category; category = eventd_event_get_category(event); if ( ( category[0] != '.' ) && ( ! server->forward_all ) && ( ( server->forwards == NULL ) || ( ! g_hash_table_contains(server->forwards, category) ) ) ) return; if( ! eventd_relay_server_has_address(server) ) return; GError *error = NULL; if ( ! eventc_connection_is_connected(server->connection, &error) ) { if ( error != NULL ) { g_warning("Couldn't send event: %s", error->message); g_clear_error(&error); evhelpers_reconnect_try(server->reconnect); } return; } if ( ! eventc_connection_event(server->connection, event, &error) ) { g_warning("Couldn't send event: %s", error->message); g_clear_error(&error); evhelpers_reconnect_try(server->reconnect); return; } }
static void _eventd_evp_event(gpointer data, LibeventdEvpContext *evp, gchar *id, EventdEvent *event) { EventdEvpClient *client = data; #ifdef DEBUG g_debug("Received an event (category: %s): %s", eventd_event_get_category(event), eventd_event_get_name(event)); #endif /* DEBUG */ const gchar *config_id; config_id = libeventd_core_get_event_config_id(client->context->core, client->context->core_interface, event); if ( config_id == NULL ) { GError *error = NULL; if ( ! libeventd_evp_context_send_ended(evp, id, EVENTD_EVENT_END_REASON_RESERVED, &error) ) { g_warning("Couldn't send ENDED message: %s", error->message); g_error_free(error); } g_free(id); return; } #ifdef DEBUG g_debug("Matched an event (category: %s, name: %s): %s", eventd_event_get_category(event), eventd_event_get_name(event), config_id); #endif /* DEBUG */ EventdEvpEvent *evp_event; evp_event = g_new0(EventdEvpEvent, 1); evp_event->client = client; evp_event->id = id; evp_event->event = g_object_ref(event); g_hash_table_insert(client->events, id, evp_event); evp_event->answered_handler = g_signal_connect(event, "answered", G_CALLBACK(_eventd_evp_event_answered), evp_event); evp_event->ended_handler = g_signal_connect(event, "ended", G_CALLBACK(_eventd_evp_event_ended), evp_event); libeventd_core_push_event(client->context->core, client->context->core_interface, config_id, event); }
static void _eventc_send_event(void) { if ( wait_event_end ) g_signal_connect(event, "ended", G_CALLBACK(_eventc_event_end_callback), NULL); GError *error = NULL; if ( ! eventc_connection_event(client, event, &error) ) g_warning("Couldn't send event '%s', '%s': %s", eventd_event_get_category(event), eventd_event_get_name(event), error->message); if ( ! wait_event_end ) _eventc_disconnect(NULL); }
gboolean eventd_core_push_event(EventdCoreContext *context, EventdEvent *event) { const gchar *category; category = eventd_event_get_category(event); if ( category[0] == '.' ) { eventd_plugins_event_dispatch_all(event); return TRUE; } const GList *actions; if ( ! eventd_config_process_event(context->config, event, context->flags, &actions) ) return FALSE; eventd_plugins_event_dispatch_all(event); eventd_actions_trigger(actions, event); return TRUE; }