GTK+ app development: avahi service browsing and Gtk+ main loop problem



Hey folks,

I am creating an application in python and gtk+ 3 that uses avahi to
broadcast itself on the network. The program should publish itself on the
network but also discover other instances of it , like an avahi
client/server.

For the publishing and browsing of services on network i'm using
dbus.SystemBus() daemon.

The publishing of service works , after i'm getting an interface object and
adding the service, then it calls the Commit() method which does what i
want.

For the service discovering part, i have to use a main loop which will
asynchronously get the services that were published in the past and that
will be published later:

loop = DBusGMainLoop()
self.bus = dbus.SystemBus(mainloop=loop)

.... and then I run a main loop to discover network services:
gobject.MainLoop().run()

Now here is the problem I'm encountering, when I start my gtk program, this
also uses a main loop by calling: Gtk.main()  , which probably interfere
with the call from the avahi service. This gives the following error :
"""
RuntimeError: To make asynchronous calls, receive signals or export
objects, D-Bus connections must be attached to a main loop by passing
mainloop=... to the constructor or calling dbus.set_default_main_loop(...)
"""

How should I pass the GTK+ application's main loop to the avahi client so
they can both share it.
Here is a small example from the code:

*** AvahiDiscover.py ***
class ServiceDiscover:
def __init__(self, stype='_http._tcp'):
self.domain = ""
self.stype = stype
 def discover(self):
loop = DBusGMainLoop()
self.bus = dbus.SystemBus(mainloop=loop)
self.server = dbus.Interface( self.bus.get_object(avahi.DBUS_NAME,
'/'),'org.freedesktop.Avahi.Server')

self.sbrowser = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME,
self.server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,
self.stype, 'local', dbus.UInt32(0))), avahi.DBUS_INTERFACE_SERVICE_BROWSER)
 self.sbrowser.connect_to_signal("ItemNew", self.handler) # handler method
which print the services found
gobject.MainLoop().run()


*** MainWindow.py ***
class MainWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Geysigning")
 # create a notebook container
notebook = Gtk.Notebook()
# ......
self.add(notebook)
self.connect("delete-event", Gtk.main_quit)
 # setup service broadcast - this publishes the service on the network
service_publisher = ServicePublisher(name="GeysignService)
service_publisher.publish()

# setup service browsing
service_discover = ServiceDiscover(stype='_http._tcp')
service_discover.discover()

if __name__ == "__main__":
window = MainWindow()
window.show_all()

Gtk.main()


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]