static bool handleActions(XmlNode node, ElementInfo ei) { if (ei.actions == null) { ei.actions = new ArrayList(); } XmlElement elt = node as XmlElement; if (elt == null) { return(true); } foreach (XmlElement signal in elt.ChildNodes) { if (IsHidden(signal)) { continue; } SignalInfo si = new SignalInfo(); si.name = signal["name"].InnerText; si.managed_name = (signal["managed_name"] != null) ? signal["managed_name"].InnerText : null; si.return_type = signal["return-type"].InnerText; si.object_type = signal["object-type"].InnerText; XmlElement parms = signal["params"]; if (parms != null) { si.parameters = new ArrayList(); foreach (XmlElement parm in parms.ChildNodes) { 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); } } ei.actions.Add(si); } return(true); }
static bool handleSignals(XmlNode node, ElementInfo ei) { if (ei.signals == null) ei.signals = new ArrayList (); XmlElement elt = node as XmlElement; if (elt == null) return true; foreach (XmlElement signal in elt.ChildNodes) { if (IsHidden (signal)) continue; SignalInfo si = new SignalInfo (); si.name = signal["name"].InnerText; si.managed_name = (signal["managed_name"] != null) ? signal["managed_name"].InnerText : null; si.return_type = signal["return-type"].InnerText; si.object_type = signal["object-type"].InnerText; XmlElement parms = signal["params"]; if (parms != null) { si.parameters = new ArrayList (); foreach (XmlElement parm in parms.ChildNodes) { 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); } } ei.signals.Add (si); } return true; }
public static void writeElement(TextWriter writer, ElementInfo ei, StreamReader custom_code, XmlDocument api_doc, string interfaces_dir) { ArrayList enums = new ArrayList(); writer.WriteLine("#region Autogenerated code"); writer.WriteLine("\t[GTypeName (\"" + ei.gtype_name + "\")]"); string class_name = (ei.class_name != null) ? ei.class_name : ei.gtype_name.StartsWith("Gst") ? ei.gtype_name.Substring(3) : ei.gtype_name; writer.Write("\tpublic sealed class " + class_name + " : "); for (int i = 1; i < ei.hierarchy.Count; i++) { string parent_type = (string)ei.hierarchy[i]; string parent_managed_type = CTypeToManagedType(parent_type, api_doc); if (parent_managed_type != null) { writer.Write(parent_managed_type); break; } } foreach (string iface in ei.interfaces) { writer.Write(", " + CTypeToManagedType(iface, api_doc)); } writer.WriteLine(" {"); writer.WriteLine("\t\tpublic " + class_name + " (IntPtr raw) : base (raw) { }\n"); writer.WriteLine("\t\t[DllImport(\"libgstreamer-0.10.dll\") ]"); writer.WriteLine("\t\tstatic extern IntPtr gst_element_factory_make (IntPtr element, IntPtr name);\n"); writer.WriteLine("\t\tpublic " + class_name + " (string name) : base (IntPtr.Zero) {"); writer.WriteLine("\t\t\tIntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name);"); writer.WriteLine("\t\t\tIntPtr native_element = GLib.Marshaller.StringToPtrGStrdup (\"" + ei.name + "\");"); writer.WriteLine("\t\t\tRaw = gst_element_factory_make (native_element, native_name);"); writer.WriteLine("\t\t\tGLib.Marshaller.Free (native_name);"); writer.WriteLine("\t\t\tGLib.Marshaller.Free (native_element);"); writer.WriteLine("\t\t\tif (Raw == IntPtr.Zero)"); writer.WriteLine("\t\t\t\tthrow new Exception (\"Failed to instantiate element \\\"" + ei.name + "\\\"\");"); writer.WriteLine("\t\t}\n"); writer.WriteLine("\t\tpublic " + class_name + " () : this ((string) null) { }\n"); writer.WriteLine("\t\tpublic static " + class_name + " Make (string name) {"); writer.WriteLine("\t\t\treturn Gst.ElementFactory.Make (\"" + ei.name + "\", name) as " + class_name + ";"); writer.WriteLine("\t\t}\n"); writer.WriteLine("\t\tpublic static " + class_name + " Make () { return Make (null); } \n"); foreach (PropertyInfo pinfo in ei.properties) { string managed_name = (pinfo.managed_name != null) ? pinfo.managed_name : PropToCamelCase(pinfo.name); string managed_type = CTypeToManagedType(pinfo.type, api_doc); if (managed_type == null && pinfo.enuminfo == null) { throw new Exception("Can't get managed type mapping for type " + pinfo.type); } else if (managed_type == null) { pinfo.enuminfo.name = pinfo.type; enums.Add(pinfo.enuminfo); managed_type = pinfo.type.StartsWith(ei.gtype_name) ? pinfo.type.Substring(ei.gtype_name.Length) : pinfo.type.StartsWith("Gst") ? pinfo.type.Substring(3) : pinfo.type; managed_type += "Type"; } writer.WriteLine("\t\t[GLib.Property (\"" + pinfo.name + "\")]"); writer.WriteLine("\t\tpublic " + managed_type + " " + managed_name + " {"); if (pinfo.readable) { writer.WriteLine("\t\t\tget {"); writer.WriteLine("\t\t\t\tGLib.Value val = GetProperty (\"" + pinfo.name + "\");"); writer.WriteLine("\t\t\t\t" + managed_type + " ret = (" + managed_type + ") val.Val;"); writer.WriteLine("\t\t\t\tval.Dispose ();"); writer.WriteLine("\t\t\t\treturn ret;"); writer.WriteLine("\t\t\t}"); } if (pinfo.writeable) { writer.WriteLine("\t\t\tset {"); writer.WriteLine("\t\t\t\tGLib.Value val = new GLib.Value (this, \"" + pinfo.name + "\");"); writer.WriteLine("\t\t\t\tval.Val = value;"); writer.WriteLine("\t\t\t\tSetProperty (\"" + pinfo.name + "\", val);"); writer.WriteLine("\t\t\t\tval.Dispose ();"); writer.WriteLine("\t\t\t}"); } writer.WriteLine("\t\t}\n"); } 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); if (si.parameters.Count > 0) { 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\tpublic event " + managed_name + "Handler " + managed_name + " {"); } else { writer.WriteLine("\t\tpublic event SignalHandler " + managed_name + " {"); } writer.WriteLine("\t\t\tadd {"); writer.WriteLine("\t\t\t\tDynamicSignal.Connect (this, \"" + si.name + "\", value);"); writer.WriteLine("\t\t\t}\n"); writer.WriteLine("\t\t\tremove {"); writer.WriteLine("\t\t\t\tDynamicSignal.Disconnect (this, \"" + si.name + "\", value);"); writer.WriteLine("\t\t\t}"); writer.WriteLine("\t\t}"); } } if (ei.actions.Count > 0) { foreach (SignalInfo si in ei.actions) { string managed_name = (si.managed_name != null) ? si.managed_name : PropToCamelCase(si.name); string managed_return = CTypeToManagedType(si.return_type, api_doc); writer.Write("\t\tpublic " + managed_return + " " + managed_name + " ("); for (int i = 0; i < si.parameters.Count; i++) { SignalParameter param = (SignalParameter)si.parameters[i]; string managed_type = CTypeToManagedType(param.type, api_doc); if (i == 0) { writer.Write(managed_type + " " + param.name); } else { writer.Write(", " + managed_type + " " + param.name); } } writer.WriteLine(") {"); writer.WriteLine("\t\t\tobject[] parameters = new object[" + si.parameters.Count + "];"); for (int i = 0; i < si.parameters.Count; i++) { SignalParameter param = (SignalParameter)si.parameters[i]; writer.WriteLine("\t\t\tparameters[" + i + "] = " + param.name + ";"); } writer.WriteLine("\t\t\treturn (" + managed_return + ") Emit (\"" + si.name + "\", parameters);"); writer.WriteLine("\t\t}\n"); } } if (ei.interfaces.Count > 0) { 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(interfaces_dir + "/" + iface + ".cs"); string iface_code = interface_code.ReadToEnd(); writer.WriteLine(iface_code); } } if (enums.Count > 0) { foreach (EnumInfo eni in enums) { writer.WriteLine("\t\t[GTypeName (\"" + eni.name + "\")]"); if (eni.flag) { writer.WriteLine("\t\t[Flags]"); } string enum_name = eni.name.StartsWith(ei.gtype_name) ? eni.name.Substring(ei.gtype_name.Length) : eni.name.StartsWith("Gst") ? eni.name.Substring(3) : eni.name; enum_name += "Type"; writer.WriteLine("\t\tpublic enum " + enum_name + " {"); if (eni.flag) { foreach (FlagValue ev in eni.values) { writer.WriteLine("\t\t\t" + PropToCamelCase(ev.name) + " = " + ev.value + ", "); } } else { foreach (EnumValue ev in eni.values) { writer.WriteLine("\t\t\t" + PropToCamelCase(ev.name) + " = " + ev.value + ", "); } } writer.WriteLine("\t\t}\n"); } } if (custom_code != null) { writer.WriteLine("#endregion"); writer.WriteLine("#region Customized code"); writer.WriteLine("#line 1 \"" + ei.name + ".custom\""); string custom_code_string = custom_code.ReadToEnd(); writer.WriteLine(custom_code_string); } writer.WriteLine("#endregion"); writer.WriteLine("\t}\n"); }