示例#1
0
文件: config.c 项目: worr/eventd
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;
}
示例#2
0
文件: events.c 项目: sardemff7/eventd
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;
}
示例#3
0
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;
    }
}
示例#4
0
文件: evp.c 项目: worr/eventd
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);
}
示例#5
0
文件: eventc.c 项目: Keruspe/eventd
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);
}
示例#6
0
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;
}