All pastes #250972 Raw Edit

rcaskey

public text v1 · immutable
#250972 ·published 2006-11-17 16:32 UTC
rendered paste body
import dbus, avahi, dbus.glibclass ServerDetector:    # The known about servers    __servers       = None    __serversByName = None    def __init__(self):        """Constructor"""        self.__servers = []        self.__serversByName = {}        # Connect to the Avahi server        bus = dbus.SystemBus()        self.server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)        # FIXME: Can raise a dbus_bindings.DBusException (local name collision)        browser = self.server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_INET, '_workstation._udp', '', 0)        listener = dbus.Interface(bus.get_object(avahi.DBUS_NAME, browser), avahi.DBUS_INTERFACE_SERVICE_BROWSER)        listener.connect_to_signal('ItemNew', self.__serviceDetected)        listener.connect_to_signal('ItemRemove', self.__serviceRemoved)    # Methods to extend    def onServerDetected(self, server):        """Called when a server is detected.        'server' is the server that has been detected (RemoteServer).        """        pass    def onServerRemoved(self, server):        """Called when a server is removed.        'server' is the server that has been removed (RemoteServer).        """        pass    # Public methods    def getServers(self):        """Returns a list of servers that are known of"""        return self.__servers[:]    # Private methods    def __serviceDetected(self, interface, protocol, name, stype, domain, flags):        """D-Dbus callback"""	print "DETECTED SERVICE"        # Get information on this service        self.server.ResolveService(interface, protocol, name, stype, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0),                                   reply_handler = self.__serverResolved, error_handler = self.__resolveError)    def __serverResolved(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags):        """D-Dbus callback"""        #print avahi.txt_array_to_string_array(txt)        print 'Server detected: ' + str(address) + ':' + str(port) + ' (' + name + ')'        assert(not self.__serversByName.has_key(name))        server = RemoteServer(name, (address, port))        self.__serversByName[name] = server        self.__servers.append(server)        self.onServerDetected(server)    def __resolveError(self, error):        """D-Dbus callback"""        print 'Avahi/D-Bus error: ' + repr(error)    def __serviceRemoved(self, interface, protocol, name, stype, domain, flags):        """D-Dbus callback"""        print 'Server removed: ' + str(name)        server = self.__serversByName.pop(name)        self.__servers.remove(server)        self.onServerRemoved(server)if __name__ == '__main__':	x = ServerDetector()	print x.getServers()