// 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 bool PadActivateModeFunctionNative(IntPtr pad, IntPtr parent, int mode, bool active);

	internal class PadActivateModeFunctionInvoker {

		PadActivateModeFunctionNative native_cb;
		IntPtr __data;
		GLib.DestroyNotify __notify;

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

		internal PadActivateModeFunctionInvoker (PadActivateModeFunctionNative native_cb) : this (native_cb, IntPtr.Zero, null) {}

		internal PadActivateModeFunctionInvoker (PadActivateModeFunctionNative native_cb, IntPtr data) : this (native_cb, data, null) {}

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

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

		bool InvokeNative (Gst.Pad pad, Gst.Object parent, Gst.PadMode mode, bool active)
		{
			bool __result = native_cb (pad == null ? IntPtr.Zero : pad.Handle, parent == null ? IntPtr.Zero : parent.Handle, (int) mode, active);
			return __result;
		}
	}

	internal class PadActivateModeFunctionWrapper {

		public bool NativeCallback (IntPtr pad, IntPtr parent, int mode, bool active)
		{
			try {
				bool __ret = managed (GLib.Object.GetObject(pad) as Gst.Pad, GLib.Object.GetObject(parent) as Gst.Object, (Gst.PadMode) mode, active);
				if (release_on_call)
					gch.Free ();
				return __ret;
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, false);
				return false;
			}
		}

		bool release_on_call = false;
		GCHandle gch;

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

		internal PadActivateModeFunctionNative NativeDelegate;
		Gst.PadActivateModeFunction managed;

		public PadActivateModeFunctionWrapper (Gst.PadActivateModeFunction managed)
		{
			this.managed = managed;
			if (managed != null)
				NativeDelegate = new PadActivateModeFunctionNative (NativeCallback);
		}

		public static Gst.PadActivateModeFunction GetManagedDelegate (PadActivateModeFunctionNative native)
		{
			if (native == null)
				return null;
			PadActivateModeFunctionWrapper wrapper = (PadActivateModeFunctionWrapper) native.Target;
			if (wrapper == null)
				return null;
			return wrapper.managed;
		}
	}
#endregion
}
