\r
#include <switch.h>\r
\r
-SWITCH_BEGIN_EXTERN_C \r
#include "freeswitch_managed.h" \r
\r
+#ifdef _MANAGED\r
+#include <mscoree.h>\r
+using namespace System;\r
+using namespace System::Runtime::InteropServices;\r
+#endif\r
+\r
+SWITCH_BEGIN_EXTERN_C \r
+\r
SWITCH_MODULE_LOAD_FUNCTION(mod_managed_load);\r
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_managed_shutdown);\r
SWITCH_MODULE_DEFINITION(mod_managed, mod_managed_load, mod_managed_shutdown, NULL);\r
SWITCH_STANDARD_API(managed_api_function); /* Execute */\r
SWITCH_STANDARD_APP(managed_app_function); /* Run */\r
\r
-SWITCH_END_EXTERN_C\r
+#define MOD_MANAGED_ASM_NAME "mod_managed_lib"\r
+#define MOD_MANAGED_ASM_V1 1\r
+#define MOD_MANAGED_ASM_V2 0\r
+#define MOD_MANAGED_ASM_V3 0\r
+#define MOD_MANAGED_ASM_V4 0\r
+#define MOD_MANAGED_DLL MOD_MANAGED_ASM_NAME ".dll"\r
\r
-#define MOD_MANAGED_DLL "mod_managed_lib.dll"\r
+mod_managed_globals globals = { 0 };\r
\r
#ifndef _MANAGED \r
- \r
-SWITCH_BEGIN_EXTERN_C \r
-\r
-#include <glib.h>\r
-#include <mono/jit/jit.h>\r
-#include <mono/metadata/assembly.h>\r
-#include <mono/metadata/environment.h>\r
-#include <mono/metadata/threads.h>\r
-#include <mono/metadata/debug-helpers.h>\r
- \r
-#ifdef WIN32\r
-#include <shlobj.h>\r
-#define EXPORT __declspec(dllexport)\r
-#else\r
-#define EXPORT \r
-#endif \r
-\r
-#define MOD_MONO_MANAGED_ASM_NAME "mod_managed_lib"\r
-#define MOD_MONO_MANAGED_ASM_V1 1\r
-#define MOD_MONO_MANAGED_ASM_V2 0\r
-#define MOD_MONO_MANAGED_ASM_V3 0\r
-#define MOD_MONO_MANAGED_ASM_V4 0\r
-\r
-mod_mono_globals globals = \r
-{ 0 };\r
\r
// Sets up delegates (and anything else needed) on the ManagedSession object\r
// Called via internalcall\r
session->hangupDelegate = hangupDelegate;\r
}\r
\r
+#ifdef WIN32\r
+#include <shlobj.h>\r
+#endif \r
+\r
switch_status_t setMonoDirs() \r
{\r
#ifdef WIN32 \r
\r
/* Already loaded? */\r
MonoAssemblyName name;\r
- name.name = MOD_MONO_MANAGED_ASM_NAME;\r
- name.major = MOD_MONO_MANAGED_ASM_V1;\r
- name.minor = MOD_MONO_MANAGED_ASM_V2;\r
- name.revision = MOD_MONO_MANAGED_ASM_V3;\r
- name.build = MOD_MONO_MANAGED_ASM_V4;\r
+ name.name = MOD_MANAGED_ASM_NAME;\r
+ name.major = MOD_MANAGED_ASM_V1;\r
+ name.minor = MOD_MANAGED_ASM_V2;\r
+ name.revision = MOD_MANAGED_ASM_V3;\r
+ name.build = MOD_MANAGED_ASM_V4;\r
name.culture = "";\r
name.hash_value = "";\r
\r
return SWITCH_STATUS_SUCCESS;\r
}\r
\r
-SWITCH_STANDARD_API(managedrun_api_function) \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
- void *args[1];\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(managed_api_function) \r
-{\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
- // Method is: Execute(string command, IntPtr streamPtr, IntPtr eventPtr)\r
- void *args[3];\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
- MonoObject * exception = NULL;\r
- MonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);\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(managed_app_function) \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
- void *args[2];\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_managed_shutdown) \r
-{\r
- MonoObject * ex;\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
- if (!globals.embedded) {\r
- mono_jit_cleanup(globals.domain);\r
- }\r
-\r
- return SWITCH_STATUS_SUCCESS;\r
-}\r
-\r
-SWITCH_END_EXTERN_C\r
#endif\r
\r
/**********************************************************\r
**********************************************************/\r
\r
#ifdef _MANAGED\r
-\r
-#include <mscoree.h>\r
-\r
-using namespace System;\r
-using namespace System::Runtime::InteropServices;\r
-\r
-SWITCH_BEGIN_EXTERN_C \r
-\r
-struct dotnet_conf_t {\r
- switch_memory_pool_t *pool;\r
- //ICLRRuntimeHost *pCorRuntime;\r
- //HMODULE lock_module;\r
- //OSVERSIONINFO osver;\r
- //char *cor_version;\r
-} globals;\r
-\r
-\r
// Sets up delegates (and anything else needed) on the ManagedSession object\r
// Called from ManagedSession.Initialize Managed -> this is Unmanaged code so all pointers are marshalled and prevented from GC\r
// Exported method.\r
SWITCH_ADD_APP(app_interface, "managed", "Run CLI App", "Run an App on a channel", managed_app_function, "<modulename> [<args>]", SAF_NONE);\r
return SWITCH_STATUS_SUCCESS;\r
}\r
-\r
+#endif\r
\r
SWITCH_STANDARD_API(managedrun_api_function) \r
{\r
+ int success;\r
if (switch_strlen_zero(cmd)) {\r
stream->write_function(stream, "-ERR no args specified!\n"); \r
return SWITCH_STATUS_SUCCESS;\r
}\r
-\r
+#ifdef _MANAGED\r
Object ^objResult;\r
try {\r
objResult = FreeSwitchManaged::executeBackgroundMethod->Invoke(nullptr, gcnew array<Object^> { gcnew String(cmd) } );\r
Marshal::FreeHGlobal(msg);\r
return SWITCH_STATUS_FALSE;\r
}\r
+ success = *reinterpret_cast<bool^>(objResult);\r
+#else\r
+ mono_thread_attach(globals.domain);\r
+ void *args[1];\r
\r
- if (*reinterpret_cast<bool^>(objResult)) {\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
+ success = *(int *) mono_object_unbox(objResult);\r
+#endif\r
+ if (success) {\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
+\r
SWITCH_STANDARD_API(managed_api_function) \r
{\r
+ int success;\r
if (switch_strlen_zero(cmd)) {\r
stream->write_function(stream, "-ERR no args specified!\n"); \r
return SWITCH_STATUS_SUCCESS;\r
}\r
- \r
+#ifdef _MANAGED\r
Object ^objResult;\r
try {\r
objResult = FreeSwitchManaged::executeMethod->Invoke(nullptr, gcnew array<Object^>{gcnew String(cmd),gcnew IntPtr(stream), gcnew IntPtr(stream->param_event)});\r
Marshal::FreeHGlobal(msg);\r
return SWITCH_STATUS_FALSE;\r
}\r
- \r
- if (!*reinterpret_cast<bool^>(objResult)) {\r
+ success = *reinterpret_cast<bool^>(objResult);\r
+#else\r
+ mono_thread_attach(globals.domain);\r
+ void *args[3];\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
+ MonoObject * exception = NULL;\r
+ MonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);\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
+ success = *(int *) mono_object_unbox(objResult);\r
+#endif\r
+ if (!success) {\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
+\r
SWITCH_STANDARD_APP(managed_app_function) \r
{\r
+ int success;\r
if (switch_strlen_zero(data)) {\r
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No args specified!\n");\r
}\r
- \r
+#ifdef _MANAGED\r
Object ^objResult;\r
try {\r
objResult = FreeSwitchManaged::runMethod->Invoke(nullptr, gcnew array<Object^>{gcnew String(data),gcnew IntPtr(session)});\r
Marshal::FreeHGlobal(msg);\r
return;\r
}\r
- \r
- if (!*reinterpret_cast<bool^>(objResult)) { \r
+ success = *reinterpret_cast<bool^>(objResult);\r
+#else\r
+ mono_thread_attach(globals.domain);\r
+ void *args[2];\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
+ success = *(int *) mono_object_unbox(objResult);\r
+#endif\r
+ if (!success) {\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_managed_shutdown) \r
{\r
+#ifdef _MANAGED\r
Object ^objResult;\r
try {\r
objResult = FreeSwitchManaged::unloadMethod->Invoke(nullptr, nullptr);\r
Marshal::FreeHGlobal(msg);\r
return SWITCH_STATUS_FALSE;;\r
}\r
+#else\r
+ MonoObject * ex;\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
+ if (!globals.embedded) {\r
+ mono_jit_cleanup(globals.domain);\r
+ }\r
+#endif\r
return SWITCH_STATUS_SUCCESS;\r
}\r
\r
SWITCH_END_EXTERN_C\r
-\r
-#endif
\ No newline at end of file