diff options
| author | James Willcox <snopr@snorp.net> | 2005-11-17 21:11:13 +0000 | 
|---|---|---|
| committer | James Willcox <snopr@snorp.net> | 2005-11-17 21:11:13 +0000 | 
| commit | 9a589e1f5221d1bd995b6c4fa73e3a074d4c2da4 (patch) | |
| tree | 10b4bf2a914fa421474e6e895331d3cb4b07c9d9 | |
| parent | 84e07c25895dd6a8f706499a867afa44b9444ce2 (diff) | |
* add byte[] overloads for EntryGroup methods
* cleanup string marshalling
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@999 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
| -rw-r--r-- | avahi-sharp/AddressResolver.cs | 3 | ||||
| -rw-r--r-- | avahi-sharp/AvahiTest.cs | 11 | ||||
| -rw-r--r-- | avahi-sharp/DomainBrowser.cs | 11 | ||||
| -rw-r--r-- | avahi-sharp/EntryGroup.cs | 144 | ||||
| -rw-r--r-- | avahi-sharp/HostNameResolver.cs | 13 | ||||
| -rw-r--r-- | avahi-sharp/RecordBrowser.cs | 14 | ||||
| -rw-r--r-- | avahi-sharp/ServiceBrowser.cs | 18 | ||||
| -rw-r--r-- | avahi-sharp/ServiceResolver.cs | 19 | ||||
| -rw-r--r-- | avahi-sharp/ServiceTypeBrowser.cs | 11 | ||||
| -rw-r--r-- | avahi-sharp/Utility.cs | 12 | 
10 files changed, 130 insertions, 126 deletions
diff --git a/avahi-sharp/AddressResolver.cs b/avahi-sharp/AddressResolver.cs index 63dc33e..3025102 100644 --- a/avahi-sharp/AddressResolver.cs +++ b/avahi-sharp/AddressResolver.cs @@ -151,6 +151,9 @@ namespace Avahi              lock (client) {                  handle = avahi_address_resolver_new (client.Handle, iface, proto, addrPtr, flags,                                                       cb, IntPtr.Zero); + +                if (handle == IntPtr.Zero) +                    client.ThrowError ();              }              Utility.Free (addrPtr); diff --git a/avahi-sharp/AvahiTest.cs b/avahi-sharp/AvahiTest.cs index df95b90..99cd6e2 100644 --- a/avahi-sharp/AvahiTest.cs +++ b/avahi-sharp/AvahiTest.cs @@ -37,7 +37,7 @@ public class AvahiTest {          EntryGroup eg = new EntryGroup (client);          eg.StateChanged += OnEntryGroupChanged;          eg.AddService ("foobar2", "_daap._tcp", client.DomainName, -                       444, new string[] { "foo", "bar", "baz" }); +                       444, new string[] { "foo=stuff", "bar=stuff2", "baz=stuff3" });          eg.Commit ();          Console.WriteLine ("Press enter to quit");          Console.ReadLine (); @@ -99,10 +99,17 @@ public class AvahiTest {          foreach (byte[] bytes in args.Service.Text) {              Console.WriteLine ("Text: " + Encoding.UTF8.GetString (bytes));          } +          AddressResolver ar = new AddressResolver (client, args.Service.Address);          objects.Add (ar); -         +          ar.Found += OnAddressResolved; +        ar.Failed += OnAddressResolverFailed; +    } + +    private static void OnAddressResolverFailed (object o, ErrorCodeArgs args) +    { +        Console.WriteLine ("Failed to resolve '{0}': {1}", (o as AddressResolver).Address, args.ErrorCode);      }      private static void OnAddressResolved (object o, HostAddressArgs args) diff --git a/avahi-sharp/DomainBrowser.cs b/avahi-sharp/DomainBrowser.cs index 50ac757..50da54e 100644 --- a/avahi-sharp/DomainBrowser.cs +++ b/avahi-sharp/DomainBrowser.cs @@ -22,6 +22,7 @@  using System;  using System.Collections;  using System.Runtime.InteropServices; +using System.Text;  namespace Avahi  { @@ -78,7 +79,7 @@ namespace Avahi          [DllImport ("avahi-client")]          private static extern IntPtr avahi_domain_browser_new (IntPtr client, int iface, int proto, -                                                               IntPtr domain, int btype, LookupFlags flags, +                                                               byte[] domain, int btype, LookupFlags flags,                                                                 DomainBrowserCallback cb,                                                                 IntPtr userdata); @@ -147,10 +148,12 @@ namespace Avahi                  return;              lock (client) { -                IntPtr domainPtr = Utility.StringToPtr (domain); -                handle = avahi_domain_browser_new (client.Handle, iface, (int) proto, domainPtr, (int) btype, flags, +                handle = avahi_domain_browser_new (client.Handle, iface, (int) proto, +                                                   Utility.StringToBytes (domain), (int) btype, flags,                                                     cb, IntPtr.Zero); -                Utility.Free (domainPtr); + +                if (handle == IntPtr.Zero) +                    client.ThrowError ();              }          } diff --git a/avahi-sharp/EntryGroup.cs b/avahi-sharp/EntryGroup.cs index eb7d9e2..2ebecc2 100644 --- a/avahi-sharp/EntryGroup.cs +++ b/avahi-sharp/EntryGroup.cs @@ -22,6 +22,7 @@  using System;  using System.Net;  using System.Runtime.InteropServices; +using System.Text;  using Mono.Unix;  namespace Avahi @@ -90,28 +91,28 @@ namespace Avahi          [DllImport ("avahi-client")]          private static extern int avahi_entry_group_add_service_strlst (IntPtr group, int iface, Protocol proto, -                                                                        PublishFlags flags, IntPtr name, IntPtr type, -                                                                        IntPtr domain, IntPtr host, UInt16 port, +                                                                        PublishFlags flags, byte[] name, byte[] type, +                                                                        byte[] domain, byte[] host, UInt16 port,                                                                          IntPtr strlst);          [DllImport ("avahi-client")]          private static extern int avahi_entry_group_update_service_strlst (IntPtr group, int iface, Protocol proto, -                                                                           PublishFlags flags, IntPtr name, -                                                                           IntPtr type, IntPtr domain, IntPtr strlst); +                                                                           PublishFlags flags, byte[] name, +                                                                           byte[] type, byte[] domain, IntPtr strlst);          [DllImport ("avahi-client")]          private static extern int avahi_entry_group_add_service_subtype (IntPtr group, int iface, Protocol proto, -                                                                         PublishFlags flags, IntPtr name, IntPtr type, -                                                                         IntPtr domain, IntPtr subtype); +                                                                         PublishFlags flags, byte[] name, byte[] type, +                                                                         byte[] domain, byte[] subtype);          [DllImport ("avahi-client")]          private static extern int avahi_entry_group_add_address (IntPtr group, int iface, Protocol proto, -                                                                 PublishFlags flags, IntPtr name, IntPtr address); +                                                                 PublishFlags flags, byte[] name, IntPtr address);          [DllImport ("avahi-client")]          private static extern int avahi_entry_group_add_record (IntPtr group, int iface, Protocol proto, -                                                                PublishFlags flags, IntPtr name, RecordClass clazz, +                                                                PublishFlags flags, byte[] name, RecordClass clazz,                                                                  RecordType type, uint ttl, byte[] rdata, int size);          [DllImport ("avahi-client")] @@ -121,23 +122,23 @@ namespace Avahi          private static extern IntPtr avahi_string_list_new (IntPtr txt);          [DllImport ("avahi-common")] -        private static extern IntPtr avahi_string_list_add (IntPtr list, IntPtr txt); +        private static extern IntPtr avahi_string_list_add (IntPtr list, byte[] txt);          [DllImport ("avahi-common")]          private static extern void avahi_string_list_free (IntPtr list);          [DllImport ("avahi-common")] -        private static extern int avahi_service_name_join (IntPtr buf, int len, IntPtr name, IntPtr type, -                                                           IntPtr domain); +        private static extern int avahi_service_name_join (IntPtr buf, int len, byte[] name, byte[] type, +                                                           byte[] domain);          [DllImport ("avahi-common")] -        private static extern int avahi_service_name_split (IntPtr service, IntPtr name, int name_len, +        private static extern int avahi_service_name_split (byte[] service, IntPtr name, int name_len,                                                              IntPtr type, int type_len,                                                              IntPtr domain, int domain_len);          [DllImport ("avahi-common")] -        private static extern IntPtr avahi_alternative_service_name (IntPtr name); +        private static extern IntPtr avahi_alternative_service_name (byte[] name);          public event EntryGroupStateHandler StateChanged; @@ -221,32 +222,41 @@ namespace Avahi              if (txt != null) {                  foreach (string item in txt) { -                    IntPtr itemPtr = Utility.StringToPtr (item); -                    list = avahi_string_list_add (list, itemPtr); -                    Utility.Free (itemPtr); +                    list = avahi_string_list_add (list, Utility.StringToBytes (item));                  }              } -            IntPtr namePtr = Utility.StringToPtr (name); -            IntPtr typePtr = Utility.StringToPtr (type); -            IntPtr domainPtr = Utility.StringToPtr (domain); -            IntPtr hostPtr = Utility.StringToPtr (host); - -            lock (client) { -                int ret = avahi_entry_group_add_service_strlst (handle, iface, proto, flags, namePtr, typePtr, domainPtr, -                                                                hostPtr, port, list); +            AddService (iface, proto, flags, name, type, domain, host, port, list); +        } -                Utility.Free (namePtr); -                Utility.Free (typePtr); -                Utility.Free (domainPtr); -                Utility.Free (hostPtr); -                avahi_string_list_free (list); +        public void AddService (int iface, Protocol proto, PublishFlags flags, string name, string type, string domain, +                                string host, UInt16 port, params byte[][] txt) +        { +            IntPtr list = avahi_string_list_new (IntPtr.Zero); -                if (ret < 0) { -                    client.ThrowError (); +            if (txt != null) { +                foreach (byte[] item in txt) { +                    list = avahi_string_list_add (list, item);                  }              } + +            AddService (iface, proto, flags, name, type, domain, host, port, list); +        } + +        private void AddService (int iface, Protocol proto, PublishFlags flags, string name, string type, +                                 string domain, string host, UInt16 port, IntPtr list) +        { +            int ret = avahi_entry_group_add_service_strlst (handle, iface, proto, flags, +                                                            Utility.StringToBytes (name), +                                                            Utility.StringToBytes (type), +                                                            Utility.StringToBytes (domain), +                                                            Utility.StringToBytes (host), port, list); +             +            avahi_string_list_free (list); +            if (ret < 0) { +                client.ThrowError (); +            }          }          public void UpdateService (string name, string type, string domain, params string[] txt) @@ -261,23 +271,17 @@ namespace Avahi              if (txt != null) {                  foreach (string item in txt) { -                    IntPtr itemPtr = Utility.StringToPtr (item); -                    list = avahi_string_list_add (list, itemPtr); -                    Utility.Free (itemPtr); +                    list = avahi_string_list_add (list, Utility.StringToBytes (item));                  }              } -            IntPtr namePtr = Utility.StringToPtr (name); -            IntPtr typePtr = Utility.StringToPtr (type); -            IntPtr domainPtr = Utility.StringToPtr (domain); -              lock (client) { -                int ret = avahi_entry_group_update_service_strlst (handle, iface, proto, flags, namePtr, typePtr, domainPtr, list); +                int ret = avahi_entry_group_update_service_strlst (handle, iface, proto, flags, +                                                                   Utility.StringToBytes (name), +                                                                   Utility.StringToBytes (type), +                                                                   Utility.StringToBytes (domain), +                                                                   list); -                Utility.Free (namePtr); -                Utility.Free (typePtr); -                Utility.Free (domainPtr); -                                  avahi_string_list_free (list);                  if (ret < 0) { @@ -294,20 +298,13 @@ namespace Avahi          public void AddServiceSubtype (int iface, Protocol proto, PublishFlags flags, string name,                                         string type, string domain, string subtype)          { -            IntPtr namePtr = Utility.StringToPtr (name); -            IntPtr typePtr = Utility.StringToPtr (type); -            IntPtr domainPtr = Utility.StringToPtr (domain); -            IntPtr subtypePtr = Utility.StringToPtr (subtype); -              lock (client) { -                int ret = avahi_entry_group_add_service_subtype (handle, iface, proto, flags, namePtr, -                                                                 typePtr, domainPtr, subtypePtr); +                int ret = avahi_entry_group_add_service_subtype (handle, iface, proto, flags, +                                                                 Utility.StringToBytes (name), +                                                                 Utility.StringToBytes (type), +                                                                 Utility.StringToBytes (domain), +                                                                 Utility.StringToBytes (subtype)); -                Utility.Free (namePtr); -                Utility.Free (typePtr); -                Utility.Free (domainPtr); -                Utility.Free (subtypePtr); -                                  if (ret < 0) {                      client.ThrowError ();                  } @@ -321,13 +318,12 @@ namespace Avahi          public void AddAddress (int iface, Protocol proto, PublishFlags flags, string name, IPAddress address)          { -            IntPtr namePtr = Utility.StringToPtr (name);              IntPtr addressPtr = Utility.AddressToPtr (address);              lock (client) { -                int ret = avahi_entry_group_add_address (handle, iface, proto, flags, namePtr, addressPtr); +                int ret = avahi_entry_group_add_address (handle, iface, proto, flags, +                                                         Utility.StringToBytes (name), addressPtr); -                Utility.Free (namePtr);                  Utility.Free (addressPtr);                  if (ret < 0) { @@ -344,14 +340,11 @@ namespace Avahi          public void AddRecord (int iface, Protocol proto, PublishFlags flags, string name,                                 RecordClass clazz, RecordType type, uint ttl, byte[] rdata, int length)          { -            IntPtr namePtr = Utility.StringToPtr (name); -              lock (client) { -                int ret = avahi_entry_group_add_record (handle, iface, proto, flags, namePtr, +                int ret = avahi_entry_group_add_record (handle, iface, proto, flags, +                                                        Utility.StringToBytes (name),                                                          clazz, type, ttl, rdata, length); -                Utility.Free (namePtr); -                                  if (ret < 0) {                      client.ThrowError ();                  } @@ -363,15 +356,10 @@ namespace Avahi              int len = 4 * (name.Length + type.Length + domain.Length) + 4;              IntPtr buf = Stdlib.malloc ((ulong) len); -            IntPtr namePtr = Utility.StringToPtr (name); -            IntPtr typePtr = Utility.StringToPtr (type); -            IntPtr domainPtr = Utility.StringToPtr (domain); - -            int ret = avahi_service_name_join (buf, len, namePtr, typePtr, domainPtr); - -            Utility.Free (namePtr); -            Utility.Free (typePtr); -            Utility.Free (domainPtr); +            int ret = avahi_service_name_join (buf, len, +                                               Utility.StringToBytes (name), +                                               Utility.StringToBytes (type), +                                               Utility.StringToBytes (domain));              if (ret < 0) {                  Utility.Free (buf); @@ -388,15 +376,13 @@ namespace Avahi          {              int len = 1024; -            IntPtr servicePtr = Utility.StringToPtr (service);              IntPtr namePtr = Stdlib.malloc ((ulong) len);              IntPtr typePtr = Stdlib.malloc ((ulong) len);              IntPtr domainPtr = Stdlib.malloc ((ulong) len); -            int ret = avahi_service_name_split (servicePtr, namePtr, len, typePtr, len, domainPtr, len); +            int ret = avahi_service_name_split (Utility.StringToBytes (service), namePtr, len, typePtr, len, +                                                domainPtr, len); -            Utility.Free (servicePtr); -                          if (ret < 0) {                  Utility.Free (namePtr);                  Utility.Free (typePtr); @@ -418,11 +404,7 @@ namespace Avahi          }          public static string GetAlternativeServiceName (string name) { -            IntPtr namePtr = Utility.StringToPtr (name); -            IntPtr result = avahi_alternative_service_name (namePtr); -            Utility.Free (namePtr); - -            return Utility.PtrToStringFree (result); +            return Utility.PtrToStringFree (avahi_alternative_service_name (Utility.StringToBytes (name)));          }          private void OnEntryGroupCallback (IntPtr group, EntryGroupState state, IntPtr userdata) diff --git a/avahi-sharp/HostNameResolver.cs b/avahi-sharp/HostNameResolver.cs index 0922aa7..81305fd 100644 --- a/avahi-sharp/HostNameResolver.cs +++ b/avahi-sharp/HostNameResolver.cs @@ -23,6 +23,7 @@ using System;  using System.Collections;  using System.Net;  using System.Runtime.InteropServices; +using System.Text;  using Mono.Unix;  namespace Avahi @@ -51,7 +52,7 @@ namespace Avahi          [DllImport ("avahi-client")]          private static extern IntPtr avahi_host_name_resolver_new (IntPtr client, int iface, Protocol proto, -                                                                   IntPtr hostname, Protocol aproto, LookupFlags flags, +                                                                   byte[] hostname, Protocol aproto, LookupFlags flags,                                                                     HostNameResolverCallback cb, IntPtr userdata);          [DllImport ("avahi-client")] @@ -125,14 +126,14 @@ namespace Avahi                  (foundListeners.Count == 0 && timeoutListeners.Count == 0))                  return; -            IntPtr hostPtr = Utility.StringToPtr (hostname); -              lock (client) { -                handle = avahi_host_name_resolver_new (client.Handle, iface, proto, hostPtr, aproto, flags, +                handle = avahi_host_name_resolver_new (client.Handle, iface, proto, +                                                       Utility.StringToBytes (hostname), aproto, flags,                                                         cb, IntPtr.Zero); + +                if (handle == IntPtr.Zero) +                    client.ThrowError ();              } -             -            Utility.Free (hostPtr);          }          private void Stop (bool force) diff --git a/avahi-sharp/RecordBrowser.cs b/avahi-sharp/RecordBrowser.cs index 5a736bd..f65f8ac 100644 --- a/avahi-sharp/RecordBrowser.cs +++ b/avahi-sharp/RecordBrowser.cs @@ -23,6 +23,7 @@ using System;  using System.Net;  using System.Collections;  using System.Runtime.InteropServices; +using System.Text;  namespace Avahi  { @@ -93,7 +94,7 @@ namespace Avahi          [DllImport ("avahi-client")]          private static extern IntPtr avahi_record_browser_new (IntPtr client, int iface, Protocol proto, -                                                               IntPtr name, ushort clazz, ushort type, +                                                               byte[] name, ushort clazz, ushort type,                                                                 LookupFlags flags, RecordBrowserCallback cb,                                                                 IntPtr userdata); @@ -164,14 +165,13 @@ namespace Avahi                  (addListeners.Count == 0 && removeListeners.Count == 0))                  return; -            IntPtr namePtr = Utility.StringToPtr (name); -              lock (client) { -                handle = avahi_record_browser_new (client.Handle, iface, proto, namePtr, (ushort) clazz, (ushort) type, -                                                   flags, cb, IntPtr.Zero); -            } +                handle = avahi_record_browser_new (client.Handle, iface, proto, Utility.StringToBytes (name), +                                                   (ushort) clazz, (ushort) type, flags, cb, IntPtr.Zero); -            Utility.Free (namePtr); +                if (handle == IntPtr.Zero) +                    client.ThrowError (); +            }          }          private void Stop (bool force) diff --git a/avahi-sharp/ServiceBrowser.cs b/avahi-sharp/ServiceBrowser.cs index 639dd0a..520e339 100644 --- a/avahi-sharp/ServiceBrowser.cs +++ b/avahi-sharp/ServiceBrowser.cs @@ -23,6 +23,7 @@ using System;  using System.Net;  using System.Collections;  using System.Runtime.InteropServices; +using System.Text;  namespace Avahi  { @@ -79,8 +80,8 @@ namespace Avahi          private ArrayList removeListeners = new ArrayList ();          [DllImport ("avahi-client")] -        private static extern IntPtr avahi_service_browser_new (IntPtr client, int iface, int proto, IntPtr type, -                                                                IntPtr domain, LookupFlags flags, +        private static extern IntPtr avahi_service_browser_new (IntPtr client, int iface, int proto, byte[] type, +                                                                byte[] domain, LookupFlags flags,                                                                  ServiceBrowserCallback cb,                                                                  IntPtr userdata); @@ -152,15 +153,14 @@ namespace Avahi                  (addListeners.Count == 0 && removeListeners.Count == 0))                  return; -            IntPtr domainPtr = Utility.StringToPtr (domain); -            IntPtr typePtr = Utility.StringToPtr (type); -              lock (client) { -                handle = avahi_service_browser_new (client.Handle, iface, (int) proto, typePtr, domainPtr, flags, -                                                    cb, IntPtr.Zero); +                handle = avahi_service_browser_new (client.Handle, iface, (int) proto, +                                                    Utility.StringToBytes (type), Utility.StringToBytes (domain), +                                                    flags, cb, IntPtr.Zero); + +                if (handle == IntPtr.Zero) +                    client.ThrowError ();              } -            Utility.Free (domainPtr); -            Utility.Free (typePtr);          }          private void Stop (bool force) diff --git a/avahi-sharp/ServiceResolver.cs b/avahi-sharp/ServiceResolver.cs index 8dfe520..945372b 100644 --- a/avahi-sharp/ServiceResolver.cs +++ b/avahi-sharp/ServiceResolver.cs @@ -23,6 +23,7 @@ using System;  using System.Collections;  using System.Net;  using System.Runtime.InteropServices; +using System.Text;  using Mono.Unix;  namespace Avahi @@ -53,7 +54,7 @@ namespace Avahi          [DllImport ("avahi-client")]          private static extern IntPtr avahi_service_resolver_new (IntPtr client, int iface, Protocol proto, -                                                                 IntPtr name, IntPtr type, IntPtr domain, +                                                                 byte[] name, byte[] type, byte[] domain,                                                                   Protocol aproto, LookupFlags flags,                                                                   ServiceResolverCallback cb,                                                                   IntPtr userdata); @@ -145,18 +146,14 @@ namespace Avahi                  (foundListeners.Count == 0 && timeoutListeners.Count == 0))                  return; -            IntPtr namePtr = Utility.StringToPtr (name); -            IntPtr typePtr = Utility.StringToPtr (type); -            IntPtr domainPtr = Utility.StringToPtr (domain); -              lock (client) { -                handle = avahi_service_resolver_new (client.Handle, iface, proto, namePtr, typePtr, domainPtr, -                                                     aproto, flags, cb, IntPtr.Zero); +                handle = avahi_service_resolver_new (client.Handle, iface, proto, +                                                     Utility.StringToBytes (name), Utility.StringToBytes (type), +                                                     Utility.StringToBytes (domain), aproto, flags, cb, IntPtr.Zero); + +                if (handle == IntPtr.Zero) +                    client.ThrowError ();              } -             -            Utility.Free (namePtr); -            Utility.Free (typePtr); -            Utility.Free (domainPtr);          }          private void Stop (bool force) diff --git a/avahi-sharp/ServiceTypeBrowser.cs b/avahi-sharp/ServiceTypeBrowser.cs index dbfff73..3796d60 100644 --- a/avahi-sharp/ServiceTypeBrowser.cs +++ b/avahi-sharp/ServiceTypeBrowser.cs @@ -22,6 +22,7 @@  using System;  using System.Collections;  using System.Runtime.InteropServices; +using System.Text;  namespace Avahi  { @@ -71,7 +72,7 @@ namespace Avahi          [DllImport ("avahi-client")]          private static extern IntPtr avahi_service_type_browser_new (IntPtr client, int iface, int proto, -                                                                     IntPtr domain, LookupFlags flags, +                                                                     byte[] domain, LookupFlags flags,                                                                       ServiceTypeBrowserCallback cb,                                                                       IntPtr userdata); @@ -143,10 +144,12 @@ namespace Avahi                  return;              lock (client) { -                IntPtr domainPtr = Utility.StringToPtr (domain); -                handle = avahi_service_type_browser_new (client.Handle, iface, (int) proto, domainPtr, flags, +                handle = avahi_service_type_browser_new (client.Handle, iface, (int) proto, +                                                         Utility.StringToBytes (domain), flags,                                                           cb, IntPtr.Zero); -                Utility.Free (domainPtr); + +                if (handle == IntPtr.Zero) +                    client.ThrowError ();              }          } diff --git a/avahi-sharp/Utility.cs b/avahi-sharp/Utility.cs index f8b4ffd..b15161c 100644 --- a/avahi-sharp/Utility.cs +++ b/avahi-sharp/Utility.cs @@ -60,12 +60,20 @@ namespace Avahi              return ret;          } -        public static IntPtr StringToPtr (string str) +        public static byte[] StringToBytes (string str) +        { +            if (str == null) +                return null; + +            return Encoding.UTF8.GetBytes (str); +        } + +        private static IntPtr StringToPtr (string str)          {              if (str == null)                  return IntPtr.Zero; -            byte[] bytes = Encoding.UTF8.GetBytes (str); +            byte[] bytes = Utility.StringToBytes (str);              IntPtr buf = Stdlib.malloc ((uint) bytes.Length + 1);              Marshal.Copy (bytes, 0, buf, bytes.Length);              Marshal.WriteByte (buf, bytes.Length, 0);  | 
