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

namespace GstSharp {

	using System;
	using System.Runtime.InteropServices;

#region Autogenerated code
	[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
	internal delegate int PadLinkFunctionNative(IntPtr pad, IntPtr parent, IntPtr peer);

	internal class PadLinkFunctionInvoker {

		PadLinkFunctionNative native_cb;
		IntPtr __data;
		GLib.DestroyNotify __notify;

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

		internal PadLinkFunctionInvoker (PadLinkFunctionNative native_cb) : this (native_cb, IntPtr.Zero, null) {}

		internal PadLinkFunctionInvoker (PadLinkFunctionNative native_cb, IntPtr data) : this (native_cb, data, null) {}

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

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

		Gst.PadLinkReturn InvokeNative (Gst.Pad pad, Gst.Object parent, Gst.Pad peer)
		{
			Gst.PadLinkReturn __result = (Gst.PadLinkReturn) native_cb (pad == null ? IntPtr.Zero : pad.Handle, parent == null ? IntPtr.Zero : parent.Handle, peer == null ? IntPtr.Zero : peer.Handle);
			return __result;
		}
	}

	internal class PadLinkFunctionWrapper {

		public int NativeCallback (IntPtr pad, IntPtr parent, IntPtr peer)
		{
			try {
				Gst.PadLinkReturn __ret = managed (GLib.Object.GetObject(pad) as Gst.Pad, GLib.Object.GetObject(parent) as Gst.Object, GLib.Object.GetObject(peer) as Gst.Pad);
				if (release_on_call)
					gch.Free ();
				return (int) __ret;
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, true);
				// NOTREACHED: Above call does not return.
				throw e;
			}
		}

		bool release_on_call = false;
		GCHandle gch;

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

		internal PadLinkFunctionNative NativeDelegate;
		Gst.PadLinkFunction managed;

		public PadLinkFunctionWrapper (Gst.PadLinkFunction managed)
		{
			this.managed = managed;
			if (managed != null)
				NativeDelegate = new PadLinkFunctionNative (NativeCallback);
		}

		public static Gst.PadLinkFunction GetManagedDelegate (PadLinkFunctionNative native)
		{
			if (native == null)
				return null;
			PadLinkFunctionWrapper wrapper = (PadLinkFunctionWrapper) native.Target;
			if (wrapper == null)
				return null;
			return wrapper.managed;
		}
	}
#endregion
}
