[gst-cvs] gstreamer-sharp: Add a method to retrieve the property info of a single property

Sebastian Dröge slomo at kemper.freedesktop.org
Thu May 14 08:16:04 PDT 2009


Module: gstreamer-sharp
Branch: master
Commit: a3032c056540fdee109c13fa8c7e1fff6e36ca57
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer-sharp/commit/?id=a3032c056540fdee109c13fa8c7e1fff6e36ca57

Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Tue May 12 15:50:04 2009 +0200

Add a method to retrieve the property info of a single property

---

 gstreamer-sharp/Object.custom   |   73 ++++++--------------------------------
 gstreamer-sharp/PropertyInfo.cs |   75 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+), 62 deletions(-)

diff --git a/gstreamer-sharp/Object.custom b/gstreamer-sharp/Object.custom
index 64ed3a3..563abf7 100644
--- a/gstreamer-sharp/Object.custom
+++ b/gstreamer-sharp/Object.custom
@@ -10,37 +10,24 @@ public object this[string property] {
   }
 }
 
-[StructLayout (LayoutKind.Sequential) ]
-struct GTypeInstance {
-  public IntPtr g_class;
-}
-
-[StructLayout (LayoutKind.Sequential) ]
-struct GParamSpec {
-  public GTypeInstance instance;
-  IntPtr name;
-  public int Flags;
-  public IntPtr ValueType;
-  public IntPtr OwnerType;
-}
-
 [DllImport ("libgobject-2.0-0.dll") ]
 static extern IntPtr g_object_class_list_properties (IntPtr klass, out uint n_properties);
 
 [DllImport ("libgobject-2.0-0.dll") ]
-static extern IntPtr g_param_spec_get_name (IntPtr pspec);
+static extern IntPtr g_object_class_find_property (IntPtr gclass, IntPtr name);
 
-[DllImport ("libgobject-2.0-0.dll") ]
-static extern IntPtr g_param_spec_get_nick (IntPtr pspec);
+public PropertyInfo GetPropertyInfo (string property) {
+  IntPtr klass = Marshal.ReadIntPtr (Handle);
 
-[DllImport ("libgobject-2.0-0.dll") ]
-static extern IntPtr g_param_spec_get_blurb (IntPtr pspec);
+  IntPtr native_property = GLib.Marshaller.StringToPtrGStrdup (property);
+  IntPtr pspec = g_object_class_find_property (klass, native_property);
+  GLib.Marshaller.Free (native_property);
 
-[DllImport ("libgobject-2.0-0.dll") ]
-static extern void g_param_value_set_default (IntPtr pspec, ref GLib.Value val);
+  if (pspec == IntPtr.Zero)
+    throw new ArgumentException ("Unknown property");
 
-[DllImport ("gstreamersharpglue-0.10") ]
-static extern bool gstsharp_g_param_spec_get_range (IntPtr pspec, ref GLib.Value min, ref GLib.Value max);
+  return new PropertyInfo (pspec);
+}
 
 public PropertyInfo[] Properties {
   get {
@@ -51,46 +38,8 @@ public PropertyInfo[] Properties {
     PropertyInfo[] ret = new PropertyInfo[n_properties];
     for (int i = 0; i < n_properties; i++) {
       IntPtr pspec_ptr = Marshal.ReadIntPtr (properties, i * IntPtr.Size);
-      GParamSpec pspec = (GParamSpec) Marshal.PtrToStructure (pspec_ptr, typeof (GParamSpec));
-      IntPtr name = g_param_spec_get_name (pspec_ptr);
-      IntPtr nick = g_param_spec_get_nick (pspec_ptr);
-      IntPtr blurb = g_param_spec_get_blurb (pspec_ptr);
-
-      ret[i].name = GLib.Marshaller.Utf8PtrToString (name);
-      ret[i].nick = GLib.Marshaller.Utf8PtrToString (nick);
-      ret[i].blurb = GLib.Marshaller.Utf8PtrToString (blurb);
-
-      ret[i].readable = ( (pspec.Flags & (1 << 0)) != 0);
-      ret[i].writeable = ( (pspec.Flags & (1 << 1)) != 0);
-      ret[i].controllable = ( (pspec.Flags & (1 << 9)) != 0);
-      /* TODO: Add more flags later, like the mutable flags */
-
-      ret[i].gtype = new GLib.GType (pspec.ValueType);
-      ret[i].type = (System.Type) ret[i].gtype;
-
-      try {
-        GLib.Value v = new GLib.Value (new GLib.GType (pspec.ValueType));
-        g_param_value_set_default (pspec_ptr, ref v);
-        ret[i].dflt = v.Val;
-        v.Dispose ();
-
-        if (EnumInfo.IsEnumType (ret[i].gtype)) {
-          EnumInfo ei = new EnumInfo (ret[i].gtype);
-          ret[i].min = ei.Min;
-          ret[i].max = ei.Max;
-        } else {
-          GLib.Value min = new GLib.Value (new GLib.GType (pspec.ValueType));
-          GLib.Value max = new GLib.Value (new GLib.GType (pspec.ValueType));
-          if (gstsharp_g_param_spec_get_range (pspec_ptr, ref min, ref max)) {
-            ret[i].min = (object) min.Val;
-            ret[i].max = (object) max.Val;
-          }
-          min.Dispose ();
-          max.Dispose ();
-        }
-      } catch (Exception) {}
+      ret[i] = new PropertyInfo (pspec_ptr);
     }
-
     GLib.Marshaller.Free (properties);
 
     return ret;
diff --git a/gstreamer-sharp/PropertyInfo.cs b/gstreamer-sharp/PropertyInfo.cs
index 5031442..5454369 100644
--- a/gstreamer-sharp/PropertyInfo.cs
+++ b/gstreamer-sharp/PropertyInfo.cs
@@ -1,4 +1,6 @@
 using System;
+using System.Runtime.InteropServices;
+using GLib;
 
 namespace Gst {
   public struct PropertyInfo {
@@ -78,6 +80,79 @@ namespace Gst {
         return max;
       }
     }
+
+    [DllImport ("libgobject-2.0-0.dll") ]
+    static extern IntPtr g_param_spec_get_name (IntPtr pspec);
+
+    [DllImport ("libgobject-2.0-0.dll") ]
+    static extern IntPtr g_param_spec_get_nick (IntPtr pspec);
+
+    [DllImport ("libgobject-2.0-0.dll") ]
+    static extern IntPtr g_param_spec_get_blurb (IntPtr pspec);
+
+    [DllImport ("libgobject-2.0-0.dll") ]
+    static extern void g_param_value_set_default (IntPtr pspec, ref GLib.Value val);
+
+    [DllImport ("gstreamersharpglue-0.10") ]
+    static extern bool gstsharp_g_param_spec_get_range (IntPtr pspec, ref GLib.Value min, ref GLib.Value max);
+
+
+    [StructLayout (LayoutKind.Sequential) ]
+    struct GTypeInstance {
+      public IntPtr g_class;
+    }
+
+    [StructLayout (LayoutKind.Sequential) ]
+    struct GParamSpec {
+      public GTypeInstance instance;
+      IntPtr name;
+      public int Flags;
+      public IntPtr ValueType;
+      public IntPtr OwnerType;
+    }
+
+    internal PropertyInfo (IntPtr pspec_ptr) {
+      GParamSpec pspec = (GParamSpec) Marshal.PtrToStructure (pspec_ptr, typeof (GParamSpec));
+      IntPtr name = g_param_spec_get_name (pspec_ptr);
+      IntPtr nick = g_param_spec_get_nick (pspec_ptr);
+      IntPtr blurb = g_param_spec_get_blurb (pspec_ptr);
+
+      this.name = GLib.Marshaller.Utf8PtrToString (name);
+      this.nick = GLib.Marshaller.Utf8PtrToString (nick);
+      this.blurb = GLib.Marshaller.Utf8PtrToString (blurb);
+
+      this.readable = ( (pspec.Flags & (1 << 0)) != 0);
+      this.writeable = ( (pspec.Flags & (1 << 1)) != 0);
+      this.controllable = ( (pspec.Flags & (1 << 9)) != 0);
+      /* TODO: Add more flags later, like the mutable flags */
+
+      this.gtype = new GLib.GType (pspec.ValueType);
+      this.type = (System.Type) this.gtype;
+
+      this.dflt = this.min = this.max = null;
+
+      try {
+        GLib.Value v = new GLib.Value (new GLib.GType (pspec.ValueType));
+        g_param_value_set_default (pspec_ptr, ref v);
+        this.dflt = v.Val;
+        v.Dispose ();
+
+        if (EnumInfo.IsEnumType (this.gtype)) {
+          EnumInfo ei = new EnumInfo (this.gtype);
+          this.min = ei.Min;
+          this.max = ei.Max;
+        } else {
+          GLib.Value min = new GLib.Value (new GLib.GType (pspec.ValueType));
+          GLib.Value max = new GLib.Value (new GLib.GType (pspec.ValueType));
+          if (gstsharp_g_param_spec_get_range (pspec_ptr, ref min, ref max)) {
+            this.min = (object) min.Val;
+            this.max = (object) max.Val;
+          }
+          min.Dispose ();
+          max.Dispose ();
+        }
+      } catch (Exception) {}
+    }
   }
 
 }





More information about the Gstreamer-commits mailing list