*/ \r
\r
#include <switch.h>\r
- \r\rSWITCH_BEGIN_EXTERN_C \r \r
+ \r
+\r
+SWITCH_BEGIN_EXTERN_C \r
+ \r
#include "freeswitch_mono.h"\r
#include <glib.h>\r
#include <mono/jit/jit.h>\r
#define EXPORT __declspec(dllexport)\r
#elif\r
#define EXPORT \r
-#endif /* \r */
+#endif /* \r
+ */\r
\r
#define MOD_MONO_MANAGED_DLL "mod_mono_managed.dll"\r
- \rmod_mono_globals globals = {
-0};
-
-\r\rSWITCH_MODULE_LOAD_FUNCTION(mod_mono_load);
-\rSWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mono_shutdown);
-\rSWITCH_MODULE_DEFINITION(mod_mono, mod_mono_load, mod_mono_shutdown, NULL);
-\r\rSWITCH_STANDARD_API(monorun_api_function); /* ExecuteBackground */
-\rSWITCH_STANDARD_API(mono_api_function); /* Execute */
-\rSWITCH_STANDARD_APP(mono_app_function); /* Run */
-\r\r\r
+ \r
+mod_mono_globals globals = {\r
+0};\r
+\r
+\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
// Sets up delegates (and anything else needed) on the MonoSession object\r
// Called via internalcall\r
- SWITCH_MOD_DECLARE(void) InitMonoSession(MonoSession * session, MonoObject * dtmfDelegate, MonoObject * hangupDelegate) \r
-{
- \rswitch_assert(session);
- \rif (!session)
- return;
- \rsession->setDTMFCallback(NULL, "");
- \rsession->setHangupHook(NULL);
- \rsession->dtmfDelegateHandle = mono_gchandle_new(dtmfDelegate, FALSE);
- \rsession->hangupDelegateHandle = mono_gchandle_new(hangupDelegate, FALSE);
-\r}
-\r\rswitch_status_t setMonoDirs() \r
-{
+SWITCH_MOD_DECLARE(void) InitMonoSession(MonoSession * session, MonoObject * dtmfDelegate, MonoObject * hangupDelegate) \r
+{\r
+ switch_assert(session);\r
+ if (!session) {\r
+ return;\r
+ }\r
+ session->setDTMFCallback(NULL, "");\r
+ session->setHangupHook(NULL);\r
+ session->dtmfDelegateHandle = mono_gchandle_new(dtmfDelegate, FALSE);\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;
- \rWIN32_FIND_DATA findData;
- \rchar progFilesPath[MAX_PATH];
- \rchar findPath[MAX_PATH];
- \rSHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progFilesPath);
- \rswitch_snprintf(findPath, MAX_PATH, "%s\\Mono-*", progFilesPath);
- \rhFind = FindFirstFile(findPath, &findData);
- \rif (hFind == INVALID_HANDLE_VALUE) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error looking for Mono in Program Files.\n");
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \rwhile ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
- \rif (FindNextFile(hFind, &findData) == 0) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find Mono directory in Program Files.\n");
- \rFindClose(hFind);
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \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
- {
- \rchar libPath[MAX_PATH];
- \rchar etcPath[MAX_PATH];
- \rswitch_snprintf(libPath, MAX_PATH, "%s\\%s\\lib", progFilesPath, findData.cFileName);
- \rswitch_snprintf(etcPath, MAX_PATH, "%s\\%s\\etc", progFilesPath, findData.cFileName);
- \rFindClose(hFind);
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Using Mono paths '%s' and '%s'.\n", libPath, etcPath);
- \rmono_set_dirs(libPath, etcPath);
- \rreturn SWITCH_STATUS_SUCCESS;
- \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
#elif\r
// On other platforms, it should just work if it hasn't been relocated\r
- mono_set_dirs(NULL, NULL);
- \rreturn SWITCH_STATUS_SUCCESS;
+ mono_set_dirs(NULL, NULL);\r
+ \r
+return SWITCH_STATUS_SUCCESS;\r
\r
-#endif /* \r */
-}
-\r\rswitch_status_t loadModMonoManaged() \r
-{
+#endif /* \r
+ */\r
+}\r
+\r
+\r
+switch_status_t loadModMonoManaged() \r
+{\r
\r
/* Find and load mod_mono_managed.exe */ \r
- char filename[256];
- \rswitch_snprintf(filename, 256, "%s%s%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_PATH_SEPARATOR, MOD_MONO_MANAGED_DLL);
- \rglobals.domain = mono_jit_init(filename);
- \r\rif (!globals.domain) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_jit_init failed.\n");
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \r\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
+\r
/* Open the assembly */ \r
- globals.mod_mono_asm = mono_domain_assembly_open(globals.domain, filename);
- \rif (!globals.mod_mono_asm) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_domain_assembly_open failed.\n");
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \rreturn SWITCH_STATUS_SUCCESS;
-\r}
-
-\r\rMonoMethod * getMethod(const char *name, MonoClass * klass) \r
-{
- \rMonoMethodDesc * desc;
- \rMonoMethod * method;
- \rdesc = mono_method_desc_new(name, TRUE);
- \rmethod = mono_method_desc_search_in_class(desc, klass);
- \rif (!method) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find %s method.\n", name);
- \rreturn NULL;
- \r}
- \rreturn method;
-\r}
-\r\rswitch_status_t findLoader() \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
+\r
+}\r
+\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
+\r
+}\r
+\r
+\r
+switch_status_t findLoader() \r
+{\r
\r
/* Find loader class and methods */ \r
- MonoImage * img;
- \rMonoClass * loaderClass;
- \rimg = mono_assembly_get_image(globals.mod_mono_asm);
- \rloaderClass = mono_class_from_name(img, "FreeSWITCH", "Loader");
- \rif (!loaderClass) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find FreeSWITCH.Loader class.\n");
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \r\rglobals.loadMethod = getMethod("FreeSWITCH.Loader:Load()", loaderClass);
- \rif (!globals.loadMethod)
- return SWITCH_STATUS_FALSE;
- \r\rglobals.unloadMethod = getMethod("FreeSWITCH.Loader:Unload()", loaderClass);
- \rif (!globals.unloadMethod)
- return SWITCH_STATUS_FALSE;
- \r\rglobals.runMethod = getMethod("FreeSWITCH.Loader:Run(string,intptr)", loaderClass);
- \rif (!globals.runMethod)
- return SWITCH_STATUS_FALSE;
- \r\rglobals.executeMethod = getMethod("FreeSWITCH.Loader:Execute(string,intptr,intptr)", loaderClass);
- \rif (!globals.executeMethod)
- return SWITCH_STATUS_FALSE;
- \r\rglobals.executeBackgroundMethod = getMethod("FreeSWITCH.Loader:ExecuteBackground(string)", loaderClass);
- \rif (!globals.executeBackgroundMethod)
- return SWITCH_STATUS_FALSE;
- \r\rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found all loader functions.\n");
- \rreturn SWITCH_STATUS_SUCCESS;
-\r}
-
-\r\rSWITCH_MODULE_LOAD_FUNCTION(mod_mono_load) \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
+\r
+globals.loadMethod = getMethod("FreeSWITCH.Loader:Load()", loaderClass);\r
+ \r
+if (!globals.loadMethod)\r
+ return SWITCH_STATUS_FALSE;\r
+ \r
+\r
+globals.unloadMethod = getMethod("FreeSWITCH.Loader:Unload()", loaderClass);\r
+ \r
+if (!globals.unloadMethod)\r
+ return SWITCH_STATUS_FALSE;\r
+ \r
+\r
+globals.runMethod = getMethod("FreeSWITCH.Loader:Run(string,intptr)", loaderClass);\r
+ \r
+if (!globals.runMethod)\r
+ return SWITCH_STATUS_FALSE;\r
+ \r
+\r
+globals.executeMethod = getMethod("FreeSWITCH.Loader:Execute(string,intptr,intptr)", loaderClass);\r
+ \r
+if (!globals.executeMethod)\r
+ return SWITCH_STATUS_FALSE;\r
+ \r
+\r
+globals.executeBackgroundMethod = getMethod("FreeSWITCH.Loader:ExecuteBackground(string)", loaderClass);\r
+ \r
+if (!globals.executeBackgroundMethod)\r
+ return SWITCH_STATUS_FALSE;\r
+ \r
+\r
+switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found all loader functions.\n");\r
+ \r
+return SWITCH_STATUS_SUCCESS;\r
+\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);
- \rglobals.pool = pool;
- \r\rif (setMonoDirs() != SWITCH_STATUS_SUCCESS) {
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \rif (loadModMonoManaged() != SWITCH_STATUS_SUCCESS) {
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \rif (findLoader() != SWITCH_STATUS_SUCCESS) {
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \r\r
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);\r
+ \r
+globals.pool = pool;\r
+ \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
+\r
/* Not sure if this is necesary on the loading thread */ \r
- mono_thread_attach(globals.domain);
- \rmono_add_internal_call("FreeSWITCH.Native.MonoSession::InitMonoSession", InitMonoSession);
- \r\r
+ mono_thread_attach(globals.domain);\r
+ \r
+mono_add_internal_call("FreeSWITCH.Native.MonoSession::InitMonoSession", InitMonoSession);\r
+ \r
+\r
/* Run loader */ \r
- MonoObject * objResult;
- \rMonoObject * exception = NULL;
- \robjResult = mono_runtime_invoke(globals.loadMethod, NULL, NULL, &exception);
- \rif (exception) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load threw an exception.\n");
- \rmono_print_unhandled_exception(exception);
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \rif (*(int *) mono_object_unbox(objResult)) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Load completed successfully.\n");
- \r} else {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load did not return true.\n");
- \rreturn SWITCH_STATUS_FALSE;
- \r}
- \r\r\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
+\r
+\r
/* We're good to register */ \r
- switch_api_interface_t *api_interface;
- \rswitch_application_interface_t *app_interface;
- \r\rSWITCH_ADD_API(api_interface, "monorun", "Run a module (ExecuteBackground)", monorun_api_function, "<module> [<args>]");
- \rSWITCH_ADD_API(api_interface, "mono", "Run a module as an API function (Execute)", mono_api_function, "<module> [<args>]");
- \rSWITCH_ADD_APP(app_interface, "mono", "Run Mono IVR", "Run a Mono IVR on a channel", mono_app_function, "<modulename> [<args>]", SAF_NONE);
- \r\rreturn SWITCH_STATUS_SUCCESS;
-\r}
-
-\r\rSWITCH_STANDARD_API(monorun_api_function) \r
-{
+ switch_api_interface_t *api_interface;\r
+ \r
+switch_application_interface_t *app_interface;\r
+ \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
+\r
+return SWITCH_STATUS_SUCCESS;\r
+\r
+}\r
+\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);
- \rif (switch_strlen_zero(cmd)) {
- \rstream->write_function(stream, "-ERR no args specified!\n");
- \rreturn SWITCH_STATUS_SUCCESS;
- \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
+\r
// ExecuteBackground(string command)\r
- void *args[1];
- \rargs[0] = mono_string_new(globals.domain, cmd);
- \rMonoObject * exception = NULL;
- \rMonoObject * objResult = mono_runtime_invoke(globals.executeBackgroundMethod, NULL, args, &exception);
- \rif (exception) {
- \rstream->write_function(stream, "-ERR FreeSWITCH.Loader.ExecuteBackground threw an exception.\n");
- \rmono_print_unhandled_exception(exception);
- \rreturn SWITCH_STATUS_SUCCESS;
- \r}
- \rif (*(int *) mono_object_unbox(objResult)) {
- \rstream->write_function(stream, "+OK\n");
- \r} else {
- \rstream->write_function(stream, "-ERR ExecuteBackground returned false (unknown module?).\n");
- \r}
- \rreturn SWITCH_STATUS_SUCCESS;
-\r}
-
-\r\rSWITCH_STANDARD_API(mono_api_function) \r
-{
- \rmono_thread_attach(globals.domain);
- \rif (switch_strlen_zero(cmd)) {
- \rstream->write_function(stream, "-ERR no args specified!\n");
- \rreturn SWITCH_STATUS_SUCCESS;
- \r}
- \r\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
+\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
+\r
// Method is: Execute(string command, IntPtr streamPtr, IntPtr eventPtr)\r
- void *args[3];
- \rargs[0] = mono_string_new(globals.domain, cmd);
- \rargs[1] = &stream; // Address of the arguments\r
- args[2] = &(stream->param_event);
- \r\rMonoObject * exception = NULL;
- \rMonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);
- \rif (exception) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute mono %s.\n", cmd);
- \rmono_print_unhandled_exception(exception);
- \r}
- \rif (!(*(int *) mono_object_unbox(objResult))) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Execute failed for %s (unknown module?).\n", cmd);
- \r}
- \rreturn SWITCH_STATUS_SUCCESS;
-\r}
-
-\r\rSWITCH_STANDARD_APP(mono_app_function) \r
-{
- \rmono_thread_attach(globals.domain);
- \rif (switch_strlen_zero(data)) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No args specified!\n");
- \r}
- \r\r
+ void *args[3];\r
+ \r
+args[0] = mono_string_new(globals.domain, cmd);\r
+ \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
+\r
+}\r
+\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
+\r
// bool Run(string command, IntPtr sessionHandle)\r
- void *args[2];
- \rargs[0] = mono_string_new(globals.domain, data);
- \rargs[1] = &session;
- \r\rMonoObject * exception = NULL;
- \rMonoObject * objResult = mono_runtime_invoke(globals.runMethod, NULL, args, &exception);
- \rif (exception) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute application mono %s.\n", data);
- \rmono_print_unhandled_exception(exception);
- \r}
- \rif (!(*(int *) mono_object_unbox(objResult))) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Application run failed for %s (unknown module?).\n", data);
- \r}
-\r} \r\rSWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mono_shutdown) \r
-{
- \rmono_thread_attach(globals.domain);
- \rMonoObject * ex;
- \rmono_runtime_invoke(globals.unloadMethod, NULL, NULL, &ex);
- \rif (ex) {
- \rswitch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception occurred in Loader::Unload.\n");
- \rmono_print_unhandled_exception(ex);
- \r}
- \rmono_runtime_set_shutting_down();
- \rmono_runtime_cleanup(globals.domain);
- \rmono_runtime_quit();
- \rreturn SWITCH_STATUS_SUCCESS;
-\r}
-
-\r\rSWITCH_END_EXTERN_C
+ 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
+\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
+\r
+}\r
+\r
+\r
+\r
+SWITCH_END_EXTERN_C\r