// 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 IntPtr MiniObjectCopyFunctionNative(IntPtr obj);

	internal class MiniObjectCopyFunctionInvoker {

		MiniObjectCopyFunctionNative native_cb;
		IntPtr __data;
		GLib.DestroyNotify __notify;

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

		internal MiniObjectCopyFunctionInvoker (MiniObjectCopyFunctionNative native_cb) : this (native_cb, IntPtr.Zero, null) {}

		internal MiniObjectCopyFunctionInvoker (MiniObjectCopyFunctionNative native_cb, IntPtr data) : this (native_cb, data, null) {}

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

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

		Gst.MiniObject InvokeNative (Gst.MiniObject obj)
		{
			Gst.MiniObject __result = native_cb (obj == null ? IntPtr.Zero : obj.Handle) == IntPtr.Zero ? null : (Gst.MiniObject) GLib.Opaque.GetOpaque (native_cb (obj == null ? IntPtr.Zero : obj.Handle), typeof (Gst.MiniObject), true);
			return __result;
		}
	}

	internal class MiniObjectCopyFunctionWrapper {

		public IntPtr NativeCallback (IntPtr obj)
		{
			try {
				Gst.MiniObject __ret = managed (obj == IntPtr.Zero ? null : (Gst.MiniObject) GLib.Opaque.GetOpaque (obj, typeof (Gst.MiniObject), false));
				if (release_on_call)
					gch.Free ();
				return __ret == null ? IntPtr.Zero : __ret.OwnedCopy;
			} 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 MiniObjectCopyFunctionNative NativeDelegate;
		Gst.MiniObjectCopyFunction managed;

		public MiniObjectCopyFunctionWrapper (Gst.MiniObjectCopyFunction managed)
		{
			this.managed = managed;
			if (managed != null)
				NativeDelegate = new MiniObjectCopyFunctionNative (NativeCallback);
		}

		public static Gst.MiniObjectCopyFunction GetManagedDelegate (MiniObjectCopyFunctionNative native)
		{
			if (native == null)
				return null;
			MiniObjectCopyFunctionWrapper wrapper = (MiniObjectCopyFunctionWrapper) native.Target;
			if (wrapper == null)
				return null;
			return wrapper.managed;
		}
	}
#endregion
}
