From fc42fa2c0428b6b9c9888d3536caeed7b4a0d5bd Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Tue, 27 Jan 2004 23:55:13 +0000 Subject: [PATCH] 2004-01-27 Mike Kestner * glib/TypeConverter.cs : lookup GTypes for boxed value types. * glib/Value.cs : fix boxed type handling in object ctor. [Fixes #51043] svn path=/trunk/gtk-sharp/; revision=22555 --- ChangeLog | 6 ++++++ glib/TypeConverter.cs | 16 ++++++++++------ glib/Value.cs | 7 +++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7e41bd897..1b41ce49f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-01-27 Mike Kestner + + * glib/TypeConverter.cs : lookup GTypes for boxed value types. + * glib/Value.cs : fix boxed type handling in object ctor. + [Fixes #51043] + 2004-01-27 Mike Kestner * generator/BoxedGen.cs : gen a Value to Boxed explicit cast op. diff --git a/glib/TypeConverter.cs b/glib/TypeConverter.cs index 0743de29b..aec2ad1c8 100644 --- a/glib/TypeConverter.cs +++ b/glib/TypeConverter.cs @@ -7,6 +7,7 @@ namespace GLibSharp { using System; using System.Collections; + using System.Reflection; using GLib; /// @@ -36,14 +37,17 @@ namespace GLibSharp { return GType.Char; if (type.Equals (typeof (uint))) return GType.UInt; - if (type.IsValueType) - return GType.Pointer; if (type.IsSubclassOf (typeof (GLib.Object))) return GType.Object; - else if (type.IsSubclassOf (typeof (GLib.Boxed))) - return GType.Boxed; - else - return GType.None; + if (type.IsValueType) { + PropertyInfo pi = type.GetProperty ("GType"); + if (pi == null) + return GType.Pointer; + else + return (GType) pi.GetValue (null, null); + } + + return GType.None; } } } diff --git a/glib/Value.cs b/glib/Value.cs index 8428cb891..1987a3abc 100755 --- a/glib/Value.cs +++ b/glib/Value.cs @@ -317,6 +317,9 @@ namespace GLib { [DllImport("libgobject-2.0-0.dll")] static extern void g_value_set_boxed_take_ownership (IntPtr val, IntPtr data); + [DllImport("libgobject-2.0-0.dll")] + static extern bool g_type_is_a (IntPtr type, IntPtr is_a_type); + IntPtr buf = IntPtr.Zero; /// @@ -361,6 +364,10 @@ namespace GLib { buf = Marshal.AllocHGlobal (Marshal.SizeOf (obj.GetType())); Marshal.StructureToPtr (obj, buf, false); g_value_set_pointer (_val, buf); + } else if (g_type_is_a (type.Val, GLib.GType.Boxed.Val)) { + buf = Marshal.AllocHGlobal (Marshal.SizeOf (obj.GetType())); + Marshal.StructureToPtr (obj, buf, false); + g_value_set_boxed (_val, buf); } else throw new Exception ("Unknown type"); }