diff --git a/src/bindings/mono/eina_mono/eina_strbuf.cs b/src/bindings/mono/eina_mono/eina_strbuf.cs index a538de0fd2..6fd35a4638 100644 --- a/src/bindings/mono/eina_mono/eina_strbuf.cs +++ b/src/bindings/mono/eina_mono/eina_strbuf.cs @@ -32,9 +32,18 @@ static internal class StrbufNativeMethods [return: MarshalAsAttribute(UnmanagedType.U1)] internal static extern bool eina_strbuf_append_char(IntPtr buf, char c); - [DllImport(efl.Libs.Eina)] + [DllImport(efl.Libs.Eina, CharSet=CharSet.Ansi)] + [return: + MarshalAs(UnmanagedType.CustomMarshaler, + MarshalTypeRef=typeof(Efl.Eo.StringPassOwnershipMarshaler))] internal static extern string eina_strbuf_string_steal(IntPtr buf); + [DllImport(efl.Libs.Eina, CharSet=CharSet.Ansi)] + [return: + MarshalAs(UnmanagedType.CustomMarshaler, + MarshalTypeRef=typeof(Efl.Eo.StringKeepOwnershipMarshaler))] + internal static extern string eina_strbuf_string_get(IntPtr buf); + [DllImport(efl.Libs.Eina)] internal static extern IntPtr eina_strbuf_length_get(IntPtr buf); // Uses IntPtr as wrapper for size_t } @@ -176,8 +185,18 @@ public class Strbuf : IDisposable throw new ObjectDisposedException(base.GetType().Name); } - return eina_strbuf_string_steal(Handle); + return eina_strbuf_string_steal(this.Handle); + } + + /// Copy the content of a buffer. + public override string ToString() + { + if (Disposed) + { + throw new ObjectDisposedException(base.GetType().Name); + } + + return eina_strbuf_string_get(this.Handle); } } - } // namespace eina diff --git a/src/bindings/mono/eina_mono/eina_value.cs b/src/bindings/mono/eina_mono/eina_value.cs index 57a615772b..54c437d352 100644 --- a/src/bindings/mono/eina_mono/eina_value.cs +++ b/src/bindings/mono/eina_mono/eina_value.cs @@ -173,7 +173,10 @@ static internal class UnsafeNativeMethods internal static extern int eina_value_compare_wrapper(IntPtr handle, IntPtr other); [DllImport(efl.Libs.Eina, CharSet=CharSet.Ansi)] - internal static extern IntPtr eina_value_to_string(IntPtr handle); // We take ownership of the returned string. + [return: + MarshalAs(UnmanagedType.CustomMarshaler, + MarshalTypeRef=typeof(Efl.Eo.StringPassOwnershipMarshaler))] + internal static extern string eina_value_to_string(IntPtr handle); // We take ownership of the returned string. [DllImport(efl.Libs.CustomExports)] [return: MarshalAsAttribute(UnmanagedType.U1)] @@ -2611,10 +2614,8 @@ public class Value : IDisposable, IComparable, IEquatable public override String ToString() { SanityChecks(); - IntPtr ptr = eina_value_to_string(this.Handle); - String str = Marshal.PtrToStringAnsi(ptr); - MemoryNative.Free(ptr); - return str; + return eina_value_to_string(this.Handle); + } /// Empties an optional Eina.Value, freeing what was previously contained. diff --git a/src/tests/efl_mono/Strbuf.cs b/src/tests/efl_mono/Strbuf.cs index ef2cc56f16..78e9c5cbc3 100644 --- a/src/tests/efl_mono/Strbuf.cs +++ b/src/tests/efl_mono/Strbuf.cs @@ -16,6 +16,16 @@ class TestStrBuf Test.AssertEquals("Here's Johnny!", buf.Steal()); } + public static void test_tostring() + { + Eina.Strbuf buf = new Eina.Strbuf(); + buf.Append("Hello"); + buf.Append(' '); + buf.Append("World!"); + + Test.AssertEquals("Hello World!", buf.ToString()); + } + public static void test_eolian() { var obj = new Dummy.TestObject();