From 90a870e2def5e16f04ec053f11769f4d7b913438 Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Tue, 8 Mar 2005 21:28:08 +0000 Subject: [PATCH] 2005-03-08 Mike Kestner * */*.cs : scrub for StringToPtrAnsi and string usage in DllImports. * */*.custom : begin the scrub here too. * generator/ConstStringGen.cs : implement IManualMarshaler and move to 100% IntPtr marshaling. * generator/Ctor.cs : call Body.Finish too. * generator/IManualMarshaler.cs : new interface for generatables that marshal manually and need cleanup. * generator/Makefile.am : new file. * generator/MethodBody.cs : use IManualMarshaler if applicable. svn path=/trunk/gtk-sharp/; revision=41579 --- ChangeLog | 12 ++ doc/en/GLib/Marshaller.xml | 17 ++- doc/en/Gda/Application.xml | 70 ++++++------ gconf/GConf/Value.cs | 2 +- gda/Application.cs | 45 +++++--- gda/XmlConnection.custom | 5 +- gdk/Device.custom | 2 +- gdk/EventSetting.cs | 2 +- gdk/TextProperty.cs | 4 +- generator/ConstStringGen.cs | 27 +++-- generator/Ctor.cs | 1 + generator/IManualMarshaler.cs | 32 ++++++ generator/Makefile.am | 1 + generator/MethodBody.cs | 24 ++-- glade/XML.custom | 4 +- glib/Argv.cs | 7 +- glib/DelegateWrapper.cs | 5 +- glib/FileUtils.cs | 8 +- glib/GException.cs | 2 +- glib/GString.cs | 8 +- glib/ListBase.cs | 4 +- glib/Log.cs | 54 ++++----- glib/ManagedValue.cs | 6 +- glib/Markup.cs | 9 +- glib/Marshaller.cs | 25 +++-- glib/NotifyHandler.cs | 2 +- glib/Object.cs | 35 ++++-- glib/ObjectManager.cs | 4 +- glib/Signal.cs | 32 ++++-- glib/SignalCallback.cs | 6 +- glib/Value.cs | 42 ++++--- gnome/IconTheme.cs | 6 +- gnome/IconTheme.custom | 2 +- gnome/PanelAppletFactory.cs | 6 +- gnomedb/Application.cs | 41 ++++--- gnomevfs/FileInfo.cs | 6 +- gnomevfs/Vfs.cs | 2 +- gtk/FileSelection.custom | 4 +- gtk/IconTheme.custom | 2 +- gtk/RadioMenuItem.custom | 4 +- gtk/Stock.custom | 6 +- gtk/StockManager.cs | 13 ++- pango/Layout.custom | 18 ++- rsvg/Tool.cs | 204 ++++++++++++++-------------------- 44 files changed, 472 insertions(+), 339 deletions(-) create mode 100644 generator/IManualMarshaler.cs diff --git a/ChangeLog b/ChangeLog index 1a68686df..96717a949 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-03-08 Mike Kestner + + * */*.cs : scrub for StringToPtrAnsi and string usage in DllImports. + * */*.custom : begin the scrub here too. + * generator/ConstStringGen.cs : implement IManualMarshaler and move to + 100% IntPtr marshaling. + * generator/Ctor.cs : call Body.Finish too. + * generator/IManualMarshaler.cs : new interface for generatables that + marshal manually and need cleanup. + * generator/Makefile.am : new file. + * generator/MethodBody.cs : use IManualMarshaler if applicable. + 2005-03-07 Mike Kestner * generator/MethodBody.cs : remove an unused var. diff --git a/doc/en/GLib/Marshaller.xml b/doc/en/GLib/Marshaller.xml index 90ba368a2..a03576f06 100644 --- a/doc/en/GLib/Marshaller.xml +++ b/doc/en/GLib/Marshaller.xml @@ -217,5 +217,20 @@ To be added + + + Method + + System.Void + + + + + + To be added + a + To be added + + - + \ No newline at end of file diff --git a/doc/en/Gda/Application.xml b/doc/en/Gda/Application.xml index 1eaa00131..fdfd616d3 100644 --- a/doc/en/Gda/Application.xml +++ b/doc/en/Gda/Application.xml @@ -48,40 +48,6 @@ To be added - - - Method - - System.Void - - - - - - To be added - a - To be added - - - - - Method - - System.Void - - - - - - - - To be added - a - a - a - To be added - - Method @@ -117,5 +83,39 @@ To be added + + + Method + + System.Void + + + + + + To be added + a + To be added + + + + + Method + + System.Void + + + + + + + + To be added + a + a + a + To be added + + - \ No newline at end of file + diff --git a/gconf/GConf/Value.cs b/gconf/GConf/Value.cs index 6cb67345f..95b4d1ddd 100644 --- a/gconf/GConf/Value.cs +++ b/gconf/GConf/Value.cs @@ -165,7 +165,7 @@ namespace GConf switch (val_type) { case ValueType.String: - return Marshal.PtrToStringAnsi (gconf_value_get_string (Raw)); + return GLib.Marshaller.Utf8PtrToString (gconf_value_get_string (Raw)); case ValueType.Int: return gconf_value_get_int (Raw); case ValueType.Float: diff --git a/gda/Application.cs b/gda/Application.cs index d2f75a960..de0a37c56 100644 --- a/gda/Application.cs +++ b/gda/Application.cs @@ -23,42 +23,53 @@ using System.Runtime.InteropServices; namespace Gda { - /// - /// GDA Application class - /// - /// - /// - /// Provides the initialization and event loop iteration related - /// methods for the GDA data access library. - /// - public class Application { private const string VERSION = "0.10"; [DllImport("gda-2")] - static extern void gda_init (string app_id, string version, int nargs, string[] args); + static extern void gda_init (IntPtr app_id, IntPtr version, int nargs, IntPtr args); + [DllImport("gda-2")] + static extern void gda_init (IntPtr app_id, IntPtr version, ref int argc, ref IntPtr argv); + public static void Init () { - gda_init ("Gda#", VERSION, 0, new string[0]); + Init ("Gda#", VERSION); } public static void Init (string app_id, string version) { - gda_init (app_id, version, 0, new string[0]); + IntPtr native_appid = GLib.Marshaller.StringToPtrGStrdup (app_id); + IntPtr native_version = GLib.Marshaller.StringToPtrGStrdup (version); + gda_init (native_appid, native_version, 0, IntPtr.Zero); + GLib.Marshaller.Free (native_appid); + GLib.Marshaller.Free (native_version); } - public static void Init (string[] args) + public static void Init (ref string[] args) { - gda_init ("Gda#", VERSION, args.Length, args); + Init ("Gda#", VERSION, ref args); } - public static void Init (string app_id, string version, string[] args) + public static void Init (string app_id, string version, ref string[] args) { - gda_init (app_id, version, args.Length, args); + IntPtr native_appid = GLib.Marshaller.StringToPtrGStrdup (app_id); + IntPtr native_version = GLib.Marshaller.StringToPtrGStrdup (version); + GLib.Argv argv = new GLib.Argv (args); + IntPtr arg_ptr = argv.Handle; + int argc = args.Length; + gda_init (native_appid, native_version, ref argc, ref arg_ptr); + GLib.Marshaller.Free (native_appid); + GLib.Marshaller.Free (native_version); + if (arg_ptr != argv.Handle) + throw new Exception ("Init returned new argv handle."); + if (argc <= 1) + args = new string [0]; + else + args = argv.GetArgs (argc); } - + [DllImport("gda-2")] static extern void gda_main_run (IntPtr init_func, IntPtr user_data); diff --git a/gda/XmlConnection.custom b/gda/XmlConnection.custom index 3fe05aac9..957a81c12 100644 --- a/gda/XmlConnection.custom +++ b/gda/XmlConnection.custom @@ -21,6 +21,9 @@ public static XmlConnection NewFromFile (string filename) { - return new XmlConnection (gda_xml_connection_new_from_file (filename)); + IntPtr filename_as_native = GLib.Marshaller.StringToPtrGStrdup (filename); + XmlConnection ret = new XmlConnection (gda_xml_connection_new_from_file (filename_as_native)); + GLib.Marshaller.Free (filename_as_native); + return ret; } diff --git a/gdk/Device.custom b/gdk/Device.custom index afb544f92..886f0f0d8 100644 --- a/gdk/Device.custom +++ b/gdk/Device.custom @@ -53,7 +53,7 @@ public string Name { get { IntPtr rawName = gtksharp_gdk_device_get_name (Handle); - return Marshal.PtrToStringAnsi(rawName); + return GLib.Marshaller.Utf8PtrToString (rawName); } } diff --git a/gdk/EventSetting.cs b/gdk/EventSetting.cs index 3a1e2949e..d95b31b73 100644 --- a/gdk/EventSetting.cs +++ b/gdk/EventSetting.cs @@ -42,7 +42,7 @@ namespace Gdk { public string Name { get { - return Marshal.PtrToStringAnsi (gtksharp_gdk_event_setting_get_name (Handle)); + return GLib.Marshaller.Utf8PtrToString (gtksharp_gdk_event_setting_get_name (Handle)); } } } diff --git a/gdk/TextProperty.cs b/gdk/TextProperty.cs index 212c6da19..96bc4e2eb 100644 --- a/gdk/TextProperty.cs +++ b/gdk/TextProperty.cs @@ -43,7 +43,7 @@ namespace Gdk { string[] result = new string [count]; for (int i = 0; i < count; i++) { IntPtr ptr = Marshal.ReadIntPtr (list_ptr, i * IntPtr.Size); - result [i] = Marshal.PtrToStringAnsi (ptr); + result [i] = GLib.Marshaller.Utf8PtrToString (ptr); } gdk_free_text_list (list_ptr); return result; @@ -63,7 +63,7 @@ namespace Gdk { string[] result = new string [count]; for (int i = 0; i < count; i++) { IntPtr ptr = Marshal.ReadIntPtr (list_ptr, i * IntPtr.Size); - result [i] = Marshal.PtrToStringAnsi (ptr); + result [i] = GLib.Marshaller.Utf8PtrToString (ptr); } gdk_free_text_list (list_ptr); return result; diff --git a/generator/ConstStringGen.cs b/generator/ConstStringGen.cs index 6f2ae6a01..1a50279a2 100644 --- a/generator/ConstStringGen.cs +++ b/generator/ConstStringGen.cs @@ -1,8 +1,10 @@ // GtkSharp.Generation.ConstStringGen.cs - The Const String type Generatable. // // Author: Rachel Hestilow +// Mike Kestner // // Copyright (c) 2003 Rachel Hestilow +// Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public @@ -23,22 +25,29 @@ namespace GtkSharp.Generation { using System; - public class ConstStringGen : SimpleBase { + public class ConstStringGen : SimpleBase, IManualMarshaler { - public ConstStringGen (string ctype) : base (ctype, "string") - { - } + public ConstStringGen (string ctype) : base (ctype, "string") {} - public override string MarshalReturnType { - get - { + public override string MarshalType { + get { return "IntPtr"; } } - public override string FromNativeReturn(string var) + public override string FromNative (string var) { - return "Marshal.PtrToStringAnsi(" + var + ")"; + return "GLib.Marshaller.Utf8PtrToString (" + var + ")"; + } + + public string AllocNative (string managed_var) + { + return "GLib.Marshaller.StringToPtrGStrdup (" + managed_var + ")"; + } + + public string ReleaseNative (string native_var) + { + return "GLib.Marshaller.Free (" + native_var + ")"; } } } diff --git a/generator/Ctor.cs b/generator/Ctor.cs index 159424f4d..20ed27996 100644 --- a/generator/Ctor.cs +++ b/generator/Ctor.cs @@ -151,6 +151,7 @@ namespace GtkSharp.Generation { Body.Initialize(gen_info, false, false, ""); sw.WriteLine("\t\t\t{0} = {1}({2});", container_type.AssignToName, CName, Body.GetCallString (false)); + Body.Finish (sw, ""); Body.HandleException (sw, ""); } diff --git a/generator/IManualMarshaler.cs b/generator/IManualMarshaler.cs new file mode 100644 index 000000000..e9e7eaf3d --- /dev/null +++ b/generator/IManualMarshaler.cs @@ -0,0 +1,32 @@ +// GtkSharp.Generation.IManualMarshaler.cs - Interface for manual marshaling. +// +// Author: Mike Kestner +// +// Copyright (c) 2005 Novell, Inc. +// +// 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 { + + public interface IManualMarshaler { + + string AllocNative (string managed_var); + + string ReleaseNative (string native_var); + + } +} + diff --git a/generator/Makefile.am b/generator/Makefile.am index e426c30f5..bbe00ac63 100644 --- a/generator/Makefile.am +++ b/generator/Makefile.am @@ -22,6 +22,7 @@ sources = \ GenBase.cs \ GenerationInfo.cs \ IGeneratable.cs \ + IManualMarshaler.cs \ ImportSignature.cs \ InterfaceGen.cs \ LPGen.cs \ diff --git a/generator/MethodBody.cs b/generator/MethodBody.cs index 99c8c76ae..b3a1c6ad4 100644 --- a/generator/MethodBody.cs +++ b/generator/MethodBody.cs @@ -77,7 +77,7 @@ namespace GtkSharp.Generation { result[i] = igen.CallByName (CastFromInt (p.CSType) + parameters [i - 1].Name + ".Length"); continue; } else if (p.IsArray && p.MarshalType != p.CSType) { - result[i] = (is_set && i == 0 ? "native_value" : "native_" + p.Name); + result[i] = "native_" + p.Name; continue; } @@ -90,7 +90,8 @@ namespace GtkSharp.Generation { if (p.CSType != p.MarshalType && !(igen is StructBase || igen is ByRefGen)) call_parm = p.Name + "_as_native"; - } + } else if (igen is IManualMarshaler) + call_parm = p.Name + "_as_native"; if (p.CType == "GError**") { call_parm = call_parm.Replace (p.Name, "error"); @@ -124,12 +125,16 @@ namespace GtkSharp.Generation { if ((is_get || p.PassAs == "out") && p.CSType != p.MarshalType && !(gen is StructBase || gen is ByRefGen)) sw.WriteLine(indent + "\t\t\t" + gen.MarshalType + " " + name + "_as_native;"); - - if (p.IsArray && p.MarshalType != p.CSType) { - sw.WriteLine(indent + "\t\t\t{0}[] native_{1} = new {0} [{1}.Length];", p.MarshalType.TrimEnd('[', ']'), name); + else if (p.IsArray && p.MarshalType != p.CSType) { + sw.WriteLine(indent + "\t\t\t{0}[] native_" + p.Name + " = new {0} [{1}.Length];", p.MarshalType.TrimEnd('[', ']'), name); sw.WriteLine(indent + "\t\t\tfor (int i = 0; i < {0}.Length; i++)", name); - sw.WriteLine(indent + "\t\t\t\tnative_{0} [i] = {1};", name, p.CallByName (name + "[i]")); - } + if (gen is IManualMarshaler) + sw.WriteLine(indent + "\t\t\t\tnative_{0} [i] = {1};", p.Name, (gen as IManualMarshaler).AllocNative (name + "[i]")); + else + sw.WriteLine(indent + "\t\t\t\tnative_{0} [i] = {1};", p.Name, p.CallByName (name + "[i]")); + } else if (gen is IManualMarshaler) + sw.WriteLine(indent + "\t\t\t" + gen.MarshalType + " " + p.Name + "_as_native = " + (gen as IManualMarshaler).AllocNative (name) + ";"); + if (gen is CallbackGen) { CallbackGen cbgen = gen as CallbackGen; @@ -160,6 +165,11 @@ namespace GtkSharp.Generation { if (p.PassAs == "out" && p.CSType != p.MarshalType && !(gen is StructBase || gen is ByRefGen)) sw.WriteLine(indent + "\t\t\t" + p.Name + " = " + gen.FromNative (p.Name + "_as_native") + ";"); + else if (p.IsArray && gen is IManualMarshaler) { + sw.WriteLine(indent + "\t\t\tfor (int i = 0; i < native_" + p.Name + ".Length; i++)"); + sw.WriteLine(indent + "\t\t\t\t" + (gen as IManualMarshaler).ReleaseNative ("native_" + p.Name + "[i]") + ";"); + } else if (gen is IManualMarshaler) + sw.WriteLine(indent + "\t\t\t" + (gen as IManualMarshaler).ReleaseNative (p.Name + "_as_native") + ";"); } } diff --git a/glade/XML.custom b/glade/XML.custom index 489f3746b..017e59545 100644 --- a/glade/XML.custom +++ b/glade/XML.custom @@ -50,7 +50,7 @@ } else { - ret = Marshal.PtrToStringAnsi (ptr); + ret = GLib.Marshaller.Utf8PtrToString (ptr); } return ret; } @@ -71,7 +71,7 @@ if (ptr == IntPtr.Zero) ret = ""; else - ret = Marshal.PtrToStringAnsi (ptr); + ret = GLib.Marshaller.Utf8PtrToString (ptr); return ret; } diff --git a/glib/Argv.cs b/glib/Argv.cs index 54303e8dc..6f5d09307 100644 --- a/glib/Argv.cs +++ b/glib/Argv.cs @@ -30,9 +30,6 @@ namespace GLib { IntPtr handle; bool add_progname = false; - [DllImport("libglib-2.0-0.dll")] - static extern IntPtr g_strdup (string str); - [DllImport("libglib-2.0-0.dll")] static extern IntPtr g_malloc(IntPtr size); @@ -62,7 +59,7 @@ namespace GLib { arg_ptrs = new IntPtr [args.Length]; for (int i = 0; i < args.Length; i++) - arg_ptrs [i] = g_strdup (args[i]); + arg_ptrs [i] = Marshaller.StringToPtrGStrdup (args[i]); handle = g_malloc (new IntPtr (IntPtr.Size * args.Length)); @@ -83,7 +80,7 @@ namespace GLib { string[] result = new string [count]; for (int i = 0; i < count; i++, idx++) - result [i] = Marshal.PtrToStringAnsi (Marshal.ReadIntPtr (handle, idx * IntPtr.Size)); + result [i] = Marshaller.Utf8PtrToString (Marshal.ReadIntPtr (handle, idx * IntPtr.Size)); return result; } diff --git a/glib/DelegateWrapper.cs b/glib/DelegateWrapper.cs index e5dcef3a8..62cee1de6 100644 --- a/glib/DelegateWrapper.cs +++ b/glib/DelegateWrapper.cs @@ -71,7 +71,7 @@ namespace GLib { private delegate void DestroyNotify (IntPtr data); [DllImport("libgobject-2.0-0.dll")] - private static extern void g_object_set_data (IntPtr obj, string name, IntPtr data, DestroyNotify destroy); + private static extern void g_object_set_data (IntPtr obj, IntPtr name, IntPtr data, DestroyNotify destroy); private void AddDestroyNotify (GLib.Object o) { // This is a bit of an ugly hack. There is no @@ -79,10 +79,11 @@ namespace GLib { // explicitly, so we set some data and ask // for notification when it is removed - string name = String.Format ("_GtkSharpDelegateWrapper_{0}", notify_count); + IntPtr name = Marshaller.StringToPtrGStrdup (String.Format ("_GtkSharpDelegateWrapper_{0}", notify_count)); DestroyNotify destroy = new DestroyNotify (this.OnDestroy); g_object_set_data (o.Handle, name, IntPtr.Zero, destroy); + Marshaller.Free (name); lock (typeof (DelegateWrapper)) { instances[this] = destroy; notify_count++; diff --git a/glib/FileUtils.cs b/glib/FileUtils.cs index d82011b73..53d96ff3a 100644 --- a/glib/FileUtils.cs +++ b/glib/FileUtils.cs @@ -28,17 +28,19 @@ namespace GLib { public class FileUtils { [DllImport("libglib-2.0-0.dll")] - extern static bool g_file_get_contents (string filename, out IntPtr contents, out int length, out IntPtr error); + extern static bool g_file_get_contents (IntPtr filename, out IntPtr contents, out int length, out IntPtr error); public static string GetFileContents (string filename) { int length; IntPtr contents, error; + IntPtr native_filename = Marshaller.StringToPtrGStrdup (filename); - if (!g_file_get_contents (filename, out contents, out length, out error)) + if (!g_file_get_contents (native_filename, out contents, out length, out error)) throw new GException (error); - return Marshal.PtrToStringAnsi (contents, length); + Marshaller.Free (native_filename); + return Marshaller.Utf8PtrToString (contents); } private FileUtils () {} diff --git a/glib/GException.cs b/glib/GException.cs index b7ff14bcb..da91b7759 100644 --- a/glib/GException.cs +++ b/glib/GException.cs @@ -37,7 +37,7 @@ namespace GLib { static extern IntPtr gtksharp_error_get_message (IntPtr errptr); public override string Message { get { - return Marshal.PtrToStringAnsi (gtksharp_error_get_message (errptr)); + return Marshaller.Utf8PtrToString (gtksharp_error_get_message (errptr)); } } diff --git a/glib/GString.cs b/glib/GString.cs index ee01062dd..673103f77 100644 --- a/glib/GString.cs +++ b/glib/GString.cs @@ -36,11 +36,13 @@ namespace GLib { } [DllImport("libglib-2.0-0.dll")] - static extern IntPtr g_string_new (string text); + static extern IntPtr g_string_new (IntPtr text); public GString (string text) { - handle = g_string_new (text); + IntPtr native_text = Marshaller.StringToPtrGStrdup (text); + handle = g_string_new (native_text); + Marshaller.Free (native_text); } public IntPtr Handle { @@ -51,7 +53,7 @@ namespace GLib { public static string PtrToString (IntPtr ptr) { - return Marshal.PtrToStringAnsi (ptr); + return Marshaller.Utf8PtrToString (ptr); } } } diff --git a/glib/ListBase.cs b/glib/ListBase.cs index 31369009f..6d390986b 100644 --- a/glib/ListBase.cs +++ b/glib/ListBase.cs @@ -89,7 +89,7 @@ namespace GLib { public void Append (string item) { - this.Append (Marshal.StringToHGlobalAnsi (item)); + this.Append (Marshaller.StringToPtrGStrdup (item)); } public void Prepend (IntPtr raw) @@ -139,7 +139,7 @@ namespace GLib { object ret = null; if (element_type != null) { if (element_type == typeof (string)) - ret = Marshal.PtrToStringAnsi (data); + ret = Marshaller.Utf8PtrToString (data); else if (element_type == typeof (int)) ret = (int) data; else if (element_type.IsValueType) diff --git a/glib/Log.cs b/glib/Log.cs index c41d73610..b3d20e12d 100644 --- a/glib/Log.cs +++ b/glib/Log.cs @@ -28,9 +28,7 @@ namespace GLib { using System.Collections; using System.Runtime.InteropServices; - public delegate void LogFunc (string log_domain, - LogLevelFlags log_level, - string message); + public delegate void LogFunc (string log_domain, LogLevelFlags log_level, string message); public delegate void PrintFunc (string message); @@ -69,25 +67,25 @@ namespace GLib { } [DllImport("libglib-2.0-0.dll")] - static extern void g_logv (string log_domain, LogLevelFlags flags, string message); + static extern void g_logv (IntPtr log_domain, LogLevelFlags flags, IntPtr message); public void WriteLog (string logDomain, LogLevelFlags flags, string format, params object [] args) { - g_logv (logDomain, flags, String.Format (format, args)); + IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain); + IntPtr nmessage = Marshaller.StringToPtrGStrdup (String.Format (format, args)); + g_logv (ndom, flags, nmessage); + Marshaller.Free (ndom); + Marshaller.Free (nmessage); } [DllImport("libglib-2.0-0.dll")] - static extern uint g_log_set_handler (string log_domain, - LogLevelFlags flags, - LogFunc log_func, - IntPtr user_data); + static extern uint g_log_set_handler (IntPtr log_domain, LogLevelFlags flags, LogFunc log_func, IntPtr user_data); - public static uint SetLogHandler (string logDomain, - LogLevelFlags flags, - LogFunc logFunc) - + public static uint SetLogHandler (string logDomain, LogLevelFlags flags, LogFunc logFunc) { - uint result = g_log_set_handler (logDomain, flags, logFunc, IntPtr.Zero); + IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain); + uint result = g_log_set_handler (ndom, flags, logFunc, IntPtr.Zero); + Marshaller.Free (ndom); EnsureHash (); handlers [result] = logFunc; @@ -95,14 +93,16 @@ namespace GLib { } [DllImport("libglib-2.0-0.dll")] - static extern uint g_log_remove_handler (string log_domain, uint handler_id); + static extern uint g_log_remove_handler (IntPtr log_domain, uint handler_id); public static void RemoveLogHandler (string logDomain, uint handlerID) { if (handlers != null && handlers.ContainsKey (handlerID)) handlers.Remove (handlerID); - g_log_remove_handler (logDomain, handlerID); + IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain); + g_log_remove_handler (ndom, handlerID); + Marshaller.Free (ndom); } @@ -129,17 +129,16 @@ namespace GLib { } [DllImport("libglib-2.0-0.dll")] - static extern void g_log_default_handler (string log_domain, - LogLevelFlags log_level, - string message, - IntPtr unused_data); + static extern void g_log_default_handler (IntPtr log_domain, LogLevelFlags log_level, IntPtr message, IntPtr unused_data); - public static void DefaultHandler (string logDomain, - LogLevelFlags logLevel, - string message) + public static void DefaultHandler (string logDomain, LogLevelFlags logLevel, string message) { - g_log_default_handler (logDomain, logLevel, message, IntPtr.Zero); + IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain); + IntPtr nmess = Marshaller.StringToPtrGStrdup (message); + g_log_default_handler (ndom, logLevel, nmess, IntPtr.Zero); + Marshaller.Free (ndom); + Marshaller.Free (nmess); } [DllImport("libglib-2.0-0.dll")] @@ -151,11 +150,14 @@ namespace GLib { } [DllImport("libglib-2.0-0.dll")] - extern static LogLevelFlags g_log_set_fatal_mask (string log_domain, LogLevelFlags fatal_mask); + extern static LogLevelFlags g_log_set_fatal_mask (IntPtr log_domain, LogLevelFlags fatal_mask); public static LogLevelFlags SetAlwaysFatal (string logDomain, LogLevelFlags fatalMask) { - return g_log_set_fatal_mask (logDomain, fatalMask); + IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain); + LogLevelFlags result = g_log_set_fatal_mask (ndom, fatalMask); + Marshaller.Free (ndom); + return result; } /* diff --git a/glib/ManagedValue.cs b/glib/ManagedValue.cs index c85414fa4..96dce5e39 100644 --- a/glib/ManagedValue.cs +++ b/glib/ManagedValue.cs @@ -48,7 +48,7 @@ namespace GLib { private static GType boxed_type = GType.Invalid; [DllImport("libgobject-2.0-0.dll")] - private static extern IntPtr g_boxed_type_register_static (string typename, CopyFunc copy_func, FreeFunc free_func); + private static extern IntPtr g_boxed_type_register_static (IntPtr typename, CopyFunc copy_func, FreeFunc free_func); public static GType GType { get { @@ -56,7 +56,9 @@ namespace GLib { copy = new CopyFunc (Copy); free = new FreeFunc (Free); - boxed_type = new GLib.GType (g_boxed_type_register_static ("GtkSharpValue", copy, free)); + IntPtr name = Marshaller.StringToPtrGStrdup ("GtkSharpValue"); + boxed_type = new GLib.GType (g_boxed_type_register_static (name, copy, free)); + Marshaller.Free (name); } return boxed_type; diff --git a/glib/Markup.cs b/glib/Markup.cs index 5c25b492a..254199371 100644 --- a/glib/Markup.cs +++ b/glib/Markup.cs @@ -30,14 +30,17 @@ namespace GLib { private Markup () {} [DllImport("libglib-2.0-0.dll")] - static extern IntPtr g_markup_escape_text (string text, int len); + static extern IntPtr g_markup_escape_text (IntPtr text, int len); static public string EscapeText (string s) { if (s == null) - return ""; + return String.Empty; - return Marshaller.PtrToStringGFree (g_markup_escape_text (s, -1)); + IntPtr native = Marshaller.StringToPtrGStrdup (s); + string result = Marshaller.PtrToStringGFree (g_markup_escape_text (native, -1)); + Marshaller.Free (native); + return result; } } } diff --git a/glib/Marshaller.cs b/glib/Marshaller.cs index 7ffc76c47..73db9ea8d 100644 --- a/glib/Marshaller.cs +++ b/glib/Marshaller.cs @@ -32,6 +32,11 @@ namespace GLib { [DllImport("libglib-2.0-0.dll")] static extern void g_free (IntPtr mem); + public static void Free (IntPtr ptr) + { + g_free (ptr); + } + [DllImport("libglib-2.0-0.dll")] static extern IntPtr g_utf8_strlen (IntPtr mem, int size); @@ -63,12 +68,14 @@ namespace GLib { return ret; } - [DllImport("libglib-2.0-0.dll")] - static extern IntPtr g_strdup (byte[] bytes); - public static IntPtr StringToPtrGStrdup (string str) { + if (str == null) + return IntPtr.Zero; byte[] bytes = System.Text.Encoding.UTF8.GetBytes (str); - return g_strdup (bytes); + IntPtr result = g_malloc (new UIntPtr ((ulong)bytes.Length + 1)); + Marshal.Copy (bytes, 0, result, bytes.Length); + Marshal.WriteByte (result, bytes.Length, 0); + return result; } public static string StringFormat (string format, params object[] args) { @@ -89,7 +96,7 @@ namespace GLib { // [native pointer size] * [count] bytes. [DllImport("libglib-2.0-0.dll")] - static extern IntPtr g_malloc(ulong size); + static extern IntPtr g_malloc(UIntPtr size); static bool check_sixtyfour () { int szint = Marshal.SizeOf (typeof (int)); @@ -111,8 +118,8 @@ namespace GLib { for (int i = 0; i < args.Length; i++) ptrs[i] = (int) Marshal.StringToHGlobalAuto (args[i]); - IntPtr buf = g_malloc ((ulong) Marshal.SizeOf(typeof(int)) * - (ulong) args.Length); + IntPtr buf = g_malloc (new UIntPtr ((ulong) Marshal.SizeOf(typeof(int)) * + (ulong) args.Length)); Marshal.Copy (ptrs, 0, buf, ptrs.Length); return buf; } @@ -124,8 +131,8 @@ namespace GLib { for (int i = 0; i < args.Length; i++) ptrs[i] = (long) Marshal.StringToHGlobalAuto (args[i]); - IntPtr buf = g_malloc ((ulong) Marshal.SizeOf(typeof(long)) * - (ulong) args.Length); + IntPtr buf = g_malloc (new UIntPtr ((ulong) Marshal.SizeOf(typeof(long)) * + (ulong) args.Length)); Marshal.Copy (ptrs, 0, buf, ptrs.Length); return buf; } diff --git a/glib/NotifyHandler.cs b/glib/NotifyHandler.cs index f8f20ae5f..0ea3e250b 100644 --- a/glib/NotifyHandler.cs +++ b/glib/NotifyHandler.cs @@ -28,7 +28,7 @@ namespace GLib { public string Property { get { IntPtr raw_ret = g_param_spec_get_name ((IntPtr) Args[0]); - return Marshal.PtrToStringAnsi (raw_ret); + return Marshaller.Utf8PtrToString (raw_ret); } } } diff --git a/glib/Object.cs b/glib/Object.cs index 28a5a32fc..3b281d525 100644 --- a/glib/Object.cs +++ b/glib/Object.cs @@ -147,14 +147,16 @@ namespace GLib { } [DllImport("glibsharpglue-2")] - static extern IntPtr gtksharp_register_type (string name, IntPtr parent_type); + static extern IntPtr gtksharp_register_type (IntPtr name, IntPtr parent_type); protected static GType RegisterGType (System.Type t) { GType parent_gtype = LookupGType (t.BaseType); string name = t.FullName.Replace(".", "_"); GLib.ObjectManager.RegisterType (name, t.FullName, t.Assembly.GetName().Name); - GType gtype = new GType (gtksharp_register_type (name, parent_gtype.Val)); + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + GType gtype = new GType (gtksharp_register_type (native_name, parent_gtype.Val)); + GLib.Marshaller.Free (native_name); ConnectDefaultHandlers (gtype, t); InvokeClassInitializers (gtype, t); g_types[t] = gtype; @@ -196,11 +198,16 @@ namespace GLib { } [DllImport("glibsharpglue-2")] - static extern IntPtr gtksharp_object_newv (IntPtr gtype, int n_params, string[] names, GLib.Value[] vals); + static extern IntPtr gtksharp_object_newv (IntPtr gtype, int n_params, IntPtr[] names, GLib.Value[] vals); protected virtual void CreateNativeObject (string[] names, GLib.Value[] vals) { - Raw = gtksharp_object_newv (LookupGType ().Val, names.Length, names, vals); + IntPtr[] native_names = new IntPtr [names.Length]; + for (int i = 0; i < names.Length; i++) + native_names [i] = GLib.Marshaller.StringToPtrGStrdup (names [i]); + Raw = gtksharp_object_newv (LookupGType ().Val, names.Length, native_names, vals); + foreach (IntPtr p in native_names) + GLib.Marshaller.Free (p); } protected virtual IntPtr Raw { @@ -231,7 +238,7 @@ namespace GLib { protected string TypeName { get { - return Marshal.PtrToStringAnsi (gtksharp_get_type_name (Raw)); + return Marshaller.Utf8PtrToString (gtksharp_get_type_name (Raw)); } } @@ -351,29 +358,35 @@ namespace GLib { } [DllImport("libgobject-2.0-0.dll")] - static extern void g_object_get_property (IntPtr obj, string name, ref GLib.Value val); + static extern void g_object_get_property (IntPtr obj, IntPtr name, ref GLib.Value val); protected GLib.Value GetProperty (string name) { Value val = new Value (this, name); - g_object_get_property (Raw, name, ref val); + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + g_object_get_property (Raw, native_name, ref val); + GLib.Marshaller.Free (native_name); return val; } [DllImport("libgobject-2.0-0.dll")] - static extern void g_object_set_property (IntPtr obj, string name, ref GLib.Value val); + static extern void g_object_set_property (IntPtr obj, IntPtr name, ref GLib.Value val); protected void SetProperty (string name, GLib.Value val) { - g_object_set_property (Raw, name, ref val); + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + g_object_set_property (Raw, native_name, ref val); + GLib.Marshaller.Free (native_name); } [DllImport("glibsharpglue-2")] - static extern void gtksharp_override_virtual_method (IntPtr gtype, string name, Delegate cb); + static extern void gtksharp_override_virtual_method (IntPtr gtype, IntPtr name, Delegate cb); protected static void OverrideVirtualMethod (GType gtype, string name, Delegate cb) { - gtksharp_override_virtual_method (gtype.Val, name, cb); + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + gtksharp_override_virtual_method (gtype.Val, native_name, cb); + GLib.Marshaller.Free (native_name); } [DllImport("libgobject-2.0-0.dll")] diff --git a/glib/ObjectManager.cs b/glib/ObjectManager.cs index 4907cbb80..d836947bf 100644 --- a/glib/ObjectManager.cs +++ b/glib/ObjectManager.cs @@ -40,7 +40,7 @@ namespace GLib { if (raw == IntPtr.Zero) return null; - string typename = Marshal.PtrToStringAnsi (gtksharp_get_type_name (raw)); + string typename = Marshaller.Utf8PtrToString (gtksharp_get_type_name (raw)); string mangled; if (types.ContainsKey(typename)) mangled = (string)types[typename]; @@ -141,7 +141,7 @@ namespace GLib { type_id = gtksharp_get_parent_type (type_id); if (type_id == 0) return null; - typename = Marshal.PtrToStringAnsi (gtksharp_get_type_name_for_id (type_id)); + typename = Marshaller.Utf8PtrToString (gtksharp_get_type_name_for_id (type_id)); if (types.ContainsKey (typename)) mangled = (string)types[typename]; else diff --git a/glib/Signal.cs b/glib/Signal.cs index 749f91652..89dac128c 100644 --- a/glib/Signal.cs +++ b/glib/Signal.cs @@ -68,7 +68,9 @@ namespace GLib { name = signal_name; this.marshaler = marshaler; gc_handle = GCHandle.Alloc (this); - g_object_set_data_full (handle, name + "_signal_marshaler", (IntPtr) gc_handle, notify); + IntPtr native_key = GLib.Marshaller.StringToPtrGStrdup (name + "_signal_marshaler"); + g_object_set_data_full (handle, native_key, (IntPtr) gc_handle, notify); + GLib.Marshaller.Free (native_key); } public static Signal Lookup (GLib.Object obj, string name) @@ -78,7 +80,9 @@ namespace GLib { public static Signal Lookup (GLib.Object obj, string name, Delegate marshaler) { - IntPtr data = g_object_get_data (obj.Handle, name + "_signal_marshaler"); + IntPtr native_key = GLib.Marshaller.StringToPtrGStrdup (name + "_signal_marshaler"); + IntPtr data = g_object_get_data (obj.Handle, native_key); + GLib.Marshaller.Free (native_key); if (data == IntPtr.Zero) return new Signal (obj, name, marshaler); @@ -99,18 +103,26 @@ namespace GLib { } } + uint Connect (int flags) + { + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + uint id = g_signal_connect_data (handle, native_name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, flags); + GLib.Marshaller.Free (native_name); + return id; + } + public void AddDelegate (Delegate d) { if (d.Method.IsDefined (typeof (ConnectBeforeAttribute), false)) { if (before_handler == null) { before_handler = d; - before_id = g_signal_connect_data (handle, name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, 0); + before_id = Connect (0); } else before_handler = Delegate.Combine (before_handler, d); } else { if (after_handler == null) { after_handler = d; - after_id = g_signal_connect_data (handle, name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, 1); + after_id = Connect (1); } else after_handler = Delegate.Combine (after_handler, d); } @@ -138,7 +150,9 @@ namespace GLib { void DisconnectObject () { - g_object_set_data (handle, name + "_signal_marshaler", IntPtr.Zero); + IntPtr native_key = GLib.Marshaller.StringToPtrGStrdup (name + "_signal_marshaler"); + g_object_set_data (handle, native_key, IntPtr.Zero); + GLib.Marshaller.Free (native_key); } void DisconnectHandler (uint handler_id) @@ -169,16 +183,16 @@ namespace GLib { } [DllImport("libgobject-2.0-0.dll")] - static extern IntPtr g_object_get_data (IntPtr instance, string key); + static extern IntPtr g_object_get_data (IntPtr instance, IntPtr key); [DllImport("libgobject-2.0-0.dll")] - static extern void g_object_set_data (IntPtr instance, string key, IntPtr data); + static extern void g_object_set_data (IntPtr instance, IntPtr key, IntPtr data); [DllImport("libgobject-2.0-0.dll")] - static extern void g_object_set_data_full (IntPtr instance, string key, IntPtr data, DestroyNotify notify); + static extern void g_object_set_data_full (IntPtr instance, IntPtr key, IntPtr data, DestroyNotify notify); [DllImport("libgobject-2.0-0.dll")] - static extern uint g_signal_connect_data(IntPtr obj, string name, Delegate cb, IntPtr gc_handle, IntPtr dummy, int flags); + static extern uint g_signal_connect_data(IntPtr obj, IntPtr name, Delegate cb, IntPtr gc_handle, IntPtr dummy, int flags); [DllImport("libgobject-2.0-0.dll")] static extern IntPtr g_signal_get_invocation_hint (IntPtr instance); diff --git a/glib/SignalCallback.cs b/glib/SignalCallback.cs index b1142020b..1daa04dcb 100644 --- a/glib/SignalCallback.cs +++ b/glib/SignalCallback.cs @@ -61,11 +61,13 @@ namespace GLib { } [DllImport("libgobject-2.0-0.dll")] - static extern uint g_signal_connect_data(IntPtr obj, string name, Delegate cb, int key, IntPtr p, int flags); + static extern uint g_signal_connect_data(IntPtr obj, IntPtr name, Delegate cb, int key, IntPtr p, int flags); protected void Connect (string name, Delegate cb, int flags) { - _HandlerID = g_signal_connect_data(_obj.Handle, name, cb, _key, new IntPtr(0), flags); + IntPtr native_name = Marshaller.StringToPtrGStrdup (name); + _HandlerID = g_signal_connect_data(_obj.Handle, native_name, cb, _key, new IntPtr(0), flags); + Marshaller.Free (native_name); } [DllImport("libgobject-2.0-0.dll")] diff --git a/glib/Value.cs b/glib/Value.cs index 2c6573e81..76cc0fb70 100755 --- a/glib/Value.cs +++ b/glib/Value.cs @@ -42,13 +42,13 @@ namespace GLib { static extern void g_value_unset (ref GLib.Value val); [DllImport("glibsharpglue-2")] - static extern IntPtr gtksharp_value_create_from_property(ref GLib.Value val, IntPtr obj, string name); + static extern IntPtr gtksharp_value_create_from_property(ref GLib.Value val, IntPtr obj, IntPtr name); [DllImport("glibsharpglue-2")] - static extern IntPtr gtksharp_value_create_from_type_and_property(ref GLib.Value val, IntPtr gtype, string name); + static extern IntPtr gtksharp_value_create_from_type_and_property(ref GLib.Value val, IntPtr gtype, IntPtr name); [DllImport("glibsharpglue-2")] - static extern IntPtr gtksharp_value_create_from_type_name(ref GLib.Value val, string type_name); + static extern IntPtr gtksharp_value_create_from_type_name(ref GLib.Value val, IntPtr type_name); public void Dispose () { @@ -71,7 +71,9 @@ namespace GLib { { type = IntPtr.Zero; pad_1 = pad_2 = 0; - gtksharp_value_create_from_property (ref this, obj.Handle, prop_name); + IntPtr prop = GLib.Marshaller.StringToPtrGStrdup (prop_name); + gtksharp_value_create_from_property (ref this, obj.Handle, prop); + GLib.Marshaller.Free (prop); } [DllImport("libgobject-2.0-0.dll")] @@ -89,7 +91,9 @@ namespace GLib { { type = IntPtr.Zero; pad_1 = pad_2 = 0; - gtksharp_value_create_from_type_name (ref this, type_name); + IntPtr native = GLib.Marshaller.StringToPtrGStrdup (type_name); + gtksharp_value_create_from_type_name (ref this, native); + GLib.Marshaller.Free (native); g_value_set_boxed (ref this, val.Handle); } @@ -98,7 +102,9 @@ namespace GLib { { type = IntPtr.Zero; pad_1 = pad_2 = 0; - gtksharp_value_create_from_property (ref this, obj, prop_name); + IntPtr native = GLib.Marshaller.StringToPtrGStrdup (prop_name); + gtksharp_value_create_from_property (ref this, obj, native); + GLib.Marshaller.Free (native); g_value_set_boxed (ref this, val.Handle); } @@ -163,11 +169,13 @@ namespace GLib { } [DllImport("libgobject-2.0-0.dll")] - static extern void g_value_set_string (ref Value val, string data); + static extern void g_value_set_string (ref Value val, IntPtr data); public Value (string val) : this (GType.String) { - g_value_set_string (ref this, val); + IntPtr native_val = GLib.Marshaller.StringToPtrGStrdup (val); + g_value_set_string (ref this, native_val); + GLib.Marshaller.Free (native_val); } [DllImport("libgobject-2.0-0.dll")] @@ -194,7 +202,9 @@ namespace GLib { { type = IntPtr.Zero; pad_1 = pad_2 = 0; - gtksharp_value_create_from_type_name (ref this, type_name); + IntPtr native = GLib.Marshaller.StringToPtrGStrdup (type_name); + gtksharp_value_create_from_type_name (ref this, native); + GLib.Marshaller.Free (native); if (wrap.flags) g_value_set_flags (ref this, (uint) (int) wrap); else @@ -206,7 +216,9 @@ namespace GLib { { type = IntPtr.Zero; pad_1 = pad_2 = 0; - gtksharp_value_create_from_type_and_property (ref this, obj.NativeType.Val, prop_name); + IntPtr native = GLib.Marshaller.StringToPtrGStrdup (prop_name); + gtksharp_value_create_from_type_and_property (ref this, obj.NativeType.Val, native); + GLib.Marshaller.Free (native); if (wrap.flags) g_value_set_flags (ref this, (uint) (int) wrap); else @@ -317,7 +329,7 @@ namespace GLib { public static explicit operator String (Value val) { IntPtr str = g_value_get_string (ref val); - return str == IntPtr.Zero ? null : Marshal.PtrToStringAnsi (str); + return str == IntPtr.Zero ? null : GLib.Marshaller.Utf8PtrToString (str); } [DllImport("libgobject-2.0-0.dll")] @@ -393,9 +405,11 @@ namespace GLib { GType type = TypeConverter.LookupType (value.GetType()); if (type == ManagedValue.GType) g_value_set_boxed (ref this, ManagedValue.WrapObject (value)); - else if (type == GType.String) - g_value_set_string (ref this, (string) value); - else if (type == GType.Boolean) + else if (type == GType.String) { + IntPtr native = GLib.Marshaller.StringToPtrGStrdup ((string)value); + g_value_set_string (ref this, native); + GLib.Marshaller.Free (native); + } else if (type == GType.Boolean) g_value_set_boolean (ref this, (bool) value); else if (type == GType.Int) g_value_set_int (ref this, (int) value); diff --git a/gnome/IconTheme.cs b/gnome/IconTheme.cs index 0c8beafa9..4c01e68fb 100644 --- a/gnome/IconTheme.cs +++ b/gnome/IconTheme.cs @@ -46,10 +46,12 @@ namespace Gnome { } [DllImport("gnomeui-2")] - static extern IntPtr gnome_icon_theme_lookup_icon(IntPtr raw, string icon_name, int size, ref Gnome.IconData icon_data, out int base_size); + static extern IntPtr gnome_icon_theme_lookup_icon(IntPtr raw, IntPtr icon_name, int size, ref Gnome.IconData icon_data, out int base_size); public string LookupIcon(string icon_name, int size, Gnome.IconData icon_data, out int base_size) { - IntPtr raw_ret = gnome_icon_theme_lookup_icon(Handle, icon_name, size, ref icon_data, out base_size); + IntPtr native_icon_name = GLib.Marshaller.StringToPtrGStrdup (icon_name); + IntPtr raw_ret = gnome_icon_theme_lookup_icon(Handle, native_icon_name, size, ref icon_data, out base_size); + GLib.Marshaller.Free (native_icon_name); string ret = GLib.Marshaller.PtrToStringGFree(raw_ret); return ret; } diff --git a/gnome/IconTheme.custom b/gnome/IconTheme.custom index c8f127027..3ec9f97e1 100644 --- a/gnome/IconTheme.custom +++ b/gnome/IconTheme.custom @@ -55,7 +55,7 @@ retval = new string[length]; for (int i = 0, j = 0; i < length; i++, j += size) { IntPtr string_ptr = Marshal.ReadIntPtr (new IntPtr (raw_ret.ToInt32 () + j)); - retval[i] = Marshal.PtrToStringAnsi (string_ptr); + retval[i] = GLib.Marshaller.Utf8PtrToString (string_ptr); } g_strfreev (raw_ret); diff --git a/gnome/PanelAppletFactory.cs b/gnome/PanelAppletFactory.cs index 21f962961..f90ac37b0 100644 --- a/gnome/PanelAppletFactory.cs +++ b/gnome/PanelAppletFactory.cs @@ -19,7 +19,9 @@ namespace Gnome cb_wrapper = new GnomeSharp.PanelAppletFactoryCallbackWrapper (new PanelAppletFactoryCallback (Creation), null); _IID = applet.IID; _factoryIID = applet.FactoryIID; - panel_applet_factory_main(_factoryIID, GLib.Object.LookupGType (applet_type).Val, cb_wrapper.NativeDelegate, IntPtr.Zero); + IntPtr native_iid = GLib.Marshaller.StringToPtrGStrdup (_factoryIID); + panel_applet_factory_main (native_iid, GLib.Object.LookupGType (applet_type).Val, cb_wrapper.NativeDelegate, IntPtr.Zero); + GLib.Marshaller.Free (native_iid); } private static bool Creation (PanelApplet applet, string iid) @@ -31,6 +33,6 @@ namespace Gnome } [DllImport("panel-applet-2")] - static extern int panel_applet_factory_main(string iid, IntPtr applet_type, GnomeSharp.PanelAppletFactoryCallbackNative cb, IntPtr data); + static extern int panel_applet_factory_main(IntPtr iid, IntPtr applet_type, GnomeSharp.PanelAppletFactoryCallbackNative cb, IntPtr data); } } diff --git a/gnomedb/Application.cs b/gnomedb/Application.cs index 1e565afda..2c0ade21e 100644 --- a/gnomedb/Application.cs +++ b/gnomedb/Application.cs @@ -24,47 +24,54 @@ using System.Runtime.InteropServices; namespace GnomeDb { - /// - /// GnomeDb Application class - /// - /// - /// - /// Provides the initialization and event loop iteration related - /// methods for the libgnomedb library. - /// public class Application { private const string VERSION = "0.10"; [DllImport("gnomedb-2")] - static extern void gnome_db_init (string app_id, string version, int nargs, IntPtr args); + static extern void gnome_db_init (IntPtr app_id, IntPtr version, int nargs, IntPtr args); public static void Init () { - gnome_db_init ("GnomeDb#", VERSION, 0, new IntPtr(0)); + Init ("GnomeDb#", VERSION); } public static void Init (string app_id, string version) { - gnome_db_init (app_id, version, 0, new IntPtr(0)); + IntPtr native_appid = GLib.Marshaller.StringToPtrGStrdup (app_id); + IntPtr native_version = GLib.Marshaller.StringToPtrGStrdup (version); + gnome_db_init (native_appid, native_version, 0, IntPtr.Zero); + GLib.Marshaller.Free (native_appid); + GLib.Marshaller.Free (native_version); } [DllImport("gnomedb-2")] - static extern void gnome_db_init (string app_id, string version, ref int nargs, ref String [] args); + static extern void gnome_db_init (IntPtr app_id, IntPtr version, ref int argc, ref IntPtr argv); public static void Init (ref string [] args) { - int argc = args.Length; - gnome_db_init ("GnomeDb#", VERSION, ref argc, ref args); + Init ("GnomeDb#", VERSION, ref args); } - public static void Init (string app_id, string version, ref string [] args) + public static void Init (string app_id, string version, ref string[] args) { + IntPtr native_appid = GLib.Marshaller.StringToPtrGStrdup (app_id); + IntPtr native_version = GLib.Marshaller.StringToPtrGStrdup (version); + GLib.Argv argv = new GLib.Argv (args); + IntPtr arg_ptr = argv.Handle; int argc = args.Length; - gnome_db_init (app_id, version, ref argc, ref args); + gnome_db_init (native_appid, native_version, ref argc, ref arg_ptr); + GLib.Marshaller.Free (native_appid); + GLib.Marshaller.Free (native_version); + if (arg_ptr != argv.Handle) + throw new Exception ("Init returned new argv handle."); + if (argc <= 1) + args = new string [0]; + else + args = argv.GetArgs (argc); } - + [DllImport("gnomedb-2")] static extern void gnome_db_main_run (IntPtr init_func, IntPtr user_data); diff --git a/gnomevfs/FileInfo.cs b/gnomevfs/FileInfo.cs index 84f8c380d..f24ab0090 100644 --- a/gnomevfs/FileInfo.cs +++ b/gnomevfs/FileInfo.cs @@ -93,7 +93,7 @@ namespace Gnome.Vfs { public string Name { get { if (info.name != IntPtr.Zero) - return Marshal.PtrToStringAnsi (info.name); + return GLib.Marshaller.Utf8PtrToString (info.name); else return null; } @@ -229,7 +229,7 @@ namespace Gnome.Vfs { get { if ((ValidFields & FileInfoFields.SymlinkName) != 0 && info.symlink_name != IntPtr.Zero) - return Marshal.PtrToStringAnsi (info.symlink_name); + return GLib.Marshaller.Utf8PtrToString (info.symlink_name); else throw new ArgumentException ("SymlinkName is not set"); } @@ -239,7 +239,7 @@ namespace Gnome.Vfs { get { if ((ValidFields & FileInfoFields.MimeType) != 0 && info.mime_type != IntPtr.Zero) - return Marshal.PtrToStringAnsi (info.mime_type); + return GLib.Marshaller.Utf8PtrToString (info.mime_type); else throw new ArgumentException ("MimeType is not set"); } diff --git a/gnomevfs/Vfs.cs b/gnomevfs/Vfs.cs index bd117ebbe..ebbb42fef 100644 --- a/gnomevfs/Vfs.cs +++ b/gnomevfs/Vfs.cs @@ -76,7 +76,7 @@ namespace Gnome.Vfs { internal static string ResultToString (int result) { IntPtr ptr = gnome_vfs_result_to_string (result); - return Marshal.PtrToStringAnsi (ptr); + return GLib.Marshaller.Utf8PtrToString (ptr); } public static void ThrowException (Result result) diff --git a/gtk/FileSelection.custom b/gtk/FileSelection.custom index aa62c9f73..2bbdfe532 100644 --- a/gtk/FileSelection.custom +++ b/gtk/FileSelection.custom @@ -106,7 +106,7 @@ public Gtk.Entry FileopEntry { static extern IntPtr gtksharp_file_selection_get_fileop_file (IntPtr i); public string FileopFile { get { - return Marshal.PtrToStringAnsi (gtksharp_file_selection_get_fileop_file (this.Handle)); + return GLib.Marshaller.Utf8PtrToString (gtksharp_file_selection_get_fileop_file (this.Handle)); } } @@ -155,7 +155,7 @@ public string[] Selections { int i = 0; IntPtr strptr = Marshal.ReadIntPtr (strv, IntPtr.Size * i++); while (strptr != IntPtr.Zero) { - result.Add (Marshal.PtrToStringAnsi (strptr)); + result.Add (GLib.Marshaller.Utf8PtrToString (strptr)); strptr = Marshal.ReadIntPtr (strv, IntPtr.Size * i++); } diff --git a/gtk/IconTheme.custom b/gtk/IconTheme.custom index a0314625c..0406f654a 100644 --- a/gtk/IconTheme.custom +++ b/gtk/IconTheme.custom @@ -40,7 +40,7 @@ retval = new string[length]; for (int i = 0, j = 0; i < length; i++, j += size) { IntPtr string_ptr = Marshal.ReadIntPtr (new IntPtr (raw_ret.ToInt32 () + j)); - retval[i] = Marshal.PtrToStringAnsi (string_ptr); + retval[i] = GLib.Marshaller.Utf8PtrToString (string_ptr); } g_strfreev (raw_ret); diff --git a/gtk/RadioMenuItem.custom b/gtk/RadioMenuItem.custom index cdbab1227..324e08527 100644 --- a/gtk/RadioMenuItem.custom +++ b/gtk/RadioMenuItem.custom @@ -32,5 +32,7 @@ return; } - Raw = gtk_radio_menu_item_new_with_mnemonic (IntPtr.Zero, label); + IntPtr label_as_native = GLib.Marshaller.StringToPtrGStrdup (label); + Raw = gtk_radio_menu_item_new_with_mnemonic (IntPtr.Zero, label_as_native); + GLib.Marshaller.Free (label_as_native); } diff --git a/gtk/Stock.custom b/gtk/Stock.custom index e1db9c3ff..d24c8d910 100644 --- a/gtk/Stock.custom +++ b/gtk/Stock.custom @@ -53,11 +53,11 @@ return Gtk.StockItem.Zero; Gtk.StockItem item = new Gtk.StockItem (); - item.StockId = Marshal.PtrToStringAnsi (const_item.StockId); - item.Label = Marshal.PtrToStringAnsi (const_item.Label); + item.StockId = GLib.Marshaller.Utf8PtrToString (const_item.StockId); + item.Label = GLib.Marshaller.Utf8PtrToString (const_item.Label); item.Modifier = const_item.Modifier; item.Keyval = const_item.Keyval; - item.TranslationDomain = Marshal.PtrToStringAnsi (const_item.TranslationDomain); + item.TranslationDomain = GLib.Marshaller.Utf8PtrToString (const_item.TranslationDomain); return item; } diff --git a/gtk/StockManager.cs b/gtk/StockManager.cs index 169dc9bcb..6acdbd78c 100644 --- a/gtk/StockManager.cs +++ b/gtk/StockManager.cs @@ -46,22 +46,25 @@ namespace Gtk { public static explicit operator StockItem (ConstStockItem csi) { Gtk.StockItem item = new Gtk.StockItem (); - item.StockId = Marshal.PtrToStringAnsi (csi.StockId); - item.Label = Marshal.PtrToStringAnsi (csi.Label); + item.StockId = GLib.Marshaller.Utf8PtrToString (csi.StockId); + item.Label = GLib.Marshaller.Utf8PtrToString (csi.Label); item.Modifier = csi.Modifier; item.Keyval = csi.Keyval; - item.TranslationDomain = Marshal.PtrToStringAnsi (csi.TranslationDomain); + item.TranslationDomain = GLib.Marshaller.Utf8PtrToString (csi.TranslationDomain); return item; } } [DllImport("libgtk-win32-2.0-0.dll")] - static extern bool gtk_stock_lookup (string stock_id, out ConstStockItem item); + static extern bool gtk_stock_lookup (IntPtr stock_id, out ConstStockItem item); public static bool Lookup (string stock_id, ref Gtk.StockItem item) { ConstStockItem const_item; - if (!gtk_stock_lookup (stock_id, out const_item)) + IntPtr native_id = GLib.Marshaller.StringToPtrGStrdup (stock_id); + bool found = gtk_stock_lookup (native_id, out const_item); + GLib.Marshaller.Free (native_id); + if (!found) return false; item = (StockItem) const_item; return true; diff --git a/pango/Layout.custom b/pango/Layout.custom index e65f46a82..5d1f09803 100644 --- a/pango/Layout.custom +++ b/pango/Layout.custom @@ -72,15 +72,21 @@ public void SetMarkupWithAccel (string markup, char accel_marker, out char accel } [DllImport ("libpango-1.0-0.dll")] - static extern void pango_layout_set_text (IntPtr raw, string text, int length); + static extern void pango_layout_set_text (IntPtr raw, IntPtr text, int length); - public void SetText (string text) { - pango_layout_set_text (Handle, text, -1); + public void SetText (string text) + { + IntPtr native_text = GLib.Marshaller.StringToPtrGStrdup (text); + pango_layout_set_text (Handle, native_text, -1); + GLib.Marshaller.Free (native_text); } [DllImport ("libpango-1.0-0.dll")] - static extern void pango_layout_set_markup (IntPtr raw, string markup, int length); + static extern void pango_layout_set_markup (IntPtr raw, IntPtr markup, int length); - public void SetMarkup (string markup) { - pango_layout_set_markup (Handle, markup, -1); + public void SetMarkup (string markup) + { + IntPtr native_markup = GLib.Marshaller.StringToPtrGStrdup (markup); + pango_layout_set_markup (Handle, native_markup, -1); + GLib.Marshaller.Free (native_markup); } diff --git a/rsvg/Tool.cs b/rsvg/Tool.cs index 800990717..736096d4d 100644 --- a/rsvg/Tool.cs +++ b/rsvg/Tool.cs @@ -1,10 +1,11 @@ -// // rsvg/Tool.cs - Rsvg Tool class // // Author: Charles Iliya Krempeaux +// Mike Kestner // // Copyright (C) 2003 Reptile Consulting & Services Ltd. // Copyright (C) 2003 Charles Iliya Krempeaux. +// Copyright (C) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General @@ -22,137 +23,94 @@ -// O B J E C T S //////////////////////////////////////////////////////////////////////////////////////////////////////////// +namespace Rsvg { - namespace Rsvg { + using System; + using System.Runtime.InteropServices; - public class Tool - { + public class Tool { + + [DllImport("rsvg-2")] + static extern IntPtr rsvg_pixbuf_from_file (IntPtr file_name, out IntPtr error); + + [DllImport("rsvg-2")] + static extern IntPtr rsvg_pixbuf_from_file_at_zoom (IntPtr file_name, double x_zoom, double y_zoom, out IntPtr error); + + [DllImport("rsvg-2")] + static extern IntPtr rsvg_pixbuf_from_file_at_size (IntPtr file_name, int width, int height, out IntPtr error); + + [DllImport("rsvg-2")] + static extern IntPtr rsvg_pixbuf_from_file_at_max_size (IntPtr file_name, int max_width, int max_height, out IntPtr error); + + [DllImport("rsvg-2")] + static extern IntPtr rsvg_pixbuf_from_file_at_zoom_with_max (IntPtr file_name, double x_zoom, double y_zoom, int max_width, int max_height, out IntPtr error); - // D L L I M P O R T S //////////////////////////////////////////////////////////////////////////////////////// + public static Gdk.Pixbuf PixbufFromFile (string file_name) + { + IntPtr error = IntPtr.Zero; + IntPtr native_filename = GLib.Marshaller.StringToPtrGStrdup (file_name); + IntPtr raw_pixbuf = rsvg_pixbuf_from_file(native_filename, out error); + GLib.Marshaller.Free (native_filename); - [System.Runtime.InteropServices.DllImport("rsvg-2")] - static extern System.IntPtr rsvg_pixbuf_from_file( string file_name - , out System.IntPtr error - ); + if (IntPtr.Zero != error) + throw new GLib.GException (error); - [System.Runtime.InteropServices.DllImport("rsvg-2")] - static extern - System.IntPtr - rsvg_pixbuf_from_file_at_zoom( string file_name - , double x_zoom - , double y_zoom - , out System.IntPtr error - ); + return GLib.Object.GetObject (raw_pixbuf, true) as Gdk.Pixbuf; + } - [System.Runtime.InteropServices.DllImport("rsvg-2")] - static extern - System.IntPtr - rsvg_pixbuf_from_file_at_size( string file_name - , int width - , int height - , out System.IntPtr error - ); + public static Gdk.Pixbuf PixbufFromFileAtZoom (string file_name, double x_zoom, double y_zoom) + { + IntPtr error = IntPtr.Zero; + IntPtr native_filename = GLib.Marshaller.StringToPtrGStrdup (file_name); + IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_zoom (native_filename, x_zoom, y_zoom, out error); + GLib.Marshaller.Free (native_filename); - [System.Runtime.InteropServices.DllImport("rsvg-2")] - static extern - System.IntPtr - rsvg_pixbuf_from_file_at_max_size( string file_name - , int max_width - , int max_height - , out System.IntPtr error - ); + if (IntPtr.Zero != error) + throw new GLib.GException (error); - [System.Runtime.InteropServices.DllImport("rsvg-2")] - static extern - System.IntPtr - rsvg_pixbuf_from_file_at_zoom_with_max( string file_name - , double x_zoom - , double y_zoom - , int max_width - , int max_height - , out System.IntPtr error - ); + return GLib.Object.GetObject (raw_pixbuf, true) as Gdk.Pixbuf; + } - //////////////////////////////////////////////////////////////////////////////////////// D L L I M P O R T S // - - - - // P R O C E D U R E S ////////////////////////////////////////////////////////////////////////////////////////// - - public static Gdk.Pixbuf PixbufFromFile(string file_name) - { - System.IntPtr error = System.IntPtr.Zero; - - System.IntPtr raw_pixbuf = rsvg_pixbuf_from_file(file_name, out error); - - if (System.IntPtr.Zero != error) { - throw new GLib.GException ( error ); - } else { - return new Gdk.Pixbuf( raw_pixbuf ); - } - } - - public static Gdk.Pixbuf PixbufFromFileAtZoom(string file_name, double x_zoom, double y_zoom) - { - System.IntPtr error = System.IntPtr.Zero; - - System.IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_zoom(file_name, x_zoom, y_zoom, out error); - - if (System.IntPtr.Zero != error) { - throw new GLib.GException( error ); - } else { - return new Gdk.Pixbuf( raw_pixbuf ); - } - } - - public static Gdk.Pixbuf PixbufFromFileAtSize(string file_name, int width, int height) - { - System.IntPtr error = System.IntPtr.Zero; - - System.IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_size(file_name, width, height, out error); - - if (System.IntPtr.Zero != error) { - throw new GLib.GException( error ); - } else { - return new Gdk.Pixbuf( raw_pixbuf ); - } - } - - public static Gdk.Pixbuf PixbufFromFileAtMaxSize(string file_name, int max_width, int max_height) - { - System.IntPtr error = System.IntPtr.Zero; - - System.IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_max_size(file_name, max_width, max_height, out error); - - if (System.IntPtr.Zero != error) { - throw new GLib.GException( error ); - } else { - return new Gdk.Pixbuf( raw_pixbuf ); - } - } - - public static Gdk.Pixbuf PixbufFromFileAtZoomWithMaxSize(string file_name, double x_zoom, double y_zoom, int max_width, int max_height) - { - System.IntPtr error = System.IntPtr.Zero; - - System.IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_zoom_with_max(file_name, x_zoom, y_zoom, max_width, max_height, out error); - - if (System.IntPtr.Zero != error) { - throw new GLib.GException( error ); - } else { - return new Gdk.Pixbuf( raw_pixbuf ); - } - } - - ////////////////////////////////////////////////////////////////////////////////////////// P R O C E D U R E S // - - - } // class Tool - - } // namespace Rsvg - -//////////////////////////////////////////////////////////////////////////////////////////////////////////// O B J E C T S // + public static Gdk.Pixbuf PixbufFromFileAtSize(string file_name, int width, int height) + { + IntPtr error = IntPtr.Zero; + IntPtr native_filename = GLib.Marshaller.StringToPtrGStrdup (file_name); + IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_size (native_filename, width, height, out error); + GLib.Marshaller.Free (native_filename); + + if (IntPtr.Zero != error) + throw new GLib.GException (error); + + return GLib.Object.GetObject (raw_pixbuf, true) as Gdk.Pixbuf; + } + + public static Gdk.Pixbuf PixbufFromFileAtMaxSize(string file_name, int max_width, int max_height) + { + IntPtr error = IntPtr.Zero; + IntPtr native_filename = GLib.Marshaller.StringToPtrGStrdup (file_name); + IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_max_size (native_filename, max_width, max_height, out error); + GLib.Marshaller.Free (native_filename); + + if (IntPtr.Zero != error) + throw new GLib.GException (error); + + return GLib.Object.GetObject (raw_pixbuf, true) as Gdk.Pixbuf; + } + + public static Gdk.Pixbuf PixbufFromFileAtZoomWithMaxSize(string file_name, double x_zoom, double y_zoom, int max_width, int max_height) + { + IntPtr error = IntPtr.Zero; + IntPtr native_filename = GLib.Marshaller.StringToPtrGStrdup (file_name); + IntPtr raw_pixbuf = rsvg_pixbuf_from_file_at_zoom_with_max (native_filename, x_zoom, y_zoom, max_width, max_height, out error); + GLib.Marshaller.Free (native_filename); + + if (IntPtr.Zero != error) + throw new GLib.GException (error); + + return GLib.Object.GetObject (raw_pixbuf, true) as Gdk.Pixbuf; + } + } +}