/trunk/src/Mono.Zeroconf.Providers.Bonjour/Mono.Zeroconf.Providers.Bonjour/BrowseService.cs |
@@ -58,11 +58,18 @@ |
{ |
resolve_reply_handler = new Native.DNSServiceResolveReply(OnResolveReply); |
query_record_reply_handler = new Native.DNSServiceQueryRecordReply(OnQueryRecordReply); |
resolveAction = new Action<bool>(Resolve); |
} |
|
private Action<bool> resolveAction; |
|
public void Resolve() |
{ |
Resolve(false); |
// If people call this in a ServiceAdded eventhandler (which they genreally do) |
// We need to invoke onto another thread otherwise we block processing any more results. |
|
resolveAction.BeginInvoke(false, null, null); |
} |
|
public void Resolve(bool requery) |
@@ -80,7 +87,7 @@ |
|
ServiceRef sd_ref; |
ServiceError error = Native.DNSServiceResolve(out sd_ref, ServiceFlags.None, |
InterfaceIndex, Name, RegType, ReplyDomain, resolve_reply_handler, IntPtr.Zero); |
InterfaceIndex, Encoding.UTF8.GetBytes(Name), RegType, ReplyDomain, resolve_reply_handler, IntPtr.Zero); |
|
if(error != ServiceError.NoError) { |
throw new ServiceErrorException(error); |
@@ -105,7 +112,7 @@ |
} |
|
private void OnResolveReply(ServiceRef sdRef, ServiceFlags flags, uint interfaceIndex, |
ServiceError errorCode, string fullname, string hosttarget, ushort port, ushort txtLen, |
ServiceError errorCode, IntPtr fullname, string hosttarget, ushort port, ushort txtLen, |
IntPtr txtRecord, IntPtr contex) |
{ |
is_resolved = true; |
@@ -112,9 +119,10 @@ |
resolve_pending = false; |
|
InterfaceIndex = interfaceIndex; |
FullName = fullname; |
this.port = port; |
FullName = Native.Utf8toString(fullname); |
this.port = (ushort)IPAddress.NetworkToHostOrder((short)port); |
TxtRecord = new TxtRecord(txtLen, txtRecord); |
this.hosttarget = hosttarget; |
|
sdRef.Deallocate(); |
|
@@ -142,7 +150,16 @@ |
|
sd_ref.Process(); |
} |
|
if (hostentry.AddressList != null) |
{ |
ServiceResolvedEventHandler handler = Resolved; |
if (handler != null) |
{ |
handler(this, new ServiceResolvedEventArgs(this)); |
} |
} |
} |
|
private void OnQueryRecordReply(ServiceRef sdRef, ServiceFlags flags, uint interfaceIndex, |
ServiceError errorCode, string fullname, ServiceType rrtype, ServiceClass rrclass, ushort rdlen, |
@@ -150,6 +167,7 @@ |
{ |
switch(rrtype) { |
case ServiceType.A: |
case ServiceType.AAAA: |
IPAddress address; |
|
if(rdlen == 4) { |
@@ -198,8 +216,12 @@ |
break; |
} |
|
|
if ((flags & ServiceFlags.MoreComing) != ServiceFlags.MoreComing) |
{ |
sdRef.Deallocate(); |
} |
} |
|
public bool IsResolved { |
get { return is_resolved; } |
/trunk/src/Mono.Zeroconf.Providers.Bonjour/Mono.Zeroconf.Providers.Bonjour/Native.cs |
@@ -27,6 +27,7 @@ |
// |
|
using System; |
using System.Text; |
using System.Runtime.InteropServices; |
|
namespace Mono.Zeroconf.Providers.Bonjour |
@@ -50,7 +51,7 @@ |
// DNSServiceBrowse |
|
public delegate void DNSServiceBrowseReply(ServiceRef sdRef, ServiceFlags flags, uint interfaceIndex, |
ServiceError errorCode, string serviceName, string regtype, string replyDomain, |
ServiceError errorCode, IntPtr serviceName, string regtype, string replyDomain, |
IntPtr context); |
|
[DllImport("dnssd.dll")] |
@@ -61,22 +62,23 @@ |
// DNSServiceResolve |
|
public delegate void DNSServiceResolveReply(ServiceRef sdRef, ServiceFlags flags, uint interfaceIndex, |
ServiceError errorCode, string fullname, string hosttarget, ushort port, ushort txtLen, |
ServiceError errorCode, IntPtr fullname, string hosttarget, ushort port, ushort txtLen, |
IntPtr txtRecord, IntPtr context); |
|
[DllImport("dnssd.dll")] |
public static extern ServiceError DNSServiceResolve(out ServiceRef sdRef, ServiceFlags flags, |
uint interfaceIndex, string name, string regtype, string domain, DNSServiceResolveReply callBack, |
uint interfaceIndex, byte[] name, string regtype, string domain, DNSServiceResolveReply callBack, |
IntPtr context); |
|
// DNSServiceRegister |
|
public delegate void DNSServiceRegisterReply(ServiceRef sdRef, ServiceFlags flags, ServiceError errorCode, |
string name, string regtype, string domain, IntPtr context); |
IntPtr name, string regtype, string domain, IntPtr context); |
|
|
[DllImport("dnssd.dll")] |
public static extern ServiceError DNSServiceRegister(out ServiceRef sdRef, ServiceFlags flags, |
uint interfaceIndex, string name, string regtype, string domain, string host, ushort port, |
uint interfaceIndex, byte[] name, string regtype, string domain, string host, ushort port, |
ushort txtLen, byte [] txtRecord, DNSServiceRegisterReply callBack, IntPtr context); |
|
// DNSServiceQueryRecord |
@@ -117,5 +119,17 @@ |
|
[DllImport("dnssd.dll")] |
public static extern ushort TXTRecordGetCount(ushort txtLen, IntPtr txtRecord); |
|
public static string Utf8toString(IntPtr ptr) |
{ |
int len = 0; |
while (Marshal.ReadByte(ptr, len) != 0) |
{ |
len++; |
} |
byte[] raw = new byte[len]; |
Marshal.Copy(ptr, raw, 0, len); |
return Encoding.UTF8.GetString(raw); |
} |
} |
} |
/trunk/src/Mono.Zeroconf.Providers.Bonjour/Mono.Zeroconf.Providers.Bonjour/RegisterService.cs |
@@ -30,6 +30,7 @@ |
using System.Net; |
using System.Threading; |
using System.Runtime.InteropServices; |
using System.Text; |
|
namespace Mono.Zeroconf.Providers.Bonjour |
{ |
@@ -107,7 +108,7 @@ |
|
ServiceError error = Native.DNSServiceRegister(out sd_ref, |
auto_rename ? ServiceFlags.None : ServiceFlags.NoAutoRename, InterfaceIndex, |
Name, RegType, ReplyDomain, HostTarget, (ushort)IPAddress.HostToNetworkOrder((short)port), txt_rec_length, txt_rec, |
Encoding.UTF8.GetBytes(Name), RegType, ReplyDomain, HostTarget, (ushort)IPAddress.HostToNetworkOrder((short)port), txt_rec_length, txt_rec, |
register_reply_handler, IntPtr.Zero); |
|
if(error != ServiceError.NoError) { |
@@ -128,7 +129,7 @@ |
} |
|
private void OnRegisterReply(ServiceRef sdRef, ServiceFlags flags, ServiceError errorCode, |
string name, string regtype, string domain, IntPtr context) |
IntPtr name, string regtype, string domain, IntPtr context) |
{ |
RegisterServiceEventArgs args = new RegisterServiceEventArgs(); |
|
@@ -137,7 +138,7 @@ |
args.ServiceError = (ServiceErrorCode)errorCode; |
|
if(errorCode == ServiceError.NoError) { |
Name = name; |
Name = Native.Utf8toString(name); |
RegType = regtype; |
ReplyDomain = domain; |
args.IsRegistered = true; |
/trunk/src/Mono.Zeroconf.Providers.Bonjour/Mono.Zeroconf.Providers.Bonjour/ServiceBrowser.cs |
@@ -168,11 +168,12 @@ |
} |
|
private void OnBrowseReply(ServiceRef sdRef, ServiceFlags flags, uint interfaceIndex, ServiceError errorCode, |
string serviceName, string regtype, string replyDomain, IntPtr context) |
IntPtr serviceName, string regtype, string replyDomain, IntPtr context) |
{ |
string name = Native.Utf8toString(serviceName); |
BrowseService service = new BrowseService(); |
service.Flags = flags; |
service.Name = serviceName; |
service.Name = name; |
service.RegType = regtype; |
service.ReplyDomain = replyDomain; |
service.InterfaceIndex = interfaceIndex; |
@@ -183,10 +184,10 @@ |
|
if((flags & ServiceFlags.Add) != 0) { |
lock (service_table) { |
if (service_table.ContainsKey (serviceName)) { |
service_table[serviceName] = service; |
if (service_table.ContainsKey (name)) { |
service_table[name] = service; |
} else { |
service_table.Add (serviceName, service); |
service_table.Add(name, service); |
} |
} |
|
@@ -196,8 +197,8 @@ |
} |
} else { |
lock (service_table) { |
if (service_table.ContainsKey (serviceName)) { |
service_table.Remove (serviceName); |
if (service_table.ContainsKey (name)) { |
service_table.Remove (name); |
} |
} |
|