summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-06-03 21:10:57 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-06-03 21:10:57 +0200
commit6ab410403c92cdace4d88d82d0404d2951440eb4 (patch)
tree93ac83af49102abc032a0913d060d235de2cdd9b
parentaba607129cc30f66d946109c50522674b1663af9 (diff)
Fix marshalling of null terminated string arrays as return values
-rw-r--r--generator/ReturnValue.cs8
-rw-r--r--gstreamer-sharp/DynamicSignal.cs2
-rw-r--r--gstreamer-sharp/Makefile.am1
-rw-r--r--gstreamer-sharp/Marshaller.cs46
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));
+ }
+ }
+}