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