def OnExpandItem(self,event): item = event.GetItem() if item == self.tree.GetRootItem(): return data = self.tree.GetPyData(item) if not data: return self.tree.DeleteChildren(item) name,regtype,replyDomain = data self.resolvingItem = item sdRef2 = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, name, regtype, replyDomain, ResolveCallback, None) bonjour.DNSServiceProcessResult(sdRef2)
def QueryCallback(sdRef,flags,interfaceIndex, errorCode,fullname,rrtype, rrclass,rdlen,rdata, ttl,userdata): # This is very ugly; should understand resource records better st = struct.unpack('%dc' % (rdlen-1), rdata) l1 = ord(st[0]) l2 = ord(st[l1+1]) typ = ''.join(st[1:l1+1]) klass = ''.join(st[l1+2:l1+l2+2]) serviceType = typ + '.' + klass if flags & SERVICE_ADD: # Add the service type to the browser app.frame.AddServiceType(serviceType) serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse( serviceRef, # DNSServiceRef *sdRef, 0, # DNSServiceFlags flags, 0, # uint32_t interfaceIndex, serviceType, # const char *regtype, 'local.', # const char *domain, /* may be NULL */ BrowseCallback, # DNSServiceBrowseReply callBack, None) if ret: print "ret = %d; exiting" % ret sys.exit(1) fd = bonjour.DNSServiceRefSockFD(serviceRef) serviceRefDict[fd] = serviceRef elif flags == 0: app.frame.RemoveServiceType(serviceType)
def startResolving(self): """Advertise the service with Bonjour. This method returns a deferred. Upon success, the result is a dictionary of information about the service. Upon failure, the result is a Failure object that knows the BonjourError code. """ # Allocate a Bonjour Service Reference self.sdRef = bonjour.AllocateDNSServiceRef() # Initiate Registration of the service ret = bonjour.pyDNSServiceResolve(self.sdRef, self.flags, self.interfaceIndex, self.name, self.regtype, self.domain, self.callback, self.context) # Error check for immediate failure if ret != bonjour.kDNSServiceErr_NoError: raise BonjourResolveError(ret) # Get the file descriptor and integrate with twisted self.fd = bonjour.DNSServiceRefSockFD(self.sdRef) self.bonjourDesc = BonjourDescriptor(self.fd, self.sdRef) self.reactor.addReader(self.bonjourDesc) return None
def __init__(self, serviceName, regtype, url, port=9999): if port == 0: raise PublisherError( 'Service registered with invalid port %d' % (port, )) self.serviceRef = None self.registerFlag = threading.Event() # Create a text record txtRecordTxt = 'url=' + url txtRecord = chr(len(txtRecordTxt)) + txtRecordTxt txtRecordLen = len(txtRecord) # Allocate a service discovery reference and register the specified service self.serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceRegister(self.serviceRef, 0, 0, serviceName, regtype, 'local.', None, port, txtRecordLen, txtRecord, self.__RegisterCallback, None) if ret != bonjour.kDNSServiceErr_NoError: raise PublisherError(ret) # Get the socket and loop fd = bonjour.DNSServiceRefSockFD(self.serviceRef) ret = select.select([fd], [], []) if ret[0]: ret = bonjour.DNSServiceProcessResult(self.serviceRef)
def Run(self): self.running = 1 # Allocate a service discovery ref and browse for the specified service type self.serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse(self.serviceRef, 0, 0, self.serviceType, 'local.', self.__BrowseCallback, None) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret raise BrowserError('browse', ret) # Get socket descriptor fd = bonjour.DNSServiceRefSockFD(self.serviceRef) if fd <= 0: raise BrowserError('fd', fd) # Loop while self.IsRunning(): # print "do select" ret = select.select([fd], [], [], self.timeout) if ret[0]: #print "do process result" ret = bonjour.DNSServiceProcessResult(self.serviceRef) if ret != bonjour.kDNSServiceErr_NoError: raise BrowserError('processresult', ret)
def BrowseCallback(sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, userdata): if flags & bonjour.kDNSServiceFlagsAdd: sdRef2 = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName, regtype, replyDomain, ResolveCallback, None) bonjour.DNSServiceProcessResult(sdRef2) elif flags == 0: print "Service removed: ", serviceName, regtype
def BrowseCallback(sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, userdata): if serviceName == servicename and flags & bonjour.kDNSServiceFlagsAdd: sys.stderr.write("Found service; resolving...\n") waitEvent.set() sdRef2 = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName, regtype, replyDomain, ResolveCallback, None) resolveEvent.clear() while not resolveEvent.isSet(): bonjour.DNSServiceProcessResult(sdRef2)
def __BrowseCallback(self, sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, userdata): if flags & bonjour.kDNSServiceFlagsAdd: sdRef2 = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName, regtype, replyDomain, self.__ResolveCallback, serviceName) bonjour.DNSServiceProcessResult(sdRef2) bonjour.DNSServiceRefDeallocate(sdRef2) elif flags == 0: self.lock.acquire() del self.serviceUrls[serviceName] self.lock.release() # Call callback (if registered) to signal delete if self.browseCallback: self.browseCallback(self.DELETE, serviceName)
def BrowseServices(): # Allocate a service discovery ref and browse for the specified service type serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceQueryRecord(serviceRef, 0, # no flags 0, # all network interfaces "_services._dns-sd._udp.local.", # meta-query record name PTR_RECORD_TYPE, INTERNET_CLASS_TYPE, QueryCallback, # callback function ptr None) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret sys.exit(1) # Get socket descriptor and loop fd = bonjour.DNSServiceRefSockFD(serviceRef) while 1: ret = select.select([fd],[],[]) ret = bonjour.DNSServiceProcessResult(serviceRef) # Deallocate the service discovery ref bonjour.DNSServiceRefDeallocate(serviceRef)
if len(sys.argv) < 4: print "Usage: register.py servicename regtype port" sys.exit(1) servicename = sys.argv[1] regtype = sys.argv[2] port = int(sys.argv[3]) userdata = None if len(sys.argv) > 4: userdata = sys.argv[4] hostname = socket.gethostname() # Allocate a service discovery reference and register the specified service serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceRegister( serviceRef, # DNSServiceRef *sdRef, 0, # DNSServiceFlags flags, /* may be 0 */ 0, # uint32_t interfaceIndex,/* may be 0 */ servicename, # const char *name, /* may be NULL */ regtype, # const char *regtype, 'local.', # const char *domain, /* may be NULL */ hostname, # const char *host, /* may be NULL */ port, # uint16_t port, 0, # uint16_t txtLen, "", # const void *txtRecord, /* may be NULL */ RegisterCallback, # DNSServiceRegisterReply callBack, /* may be NULL */ userdata) if ret != bonjour.kDNSServiceErr_NoError: