import dbus from .engine import Engine from .dbustools import remote_call _DBUS_SERVICE = "org.tutorius.Service" _DBUS_PATH = "/org/tutorius/Service" _DBUS_SERVICE_IFACE = "org.tutorius.Service" class Service(dbus.service.Object): """ Global tutorius entry point to control the whole system """ def __init__(self): bus = dbus.SessionBus() bus_name = dbus.service.BusName(_DBUS_SERVICE, bus=bus) dbus.service.Object.__init__(self, bus_name, _DBUS_PATH) self._engine = None def start(self): """ Start the service itself """ # For the moment there is nothing to do pass @dbus.service.method(_DBUS_SERVICE_IFACE, in_signature="s", out_signature="") def launch(self, tutorialID): """ Launch a tutorial @param tutorialID unique tutorial identifier used to retrieve it from the disk """ if self._engine == None: self._engine = Engine() self._engine.launch(tutorialID) @dbus.service.method(_DBUS_SERVICE_IFACE, in_signature="", out_signature="") def stop(self): """ Stop the current tutorial """ self._engine.stop() @dbus.service.method(_DBUS_SERVICE_IFACE, in_signature="", out_signature="") def pause(self): """ Interrupt the current tutorial and save its state in the journal """ self._engine.pause() class ServiceProxy: """ Proxy to connect to the Service object, abstracting the DBus interface""" def __init__(self): bus = dbus.SessionBus() self._object = bus.get_object(_DBUS_SERVICE,_DBUS_PATH) self._service = dbus.Interface(self._object, _DBUS_SERVICE_IFACE) def launch(self, tutorialID): """ Launch a tutorial @param tutorialID unique tutorial identifier used to retrieve it from the disk """ remote_call(self._service.launch, (tutorialID, ), block=False) def stop(self): """ Stop the current tutorial """ remote_call(self._service.stop, (), block=False) def pause(self): """ Interrupt the current tutorial and save its state in the journal """ remote_call(self._service.pause, (), block=False) if __name__ == "__main__": import dbus.mainloop.glib import gobject loop = gobject.MainLoop() dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) s = Service() loop.run()