From abe91da3add7e17d17495880155f96052fcc9dd8 Mon Sep 17 00:00:00 2001 From: Benjamin Baron Date: Sat, 6 Oct 2012 21:46:09 -0700 Subject: [PATCH] - Fixed crash in ZeroConf.dll when embedded using mkbundle - Fixed crash in Avahi provider when it encounters a name collision (now tries name (2), etc like the Bonjour plugin does automatically) --- .../RegisterService.cs | 17 ++++++++- .../ProviderFactory.cs | 38 ++++++++++--------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/RegisterService.cs b/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/RegisterService.cs index 506ea9a..f258e8e 100644 --- a/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/RegisterService.cs +++ b/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/RegisterService.cs @@ -38,6 +38,9 @@ public class RegisterService : Service, IRegisterService private IAvahiEntryGroup entry_group; public event RegisterServiceEventHandler Response; + + private string originalName; + private int retryNameModifier = 2; public RegisterService () { @@ -95,12 +98,22 @@ private void OnEntryGroupStateChanged (EntryGroupState state, string error) switch (state) { case EntryGroupState.Collision: if (!OnResponse (ErrorCode.Collision)) { - throw new ApplicationException (); + if (originalName == null) + originalName = Name; + + Name = originalName + " (" + retryNameModifier + ")"; + retryNameModifier++; + + Console.WriteLine("ZeroConf had a name collision, trying: " + Name); + + Register(); + //throw new ApplicationException (); } break; case EntryGroupState.Failure: if (!OnResponse (ErrorCode.Failure)) { - throw new ApplicationException (); + Console.WriteLine("Mono.ZeroConf failed to register name with AvahiDBus"); + //throw new ApplicationException (); } break; case EntryGroupState.Established: diff --git a/src/Mono.Zeroconf/Mono.Zeroconf.Providers/ProviderFactory.cs b/src/Mono.Zeroconf/Mono.Zeroconf.Providers/ProviderFactory.cs index 6f5e694..1b6da83 100644 --- a/src/Mono.Zeroconf/Mono.Zeroconf.Providers/ProviderFactory.cs +++ b/src/Mono.Zeroconf/Mono.Zeroconf.Providers/ProviderFactory.cs @@ -91,23 +91,27 @@ private static IZeroconfProvider [] GetProviders() } foreach(string directory in directories) { - foreach(string file in Directory.GetFiles(directory, "Mono.Zeroconf.Providers.*.dll")) { - if(Path.GetFileName(file) != Path.GetFileName(this_asm_path)) { - Assembly provider_asm = Assembly.LoadFile(file); - foreach(Attribute attr in provider_asm.GetCustomAttributes(false)) { - if(attr is ZeroconfProviderAttribute) { - Type type = (attr as ZeroconfProviderAttribute).ProviderType; - IZeroconfProvider provider = (IZeroconfProvider)Activator.CreateInstance(type); - try { - provider.Initialize(); - providers_list.Add(provider); - } catch (Exception e) { - Console.WriteLine (e); - } - } - } - } - } + try + { + foreach(string file in Directory.GetFiles(directory, "Mono.Zeroconf.Providers.*.dll")) { + if(Path.GetFileName(file) != Path.GetFileName(this_asm_path)) { + Assembly provider_asm = Assembly.LoadFile(file); + foreach(Attribute attr in provider_asm.GetCustomAttributes(false)) { + if(attr is ZeroconfProviderAttribute) { + Type type = (attr as ZeroconfProviderAttribute).ProviderType; + IZeroconfProvider provider = (IZeroconfProvider)Activator.CreateInstance(type); + try { + provider.Initialize(); + providers_list.Add(provider); + } catch (Exception e) { + Console.WriteLine (e); + } + } + } + } + } + } + catch {} } if(providers_list.Count == 0) {