Beispiel #1
0
ConstAction ConstAction::lookup(
    Engine      engine,
    const char* name,
    size_t      name_length
)
{
    const ib_action_t* action;

    throw_if_error(
        ib_action_lookup(
            engine.ib(),
            name, name_length,
            &action
        )
    );

    return ConstAction(action);
}
Beispiel #2
0
ib_status_t ib_action_inst_create(
    ib_action_inst_t  **act_inst,
    ib_mm_t             mm,
    ib_context_t       *ctx,
    const char         *action_name,
    const char         *parameters
)
{
    assert(action_name != NULL);
    assert(act_inst != NULL);
    assert(ctx != NULL);
    assert(ctx->ib != NULL);

    const ib_action_t *action;
    ib_action_inst_t  *local_action_inst = NULL;
    ib_status_t        rc;

    rc = ib_action_lookup(ctx->ib, action_name, strlen(action_name), &action);
    if (rc != IB_OK) {
        return rc;
    }

    local_action_inst =
        (ib_action_inst_t *)ib_mm_alloc(mm, sizeof(*local_action_inst));
    if (local_action_inst == NULL) {
        return IB_EALLOC;
    }
    if (parameters != NULL) {
        local_action_inst->parameters = ib_mm_strdup(mm, parameters);
        if (local_action_inst->parameters == NULL) {
            return IB_EALLOC;
        }
    }
    else {
        local_action_inst->parameters = NULL;
    }
    local_action_inst->action = action;

    if (action->create_fn == NULL) {
        local_action_inst->instance_data = NULL;
    }
    else {
        rc = action->create_fn(
            mm,
            ctx,
            parameters,
            &(local_action_inst->instance_data),
            action->create_cbdata
        );
        if (rc != IB_OK) {
            return rc;
        }
    }

    if (action->destroy_fn != NULL) {
        /* Register the destroy function. */
        rc = ib_mm_register_cleanup(mm, cleanup_action, local_action_inst);
        if (rc != IB_OK) {
            return rc;
        }
    }

    *act_inst = local_action_inst;

    return IB_OK;
}