Hack patch to avoid hanguphook calling check_hangup_hook purely virtually

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8789 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Giagnocavo 2008-06-09 00:09:42 +00:00
parent 66948098d8
commit e5233533b3
1 changed files with 103 additions and 67 deletions

View File

@ -38,71 +38,107 @@
#include <mono/metadata/threads.h> #include <mono/metadata/threads.h>
#include <mono/metadata/metadata.h> #include <mono/metadata/metadata.h>
#include "freeswitch_mono.h" #include "freeswitch_mono.h"
MonoSession::MonoSession():CoreSession()
{ MonoSession::MonoSession():CoreSession()
} MonoSession::MonoSession(char *uuid):CoreSession(uuid) {
{
} MonoSession::MonoSession(switch_core_session_t *session):CoreSession(session) }
{
} MonoSession::~MonoSession() MonoSession::MonoSession(char *uuid):CoreSession(uuid)
{ {
mono_thread_attach(globals.domain);
if (dtmfDelegateHandle) }
mono_gchandle_free(dtmfDelegateHandle);
if (hangupDelegateHandle) MonoSession::MonoSession(switch_core_session_t *session):CoreSession(session)
mono_gchandle_free(hangupDelegateHandle); {
}
}
bool MonoSession::begin_allow_threads()
{ MonoSession::~MonoSession()
return true; {
} mono_thread_attach(globals.domain);
bool MonoSession::end_allow_threads() if (dtmfDelegateHandle) {
{ mono_gchandle_free(dtmfDelegateHandle);
return true; }
}
void MonoSession::check_hangup_hook() if (hangupDelegateHandle) {
{ mono_gchandle_free(hangupDelegateHandle);
mono_thread_attach(globals.domain); }
if (!hangupDelegateHandle) {
return; // Do auto-hangup ourselves because CoreSession can't call check_hangup_hook
} // after MonoSession destruction (cause at point it's pure virtual)
MonoObject * hangupDelegate = mono_gchandle_get_target(hangupDelegateHandle); if (session) {
if (!hangupDelegate) { channel = switch_core_session_get_channel(session);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "hangupDelegateHandle didn't get an object."); if (switch_test_flag(this, S_HUP) && !switch_channel_test_flag(channel, CF_TRANSFER)) {
return; switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
} setAutoHangup(0);
MonoObject * ex = NULL; }
mono_runtime_delegate_invoke(hangupDelegate, NULL, &ex); }
if (ex) { }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "hangupDelegate threw an exception.");
}
}
switch_status_t MonoSession::run_dtmf_callback(void *input, switch_input_type_t itype) bool MonoSession::begin_allow_threads()
{ {
mono_thread_attach(globals.domain); return true;
if (!dtmfDelegateHandle) { }
return SWITCH_STATUS_SUCCESS;
}
MonoObject * dtmfDelegate = mono_gchandle_get_target(dtmfDelegateHandle);
if (!dtmfDelegate) { bool MonoSession::end_allow_threads()
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dtmfDelegateHandle didn't get an object."); {
return SWITCH_STATUS_SUCCESS; return true;
} }
void *args[2];
args[0] = &input;
args[1] = &itype; void MonoSession::check_hangup_hook()
MonoObject * ex = NULL; {
MonoObject * res = mono_runtime_delegate_invoke(dtmfDelegate, args, &ex); mono_thread_attach(globals.domain);
if (ex) { if (!hangupDelegateHandle) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dtmfDelegate threw an exception."); return;
return SWITCH_STATUS_FALSE; }
}
char *resPtr = mono_string_to_utf8((MonoString *) res); MonoObject * hangupDelegate = mono_gchandle_get_target(hangupDelegateHandle);
switch_status_t status = process_callback_result(resPtr); if (!hangupDelegate) {
g_free(resPtr); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "hangupDelegateHandle didn't get an object.");
return status; return;
} }
MonoObject * ex = NULL;
mono_runtime_delegate_invoke(hangupDelegate, NULL, &ex);
if (ex) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "hangupDelegate threw an exception.");
}
}
switch_status_t MonoSession::run_dtmf_callback(void *input, switch_input_type_t itype)
{
mono_thread_attach(globals.domain);
if (!dtmfDelegateHandle) {
return SWITCH_STATUS_SUCCESS;
}
MonoObject * dtmfDelegate = mono_gchandle_get_target(dtmfDelegateHandle);
if (!dtmfDelegate) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dtmfDelegateHandle didn't get an object.");
return SWITCH_STATUS_SUCCESS;
}
void *args[2];
args[0] = &input;
args[1] = &itype;
MonoObject * ex = NULL;
MonoObject * res = mono_runtime_delegate_invoke(dtmfDelegate, args, &ex);
if (ex) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dtmfDelegate threw an exception.");
return SWITCH_STATUS_FALSE;
}
char *resPtr = mono_string_to_utf8((MonoString *) res);
switch_status_t status = process_callback_result(resPtr);
g_free(resPtr);
return status;
}