// This file was generated by the Gtk# code generator.
// Any changes made will be lost if regenerated.

namespace Gst.BaseSharp {

	using System;
	using System.Runtime.InteropServices;

#region Autogenerated code
	[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
	internal delegate void CollectDataDestroyNotifyNative(IntPtr data);

	internal class CollectDataDestroyNotifyInvoker {

		CollectDataDestroyNotifyNative native_cb;
		IntPtr __data;
		GLib.DestroyNotify __notify;

		~CollectDataDestroyNotifyInvoker ()
		{
			if (__notify == null)
				return;
			__notify (__data);
		}

		internal CollectDataDestroyNotifyInvoker (CollectDataDestroyNotifyNative native_cb) : this (native_cb, IntPtr.Zero, null) {}

		internal CollectDataDestroyNotifyInvoker (CollectDataDestroyNotifyNative native_cb, IntPtr data) : this (native_cb, data, null) {}

		internal CollectDataDestroyNotifyInvoker (CollectDataDestroyNotifyNative native_cb, IntPtr data, GLib.DestroyNotify notify)
		{
			this.native_cb = native_cb;
			__data = data;
			__notify = notify;
		}

		internal Gst.Base.CollectDataDestroyNotify Handler {
			get {
				return new Gst.Base.CollectDataDestroyNotify(InvokeNative);
			}
		}

		void InvokeNative (Gst.Base.CollectData data)
		{
			IntPtr native_data = GLib.Marshaller.StructureToPtrAlloc (data);
			native_cb (native_data);
			Marshal.FreeHGlobal (native_data);
		}
	}

	internal class CollectDataDestroyNotifyWrapper {

		public void NativeCallback (IntPtr data)
		{
			try {
				managed (Gst.Base.CollectData.New (data));
				if (release_on_call)
					gch.Free ();
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, false);
			}
		}

		bool release_on_call = false;
		GCHandle gch;

		public void PersistUntilCalled ()
		{
			release_on_call = true;
			gch = GCHandle.Alloc (this);
		}

		internal CollectDataDestroyNotifyNative NativeDelegate;
		Gst.Base.CollectDataDestroyNotify managed;

		public CollectDataDestroyNotifyWrapper (Gst.Base.CollectDataDestroyNotify managed)
		{
			this.managed = managed;
			if (managed != null)
				NativeDelegate = new CollectDataDestroyNotifyNative (NativeCallback);
		}

		public static Gst.Base.CollectDataDestroyNotify GetManagedDelegate (CollectDataDestroyNotifyNative native)
		{
			if (native == null)
				return null;
			CollectDataDestroyNotifyWrapper wrapper = (CollectDataDestroyNotifyWrapper) native.Target;
			if (wrapper == null)
				return null;
			return wrapper.managed;
		}
	}
#endregion
}
