Hi,

 

I am having a third party VoIP client which exposes API in .NET to communicate with my application. I want to use this client as an endpoint in Freeswitch (like how it is implemented in “mod_skypopen” module), so that calls coming to this client can be handled at Freeswitch and (if required) bridge calls to clients connected to Freeswitch.

 

To implement this, I have written a managed module in which “ILoadNotificationPlugin” is implemented where config (client’s interface config) is loaded.

 

When there is an incoming call (ringing state) to the client, I get handle in managed module and trying to establish a session at freeswitch. While doing this I am getting exception as “Attempted to read or write protected memory. This is often an indication that other memory is corrupt.”

Here is the code that I am using… Could someone guide me if I am doing this correctly.

 

Note: I am following “mod_skypopen” as an example…

 

public static int new_inbound_channel(private_object pobject)

    {

                                SWIGTYPE_p_switch_core_session session = null;

                                SWIGTYPE_p_switch_channel channel = null;

                                switch_endpoint_interface intf = new switch_endpoint_interface();

                                intf.interface_name = "NET_interface";

                                intf.io_routines = io_routines;

                                intf.state_handler = state_handlers;

                                freeswitch.switch_core_set_globals();

                                Api fsApi = new Api();

                                String uuid = fsApi.ExecuteString("create_uuid");

                                try

                                {

                                                session = freeswitch.switch_core_session_request_uuid(intf, switch_call_direction_t.SWITCH_CALL_DIRECTION_INBOUND, 0, null, uuid);  //I am getting the above issue here….

                                                if (session != null)

                                                {

                                                                freeswitch.switch_core_session_add_stream(session, null);

                                                                channel = freeswitch.switch_core_session_get_channel(session);

                                                                if (channel == null)

                                                                {

                                                                                freeswitch.switch_core_session_destroy_state(session);

                                                                                return 0;

                                                                }

                                                                freeswitch.switch_channel_set_variable_name_printf(channel, "waste", "false");

 

                                                                pobject.caller_profile = freeswitch.switch_caller_profile_new(freeswitch.switch_core_session_get_pool(session), "NETClient", "dialplan", "callid_name", "callid_number", null, null, null, null, "mod_netclient", "context", "destination");

                                                                if (pobject.caller_profile != null)

                                                                {

                                                                                freeswitch.switch_channel_set_name(channel, "name");

                                                                                freeswitch.switch_channel_set_caller_profile(channel, pobject.caller_profile);

                                                                }

                                                                freeswitch.switch_channel_set_state_flag(channel, switch_channel_flag_t.CF_GEN_RINGBACK);

                                                                switch_status_t session_status = freeswitch.switch_core_session_thread_launch(session);

                                                                if (session_status != switch_status_t.SWITCH_STATUS_SUCCESS)

                                                                {

                                                                                freeswitch.switch_core_session_destroy_state(session);

                                                                                return 0;

                                                                }

                                                }

                                }

                                catch (Exception exp)

                                {

                                                string expstring = exp.Message;

                                }

                                return 0;

                }

 

Thanks & Regards

Suneel