rendered paste body// Copyright (C) 2003 Telefinity, Inc. All rights reserved.#include <asterisk/file.h>#include <asterisk/logger.h>#include <asterisk/channel.h>#include <asterisk/pbx.h>#include <asterisk/module.h>#include <asterisk/lock.h>#include <stdlib.h>#include <unistd.h>#include <string.h>//#include <gc/gc.h>#include <mono/jit/jit.h>#include <mono/metadata/environment.h>static char *tdesc = "ast_mono loader";static char *app = "ast_mono_loader";static char *synopsis = "Managed wrapper for Asterisk.";STANDARD_LOCAL_USER;LOCAL_USER_DECL;static MonoDomain *domain; static void main_thread_handler (gpointer user_data){ MonoAssembly *assembly; ast_log(LOG_DEBUG, "assembly_open\n"); assembly = mono_domain_assembly_open (domain, "/hash"); if (!assembly) { ast_log(LOG_ERROR, "Could not load assembly.\n"); return; } char *args[1]; args[0] = "/hash"; ast_log(LOG_DEBUG, "jit_exec\n"); int retval = mono_jit_exec (domain, assembly, 1, args); ast_log(LOG_DEBUG, "mono_jit_exec returned %d.\n", retval);} static int loader_exec(struct ast_channel *chan, void *data){ int res=0; struct localuser *u; LOCAL_USER_ADD(u); void *user_data = NULL; ast_log(LOG_DEBUG, "exec_managed_code\n"); mono_runtime_exec_managed_code (domain, main_thread_handler, user_data); mono_environment_exitcode_get(); LOCAL_USER_REMOVE(u); return res;} int unload_module(void){ mono_jit_cleanup(domain); STANDARD_HANGUP_LOCALUSERS; return ast_unregister_application(app);} int load_module(void){ ast_log(LOG_DEBUG, "Creating domain.\n"); domain = mono_jit_init ("MyDomain"); if (!domain) { ast_log(LOG_ERROR, "Domain not created.\n"); } else { ast_log(LOG_DEBUG, "Domain created.\n"); } return ast_register_application(app, loader_exec, synopsis, tdesc);} char *description(void){ return tdesc;} int usecount(void){ int res; STANDARD_USECOUNT(res); return res;} char *key(){ return ASTERISK_GPL_KEY;}