1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
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()
|