#!@PYTHON@# -*-python-*-# $Id$# This file is part of avahi.## avahi is free software; you can redistribute it and/or modify it# under the terms of the GNU Lesser General Public License as# published by the Free Software Foundation; either version 2 of the# License, or (at your option) any later version.## avahi is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public# License for more details.## You should have received a copy of the GNU Lesser General Public# License along with avahi; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307# USA.try: import avahi, gobject, dbusexcept ImportError: print "mdns publication requires avahi and dbus"try: import dbus.glibexcept ImportError, e: passdomain = ""host = ""name = "Haagen Daap"stype = "_daap._tcp"port = 8080txt = "Haagen Daap"# python-dbus doesn't allow transmission of empty arrays, therefore we "fix" it with a bogus entryif len(txt) == 0: txt.append("python-dbus=brain-damage")group = Nonen_rename = 0def remove_service(): global group if not group is None: group.Reset()def add_service(): global server, group, name, stype, domain, host, port, txt if group is None: group = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP) group.connect_to_signal('StateChanged', entry_group_state_changed) assert group.IsEmpty() print "Adding service '%s' of type '%s' ..." % (name, stype) group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, dbus.UInt32(0), name, stype, domain, host, dbus.UInt16(port), avahi.string_array_to_txt_array(txt)) group.Commit()def entry_group_state_changed(state): global name, server, n_rename# print "state change: %i" % state if state == avahi.ENTRY_GROUP_ESTABLISHED: print "Service established." elif state == avahi.ENTRY_GROUP_COLLISION: n_rename = n_rename + 1 if n_rename >= 12: print "ERROR: No suitable service name found after %i retries, exiting." % n_rename #main_loop.quit() else: name = server.GetAlternativeServiceName(name) print "WARNING: Service name collision, changing name to '%s' ..." % name remove_service() add_service()def server_state_changed(state): if state == avahi.SERVER_COLLISION: print "WARNING: Server name collision" remove_service() elif state == avahi.SERVER_RUNNING: add_service()#main_loop = gobject.MainLoop()#from twisted.internet import glib2reactor#glib2reactor.install()bus = dbus.SystemBus()server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)server.connect_to_signal("StateChanged", server_state_changed)server_state_changed(server.GetState())#try:# main_loop.run()#except KeyboardInterrupt, k:# passfrom twisted.internet import glib2reactorglib2reactor.install()from twisted.internet import reactorreactor.run()if not group is None: group.Free()