// Copyright (C) 2003 Telefinity, Inc. All rights reserved. #include #include #include #include #include #include #include #include #include //#include #include #include 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; }