diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-06-03 21:10:57 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-06-03 21:10:57 +0200 |
commit | 6ab410403c92cdace4d88d82d0404d2951440eb4 (patch) | |
tree | 93ac83af49102abc032a0913d060d235de2cdd9b | |
parent | aba607129cc30f66d946109c50522674b1663af9 (diff) |
Fix marshalling of null terminated string arrays as return values
-rw-r--r-- | generator/ReturnValue.cs | 8 | ||||
-rw-r--r-- | gstreamer-sharp/DynamicSignal.cs | 2 | ||||
-rw-r--r-- | gstreamer-sharp/Makefile.am | 1 | ||||
-rw-r--r-- | gstreamer-sharp/Marshaller.cs | 46 |
4 files changed, 53 insertions, 4 deletions
diff --git a/generator/ReturnValue.cs b/generator/ReturnValue.cs index 999f958..06d8a06 100644 --- a/generator/ReturnValue.cs +++ b/generator/ReturnValue.cs @@ -110,7 +110,9 @@ namespace GtkSharp.Generation { get {
if (IGen == null)
return String.Empty;
- return IGen.ToNativeReturnType + (is_array || is_null_term ? "[]" : String.Empty);
+ else if (is_null_term)
+ return "IntPtr";
+ return IGen.ToNativeReturnType + (is_array ? "[]" : String.Empty);
}
}
@@ -128,7 +130,7 @@ namespace GtkSharp.Generation { } else if (IGen is HandleBase)
return ((HandleBase)IGen).FromNative (var, owned);
else if (is_null_term)
- return String.Format ("GLib.Marshaller.NullTermPtrToStringArray ({0}, {1})", var, owned ? "true" : "false");
+ return String.Format ("Gst.Marshaller.NullTermPtrToStringArray ({0}, {1})", var, owned ? "true" : "false");
else
return IGen.FromNativeReturn (var);
}
@@ -142,7 +144,7 @@ namespace GtkSharp.Generation { string args = ", typeof (" + ElementType + "), " + (owned ? "true" : "false") + ", " + (elements_owned ? "true" : "false");
var = "new " + IGen.QualifiedName + "(" + var + args + ")";
} else if (is_null_term)
- return String.Format ("GLib.Marshaller.StringArrayToNullTermPointer ({0})", var);
+ return String.Format ("Gst.Marshaller.StringArrayToNullTermPointer ({0})", var);
if (IGen is IManualMarshaler)
return (IGen as IManualMarshaler).AllocNative (var);
diff --git a/gstreamer-sharp/DynamicSignal.cs b/gstreamer-sharp/DynamicSignal.cs index b957e65..1acd2a0 100644 --- a/gstreamer-sharp/DynamicSignal.cs +++ b/gstreamer-sharp/DynamicSignal.cs @@ -239,7 +239,7 @@ namespace Gst { query = new SignalQuery (); query.signal_id = signal_id; - query.signal_name = Marshaller.Utf8PtrToString (q.signal_name); + query.signal_name = GLib.Marshaller.Utf8PtrToString (q.signal_name); query.itype = new GType (q.itype); query.signal_flags = q.signal_flags; query.return_type = new GType (q.return_type); diff --git a/gstreamer-sharp/Makefile.am b/gstreamer-sharp/Makefile.am index 46c21a3..d43b1b0 100644 --- a/gstreamer-sharp/Makefile.am +++ b/gstreamer-sharp/Makefile.am @@ -48,6 +48,7 @@ sources = \ EnumInfo.cs \ Iterator.cs \ MiniObject.cs \ + Marshaller.cs \ GstSharp.PadQueryTypeFunctionNative.cs \ PadQueryTypeFunction.cs \ TypeFindDelegates.cs \ diff --git a/gstreamer-sharp/Marshaller.cs b/gstreamer-sharp/Marshaller.cs new file mode 100644 index 0000000..da8d9a7 --- /dev/null +++ b/gstreamer-sharp/Marshaller.cs @@ -0,0 +1,46 @@ + +using System; +using System.Runtime.InteropServices; +using GLib; + +namespace Gst { + public static class Marshaller { + + public static IntPtr StringArrayToNullTermPointer (string[] strs) + { + if (strs == null) + return IntPtr.Zero; + + IntPtr result = GLib.Marshaller.Malloc ((ulong) ((strs.Length + 1) * IntPtr.Size)); + + for (int i = 0; i < strs.Length; i++) + Marshal.WriteIntPtr (result, i * IntPtr.Size, GLib.Marshaller.StringToPtrGStrdup (strs [i])); + + Marshal.WriteIntPtr (result, strs.Length * IntPtr.Size, IntPtr.Zero); + + return result; + } + + [DllImport("libglib-2.0-0.dll")] + static extern void g_strfreev (IntPtr mem); + + public static string[] NullTermPtrToStringArray (IntPtr null_term_array, bool owned) + { + if (null_term_array == IntPtr.Zero) + return new string [0]; + + int count = 0; + System.Collections.ArrayList result = new System.Collections.ArrayList (); + IntPtr s = Marshal.ReadIntPtr (null_term_array, count++ * IntPtr.Size); + while (s != IntPtr.Zero) { + result.Add (GLib.Marshaller.Utf8PtrToString (s)); + s = Marshal.ReadIntPtr (null_term_array, count++ * IntPtr.Size); + } + + if (owned) + g_strfreev (null_term_array); + + return (string[]) result.ToArray (typeof(string)); + } + } +} |