From 66c0ec1d43a86cb3462eb6f1ea0e1f8135356cd3 Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Thu, 8 Aug 2002 04:48:41 +0000 Subject: [PATCH] 2002-08-07 Mike Kestner * generator/CodeGenerator.cs : call ObjectGen.GenerateMapper * generator/Method.cs : Remove the if null workaround * generator/ObjectGen.cs : build a hash of object types. (GenerateMapper): generate the GtkSharp.ObjectManager class. * glib/Object.cs : use ObjectManager.CreateObject. * glue/type.c : helper for typename lookup. svn path=/trunk/gtk-sharp/; revision=6526 --- ChangeLog | 9 ++++++ generator/CodeGenerator.cs | 2 ++ generator/Method.cs | 2 +- generator/ObjectGen.cs | 62 ++++++++++++++++++++++++++++++++++++++ glib/Object.cs | 2 +- glue/Makefile.am | 1 + glue/type.c | 16 ++++++++++ 7 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 glue/type.c diff --git a/ChangeLog b/ChangeLog index fcd7fc933..ae8a10177 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2002-08-07 Mike Kestner + + * generator/CodeGenerator.cs : call ObjectGen.GenerateMapper + * generator/Method.cs : Remove the if null workaround + * generator/ObjectGen.cs : build a hash of object types. + (GenerateMapper): generate the GtkSharp.ObjectManager class. + * glib/Object.cs : use ObjectManager.CreateObject. + * glue/type.c : helper for typename lookup. + 2002-08-07 Duncan Mak * sample/Fifteen.cs: Fixed scramble. The whole thing works now. diff --git a/generator/CodeGenerator.cs b/generator/CodeGenerator.cs index 5993da231..0ef9af248 100644 --- a/generator/CodeGenerator.cs +++ b/generator/CodeGenerator.cs @@ -27,6 +27,8 @@ namespace GtkSharp.Generation { gen.Generate (); } + ObjectGen.GenerateMapper (); + Statistics.Report(); return 0; } diff --git a/generator/Method.cs b/generator/Method.cs index 96f6dc0ba..8788dc1ba 100644 --- a/generator/Method.cs +++ b/generator/Method.cs @@ -374,7 +374,7 @@ namespace GtkSharp.Generation { { sw.WriteLine(m_ret + " raw_ret = " + cname + call + ";"); sw.WriteLine(indent +"\t\t\t" + s_ret + " ret = " + SymbolTable.FromNativeReturn(rettype, "raw_ret") + ";"); - sw.WriteLine(indent + "\t\t\tif (ret == null) ret = new " + s_ret + "(raw_ret);"); + // sw.WriteLine(indent + "\t\t\tif (ret == null) ret = new " + s_ret + "(raw_ret);"); } else { sw.WriteLine(m_ret + " raw_ret = " + cname + call + ";"); diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs index 7bf75947d..cdc2bbc5b 100644 --- a/generator/ObjectGen.cs +++ b/generator/ObjectGen.cs @@ -14,9 +14,12 @@ namespace GtkSharp.Generation { public class ObjectGen : ClassBase, IGeneratable { private ArrayList strings = new ArrayList(); + private static Hashtable objs = new Hashtable(); public ObjectGen (XmlElement ns, XmlElement elem) : base (ns, elem) { + objs.Add (CName, QualifiedName + "," + NS.ToLower() + "-sharp"); + foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; @@ -176,6 +179,65 @@ namespace GtkSharp.Generation { base.GenCtors (sw); } + + public static void GenerateMapper () + { + char sep = Path.DirectorySeparatorChar; + string dir = ".." + sep + "glib" + sep + "generated"; + if (!Directory.Exists(dir)) { + Console.WriteLine ("creating " + dir); + Directory.CreateDirectory(dir); + } + String filename = dir + sep + "ObjectManager.cs"; + + FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write); + StreamWriter sw = new StreamWriter (stream); + + sw.WriteLine ("// Generated File. Do not modify."); + sw.WriteLine ("// 2001-2002 Mike Kestner"); + sw.WriteLine (); + + sw.WriteLine ("namespace GtkSharp {"); + sw.WriteLine (); + sw.WriteLine ("\tusing System;"); + sw.WriteLine ("\tusing System.Collections;"); + sw.WriteLine ("\tusing System.Runtime.InteropServices;"); + sw.WriteLine (); + sw.WriteLine ("\tpublic class ObjectManager {"); + sw.WriteLine (); + sw.WriteLine ("\t\tprivate static Hashtable types = new Hashtable ();"); + sw.WriteLine (); + sw.WriteLine ("\t\tstatic ObjectManager ()"); + sw.WriteLine ("\t\t{"); + + foreach (string key in objs.Keys) { + sw.WriteLine ("\t\t\t\ttypes.Add(\"" + key + "\", \"" + objs[key] + "\");"); + } + + sw.WriteLine ("\t\t}"); + sw.WriteLine (); + sw.WriteLine ("\t\t[DllImport(\"gtksharpglue\")]"); + sw.WriteLine ("\t\tstatic extern string gtksharp_get_type_name (IntPtr raw);"); + sw.WriteLine (); + sw.WriteLine ("\t\tpublic static GLib.Object CreateObject (IntPtr raw)"); + sw.WriteLine ("\t\t{"); + sw.WriteLine ("\t\t\tstring typename = gtksharp_get_type_name (raw);"); + sw.WriteLine ("\t\t\tif (!types.ContainsKey(typename))"); + sw.WriteLine ("\t\t\t\treturn null;"); + sw.WriteLine (); + sw.WriteLine ("\t\t\tType t = Type.GetType ((string)types[typename]);"); + sw.WriteLine ("\t\t\treturn (GLib.Object) Activator.CreateInstance (t, new object[] {raw});"); + sw.WriteLine ("\t\t}"); + sw.WriteLine (); + sw.WriteLine ("\t\tpublic static void RegisterType (string native_name, string managed_name, string assembly)"); + sw.WriteLine ("\t\t{"); + sw.WriteLine ("\t\t\ttypes.Add(native_name, managed_name + \",\" + assembly);"); + sw.WriteLine ("\t\t}"); + sw.WriteLine ("\t}"); + sw.WriteLine ("}"); + sw.Flush (); + sw.Close (); + } } } diff --git a/glib/Object.cs b/glib/Object.cs index fb9e0d71c..f434d601d 100644 --- a/glib/Object.cs +++ b/glib/Object.cs @@ -48,7 +48,7 @@ namespace GLib { { Object obj = (Object)Objects[(int)o]; if (obj != null) return obj; - return null; //FIXME: Call TypeParser here eventually. + return GtkSharp.ObjectManager.CreateObject(o); } /// diff --git a/glue/Makefile.am b/glue/Makefile.am index b4f985088..468f9a65f 100644 --- a/glue/Makefile.am +++ b/glue/Makefile.am @@ -10,6 +10,7 @@ BASESOURCES = \ slist.c \ paned.c \ style.c \ + type.c \ widget.c \ canvasitem.c diff --git a/glue/type.c b/glue/type.c new file mode 100644 index 000000000..c28b4bb1e --- /dev/null +++ b/glue/type.c @@ -0,0 +1,16 @@ +/* value.c : Glue to allocate GValues on the heap. + * + * Author: Mike Kestner + * + * 2002 Mike Kestner + */ + +#include + +gchar * +gtksharp_get_type_name (GObject *obj) +{ + return G_OBJECT_TYPE_NAME (obj); +} + +