Пример #1
0
        public override void Generate(GenerationInfo gen_info)
        {
            gen_info.CurrentType = QualifiedName;

            StreamWriter sw = gen_info.Writer = gen_info.OpenStream(Name);

            sw.WriteLine("namespace " + NS + " {");
            sw.WriteLine();
            sw.WriteLine("\tusing System;");
            sw.WriteLine("\tusing System.Collections;");
            sw.WriteLine("\tusing System.Runtime.InteropServices;");
            sw.WriteLine();

            sw.WriteLine("#region Autogenerated code");

            SymbolTable table = SymbolTable.Table;

            Method ref_, unref, dispose;

            GetSpecialMethods(out ref_, out unref, out dispose);

            if (IsDeprecated)
            {
                sw.WriteLine("\t[Obsolete]");
            }
            sw.Write("\t{0} partial {1}class " + Name, IsInternal ? "internal" : "public", IsAbstract ? "abstract " : String.Empty);
            string cs_parent = table.GetCSType(Elem.GetAttribute("parent"));

            if (cs_parent != "")
            {
                sw.Write(" : " + cs_parent);
            }
            else
            {
                sw.Write(" : GLib.Opaque");
            }

            foreach (string iface in managed_interfaces)
            {
                if (Parent != null && Parent.Implements(iface))
                {
                    continue;
                }
                sw.Write(", " + iface);
            }

            sw.WriteLine(" {");
            sw.WriteLine();

            GenFields(gen_info);
            GenMethods(gen_info, null, null);
            GenCtors(gen_info);

            if (ref_ != null)
            {
                ref_.GenerateImport(sw);
                sw.WriteLine("\t\tprotected override void Ref (IntPtr raw)");
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\tif (!Owned) {");
                sw.WriteLine("\t\t\t\t" + ref_.CName + " (raw);");
                sw.WriteLine("\t\t\t\tOwned = true;");
                sw.WriteLine("\t\t\t}");
                sw.WriteLine("\t\t}");
                sw.WriteLine();

                if (ref_.IsDeprecated)
                {
                    sw.WriteLine("\t\t[Obsolete(\"" + QualifiedName + " is now refcounted automatically\")]");
                    if (ref_.ReturnType == "void")
                    {
                        sw.WriteLine("\t\tpublic void Ref () {}");
                    }
                    else
                    {
                        sw.WriteLine("\t\tpublic " + Name + " Ref () { return this; }");
                    }
                    sw.WriteLine();
                }
            }

            bool finalizer_needed = false;

            if (unref != null)
            {
                unref.GenerateImport(sw);
                sw.WriteLine("\t\tprotected override void Unref (IntPtr raw)");
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\tif (Owned) {");
                sw.WriteLine("\t\t\t\t" + unref.CName + " (raw);");
                sw.WriteLine("\t\t\t\tOwned = false;");
                sw.WriteLine("\t\t\t}");
                sw.WriteLine("\t\t}");
                sw.WriteLine();

                if (unref.IsDeprecated)
                {
                    sw.WriteLine("\t\t[Obsolete(\"" + QualifiedName + " is now refcounted automatically\")]");
                    sw.WriteLine("\t\tpublic void Unref () {}");
                    sw.WriteLine();
                }
                finalizer_needed = true;
            }

            if (dispose != null)
            {
                dispose.GenerateImport(sw);
                sw.WriteLine("\t\tprotected override void Free (IntPtr raw)");
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\t" + dispose.CName + " (raw);");
                sw.WriteLine("\t\t}");
                sw.WriteLine();

                if (dispose.IsDeprecated)
                {
                    sw.WriteLine("\t\t[Obsolete(\"" + QualifiedName + " is now freed automatically\")]");
                    sw.WriteLine("\t\tpublic void " + dispose.Name + " () {}");
                    sw.WriteLine();
                }
                finalizer_needed = true;
            }

            if (finalizer_needed)
            {
                sw.WriteLine("\t\tclass FinalizerInfo {");
                sw.WriteLine("\t\t\tIntPtr handle;");
                sw.WriteLine();
                sw.WriteLine("\t\t\tpublic FinalizerInfo (IntPtr handle)");
                sw.WriteLine("\t\t\t{");
                sw.WriteLine("\t\t\t\tthis.handle = handle;");
                sw.WriteLine("\t\t\t}");
                sw.WriteLine();
                sw.WriteLine("\t\t\tpublic bool Handler ()");
                sw.WriteLine("\t\t\t{");
                if (dispose != null)
                {
                    sw.WriteLine("\t\t\t\t{0} (handle);", dispose.CName);
                }
                else if (unref != null)
                {
                    sw.WriteLine("\t\t\t\t{0} (handle);", unref.CName);
                }
                sw.WriteLine("\t\t\t\treturn false;");
                sw.WriteLine("\t\t\t}");
                sw.WriteLine("\t\t}");
                sw.WriteLine();
                sw.WriteLine("\t\t~{0} ()", Name);
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\tif (!Owned)");
                sw.WriteLine("\t\t\t\treturn;");
                sw.WriteLine("\t\t\tFinalizerInfo info = new FinalizerInfo (Handle);");
                sw.WriteLine("\t\t\tGLib.Timeout.Add (50, new GLib.TimeoutHandler (info.Handler));");
                sw.WriteLine("\t\t}");
                sw.WriteLine();
            }

#if false
            Method copy = Methods ["Copy"] as Method;
            if (copy != null && copy.Parameters.Count == 0)
            {
                sw.WriteLine("\t\tprotected override GLib.Opaque Copy (IntPtr raw)");
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\tGLib.Opaque result = new " + QualifiedName + " (" + copy.CName + " (raw));");
                sw.WriteLine("\t\t\tresult.Owned = true;");
                sw.WriteLine("\t\t\treturn result;");
                sw.WriteLine("\t\t}");
                sw.WriteLine();
            }
#endif
            sw.WriteLine("#endregion");

            sw.WriteLine("\t}");
            sw.WriteLine("}");

            sw.Close();
            gen_info.Writer = null;
            Statistics.OpaqueCount++;
        }
Пример #2
0
        public void Generate(GenerationInfo gen_info, string indent, bool use_cnames,
                             TextWriter sw)
        {
            if (Hidden && !use_cnames)
            {
                return;
            }

            visible = Access != "private";

            SymbolTable table = SymbolTable.Table;

            string wrapped = table.GetCSType(CType);

            string wrapped_name = SymbolTable.Table.MangleName(CName);
            string name         = Name;
            string studly_name  = StudlyName;
            string cstype       = CSType;

            IGeneratable gen = table [CType];

            if (use_cnames)
            {
                name = studly_name = wrapped_name = SymbolTable.Table.MangleName(CName).Replace(".", "_");

                var mangen = gen as ManualGen;
                if (mangen != null)
                {
                    if (mangen.AbiType != null)
                    {
                        cstype = mangen.AbiType;
                    }
                }

                if (IsCPointer())
                {
                    cstype = "IntPtr";
                }
            }

            if (IsArray && !IsNullTermArray)
            {
                sw.WriteLine(indent + "[MarshalAs (UnmanagedType.ByValArray, SizeConst=" + ArrayLength + ")]");
                sw.WriteLine(indent + "{0} {1} {2};", Access, cstype, studly_name);
            }
            else if (IsArray && IsNullTermArray)
            {
                sw.WriteLine(indent + "private {0} {1};", "IntPtr", studly_name + "Ptr");
                if ((Readable || Writable) && Access == "public")
                {
                    sw.WriteLine(indent + "public {0} {1} {{", cstype, studly_name);
                    if (Readable)
                    {
                        sw.WriteLine(indent + "\tget {{ return GLib.Marshaller.StructArrayFromNullTerminatedIntPtr<{0}> ({1}); }}",
                                     base.CSType, studly_name + "Ptr");
                    }
                    if (Writable)
                    {
                        sw.WriteLine(indent + "\tset {{ {0} = GLib.Marshaller.StructArrayToNullTerminatedStructArrayIntPtr<{1}> (value); }}",
                                     studly_name + "Ptr", base.CSType);
                    }
                    sw.WriteLine(indent + "}");
                }
            }
            else if (IsBitfield)
            {
                base.Generate(gen_info, indent);
            }
            else if (gen is IAccessor)
            {
                sw.WriteLine(indent + "private {0} {1};", gen.MarshalType, name);

                if (Access != "private")
                {
                    IAccessor acc = table [CType] as IAccessor;
                    sw.WriteLine(indent + Access + " " + wrapped + " " + studly_name + " {");
                    acc.WriteAccessors(sw, indent + "\t", name);
                    sw.WriteLine(indent + "}");
                }
            }
            else if (IsPointer && (gen is StructGen || gen is BoxedGen || gen is UnionGen))
            {
                sw.WriteLine(indent + "private {0} {1};", cstype, name);
                sw.WriteLine();
                if (Access != "private")
                {
                    sw.WriteLine(indent + Access + " " + wrapped + " " + wrapped_name + " {");
                    sw.WriteLine(indent + "\tget { return " + table.FromNative(CType, name) + "; }");
                    sw.WriteLine(indent + "}");
                }
            }
            else if (IsPointer && cstype != "string")
            {
                // FIXME: probably some fields here which should be visible.
                visible = false;
                sw.WriteLine(indent + "private {0} {1};", cstype, name);
            }
            else
            {
                sw.WriteLine(indent + "{0} {1} {2};", Access, cstype, Access == "public" ? studly_name : name);
            }
        }
Пример #3
0
        public static int Main(string[] args)
        {
            bool   show_help     = false;
            string dir           = "";
            string assembly_name = "";
            string gapidir       = "";
            string glue_filename = "";
            string glue_includes = "";
            string gluelib_name  = "";
            string schema_name   = "";

            SymbolTable table = SymbolTable.Table;
            var         gens  = new List <IGeneratable> ();

            var filenames = new List <string> ();
            var includes  = new List <string> ();

            var options = new OptionSet()
            {
                { "generate=", "Generate the C# code for this GAPI XML file.",
                  (string v) => { filenames.Add(v); } },
                { "I|include=", "GAPI XML file that contain symbols used in the main GAPI XML file.",
                  (string v) => { includes.Add(v); } },
                { "outdir=", "Directory where the C# files will be generated.",
                  (string v) => { dir = v; } },
                { "assembly-name=", "Name of the assembly for which the code is generated.",
                  (string v) => { assembly_name = v; } },
                { "gapidir=", "GAPI xml data  folder.",
                  (string v) => { gapidir = v; } },
                { "glue-filename=", "Filename for the generated C glue code.",
                  (string v) => { glue_filename = v; } },
                { "glue-includes=", "Content of #include directive to add in the generated C glue code.",
                  (string v) => { glue_includes = v; } },
                { "gluelib-name=", "Name of the C library into which the C glue code will be compiled. " +
                  "Used to generated correct DllImport attributes.",
                  (string v) => { gluelib_name = v; } },
                { "schema=", "Validate all GAPI XML files against this XSD schema.",
                  (string v) => { schema_name = v; } },
                { "h|help", "Show this message and exit",
                  v => show_help = v != null },
            };

            List <string> extra;

            try {
                extra = options.Parse(args);
            }
            catch (OptionException e) {
                Console.Write("gapi-codegen: ");
                Console.WriteLine(e.Message);
                Console.WriteLine("Try `gapi-codegen --help' for more information.");
                return(64);
            }

            if (show_help)
            {
                ShowHelp(options);
                return(0);
            }

            if (filenames.Count == 0)
            {
                Console.WriteLine("You need to specify a file to process using the --generate option.");
                Console.WriteLine("Try `gapi-codegen --help' for more information.");
                return(64);
            }

            if (extra.Exists(v => { return(v.StartsWith("--customdir")); }))
            {
                Console.WriteLine("Using .custom files is not supported anymore, use partial classes instead.");
                return(64);
            }

            if (!String.IsNullOrEmpty(schema_name) && !File.Exists(schema_name))
            {
                Console.WriteLine("WARNING: Could not find schema file at '{0}', no validation will be done.", schema_name);
                schema_name = null;
            }

            Parser p = new Parser();

            foreach (string include in includes)
            {
                IGeneratable[] curr_gens = p.Parse(include, schema_name, gapidir);
                table.AddTypes(curr_gens);
            }

            foreach (string filename in filenames)
            {
                IGeneratable[] curr_gens = p.Parse(filename, schema_name, gapidir);
                table.AddTypes(curr_gens);
                gens.AddRange(curr_gens);
            }

            // Now that everything is loaded, validate all the to-be-
            // generated generatables and then remove the invalid ones.
            var invalids = new List <IGeneratable> ();

            foreach (IGeneratable gen in gens)
            {
                if (!gen.Validate())
                {
                    invalids.Add(gen);
                }
            }
            foreach (IGeneratable gen in invalids)
            {
                gens.Remove(gen);
            }

            GenerationInfo gen_info = null;

            if (dir != "" || assembly_name != "" || glue_filename != "" || glue_includes != "" || gluelib_name != "")
            {
                gen_info = new GenerationInfo(dir, assembly_name, glue_filename, glue_includes, gluelib_name);
            }

            foreach (IGeneratable gen in gens)
            {
                if (gen_info == null)
                {
                    gen.Generate();
                }
                else
                {
                    gen.Generate(gen_info);
                }
            }

            ObjectGen.GenerateMappers();

            if (gen_info != null)
            {
                gen_info.CloseGlueWriter();
            }

            Statistics.Report();
            return(0);
        }
Пример #4
0
        public virtual void Generate(GenerationInfo gen_info, string indent)
        {
            if (Ignored || Hidden)
            {
                return;
            }

            CheckGlue();
            if ((getterName != null || setterName != null || getOffsetName != null) && gen_info.GlueWriter == null)
            {
                LogWriter log = new LogWriter(container_type.QualifiedName);
                log.Member = Name;
                log.Warn("needs glue for field access.  Specify --glue-filename");
                return;
            }

            GenerateImports(gen_info, indent);

            SymbolTable  table     = SymbolTable.Table;
            StreamWriter sw        = gen_info.Writer;
            string       modifiers = elem.GetAttributeAsBoolean("new_flag") ? "new " : "";
            bool         is_struct = table.IsStruct(CType) || table.IsBoxed(CType);

            sw.WriteLine(indent + "public " + modifiers + CSType + " " + Name + " {");

            if (Getter != null)
            {
                sw.Write(indent + "\tget ");
                Getter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (getterName != null)
            {
                sw.WriteLine(indent + "\tget {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + CSType + " result = " + table.FromNative(ctype, getterName + " (" + container_type.CallByName() + ")") + ";");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\treturn result;");
                sw.WriteLine(indent + "\t}");
            }
            else if (Readable && offsetName != null)
            {
                sw.WriteLine(indent + "\tget {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (is_struct)
                {
                    sw.WriteLine(indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn *raw_ptr;");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalType(CType) + "* raw_ptr = (" + table.GetMarshalType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn " + table.FromNative(ctype, "(*raw_ptr)") + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            IGeneratable gen       = table [CType];
            string       to_native = (gen is IManualMarshaler) ? (gen as IManualMarshaler).AllocNative("value") : gen.CallByName("value");

            if (Setter != null)
            {
                sw.Write(indent + "\tset ");
                Setter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (setterName != null)
            {
                sw.WriteLine(indent + "\tset {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + setterName + " (" + container_type.CallByName() + ", " + to_native + ");");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t}");
            }
            else if (Writable && offsetName != null)
            {
                sw.WriteLine(indent + "\tset {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (is_struct)
                {
                    sw.WriteLine(indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = value;");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalType(CType) + "* raw_ptr = (" + table.GetMarshalType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = " + to_native + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            sw.WriteLine(indent + "}");
            sw.WriteLine("");

            if (getterName != null || setterName != null || getOffsetName != null)
            {
                GenerateGlue(gen_info);
            }
        }
Пример #5
0
        public override void Generate(GenerationInfo gen_info, string indent)
        {
            if (Hidden)
            {
                return;
            }

            visible = Access != "private";

            StreamWriter sw    = gen_info.Writer;
            SymbolTable  table = SymbolTable.Table;

            string       wrapped      = table.GetCSType(CType);
            string       wrapped_name = SymbolTable.Table.MangleName(CName);
            IGeneratable gen          = table [CType];

            if (IsArray && !IsNullTermArray)
            {
                sw.WriteLine(indent + "[MarshalAs (UnmanagedType.ByValArray, SizeConst=" + ArrayLength + ")]");
                sw.WriteLine(indent + "{0} {1} {2};", Access, CSType, StudlyName);
            }
            else if (IsArray && IsNullTermArray)
            {
                sw.WriteLine(indent + "private {0} {1};", "IntPtr", StudlyName + "Ptr");
                if ((Readable || Writable) && Access == "public")
                {
                    sw.WriteLine(indent + "public {0} {1} {{", CSType, StudlyName);
                    if (Readable)
                    {
                        sw.WriteLine(indent + "\tget {{ return GLib.Marshaller.StructArrayFromNullTerminatedIntPtr<{0}> ({1}); }}",
                                     base.CSType, StudlyName + "Ptr");
                    }
                    if (Writable)
                    {
                        sw.WriteLine(indent + "\tset {{ {0} = GLib.Marshaller.StructArrayToNullTerminatedStructArrayIntPtr<{1}> (value); }}",
                                     StudlyName + "Ptr", base.CSType);
                    }
                    sw.WriteLine(indent + "}");
                }
            }
            else if (IsBitfield)
            {
                base.Generate(gen_info, indent);
            }
            else if (gen is IAccessor)
            {
                sw.WriteLine(indent + "private {0} {1};", gen.MarshalType, Name);

                if (Access != "private")
                {
                    IAccessor acc = table [CType] as IAccessor;
                    sw.WriteLine(indent + Access + " " + wrapped + " " + StudlyName + " {");
                    acc.WriteAccessors(sw, indent + "\t", Name);
                    sw.WriteLine(indent + "}");
                }
            }
            else if (IsPointer && (gen is StructGen || gen is BoxedGen || gen is UnionGen))
            {
                sw.WriteLine(indent + "private {0} {1};", CSType, Name);
                sw.WriteLine();
                if (Access != "private")
                {
                    sw.WriteLine(indent + Access + " " + wrapped + " " + wrapped_name + " {");
                    sw.WriteLine(indent + "\tget { return " + table.FromNative(CType, Name) + "; }");
                    sw.WriteLine(indent + "}");
                }
            }
            else if (IsPointer && CSType != "string")
            {
                // FIXME: probably some fields here which should be visible.
                visible = false;
                sw.WriteLine(indent + "private {0} {1};", CSType, Name);
            }
            else
            {
                sw.WriteLine(indent + "{0} {1} {2};", Access, CSType, Access == "public" ? StudlyName : Name);
            }
        }
Пример #6
0
        public override void Generate(GenerationInfo gen_info)
        {
            gen_info.CurrentType = QualifiedName;

            string        asm_name = gen_info.AssemblyName.Length == 0 ? NS.ToLower() + "-sharp" : gen_info.AssemblyName;
            DirectoryInfo di       = GetDirectoryInfo(gen_info.Dir, asm_name);

            StreamWriter sw = gen_info.Writer = gen_info.OpenStream(Name);

            sw.WriteLine("namespace " + NS + " {");
            sw.WriteLine();
            sw.WriteLine("\tusing System;");
            sw.WriteLine("\tusing System.Collections;");
            sw.WriteLine("\tusing System.Runtime.InteropServices;");
            sw.WriteLine();

            SymbolTable table = SymbolTable.Table;

            sw.WriteLine("#region Autogenerated code");
            if (IsDeprecated)
            {
                sw.WriteLine("\t[Obsolete]");
            }
            foreach (string attr in custom_attrs)
            {
                sw.WriteLine("\t" + attr);
            }
            sw.Write("\t{0} partial {1}class " + Name, IsInternal ? "internal" : "public", IsAbstract ? "abstract " : "");
            string cs_parent = table.GetCSType(Elem.GetAttribute("parent"));

            if (cs_parent != "")
            {
                di.objects.Add(CName, QualifiedName);
                sw.Write(" : " + cs_parent);
            }
            foreach (string iface in interfaces)
            {
                if (Parent != null && Parent.Implements(iface))
                {
                    continue;
                }
                sw.Write(", " + table.GetCSType(iface));
            }
            foreach (string iface in managed_interfaces)
            {
                if (Parent != null && Parent.Implements(iface))
                {
                    continue;
                }
                sw.Write(", " + iface);
            }
            sw.WriteLine(" {");
            sw.WriteLine();

            GenCtors(gen_info);
            GenProperties(gen_info, null);
            GenFields(gen_info);
            GenChildProperties(gen_info);

            bool has_sigs = (sigs != null && sigs.Count > 0);

            if (!has_sigs)
            {
                foreach (string iface in interfaces)
                {
                    InterfaceGen igen = table.GetClassGen(iface) as InterfaceGen;
                    if (igen != null && igen.Signals != null)
                    {
                        has_sigs = true;
                        break;
                    }
                }
            }

            if (has_sigs && Elem.HasAttribute("parent"))
            {
                GenSignals(gen_info, null);
            }

            GenClassMembers(gen_info, cs_parent);
            GenMethods(gen_info, null, null);

            if (interfaces.Count != 0)
            {
                Hashtable all_methods = new Hashtable();
                foreach (Method m in Methods.Values)
                {
                    all_methods[m.Name] = m;
                }
                Hashtable collisions = new Hashtable();
                foreach (string iface in interfaces)
                {
                    ClassBase igen = table.GetClassGen(iface);
                    foreach (Method m in igen.Methods.Values)
                    {
                        if (m.Name.StartsWith("Get") || m.Name.StartsWith("Set"))
                        {
                            if (GetProperty(m.Name.Substring(3)) != null)
                            {
                                collisions[m.Name] = true;
                                continue;
                            }
                        }
                        Method collision = all_methods[m.Name] as Method;
                        if (collision != null && collision.Signature.Types == m.Signature.Types)
                        {
                            collisions[m.Name] = true;
                        }
                        else
                        {
                            all_methods[m.Name] = m;
                        }
                    }
                }

                foreach (string iface in interfaces)
                {
                    if (Parent != null && Parent.Implements(iface))
                    {
                        continue;
                    }
                    InterfaceGen igen = table.GetClassGen(iface) as InterfaceGen;
                    igen.GenMethods(gen_info, collisions, this);
                    igen.GenProperties(gen_info, this);
                    igen.GenSignals(gen_info, this);
                    igen.GenVirtualMethods(gen_info, this);
                }
            }

            foreach (XmlElement str in strings)
            {
                sw.Write("\t\tpublic static string " + str.GetAttribute("name"));
                sw.WriteLine(" {\n\t\t\t get { return \"" + str.GetAttribute("value") + "\"; }\n\t\t}");
            }

            if (cs_parent != String.Empty && GetExpected(CName) != QualifiedName)
            {
                sw.WriteLine();
                sw.WriteLine("\t\tstatic " + Name + " ()");
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\tGtkSharp." + Studlify(asm_name) + ".ObjectManager.Initialize ();");
                sw.WriteLine("\t\t}");
            }

            sw.WriteLine("#endregion");
            AppendCustom(sw, gen_info.CustomDir);

            sw.WriteLine("\t}");
            sw.WriteLine("}");

            sw.Close();
            gen_info.Writer = null;
            Statistics.ObjectCount++;
        }
Пример #7
0
        public void Generate(GenerationInfo gen_info, string indent, ClassBase implementor)
        {
            SymbolTable  table = SymbolTable.Table;
            StreamWriter sw    = gen_info.Writer;

            if (Hidden || (!Readable && !Writable))
            {
                return;
            }

            string modifiers = "";

            if (IsNew || (container_type.Parent != null && container_type.Parent.GetPropertyRecursively(Name) != null))
            {
                modifiers = "new ";
            }
            else if (implementor != null && implementor.Parent != null && implementor.Parent.GetPropertyRecursively(Name) != null)
            {
                modifiers = "new ";
            }

            string name = Name;

            if (name == container_type.Name)
            {
                name += "Prop";
            }
            string qpname = "\"" + CName + "\"";

            string v_type = "";

            if (table.IsInterface(CType))
            {
                v_type = "(GLib.Object)";
            }
            else if (table.IsOpaque(CType))
            {
                v_type = "(GLib.Opaque)";
            }
            else if (table.IsEnum(CType))
            {
                v_type = "(Enum)";
            }

            GenerateImports(gen_info, indent);

            if (IsDeprecated ||
                (Getter != null && Getter.IsDeprecated) ||
                (Setter != null && Setter.IsDeprecated))
            {
                sw.WriteLine(indent + "[Obsolete]");
            }
            sw.WriteLine(indent + PropertyAttribute(qpname));
            sw.WriteLine(indent + "public " + modifiers + CSType + " " + name + " {");
            indent += "\t";

            if (Getter != null)
            {
                sw.Write(indent + "get ");
                Getter.GenerateBody(gen_info, implementor, "\t");
                sw.WriteLine();
            }
            else if (Readable)
            {
                sw.WriteLine(indent + "get {");
                sw.WriteLine(indent + "\tusing (GLib.Value val = " + RawGetter(qpname) + ") {");
                if (table.IsOpaque(CType) || table.IsBoxed(CType))
                {
                    sw.WriteLine(indent + "\t\t" + CSType + " ret = (" + CSType + ") val;");
                }
                else if (table.IsInterface(CType))
                {
                    // Do we have to dispose the GLib.Object from the GLib.Value?
                    sw.WriteLine(indent + "\t\t{0} ret = {0}Adapter.GetObject ((GLib.Object) val);", CSType);
                }
                else
                {
                    sw.Write(indent + "\t\t" + CSType + " ret = ");
                    sw.Write("(" + CSType + ") ");
                    if (v_type != "")
                    {
                        sw.Write(v_type + " ");
                    }
                    sw.WriteLine("val;");
                }

                sw.WriteLine(indent + "\t\treturn ret;");
                sw.WriteLine(indent + "\t}");
                sw.WriteLine(indent + "}");
            }

            if (Setter != null)
            {
                sw.Write(indent + "set ");
                Setter.GenerateBody(gen_info, implementor, "\t");
                sw.WriteLine();
            }
            else if (Writable)
            {
                sw.WriteLine(indent + "set {");
                sw.Write(indent + "\tusing (GLib.Value val = ");
                if (table.IsBoxed(CType))
                {
                    sw.Write("(GLib.Value) value");
                }
                else if (table.IsOpaque(CType))
                {
                    sw.Write("new GLib.Value(value, \"{0}\")", CType);
                }
                else
                {
                    sw.Write("new GLib.Value(");
                    if (v_type != "" && !(table.IsObject(CType) || table.IsInterface(CType) || table.IsOpaque(CType)))
                    {
                        sw.Write(v_type + " ");
                    }
                    sw.Write("value)");
                }
                sw.WriteLine(") {");
                sw.WriteLine(indent + "\t\t" + RawSetter(qpname) + ";");
                sw.WriteLine(indent + "\t}");
                sw.WriteLine(indent + "}");
            }

            sw.WriteLine(indent.Substring(1) + "}");
            sw.WriteLine();

            Statistics.PropCount++;
        }
Пример #8
0
        public virtual void Generate(GenerationInfo gen_info, string indent)
        {
            if (Ignored || Hidden)
            {
                return;
            }

            CheckGlue();
            if ((getterName != null || setterName != null || getOffsetName != null) &&
                gen_info.GlueWriter == null)
            {
                Console.WriteLine("No glue-filename specified, can't create glue for {0}.{1}",
                                  container_type.Name, Name);
                return;
            }

            GenerateImports(gen_info, indent);

            SymbolTable  table     = SymbolTable.Table;
            StreamWriter sw        = gen_info.Writer;
            string       modifiers = elem.HasAttribute("new_flag") ? "new " : "";
            bool         is_struct = table.IsStruct(CType) || table.IsBoxed(CType);

            sw.WriteLine(indent + "public " + modifiers + CSType + " " + Name + " {");

            if (Getter != null)
            {
                sw.Write(indent + "\tget ");
                Getter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (getterName != null)
            {
                sw.WriteLine(indent + "\tget {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + CSType + " result = " + table.FromNativeReturn(ctype, getterName + " (" + container_type.CallByName() + ")") + ";");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\treturn result;");
                sw.WriteLine(indent + "\t}");
            }
            else if (Readable && offsetName != null)
            {
                sw.WriteLine(indent + "\tget {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (is_struct)
                {
                    sw.WriteLine(indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn *raw_ptr;");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalReturnType(CType) + "* raw_ptr = (" + table.GetMarshalReturnType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\treturn " + table.FromNativeReturn(ctype, "(*raw_ptr)") + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            if (Setter != null)
            {
                sw.Write(indent + "\tset ");
                Setter.GenerateBody(gen_info, container_type, "\t");
                sw.WriteLine("");
            }
            else if (setterName != null)
            {
                sw.WriteLine(indent + "\tset {");
                container_type.Prepare(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t\t" + setterName + " (" + container_type.CallByName() + ", " + table.CallByName(ctype, "value") + ");");
                container_type.Finish(sw, indent + "\t\t");
                sw.WriteLine(indent + "\t}");
            }
            else if (Writable && offsetName != null)
            {
                sw.WriteLine(indent + "\tset {");
                sw.WriteLine(indent + "\t\tunsafe {");
                if (is_struct)
                {
                    sw.WriteLine(indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = value;");
                }
                else
                {
                    sw.WriteLine(indent + "\t\t\t" + table.GetMarshalReturnType(CType) + "* raw_ptr = (" + table.GetMarshalReturnType(CType) + "*)(((byte*)" + container_type.CallByName() + ") + " + offsetName + ");");
                    sw.WriteLine(indent + "\t\t\t*raw_ptr = " + table.ToNativeReturn(ctype, "value") + ";");
                }
                sw.WriteLine(indent + "\t\t}");
                sw.WriteLine(indent + "\t}");
            }

            sw.WriteLine(indent + "}");
            sw.WriteLine("");

            if (getterName != null || setterName != null || getOffsetName != null)
            {
                GenerateGlue(gen_info);
            }
        }