From 8f450ee581cf0a6ee24edec04d655383ffe07efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 27 May 2009 21:37:56 +0200 Subject: [PATCH] Add support for autogenerating signal code in element bindings --- Makefile.am | 2 +- elementgen/elementgen.cs | 68 +++++++++++++++++-- gstreamer-sharp/Makefile.am | 4 +- gstreamer-sharp/baseplugins/Makefile.am | 4 +- gstreamer-sharp/baseplugins/decodebin.custom | 35 ---------- .../baseplugins/decodebin.metadata | 8 +++ gstreamer-sharp/coreplugins/Makefile.am | 4 +- gstreamer-sharp/coreplugins/typefind.custom | 34 ---------- gstreamer-sharp/coreplugins/typefind.metadata | 5 ++ 9 files changed, 84 insertions(+), 80 deletions(-) delete mode 100644 gstreamer-sharp/baseplugins/decodebin.custom create mode 100644 gstreamer-sharp/baseplugins/decodebin.metadata delete mode 100644 gstreamer-sharp/coreplugins/typefind.custom create mode 100644 gstreamer-sharp/coreplugins/typefind.metadata diff --git a/Makefile.am b/Makefile.am index e691b2ff0a..5b7f3ae2ed 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = source parser gstreamer-sharp doc tests samples +SUBDIRS = source parser elementgen gstreamer-sharp doc tests samples pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gstreamer-sharp-0.10.pc diff --git a/elementgen/elementgen.cs b/elementgen/elementgen.cs index 0e1f295476..be15a3c293 100644 --- a/elementgen/elementgen.cs +++ b/elementgen/elementgen.cs @@ -20,6 +20,11 @@ public class EnumInfo { public ArrayList values; } +public class SignalParameter { + public string name; + public string type; +} + public class SignalInfo { public string name; public string managed_name; @@ -147,7 +152,14 @@ public class ElementGen { if (parms != null) { si.parameters = new ArrayList (); foreach (XmlElement parm in parms.ChildNodes) { - si.parameters.Add (parm.InnerText); + SignalParameter par = new SignalParameter (); + par.type = parm.InnerText; + + if (parm.Attributes["name"] == null) + throw new Exception ("All signal parameters need the 'name' attribute"); + + par.name = parm.Attributes["name"].InnerText; + si.parameters.Add (par); } } @@ -178,7 +190,14 @@ public class ElementGen { if (parms != null) { si.parameters = new ArrayList (); foreach (XmlElement parm in parms.ChildNodes) { - si.parameters.Add (parm.InnerText); + SignalParameter par = new SignalParameter (); + par.type = parm.InnerText; + + if (parm.Attributes["name"] == null) + throw new Exception ("All signal parameters need the 'name' attribute"); + + par.name = parm.Attributes["name"].InnerText; + si.parameters.Add (par); } } @@ -288,14 +307,55 @@ public class ElementGen { writer.WriteLine ("\t\t}\n"); } - /* FIXME: We can't write signal/action code as we don't know the parameter names! */ - writer.WriteLine (); + if (ei.signals.Count > 0) { + foreach (SignalInfo si in ei.signals) { + string managed_name = (si.managed_name != null) ? si.managed_name : PropToCamelCase (si.name); + + writer.WriteLine ("\t\tpublic delegate void " + managed_name + "Handler (object o, " + managed_name + "Args args);\n"); + + writer.WriteLine ("\t\tpublic class " + managed_name + "Args : GLib.SignalArgs {"); + for (int i = 0; i < si.parameters.Count; i++) { + SignalParameter param = (SignalParameter) si.parameters[i]; + string managed_type = CTypeToManagedType (param.type, api_doc); + writer.WriteLine ("\t\t\tpublic " + managed_type + " " + param.name + " {"); + writer.WriteLine ("\t\t\t\tget {"); + writer.WriteLine ("\t\t\t\t\treturn (" + managed_type + ") Args[" + i + "];"); + writer.WriteLine ("\t\t\t\t}"); + writer.WriteLine ("\t\t\t}\n"); + + } + writer.WriteLine ("\t\t}\n"); + + writer.WriteLine ("\t\tprivate Delegate " + managed_name + "_delegate;\n"); + + writer.WriteLine ("\t\tprotected virtual void On" + managed_name + " (object o, GLib.SignalArgs args) {"); + writer.WriteLine ("\t\t\tBindingHelper.InvokeProxySignalDelegate (" + managed_name + "_delegate, typeof (" + managed_name + "Args), o, args);"); + writer.WriteLine ("\t\t}\n"); + + writer.WriteLine ("\t\tpublic event " + managed_name + "Handler " + managed_name + " {"); + writer.WriteLine ("\t\t\tadd {"); + writer.WriteLine ("\t\t\t\t" + managed_name + "_delegate = BindingHelper.AddProxySignalDelegate (this, \"" + si.name + "\", On" + managed_name + ", " + managed_name + "_delegate, value);"); + writer.WriteLine ("\t\t\t}\n"); + + writer.WriteLine ("\t\t\tremove {"); + writer.WriteLine ("\t\t\t\t" + managed_name + "_delegate = BindingHelper.RemoveProxySignalDelegate (this, \"" + si.name + "\", On" + managed_name + ", " + managed_name + "_delegate, value);"); + writer.WriteLine ("\t\t\t}"); + writer.WriteLine ("\t\t}"); + } + } + + if (ei.actions.Count > 0) + throw new Exception ("No support for actions yet"); + if (ei.interfaces.Count > 0) { string path = Path.GetDirectoryName (System.Reflection.Assembly.GetCallingAssembly ().Location); foreach (string iface in ei.interfaces) { + writer.WriteLine ("#endregion"); + writer.WriteLine ("#region Customized code"); + writer.WriteLine ("#line 1 \"" + iface + ".cs\""); StreamReader interface_code = System.IO.File.OpenText (path + "/interfaces/" + iface + ".cs"); string iface_code = interface_code.ReadToEnd (); writer.WriteLine (iface_code); diff --git a/gstreamer-sharp/Makefile.am b/gstreamer-sharp/Makefile.am index 5736885641..1a11712eb8 100644 --- a/gstreamer-sharp/Makefile.am +++ b/gstreamer-sharp/Makefile.am @@ -136,10 +136,10 @@ generated-stamp: $(API) $(build_customs) $(overrides) && mv generated/ObjectManager.cs.tmp generated/ObjectManager.cs \ && touch generated-stamp -coreplugins/*.cs: $(API) coreplugins/*.custom coreplugins/inspect/*.raw +coreplugins/*.cs: $(API) coreplugins/*.metadata coreplugins/inspect/*.raw $(MAKE) -C coreplugins -baseplugins/*.cs: $(API) baseplugins/*.custom baseplugins/inspect/*.raw +baseplugins/*.cs: $(API) baseplugins/*.metadata baseplugins/inspect/*.raw $(MAKE) -C baseplugins $(KEYFILE): $(top_srcdir)/gstreamer-sharp.snk diff --git a/gstreamer-sharp/baseplugins/Makefile.am b/gstreamer-sharp/baseplugins/Makefile.am index 44a4ab5701..17d0f2f37c 100644 --- a/gstreamer-sharp/baseplugins/Makefile.am +++ b/gstreamer-sharp/baseplugins/Makefile.am @@ -2,8 +2,8 @@ ELEMENTS = decodebin playbin xvimagesink NAMESPACE = Gst.BasePlugins INSPECT_FILES = $(patsubst %,inspect/%.raw,$(ELEMENTS)) -CUSTOM_FILES = decodebin.custom -METADATA_FILES = playbin.metadata +CUSTOM_FILES = +METADATA_FILES = decodebin.metadata playbin.metadata CS_FILES = $(patsubst %,%.cs,$(ELEMENTS)) XML_FILES = $(patsubst %,%.xml,$(ELEMENTS)) diff --git a/gstreamer-sharp/baseplugins/decodebin.custom b/gstreamer-sharp/baseplugins/decodebin.custom deleted file mode 100644 index 6cfbb24180..0000000000 --- a/gstreamer-sharp/baseplugins/decodebin.custom +++ /dev/null @@ -1,35 +0,0 @@ -public delegate void NewDecodedPadHandler (object o, NewDecodedPadArgs args); - -public class NewDecodedPadArgs : GLib.SignalArgs { - public Gst.Pad Pad { - get { - return (Gst.Pad) Args[0]; - } - } - - public bool Last { - get { - return (bool) Args[1]; - } - } -} - -private Delegate new_decoded_pad_delegate; - -protected virtual void OnNewDecodedPad (object o, GLib.SignalArgs args) { - BindingHelper.InvokeProxySignalDelegate (new_decoded_pad_delegate, - typeof (NewDecodedPadArgs), o, args); -} - -public event NewDecodedPadHandler NewDecodedPad { - add { - new_decoded_pad_delegate = BindingHelper.AddProxySignalDelegate (this, - "new-decoded-pad", OnNewDecodedPad, new_decoded_pad_delegate, value); - } - - remove { - new_decoded_pad_delegate = BindingHelper.RemoveProxySignalDelegate (this, - "new-decoded-pad", OnNewDecodedPad, new_decoded_pad_delegate, value); - } -} - diff --git a/gstreamer-sharp/baseplugins/decodebin.metadata b/gstreamer-sharp/baseplugins/decodebin.metadata new file mode 100644 index 0000000000..ce1c238d17 --- /dev/null +++ b/gstreamer-sharp/baseplugins/decodebin.metadata @@ -0,0 +1,8 @@ + + + Pad + Last + Pad + Pad + Caps + diff --git a/gstreamer-sharp/coreplugins/Makefile.am b/gstreamer-sharp/coreplugins/Makefile.am index 8cf6ad6faa..d0b1b4b2bf 100644 --- a/gstreamer-sharp/coreplugins/Makefile.am +++ b/gstreamer-sharp/coreplugins/Makefile.am @@ -3,8 +3,8 @@ ELEMENTS = capsfilter typefind NAMESPACE = Gst.CorePlugins INSPECT_FILES = $(patsubst %,inspect/%.raw,$(ELEMENTS)) -CUSTOM_FILES = typefind.custom -METADATA_FILES = +CUSTOM_FILES = +METADATA_FILES = typefind.metadata CS_FILES = $(patsubst %,%.cs,$(ELEMENTS)) XML_FILES = $(patsubst %,%.xml,$(ELEMENTS)) diff --git a/gstreamer-sharp/coreplugins/typefind.custom b/gstreamer-sharp/coreplugins/typefind.custom deleted file mode 100644 index 7eb500c5f9..0000000000 --- a/gstreamer-sharp/coreplugins/typefind.custom +++ /dev/null @@ -1,34 +0,0 @@ -public delegate void HaveTypeHandler (object o, HaveTypeArgs args); - -public class HaveTypeArgs : GLib.SignalArgs { - public uint Probability { - get { - return (uint) Args[0]; - } - } - - public Gst.Caps Caps { - get { - return (Gst.Caps) Args[1]; - } - } -} - -private Delegate have_type_delegate; - -protected virtual void OnHaveType (object o, GLib.SignalArgs args) { - BindingHelper.InvokeProxySignalDelegate (have_type_delegate, typeof (HaveTypeArgs), o, args); -} - -public event HaveTypeHandler HaveType { - add { - have_type_delegate = BindingHelper.AddProxySignalDelegate (this, "have-type", - OnHaveType, have_type_delegate, value); - } - - remove { - have_type_delegate = BindingHelper.RemoveProxySignalDelegate (this, "have-type", - OnHaveType, have_type_delegate, value); - } -} - diff --git a/gstreamer-sharp/coreplugins/typefind.metadata b/gstreamer-sharp/coreplugins/typefind.metadata new file mode 100644 index 0000000000..e476688051 --- /dev/null +++ b/gstreamer-sharp/coreplugins/typefind.metadata @@ -0,0 +1,5 @@ + + + Probability + Caps +