From 73f14c799831112f1b3612314606d6e317b0d5b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 21 Feb 2009 16:42:09 +0200 Subject: [PATCH] Safe handle class for LibVLC heap allocation --- bindings/cil/src/libvlc.cs | 2 +- bindings/cil/src/ustring.cs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/bindings/cil/src/libvlc.cs b/bindings/cil/src/libvlc.cs index 6087453be3..1728cc95be 100644 --- a/bindings/cil/src/libvlc.cs +++ b/bindings/cil/src/libvlc.cs @@ -98,7 +98,7 @@ namespace VideoLAN.LibVLC [DllImport ("libvlc.dll", EntryPoint="libvlc_media_get_mrl")] public static extern - void MediaGetMRL (MediaHandle media); + MemoryHandle MediaGetMRL (MediaHandle media, NativeException ex); [DllImport ("libvlc.dll", EntryPoint="libvlc_media_duplicate")] public static extern diff --git a/bindings/cil/src/ustring.cs b/bindings/cil/src/ustring.cs index a605b8fb7a..d6ad65a208 100644 --- a/bindings/cil/src/ustring.cs +++ b/bindings/cil/src/ustring.cs @@ -33,7 +33,7 @@ namespace VideoLAN.LibVLC * arrays (as used by the native LibVLC) and managed strings. */ [StructLayout (LayoutKind.Sequential)] - public struct U8String + internal struct U8String { public byte[] mb_str; /**< nul-terminated UTF-8 bytes array */ @@ -91,4 +91,34 @@ namespace VideoLAN.LibVLC return new U8String (ptr).ToString (); } }; + + /** + * @brief MemoryHandle: heap allocation by the C run-time + * @ingroup Internals + */ + internal sealed class MemoryHandle : NonNullHandle + { + [DllImport ("libvlc.dll", EntryPoint="libvlc_free")] + private static extern void Free (IntPtr ptr); + + /** + * NonNullHandle.Destroy + */ + protected override void Destroy () + { + Free (handle); + } + + public override string ToString () + { + return U8String.FromNative (handle); + } + + public string Transform () + { + string value = ToString (); + Close (); + return value; + } + }; }; -- 2.39.2