// GtkSharp.Generation.StructBase.cs - The Structure/Boxed Base Class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Xml; public abstract class StructBase : ClassBase { ArrayList fields = new ArrayList (); protected StructBase (XmlElement ns, XmlElement elem) : base (ns, elem) { foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; switch (node.Name) { case "field": fields.Add (new StructField (member, this)); break; case "callback": Statistics.IgnoreCount++; break; default: if (!IsNodeNameHandled (node.Name)) Console.WriteLine ("Unexpected node " + node.Name + " in " + CName); break; } } } public override string MarshalType { get { return "ref " + QualifiedName; } } public override string MarshalReturnType { get { return "IntPtr"; } } public override string ToNativeReturnType { get { return QualifiedName; } } public override string CallByName (string var_name) { return "ref " + var_name; } public override string CallByName () { return "ref this"; } public override string AssignToName { get { return "raw"; } } public override string FromNative(string var) { return var; } public override string FromNativeReturn(string var) { return QualifiedName + ".New (" + var + ")"; } public override string ToNativeReturn(string var) { // FIXME return var; } private bool DisableNew { get { return Elem.HasAttribute ("disable_new"); } } protected void GenFields (GenerationInfo gen_info) { StructField.bitfields = 0; bool need_field = true; foreach (StructField field in fields) { if (field.IsBit) { if (need_field) need_field = false; else continue; } else need_field = true; field.Generate (gen_info, "\t\t"); } } public bool Validate () { foreach (StructField field in fields) { if (!field.Validate ()) { Console.WriteLine ("in Struct " + QualifiedName); return false; } } return true; } public override void Generate (GenerationInfo gen_info) { bool need_close = false; if (gen_info.Writer == null) { gen_info.Writer = gen_info.OpenStream (Name); need_close = true; } StreamWriter sw = gen_info.Writer; 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"); sw.WriteLine ("\t[StructLayout(LayoutKind.Sequential)]"); sw.WriteLine ("\tpublic struct " + Name + " {"); sw.WriteLine (); GenFields (gen_info); sw.WriteLine (); GenCtors (gen_info); GenMethods (gen_info, null, null); if (!need_close) return; sw.WriteLine ("#endregion"); AppendCustom(sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; } protected override void GenCtors (GenerationInfo gen_info) { StreamWriter sw = gen_info.Writer; sw.WriteLine ("\t\tpublic static {0} Zero = new {0} ();", QualifiedName); sw.WriteLine(); if (!DisableNew) { sw.WriteLine ("\t\tpublic static " + QualifiedName + " New(IntPtr raw) {"); sw.WriteLine ("\t\t\tif (raw == IntPtr.Zero) {"); sw.WriteLine ("\t\t\t\treturn {0}.Zero;", QualifiedName); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t\t{0} self = new {0}();", QualifiedName); sw.WriteLine ("\t\t\tself = ({0}) Marshal.PtrToStructure (raw, self.GetType ());", QualifiedName); sw.WriteLine ("\t\t\treturn self;"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } foreach (Ctor ctor in Ctors) ctor.IsStatic = true; base.GenCtors (gen_info); } } }