Basically, if you want to do something that's not "made easy" for language 
plugins, you just do it the C way, like any other FreeSWITCH C module. The 
mod_managed swig wrappers expose nearly every function.

The difficult part is that some of the indirect types (pointers to types and 
function pointers) aren't swig'd very nicely, and just have a wrapper class 
such as "SWIGTYPE_p_foo_t". In this case, you're required to create the backing 
structure however required, then get a pointer to that structure and wrap it in 
the SWIGTYPE_p_xxx class. If your backing structure is a .NET type, you can use 
GCHandle to get an IntPtr to it. Or you can directly allocate memory via the 
Marshal class and use that IntPtr. This is likely to be annoying and a lot of 
work.

It's only really easy for function pointers, as all you need to do is declare a 
delegate, attribute it [UnmanagedFunctionPointer(CallingConvention.Cdecl)], 
then call Marshal.GetFunctionPointerForDelegate. The runtime will emit 
unmanaged stubs that will handle unmanaged-managed transitioning and give you a 
nice C compatible function pointer you can wrap and pass around. You can see 
some examples in ManagedSession.cs.

Additionally, the SWIGTYPE_p_xxx classes don't have public constructors, so the 
FSUtil class provides this extension method on IntPtr:

public static T CreateSwigTypePointer<T>(this IntPtr cPtr)

That way you can create the wrapper classes as needed after you've created the 
structures and wrapped them up.

In summary, it's possible to create an endpoint module from C#, but a major 
PITA. You should consider either using a mixed-mode language such as C++/CLI or 
write a helper library in C/C++ and export that via swig. We'd welcome 
contributions to mod_managed that simplify access to a set of the FS APIs.

-Michael



From: freeswitch-dev-boun...@lists.freeswitch.org 
[mailto:freeswitch-dev-boun...@lists.freeswitch.org] On Behalf Of Alex To
Sent: Monday, November 02, 2009 5:19 AM
To: freeswitch-dev@lists.freeswitch.org
Subject: Re: [Freeswitch-dev] mod managed, cant receive events thru 
EventReceivedFunction callback

Hi, I would like to raise this question again since it doesn't seem to have an 
answer yet.


I built a .NET module which implements IAppPlugin and IApiPlugin. I looked at 
the /contrib/verifier/eventsocket and it is actually the client to connect to 
FS through mod_event_socket (correct me if I'm wrong here).



I believe Andrew's concern was how to receive events through 
EventReceivedFunctionCallback but not connect to FS and receive event via 
TCP/IP.



I would want to implement a .NET module that acts like an endpoint. Could 
someone show me the direction of how to hook up handlers like it is done in 
native C++?



How would I read the incoming audio data and how would I send audio as an 
outgoing stream.



I setup the .NET module and dial plan so that the Run() method in my module is 
invoked whenever a call is bridged to my endpoint. The ParkingLot and Demo 
script sample does enlighten me a little but I still have no clue how would I 
go about the audio stream after I call session.Answer().



Any help would be greatly appreciated.



Best Regards



Alex To





_______________________________________________
FreeSWITCH-dev mailing list
FreeSWITCH-dev@lists.freeswitch.org
http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev
UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-dev
http://www.freeswitch.org

Reply via email to