|
-
- import dbus.service
- import gobject
- import dbus.mainloop.glib
-
- rr = None
-
- class reservation_t( dbus.service.Object ):
- def __init__( self, device_name, prio, override_cb=None ):
-
- self.dev_name = device_name
- self.prio = prio
- self.override_cb = override_cb
-
- self.bus = dbus.SessionBus()
-
- dbus.service.Object.__init__( self, None,
- "/org/freedesktop/ReserveDevice1/" + self.dev_name,
- dbus.service.BusName( "org.freedesktop.ReserveDevice1." + self.dev_name, bus=self.bus, allow_replacement=True, replace_existing=True, do_not_queue=True ) )
-
- @dbus.service.method( dbus_interface="org.freedesktop.ReserveDevice1", in_signature="i", out_signature="b" )
- def RequestRelease( self, prio ):
- if prio < self.prio:
- return False
-
- if self.override_cb:
- if self.override_cb( self.device_name ):
- self.connection.release_name( 'org.freedesktop.ReserveDevice1.' + self.dev_name )
- return True
-
- return False
-
-
- def unreserve (self):
- self.connection.release_name( 'org.freedesktop.ReserveDevice1.' + self.dev_name )
- rr.remove_from_connection()
-
-
- def reserve_dev( dev_name, prio, override_cb ):
- global rr
- try:
- session_bus = dbus.SessionBus()
- except Exception:
- return
-
- try:
- r_proxy = session_bus.get_object( "org.freedesktop.ReserveDevice1." + dev_name, "/org/freedesktop/ReserveDevice1/" + dev_name )
- r_iface = dbus.Interface( r_proxy, "org.freedesktop.ReserveDevice1" )
- except Exception:
- print "no other reservation exists. taking the name"
- rr = reservation_t( dev_name, prio, override_cb )
- return
-
- if not r_iface.RequestRelease( prio ):
- raise Exception
-
- rr = reservation_t( dev_name, prio, override_cb )
-
-
-
- dbus.mainloop.glib.threads_init()
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-
- def run_main():
- loop = gobject.MainLoop()
- loop.run()
-
|