static apt_bool_t plugin_version_load(apr_dso_handle_t *plugin) { apr_dso_handle_sym_t version_handle = NULL; if(apr_dso_sym(&version_handle,plugin,MRCP_PLUGIN_VERSION_SYM_NAME) != APR_SUCCESS) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"No Version Info Found: %s", MRCP_PLUGIN_VERSION_SYM_NAME); return FALSE; } if(version_handle) { mrcp_plugin_version_t *version = (mrcp_plugin_version_t*)version_handle; if(mrcp_plugin_version_check(version)) { return TRUE; } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Incompatible Plugin Version Found [%d.%d.%d] < ["PLUGIN_VERSION_STRING"]", version->major, version->minor, version->patch); } } return FALSE; }
/** 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; }