\r
namespace FreeSWITCH\r
{\r
+ /* When this class is used you must call Dispose on the object when done or you will leak the unmanaged switch_event */\r
+ public class SwitchEventWrap : switch_event, IDisposable\r
+ {\r
+ private bool disposed;\r
+ private SWIGTYPE_p_p_switch_event p_p_switch_event;\r
+ private IntPtr native_ptr_ptr;\r
+\r
+ internal SwitchEventWrap(IntPtr ptrPtr) : base((IntPtr)Marshal.PtrToStructure(ptrPtr, typeof(IntPtr)), false)\r
+ {\r
+ native_ptr_ptr = ptrPtr;\r
+ p_p_switch_event = new SWIGTYPE_p_p_switch_event(ptrPtr, false);\r
+ }\r
+\r
+ ~SwitchEventWrap()\r
+ {\r
+ dispose();\r
+ }\r
+\r
+ public override void Dispose()\r
+ {\r
+ dispose();\r
+ GC.SuppressFinalize(this);\r
+ }\r
+\r
+ internal void dispose()\r
+ {\r
+ if (disposed) return;\r
+ disposed = true;\r
+ freeswitch.switch_event_destroy(p_p_switch_event);\r
+ Marshal.FreeCoTaskMem(native_ptr_ptr);\r
+ }\r
+ }\r
\r
public class EventBinding : IDisposable\r
{\r
{\r
IntPtr clone_ptr_ptr = Marshal.AllocCoTaskMem(IntPtr.Size);\r
freeswitch.switch_event_dup(new SWIGTYPE_p_p_switch_event(clone_ptr_ptr, false), evt);\r
- IntPtr event_ptr = (IntPtr)Marshal.PtrToStructure(clone_ptr_ptr, typeof(IntPtr));\r
- switch_event dupe_evt = new switch_event(event_ptr, false);\r
- Marshal.FreeCoTaskMem(clone_ptr_ptr);\r
+ SwitchEventWrap dupe_evt = new SwitchEventWrap(clone_ptr_ptr);\r
return dupe_evt;\r
}\r
public static IDisposable Bind(string id, switch_event_types_t event_types, string subclass_name, Action<EventBindingArgs> f, bool dupe)\r