Author: michaelgg Date: Sat Oct 4 00:14:11 2008 New Revision: 9819 Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch.i freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp Log: Unified Mono and CLR in freeswitch_managed Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch.i ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_managed/freeswitch.i (original) +++ freeswitch/trunk/src/mod/languages/mod_managed/freeswitch.i Sat Oct 4 00:14:11 2008 @@ -39,11 +39,10 @@ %typemap(csclassmodifiers) switch_xml_flag_t "[System.Flags] public enum" %typemap(csclassmodifiers) switch_xml_section_enum_t "[System.Flags] public enum" - // Some things we dont want exposed to managed users directly, since // we're gonna handle them with our own internalcall methods -%ignore dtmfDelegateHandle; -%ignore hangupDelegateHandle; +%ignore dtmfDelegate; +%ignore hangupDelegate; %ignore setHangupHook; %ignore beginAllowThreads; %ignore endAllowThreads; @@ -114,6 +113,7 @@ %include switch.h %include switch_types.h +//%include switch_apr.h %include switch_core_db.h %include switch_regex.h Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp (original) +++ freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp Sat Oct 4 00:14:11 2008 @@ -45,6 +45,10 @@ #include "freeswitch_managed.h" #ifdef _MANAGED +#define ATTACH_THREADS +#else +#define ATTACH_THREADS mono_thread_attach(globals.domain); +#endif ManagedSession::ManagedSession():CoreSession() { @@ -61,21 +65,6 @@ } -ManagedSession::~ManagedSession() -{ - // Do auto-hangup ourselves because CoreSession can't call check_hangup_hook - // after ManagedSession destruction (cause at point it's pure virtual) - if (session) { - channel = switch_core_session_get_channel(session); - if (switch_test_flag(this, S_HUP) && !switch_channel_test_flag(channel, CF_TRANSFER)) { - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - setAutoHangup(0); - } - // Don't let any callbacks use this CoreSession anymore - switch_channel_set_private(channel, "CoreSession", NULL); - } -} - bool ManagedSession::begin_allow_threads() { return true; @@ -86,49 +75,10 @@ return true; } -void ManagedSession::check_hangup_hook() -{ - if (!hangupDelegate) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "hangupDelegateHandle didn't get an object."); - return; - } - hangupDelegate(); -} - -switch_status_t ManagedSession::run_dtmf_callback(void *input, switch_input_type_t itype) -{ - if (!dtmfDelegate) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dtmfDelegateHandle didn't get an object."); - return SWITCH_STATUS_FALSE;; - } - char *result = dtmfDelegate(input, itype); - - switch_status_t status = process_callback_result(result); - Marshal::FreeCoTaskMem(IntPtr(result)); // I think this is right - return status; -} - -#else - -ManagedSession::ManagedSession():CoreSession() -{ - -} - -ManagedSession::ManagedSession(char *uuid):CoreSession(uuid) -{ - -} - -ManagedSession::ManagedSession(switch_core_session_t *session):CoreSession(session) -{ - -} ManagedSession::~ManagedSession() { - mono_thread_attach(globals.domain); - + ATTACH_THREADS // Do auto-hangup ourselves because CoreSession can't call check_hangup_hook // after ManagedSession destruction (cause at point it's pure virtual) if (session) { @@ -142,20 +92,11 @@ } } -bool ManagedSession::begin_allow_threads() -{ - return true; -} - -bool ManagedSession::end_allow_threads() -{ - return true; -} - void ManagedSession::check_hangup_hook() { - mono_thread_attach(globals.domain); + ATTACH_THREADS if (!hangupDelegate) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "hangupDelegate is null."); return; } hangupDelegate(); @@ -163,14 +104,19 @@ switch_status_t ManagedSession::run_dtmf_callback(void *input, switch_input_type_t itype) { - mono_thread_attach(globals.domain); + ATTACH_THREADS if (!dtmfDelegate) { - return SWITCH_STATUS_SUCCESS; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "dtmfDelegate is null."); + return SWITCH_STATUS_FALSE;; } - char *resPtr = dtmfDelegate(input, itype); - switch_status_t status = process_callback_result(resPtr); - g_free(resPtr); + char *result = dtmfDelegate(input, itype); + switch_status_t status = process_callback_result(result); + +#if WIN32 + CoTaskMemFree(result); +#else + g_free(result) +#endif return status; } -#endif