class ServiceBrowser(IClientCallback, IServiceBrowserCallback, IServiceResolverCallback): # Client maintains its own thread as daemon andd returns # One Client can only handle one servicetype reliably # Use separate instance for each service def __init__(self, servicetype): """ Matching services are delivered to the callback method serviceCallback which then resolves the services. """ self._services = {} self._resolvers = ArrayList() self._client = Client(self) self._browser = self._client.createServiceBrowser(self, Avahi4JConstants.AnyInterface, Protocol.ANY, servicetype, None, 0) self._client.start() def stop(self): # release the browser first so no more ServiceResolver can be added # to the list self._browser.release() # we can now safely release items in the list for s in self._resolvers: s.release() # stop and release the client self._client.stop() self._client.release() def getServices(self): return self._services def serviceCallback(self, interfaceNum, proto, browserEvent, name, jtype, domain, lookupResultFlag): if browserEvent==BrowserEvent.NEW or browserEvent==BrowserEvent.REMOVE: # store service details key = hashlib.md5(str(interfaceNum) + str(proto) + name + jtype + domain).hexdigest() self._services.update({key: { 'interface': interfaceNum, 'protocol': proto, 'name': name, 'type': jtype, 'domain': domain }}) # only if it's a new service, resolve it if browserEvent==BrowserEvent.NEW: try: # ServiceResolvers are kept open and a reference is stored # in a list so they can be freed upon exit self._resolvers.add(self._client.createServiceResolver(self, interfaceNum, proto, name, jtype, domain, Protocol.ANY, 0)) except Avahi4JException, e: print "error creating resolver" print str(e) else: del self._services[key]
class ServiceBrowser(IClientCallback, IServiceBrowserCallback, IServiceResolverCallback): # Client maintains its own thread as daemon andd returns # One Client can only handle one servicetype reliably # Use separate instance for each service def __init__(self, servicetype): """ Matching services are delivered to the callback method serviceCallback which then resolves the services. """ self._services = {} self._resolvers = ArrayList() self._client = Client(self) self._browser = self._client.createServiceBrowser( self, Avahi4JConstants.AnyInterface, Protocol.ANY, servicetype, None, 0 ) self._client.start() def stop(self): # release the browser first so no more ServiceResolver can be added # to the list self._browser.release() # we can now safely release items in the list for s in self._resolvers: s.release() # stop and release the client self._client.stop() self._client.release() def getServices(self): return self._services def serviceCallback(self, interfaceNum, proto, browserEvent, name, jtype, domain, lookupResultFlag): if browserEvent == BrowserEvent.NEW or browserEvent == BrowserEvent.REMOVE: # store service details key = hashlib.md5(str(interfaceNum) + str(proto) + name + jtype + domain).hexdigest() self._services.update( {key: {"interface": interfaceNum, "protocol": proto, "name": name, "type": jtype, "domain": domain}} ) # only if it's a new service, resolve it if browserEvent == BrowserEvent.NEW: try: # ServiceResolvers are kept open and a reference is stored # in a list so they can be freed upon exit self._resolvers.add( self._client.createServiceResolver( self, interfaceNum, proto, name, jtype, domain, Protocol.ANY, 0 ) ) except Avahi4JException, e: print "error creating resolver" print str(e) else: del self._services[key]