Mono.Zeroconf

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 1  →  ?path2? @ 2
/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);
}
}