// 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 StructureMapFuncNative(uint field_id, IntPtr value, IntPtr user_data);

	internal class StructureMapFuncInvoker {

		StructureMapFuncNative native_cb;
		IntPtr __data;
		GLib.DestroyNotify __notify;

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

		internal StructureMapFuncInvoker (StructureMapFuncNative native_cb) : this (native_cb, IntPtr.Zero, null) {}

		internal StructureMapFuncInvoker (StructureMapFuncNative native_cb, IntPtr data) : this (native_cb, data, null) {}

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

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

		bool InvokeNative (uint field_id, GLib.Value value)
		{
			IntPtr native_value = GLib.Marshaller.StructureToPtrAlloc (value);
			bool __result = native_cb (field_id, native_value, __data);
			Marshal.FreeHGlobal (native_value);
			return __result;
		}
	}

	internal class StructureMapFuncWrapper {

		public bool NativeCallback (uint field_id, IntPtr value, IntPtr user_data)
		{
			try {
				bool __ret = managed (field_id, (GLib.Value) Marshal.PtrToStructure (value, typeof (GLib.Value)));
				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 StructureMapFuncNative NativeDelegate;
		Gst.StructureMapFunc managed;

		public StructureMapFuncWrapper (Gst.StructureMapFunc managed)
		{
			this.managed = managed;
			if (managed != null)
				NativeDelegate = new StructureMapFuncNative (NativeCallback);
		}

		public static Gst.StructureMapFunc GetManagedDelegate (StructureMapFuncNative native)
		{
			if (native == null)
				return null;
			StructureMapFuncWrapper wrapper = (StructureMapFuncWrapper) native.Target;
			if (wrapper == null)
				return null;
			return wrapper.managed;
		}
	}
#endregion
}
