// 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 ControlSourceGetValueNative(IntPtr self, ulong timestamp, double value);

	internal class ControlSourceGetValueInvoker {

		ControlSourceGetValueNative native_cb;
		IntPtr __data;
		GLib.DestroyNotify __notify;

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

		internal ControlSourceGetValueInvoker (ControlSourceGetValueNative native_cb) : this (native_cb, IntPtr.Zero, null) {}

		internal ControlSourceGetValueInvoker (ControlSourceGetValueNative native_cb, IntPtr data) : this (native_cb, data, null) {}

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

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

		bool InvokeNative (Gst.ControlSource self, ulong timestamp, double value)
		{
			bool __result = native_cb (self == null ? IntPtr.Zero : self.Handle, timestamp, value);
			return __result;
		}
	}

	internal class ControlSourceGetValueWrapper {

		public bool NativeCallback (IntPtr self, ulong timestamp, double value)
		{
			try {
				bool __ret = managed (GLib.Object.GetObject(self) as Gst.ControlSource, timestamp, 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 ControlSourceGetValueNative NativeDelegate;
		Gst.ControlSourceGetValue managed;

		public ControlSourceGetValueWrapper (Gst.ControlSourceGetValue managed)
		{
			this.managed = managed;
			if (managed != null)
				NativeDelegate = new ControlSourceGetValueNative (NativeCallback);
		}

		public static Gst.ControlSourceGetValue GetManagedDelegate (ControlSourceGetValueNative native)
		{
			if (native == null)
				return null;
			ControlSourceGetValueWrapper wrapper = (ControlSourceGetValueWrapper) native.Target;
			if (wrapper == null)
				return null;
			return wrapper.managed;
		}
	}
#endregion
}
