/** Load engine plugin */ MRCP_DECLARE(mrcp_engine_t*) mrcp_engine_loader_plugin_load(mrcp_engine_loader_t *loader, const char *path, const char *name) { apr_dso_handle_t *plugin = NULL; mrcp_plugin_creator_f plugin_creator = NULL; mrcp_engine_t *engine = NULL; if(!path || !name) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Load Plugin: invalid params"); return NULL; } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Load Plugin [%s] [%s]",path,name); if(apr_dso_load(&plugin,path,loader->pool) != APR_SUCCESS) { char derr[512] = ""; apr_dso_error(plugin,derr,sizeof(derr)); apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Load DSO: %s", derr); return NULL; } if(plugin_version_load(plugin) != TRUE) { apr_dso_unload(plugin); return NULL; } plugin_creator = plugin_creator_load(plugin); if(!plugin_creator) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"No Entry Point Found for Plugin"); apr_dso_unload(plugin); return NULL; } plugin_logger_load(plugin); apr_hash_set(loader->plugins,name,APR_HASH_KEY_STRING,plugin); engine = plugin_creator(loader->pool); if(!engine) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create MRCP Engine"); } return engine; }
/** Register resource engine plugin */ MRCP_DECLARE(apt_bool_t) mrcp_server_plugin_register(mrcp_server_t *server, const char *path, const char *name) { apr_dso_handle_t *plugin = NULL; apr_dso_handle_sym_t func_handle = NULL; apt_bool_t dso_err = FALSE; mrcp_plugin_creator_f plugin_creator = NULL; mrcp_resource_engine_t *engine; if(!path || !name) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Register Plugin: no name"); return FALSE; } apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Register Plugin [%s] [%s]",path,name); if(apr_dso_load(&plugin,path,server->pool) == APR_SUCCESS) { if(apr_dso_sym(&func_handle,plugin,MRCP_PLUGIN_SYM_NAME) == APR_SUCCESS) { if(func_handle) { plugin_creator = (mrcp_plugin_creator_f)(intptr_t)func_handle; } } else { dso_err = TRUE; } } else { dso_err = TRUE; } if(dso_err == TRUE) { char derr[512] = ""; apr_dso_error(plugin,derr,sizeof(derr)); apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Load DSO Symbol: %s", derr); apr_dso_unload(plugin); return FALSE; } if(!plugin_creator) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"No Entry Point Found for Plugin"); apr_dso_unload(plugin); return FALSE; } engine = plugin_creator(server->pool); if(!engine) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Null Resource Engine"); apr_dso_unload(plugin); return FALSE; } if(!mrcp_plugin_version_check(&engine->plugin_version)) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Incompatible Plugin Version [%d.%d.%d] < ["PLUGIN_VERSION_STRING"]", engine->plugin_version.major, engine->plugin_version.minor, engine->plugin_version.patch); apr_dso_unload(plugin); return FALSE; } mrcp_server_resource_engine_register(server,engine,name); apr_hash_set(server->plugin_table,name,APR_HASH_KEY_STRING,plugin); return TRUE; }