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++; }
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); } }
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); }
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); } }
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); } }
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++; }
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++; }
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); } }