\r
#include <switch.h>\r
\r
-\r
SWITCH_BEGIN_EXTERN_C \r
\r
#include "freeswitch_mono.h"\r
#define EXPORT __declspec(dllexport)\r
#elif\r
#define EXPORT \r
-#endif /* \r
- */\r
- \r
+#endif \r
+\r
#define MOD_MONO_MANAGED_DLL "mod_mono_managed.dll"\r
\r
-mod_mono_globals globals = {\r
-0};\r
-\r
-\r
+mod_mono_globals globals = \r
+{ 0 };\r
\r
SWITCH_MODULE_LOAD_FUNCTION(mod_mono_load);\r
-\r
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mono_shutdown);\r
-\r
SWITCH_MODULE_DEFINITION(mod_mono, mod_mono_load, mod_mono_shutdown, NULL);\r
\r
-\r
SWITCH_STANDARD_API(monorun_api_function); /* ExecuteBackground */\r
-\r
SWITCH_STANDARD_API(mono_api_function); /* Execute */\r
-\r
SWITCH_STANDARD_APP(mono_app_function); /* Run */\r
\r
\r
session->hangupDelegateHandle = mono_gchandle_new(hangupDelegate, FALSE);\r
}\r
\r
-\r
switch_status_t setMonoDirs() \r
{\r
- \r
#ifdef WIN32 \r
- /* Win32 Mono installs can't figure out their own path\r
- // Guys in #mono say we should just deploy all the libs we need\r
- // I think it's much nicer to let the user deal with installing Mono\r
- // and we'll just look for it in program files. */ \r
- HANDLE hFind;\r
- \r
-WIN32_FIND_DATA findData;\r
- \r
-char progFilesPath[MAX_PATH];\r
- \r
-char findPath[MAX_PATH];\r
- \r
-SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progFilesPath);\r
- \r
-switch_snprintf(findPath, MAX_PATH, "%s\\Mono-*", progFilesPath);\r
- \r
-hFind = FindFirstFile(findPath, &findData);\r
- \r
-if (hFind == INVALID_HANDLE_VALUE) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error looking for Mono in Program Files.\n");\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
-while ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {\r
- \r
-if (FindNextFile(hFind, &findData) == 0) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find Mono directory in Program Files.\n");\r
- \r
-FindClose(hFind);\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
-}\r
- \r
- /* Got it */ \r
+ /* Win32 Mono installs can't figure out their own path\r
+ // Guys in #mono say we should just deploy all the libs we need\r
+ // I think it's much nicer to let the user deal with installing Mono\r
+ // and we'll just look for it in program files. */ \r
+ HANDLE hFind;\r
+ WIN32_FIND_DATA findData;\r
+ char progFilesPath[MAX_PATH];\r
+ char findPath[MAX_PATH];\r
+\r
+ SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progFilesPath);\r
+ switch_snprintf(findPath, MAX_PATH, "%s\\Mono-*", progFilesPath);\r
+ hFind = FindFirstFile(findPath, &findData);\r
+ if (hFind == INVALID_HANDLE_VALUE) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error looking for Mono in Program Files.\n");\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
+\r
+ while ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {\r
+ if (FindNextFile(hFind, &findData) == 0) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find Mono directory in Program Files.\n");\r
+ FindClose(hFind);\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
+ }\r
+\r
+ /* Got it */ \r
{\r
- \r
-char libPath[MAX_PATH];\r
- \r
-char etcPath[MAX_PATH];\r
- \r
-switch_snprintf(libPath, MAX_PATH, "%s\\%s\\lib", progFilesPath, findData.cFileName);\r
- \r
-switch_snprintf(etcPath, MAX_PATH, "%s\\%s\\etc", progFilesPath, findData.cFileName);\r
- \r
-FindClose(hFind);\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Using Mono paths '%s' and '%s'.\n", libPath, etcPath);\r
- \r
-mono_set_dirs(libPath, etcPath);\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
- \r
-}\r
- \r
+ char libPath[MAX_PATH];\r
+ char etcPath[MAX_PATH];\r
+\r
+ switch_snprintf(libPath, MAX_PATH, "%s\\%s\\lib", progFilesPath, findData.cFileName);\r
+ switch_snprintf(etcPath, MAX_PATH, "%s\\%s\\etc", progFilesPath, findData.cFileName);\r
+ FindClose(hFind);\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Using Mono paths '%s' and '%s'.\n", libPath, etcPath);\r
+ mono_set_dirs(libPath, etcPath);\r
+ return SWITCH_STATUS_SUCCESS;\r
+ }\r
+\r
#elif\r
- // On other platforms, it should just work if it hasn't been relocated\r
- mono_set_dirs(NULL, NULL);\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
- \r
+ // On other platforms, it should just work if it hasn't been relocated\r
+ mono_set_dirs(NULL, NULL);\r
+ return SWITCH_STATUS_SUCCESS;\r
+\r
#endif /* \r
- */\r
+ */\r
}\r
\r
-\r
switch_status_t loadModMonoManaged() \r
{\r
- \r
- /* Find and load mod_mono_managed.exe */ \r
+ /* Find and load mod_mono_managed.exe */ \r
char filename[256];\r
- \r
-switch_snprintf(filename, 256, "%s%s%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_PATH_SEPARATOR, MOD_MONO_MANAGED_DLL);\r
- \r
-globals.domain = mono_jit_init(filename);\r
- \r
\r
-if (!globals.domain) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_jit_init failed.\n");\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
+ switch_snprintf(filename, 256, "%s%s%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_PATH_SEPARATOR, MOD_MONO_MANAGED_DLL);\r
+ globals.domain = mono_jit_init(filename);\r
\r
- /* Open the assembly */ \r
- globals.mod_mono_asm = mono_domain_assembly_open(globals.domain, filename);\r
- \r
-if (!globals.mod_mono_asm) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_domain_assembly_open failed.\n");\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
+ if (!globals.domain) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_jit_init failed.\n");\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
\r
-}\r
+ /* Open the assembly */ \r
+ globals.mod_mono_asm = mono_domain_assembly_open(globals.domain, filename);\r
\r
+ if (!globals.mod_mono_asm) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_domain_assembly_open failed.\n");\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
\r
MonoMethod * getMethod(const char *name, MonoClass * klass) \r
{\r
- \r
-MonoMethodDesc * desc;\r
- \r
-MonoMethod * method;\r
- \r
-desc = mono_method_desc_new(name, TRUE);\r
- \r
-method = mono_method_desc_search_in_class(desc, klass);\r
- \r
-if (!method) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find %s method.\n", name);\r
- \r
-return NULL;\r
- \r
-}\r
- \r
-return method;\r
+ MonoMethodDesc * desc;\r
+ MonoMethod * method;\r
\r
-}\r
+ desc = mono_method_desc_new(name, TRUE);\r
+ method = mono_method_desc_search_in_class(desc, klass);\r
\r
+ if (!method) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find %s method.\n", name);\r
+ return NULL;\r
+ }\r
+\r
+ return method;\r
+}\r
\r
switch_status_t findLoader() \r
{\r
- \r
- /* Find loader class and methods */ \r
- MonoImage * img;\r
- \r
-MonoClass * loaderClass;\r
- \r
-img = mono_assembly_get_image(globals.mod_mono_asm);\r
- \r
-loaderClass = mono_class_from_name(img, "FreeSWITCH", "Loader");\r
- \r
-if (!loaderClass) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find FreeSWITCH.Loader class.\n");\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
+ /* Find loader class and methods */ \r
+ MonoClass * loaderClass;\r
+ MonoImage * img = mono_assembly_get_image(globals.mod_mono_asm);\r
\r
-globals.loadMethod = getMethod("FreeSWITCH.Loader:Load()", loaderClass);\r
- \r
-if (!globals.loadMethod)\r
+ if (!(loaderClass = mono_class_from_name(img, "FreeSWITCH", "Loader"))) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find FreeSWITCH.Loader class.\n");\r
return SWITCH_STATUS_FALSE;\r
- \r
+ }\r
\r
-globals.unloadMethod = getMethod("FreeSWITCH.Loader:Unload()", loaderClass);\r
- \r
-if (!globals.unloadMethod)\r
+ if (!(globals.loadMethod = getMethod("FreeSWITCH.Loader:Load()", loaderClass))) {\r
return SWITCH_STATUS_FALSE;\r
- \r
+ }\r
\r
-globals.runMethod = getMethod("FreeSWITCH.Loader:Run(string,intptr)", loaderClass);\r
- \r
-if (!globals.runMethod)\r
+ if (!(globals.unloadMethod = getMethod("FreeSWITCH.Loader:Unload()", loaderClass))) {\r
return SWITCH_STATUS_FALSE;\r
- \r
+ }\r
\r
-globals.executeMethod = getMethod("FreeSWITCH.Loader:Execute(string,intptr,intptr)", loaderClass);\r
- \r
-if (!globals.executeMethod)\r
+ if (!(globals.runMethod = getMethod("FreeSWITCH.Loader:Run(string,intptr)", loaderClass))) {\r
return SWITCH_STATUS_FALSE;\r
- \r
+ }\r
\r
-globals.executeBackgroundMethod = getMethod("FreeSWITCH.Loader:ExecuteBackground(string)", loaderClass);\r
- \r
-if (!globals.executeBackgroundMethod)\r
+ if (!(globals.executeMethod = getMethod("FreeSWITCH.Loader:Execute(string,intptr,intptr)", loaderClass))) {\r
return SWITCH_STATUS_FALSE;\r
- \r
+ }\r
\r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found all loader functions.\n");\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
+ if (!(globals.executeBackgroundMethod = getMethod("FreeSWITCH.Loader:ExecuteBackground(string)", loaderClass))) {\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found all loader functions.\n");\r
+ return SWITCH_STATUS_SUCCESS;\r
}\r
\r
-\r
-\r
SWITCH_MODULE_LOAD_FUNCTION(mod_mono_load) \r
{\r
- \r
- /* connect my internal structure to the blank pointer passed to me */ \r
- *module_interface = switch_loadable_module_create_module_interface(pool, modname);\r
- \r
-globals.pool = pool;\r
- \r
+ /* connect my internal structure to the blank pointer passed to me */ \r
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);\r
\r
-if (setMonoDirs() != SWITCH_STATUS_SUCCESS) {\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
-if (loadModMonoManaged() != SWITCH_STATUS_SUCCESS) {\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
-if (findLoader() != SWITCH_STATUS_SUCCESS) {\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
+ globals.pool = pool;\r
\r
- /* Not sure if this is necesary on the loading thread */ \r
- mono_thread_attach(globals.domain);\r
- \r
-mono_add_internal_call("FreeSWITCH.Native.MonoSession::InitMonoSession", InitMonoSession);\r
- \r
+ if (setMonoDirs() != SWITCH_STATUS_SUCCESS) {\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
\r
- /* Run loader */ \r
- MonoObject * objResult;\r
- \r
-MonoObject * exception = NULL;\r
- \r
-objResult = mono_runtime_invoke(globals.loadMethod, NULL, NULL, &exception);\r
- \r
-if (exception) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load threw an exception.\n");\r
- \r
-mono_print_unhandled_exception(exception);\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
-if (*(int *) mono_object_unbox(objResult)) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Load completed successfully.\n");\r
- \r
-} else {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load did not return true.\n");\r
- \r
-return SWITCH_STATUS_FALSE;\r
- \r
-}\r
- \r
+ if (loadModMonoManaged() != SWITCH_STATUS_SUCCESS) {\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
+\r
+ if (findLoader() != SWITCH_STATUS_SUCCESS) {\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
\r
+ /* Not sure if this is necesary on the loading thread */ \r
+ mono_thread_attach(globals.domain);\r
\r
- /* We're good to register */ \r
- switch_api_interface_t *api_interface;\r
- \r
-switch_application_interface_t *app_interface;\r
- \r
+ mono_add_internal_call("FreeSWITCH.Native.MonoSession::InitMonoSession", InitMonoSession);\r
\r
-SWITCH_ADD_API(api_interface, "monorun", "Run a module (ExecuteBackground)", monorun_api_function, "<module> [<args>]");\r
- \r
-SWITCH_ADD_API(api_interface, "mono", "Run a module as an API function (Execute)", mono_api_function, "<module> [<args>]");\r
- \r
-SWITCH_ADD_APP(app_interface, "mono", "Run Mono IVR", "Run a Mono IVR on a channel", mono_app_function, "<modulename> [<args>]", SAF_NONE);\r
- \r
+ /* Run loader */ \r
+ MonoObject * objResult;\r
+ MonoObject * exception = NULL;\r
\r
-return SWITCH_STATUS_SUCCESS;\r
+ objResult = mono_runtime_invoke(globals.loadMethod, NULL, NULL, &exception);\r
\r
-}\r
+ if (exception) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load threw an exception.\n");\r
+ mono_print_unhandled_exception(exception);\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
+\r
+ if (*(int *) mono_object_unbox(objResult)) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Load completed successfully.\n");\r
+ } else {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load did not return true.\n");\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
\r
+ /* We're good to register */ \r
+ switch_api_interface_t *api_interface;\r
+ switch_application_interface_t *app_interface;\r
+\r
+ SWITCH_ADD_API(api_interface, "monorun", "Run a module (ExecuteBackground)", monorun_api_function, "<module> [<args>]");\r
+ SWITCH_ADD_API(api_interface, "mono", "Run a module as an API function (Execute)", mono_api_function, "<module> [<args>]");\r
+ SWITCH_ADD_APP(app_interface, "mono", "Run Mono IVR", "Run a Mono IVR on a channel", mono_app_function, "<modulename> [<args>]", SAF_NONE);\r
\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
\r
SWITCH_STANDARD_API(monorun_api_function) \r
{\r
- \r
- // TODO: Should we be detaching after all this?\r
- mono_thread_attach(globals.domain);\r
- \r
-if (switch_strlen_zero(cmd)) {\r
- \r
-stream->write_function(stream, "-ERR no args specified!\n");\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
- \r
-}\r
- \r
+ // TODO: Should we be detaching after all this?\r
+ mono_thread_attach(globals.domain);\r
+\r
+ if (switch_strlen_zero(cmd)) {\r
+ stream->write_function(stream, "-ERR no args specified!\n");\r
+ return SWITCH_STATUS_SUCCESS;\r
+ }\r
\r
- // ExecuteBackground(string command)\r
+ // ExecuteBackground(string command)\r
void *args[1];\r
- \r
-args[0] = mono_string_new(globals.domain, cmd);\r
- \r
-MonoObject * exception = NULL;\r
- \r
-MonoObject * objResult = mono_runtime_invoke(globals.executeBackgroundMethod, NULL, args, &exception);\r
- \r
-if (exception) {\r
- \r
-stream->write_function(stream, "-ERR FreeSWITCH.Loader.ExecuteBackground threw an exception.\n");\r
- \r
-mono_print_unhandled_exception(exception);\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
- \r
-}\r
- \r
-if (*(int *) mono_object_unbox(objResult)) {\r
- \r
-stream->write_function(stream, "+OK\n");\r
- \r
-} else {\r
- \r
-stream->write_function(stream, "-ERR ExecuteBackground returned false (unknown module?).\n");\r
- \r
-}\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
\r
-}\r
+ args[0] = mono_string_new(globals.domain, cmd);\r
+ MonoObject * exception = NULL;\r
+ MonoObject * objResult = mono_runtime_invoke(globals.executeBackgroundMethod, NULL, args, &exception);\r
\r
+ if (exception) {\r
+ stream->write_function(stream, "-ERR FreeSWITCH.Loader.ExecuteBackground threw an exception.\n");\r
+ mono_print_unhandled_exception(exception);\r
+ return SWITCH_STATUS_SUCCESS;\r
+ }\r
\r
+ if (*(int *) mono_object_unbox(objResult)) {\r
+ stream->write_function(stream, "+OK\n");\r
+ } else {\r
+ stream->write_function(stream, "-ERR ExecuteBackground returned false (unknown module?).\n");\r
+ }\r
+\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
\r
SWITCH_STANDARD_API(mono_api_function) \r
{\r
- \r
-mono_thread_attach(globals.domain);\r
- \r
-if (switch_strlen_zero(cmd)) {\r
- \r
-stream->write_function(stream, "-ERR no args specified!\n");\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
- \r
-}\r
- \r
+ mono_thread_attach(globals.domain);\r
\r
- // Method is: Execute(string command, IntPtr streamPtr, IntPtr eventPtr)\r
+ if (switch_strlen_zero(cmd)) {\r
+ stream->write_function(stream, "-ERR no args specified!\n");\r
+ return SWITCH_STATUS_SUCCESS;\r
+ }\r
+\r
+ // Method is: Execute(string command, IntPtr streamPtr, IntPtr eventPtr)\r
void *args[3];\r
- \r
-args[0] = mono_string_new(globals.domain, cmd);\r
- \r
-args[1] = &stream; // Address of the arguments\r
+\r
+ args[0] = mono_string_new(globals.domain, cmd);\r
+ args[1] = &stream; // Address of the arguments\r
args[2] = &(stream->param_event);\r
- \r
\r
-MonoObject * exception = NULL;\r
- \r
-MonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);\r
- \r
-if (exception) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute mono %s.\n", cmd);\r
- \r
-mono_print_unhandled_exception(exception);\r
- \r
-}\r
- \r
-if (!(*(int *) mono_object_unbox(objResult))) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Execute failed for %s (unknown module?).\n", cmd);\r
- \r
-}\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
+ MonoObject * exception = NULL;\r
+ MonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);\r
\r
-}\r
+ if (exception) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute mono %s.\n", cmd);\r
+ mono_print_unhandled_exception(exception);\r
+ }\r
\r
+ if (!(*(int *) mono_object_unbox(objResult))) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Execute failed for %s (unknown module?).\n", cmd);\r
+ }\r
\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
\r
SWITCH_STANDARD_APP(mono_app_function) \r
{\r
- \r
-mono_thread_attach(globals.domain);\r
- \r
-if (switch_strlen_zero(data)) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No args specified!\n");\r
- \r
-}\r
- \r
+ mono_thread_attach(globals.domain);\r
+\r
+ if (switch_strlen_zero(data)) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No args specified!\n");\r
+ }\r
\r
- // bool Run(string command, IntPtr sessionHandle)\r
+ // bool Run(string command, IntPtr sessionHandle)\r
void *args[2];\r
- \r
-args[0] = mono_string_new(globals.domain, data);\r
- \r
-args[1] = &session;\r
- \r
\r
-MonoObject * exception = NULL;\r
- \r
-MonoObject * objResult = mono_runtime_invoke(globals.runMethod, NULL, args, &exception);\r
- \r
-if (exception) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute application mono %s.\n", data);\r
- \r
-mono_print_unhandled_exception(exception);\r
- \r
-}\r
- \r
-if (!(*(int *) mono_object_unbox(objResult))) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Application run failed for %s (unknown module?).\n", data);\r
- \r
-}\r
+ args[0] = mono_string_new(globals.domain, data);\r
+ args[1] = &session;\r
+\r
+ MonoObject * exception = NULL;\r
+ MonoObject * objResult = mono_runtime_invoke(globals.runMethod, NULL, args, &exception);\r
\r
+ if (exception) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute application mono %s.\n", data);\r
+ mono_print_unhandled_exception(exception);\r
+ }\r
+\r
+ if (!(*(int *) mono_object_unbox(objResult))) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Application run failed for %s (unknown module?).\n", data);\r
+ }\r
} \r
\r
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mono_shutdown) \r
{\r
- \r
-mono_thread_attach(globals.domain);\r
- \r
-MonoObject * ex;\r
- \r
-mono_runtime_invoke(globals.unloadMethod, NULL, NULL, &ex);\r
- \r
-if (ex) {\r
- \r
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception occurred in Loader::Unload.\n");\r
- \r
-mono_print_unhandled_exception(ex);\r
- \r
-}\r
- \r
-mono_runtime_set_shutting_down();\r
- \r
-mono_runtime_cleanup(globals.domain);\r
- \r
-mono_runtime_quit();\r
- \r
-return SWITCH_STATUS_SUCCESS;\r
+ MonoObject * ex;\r
\r
-}\r
+ mono_thread_attach(globals.domain);\r
+ mono_runtime_invoke(globals.unloadMethod, NULL, NULL, &ex);\r
\r
+ if (ex) {\r
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception occurred in Loader::Unload.\n");\r
+ mono_print_unhandled_exception(ex);\r
+ }\r
+\r
+ mono_runtime_set_shutting_down();\r
+ mono_runtime_cleanup(globals.domain);\r
+ mono_runtime_quit();\r
\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
\r
SWITCH_END_EXTERN_C\r