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

namespace GES {

	using System;
	using System.Runtime.InteropServices;

#region Autogenerated code
	public partial class ExtractableAdapter : GLib.GInterfaceAdapter, GES.IExtractable {

		[StructLayout (LayoutKind.Sequential)]
		struct GESExtractableInterface {
			public GLib.GType AssetType;
			private GESSharp.ExtractableCheckIdNative _check_id;
			public GES.ExtractableCheckId CheckId {
				get {
					return GESSharp.ExtractableCheckIdWrapper.GetManagedDelegate (_check_id);
				}
			}
			public bool CanUpdateAsset;
			public SetAssetNativeDelegate SetAsset;
			IntPtr SetAssetFull;
			IntPtr GetParametersFromId;
			public GetIdNativeDelegate GetId;
			IntPtr GetRealExtractableType;
			IntPtr RegisterMetas;
			[MarshalAs (UnmanagedType.ByValArray, SizeConst=4)]
			public IntPtr[] _gesGesReserved;
		}

		static GESExtractableInterface iface;

		static ExtractableAdapter ()
		{
			GLib.GType.Register (_gtype, typeof (ExtractableAdapter));
			iface.SetAsset = new SetAssetNativeDelegate (SetAsset_cb);
			iface.GetId = new GetIdNativeDelegate (GetId_cb);
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate void SetAssetNativeDelegate (IntPtr inst, IntPtr asset);

		static void SetAsset_cb (IntPtr inst, IntPtr asset)
		{
			try {
				IExtractableImplementor __obj = GLib.Object.GetObject (inst, false) as IExtractableImplementor;
				__obj.Asset = GLib.Object.GetObject(asset) as GES.Asset;
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, false);
			}
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate IntPtr GetIdNativeDelegate (IntPtr inst);

		static IntPtr GetId_cb (IntPtr inst)
		{
			try {
				IExtractableImplementor __obj = GLib.Object.GetObject (inst, false) as IExtractableImplementor;
				string __result;
				__result = __obj.Id;
				return GLib.Marshaller.StringToPtrGStrdup(__result);
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, true);
				// NOTREACHED: above call does not return.
				throw e;
			}
		}

		static int class_offset = 2 * IntPtr.Size;

		static void Initialize (IntPtr ptr, IntPtr data)
		{
			IntPtr ifaceptr = new IntPtr (ptr.ToInt64 () + class_offset);
			GESExtractableInterface native_iface = (GESExtractableInterface) Marshal.PtrToStructure (ifaceptr, typeof (GESExtractableInterface));
			native_iface.SetAsset = iface.SetAsset;
			native_iface.GetId = iface.GetId;
			Marshal.StructureToPtr (native_iface, ifaceptr, false);
		}

		GLib.Object implementor;

		public ExtractableAdapter ()
		{
			InitHandler = new GLib.GInterfaceInitHandler (Initialize);
		}

		public ExtractableAdapter (IExtractableImplementor implementor)
		{
			if (implementor == null)
				throw new ArgumentNullException ("implementor");
			else if (!(implementor is GLib.Object))
				throw new ArgumentException ("implementor must be a subclass of GLib.Object");
			this.implementor = implementor as GLib.Object;
		}

		public ExtractableAdapter (IntPtr handle)
		{
			if (!_gtype.IsInstance (handle))
				throw new ArgumentException ("The gobject doesn't implement the GInterface of this adapter", "handle");
			implementor = GLib.Object.GetObject (handle);
		}

		[DllImport("ges-1.0", CallingConvention = CallingConvention.Cdecl)]
		static extern IntPtr ges_extractable_get_type();

		private static GLib.GType _gtype = new GLib.GType (ges_extractable_get_type ());

		public static GLib.GType GType {
			get {
				return _gtype;
			}
		}

		public override GLib.GType GInterfaceGType {
			get {
				return _gtype;
			}
		}

		public override IntPtr Handle {
			get {
				return implementor.Handle;
			}
		}

		public IntPtr OwnedHandle {
			get {
				return implementor.OwnedHandle;
			}
		}

		public static IExtractable GetObject (IntPtr handle, bool owned)
		{
			GLib.Object obj = GLib.Object.GetObject (handle, owned);
			return GetObject (obj);
		}

		public static IExtractable GetObject (GLib.Object obj)
		{
			if (obj == null)
				return null;
			else if (obj is IExtractableImplementor)
				return new ExtractableAdapter (obj as IExtractableImplementor);
			else if (obj as IExtractable == null)
				return new ExtractableAdapter (obj.Handle);
			else
				return obj as IExtractable;
		}

		public IExtractableImplementor Implementor {
			get {
				return implementor as IExtractableImplementor;
			}
		}

		[DllImport("ges-1.0", CallingConvention = CallingConvention.Cdecl)]
		static extern IntPtr ges_extractable_get_asset(IntPtr raw);

		public GES.Asset Asset { 
			get {
				IntPtr raw_ret = ges_extractable_get_asset(Handle);
				GES.Asset ret = GLib.Object.GetObject(raw_ret) as GES.Asset;
				return ret;
			}
		}

		[DllImport("ges-1.0", CallingConvention = CallingConvention.Cdecl)]
		static extern IntPtr ges_extractable_get_id(IntPtr raw);

		public string Id { 
			get {
				IntPtr raw_ret = ges_extractable_get_id(Handle);
				string ret = GLib.Marshaller.PtrToStringGFree(raw_ret);
				return ret;
			}
		}

		[DllImport("ges-1.0", CallingConvention = CallingConvention.Cdecl)]
		static extern bool ges_extractable_set_asset(IntPtr raw, IntPtr asset);

		public bool SetAsset(GES.Asset asset) {
			bool raw_ret = ges_extractable_set_asset(Handle, asset == null ? IntPtr.Zero : asset.Handle);
			bool ret = raw_ret;
			return ret;
		}

#endregion
	}
}
