Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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;
    }
Esempio n. 3
0
    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");
    }