Skip to content

Commit e0ed780

Browse files
authored
Merge pull request #209 from thoradia/agents
bluetooth.py: migrate agents to ravel
2 parents 248e787 + 345c0c6 commit e0ed780

File tree

6 files changed

+320
-306
lines changed

6 files changed

+320
-306
lines changed

resources/lib/dbus_bluez.py

Lines changed: 98 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,104 @@
33

44
import dbus_utils
55
import dbussy
6+
import ravel
67

78
BUS_NAME = 'org.bluez'
9+
ERROR_REJECTED = 'org.bluez.Error.Rejected'
810
INTERFACE_ADAPTER = 'org.bluez.Adapter1'
11+
INTERFACE_AGENT = 'org.bluez.Agent1'
12+
INTERFACE_AGENT_MANAGER = 'org.bluez.AgentManager1'
913
INTERFACE_DEVICE = 'org.bluez.Device1'
14+
PATH_BLUEZ = '/org/bluez'
15+
PATH_AGENT = '/kodi/agent/bluez'
16+
17+
18+
@ravel.interface(ravel.INTERFACE.SERVER, name=INTERFACE_AGENT)
19+
class Agent(dbus_utils.Agent):
20+
21+
def __init__(self):
22+
super().__init__(BUS_NAME, PATH_AGENT)
23+
24+
def manager_register_agent(self):
25+
dbus_utils.call_method(BUS_NAME, PATH_BLUEZ, INTERFACE_AGENT_MANAGER,
26+
'RegisterAgent', PATH_AGENT, 'KeyboardDisplay')
27+
28+
@ravel.method(
29+
in_signature='os',
30+
out_signature='',
31+
arg_keys=['device', 'uuid']
32+
)
33+
def AuthorizeService(self, device, uuid):
34+
self.authorize_service(device, uuid)
35+
36+
@ravel.method(
37+
in_signature='',
38+
out_signature=''
39+
)
40+
def Cancel(self):
41+
self.cancel()
42+
43+
@ravel.method(
44+
in_signature='ouq',
45+
out_signature='',
46+
arg_keys=['device', 'passkey', 'entered']
47+
)
48+
def DisplayPasskey(self, device, passkey, entered):
49+
self.display_passkey(device, passkey, entered)
50+
51+
@ravel.method(
52+
in_signature='os',
53+
out_signature='',
54+
arg_keys=['device', 'pincode']
55+
)
56+
def DisplayPinCode(self, device, pincode):
57+
self.display_pincode(device, pincode)
58+
59+
@ravel.method(
60+
in_signature='',
61+
out_signature=''
62+
)
63+
def Release(self):
64+
raise NotImplementedError
65+
66+
@ravel.method(
67+
in_signature='o',
68+
out_signature='',
69+
arg_keys=['device']
70+
)
71+
def RequestAuthorization(self, device):
72+
self.request_authorization(device)
73+
74+
@ravel.method(
75+
in_signature='ou',
76+
out_signature='',
77+
arg_keys=['device', 'passkey']
78+
)
79+
def RequestConfirmation(self, device, passkey):
80+
self.request_confirmation(device, passkey)
81+
82+
@ravel.method(
83+
in_signature='o',
84+
out_signature='u',
85+
arg_keys=['device'],
86+
result_keyword='reply'
87+
)
88+
def RequestPasskey(self, device):
89+
passkey = self.request_passkey(device)
90+
reply[0] = (dbus.Signature('u'), passkey)
91+
92+
@ravel.method(
93+
in_signature='o',
94+
out_signature='s',
95+
arg_keys=['device'],
96+
result_keyword='reply'
97+
)
98+
def RequestPinCode(self, device, reply):
99+
pincode = self.request_pincode(device)
100+
reply[0] = (dbus.Signature('s'), pincode)
101+
102+
def reject(self, message):
103+
raise dbus.DBusError(ERROR_REJECTED, message)
10104

11105

12106
def get_managed_objects():
@@ -54,15 +148,15 @@ def device_get_connected(path):
54148

55149

56150
def device_connect(path):
57-
return dbus_utils.call_method(BUS_NAME, path, INTERFACE_DEVICE, 'Connect')
151+
return dbus_utils.run_method(BUS_NAME, path, INTERFACE_DEVICE, 'Connect')
58152

59153

60154
def device_disconnect(path):
61155
return dbus_utils.call_method(BUS_NAME, path, INTERFACE_DEVICE, 'Disconnect')
62156

63157

64158
def device_pair(path):
65-
return dbus_utils.call_method(BUS_NAME, path, INTERFACE_DEVICE, 'Pair')
159+
return dbus_utils.run_method(BUS_NAME, path, INTERFACE_DEVICE, 'Pair')
66160

67161

68162
def device_set_property(path, name, value):
@@ -73,10 +167,6 @@ def device_set_trusted(path, trusted):
73167
return device_set_property(path, 'Trusted', (dbussy.DBUS.Signature('b'), trusted))
74168

75169

76-
def system_has_bluez():
77-
return BUS_NAME in dbus_utils.list_names()
78-
79-
80170
def find_adapter():
81171
if system_has_bluez():
82172
objects = get_managed_objects()
@@ -94,9 +184,5 @@ def find_devices():
94184
return devices
95185

96186

97-
if __name__ == '__main__':
98-
import pprint
99-
path = find_adapter()
100-
pprint.pprint(path)
101-
property = adapter_get_property(path, 'Alias')
102-
pprint.pprint(property)
187+
def system_has_bluez():
188+
return BUS_NAME in dbus_utils.list_names()

resources/lib/dbus_connman.py

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,54 +15,49 @@
1515
INTERFACE_TECHNOLOGY = 'net.connman.Technology'
1616
PATH_TECH_ETHERNET = '/net/connman/technology/ethernet'
1717
PATH_TECH_WIFI = '/net/connman/technology/wifi'
18-
PATH_AGENT = '/kodi/agent'
18+
PATH_AGENT = '/kodi/agent/connman'
1919

2020

2121
@ravel.interface(ravel.INTERFACE.SERVER, name=INTERFACE_AGENT)
22-
class Agent(object):
22+
class Agent(dbus_utils.Agent):
2323

24-
agent = None
24+
@log.log_function(log.INFO)
25+
def __init__(self):
26+
super().__init__(BUS_NAME, PATH_AGENT)
2527

26-
@classmethod
27-
def register_agent(cls):
28-
if cls.agent is not None:
29-
raise RuntimeError('An agent is already registered')
30-
cls.agent = cls()
31-
dbus_utils.BUS.request_name(
32-
BUS_NAME, flags=dbussy.DBUS.NAME_FLAG_DO_NOT_QUEUE)
33-
dbus_utils.BUS.register(
34-
path=PATH_AGENT, interface=cls.agent, fallback=True)
35-
return cls.agent
28+
def manager_register_agent(self):
29+
dbus_utils.call_method(
30+
BUS_NAME, '/', INTERFACE_MANAGER, 'RegisterAgent', PATH_AGENT)
3631

3732
@ravel.method(
3833
in_signature='',
3934
out_signature=''
4035
)
4136
def Cancel(self):
42-
raise NotImplementedError
37+
self.cancel()
38+
39+
def cancel(self):
40+
pass
4341

4442
@ravel.method(
4543
in_signature='',
4644
out_signature=''
4745
)
4846
def Release(self):
49-
raise NotImplementedError
47+
pass
5048

5149
@ravel.method(
5250
in_signature='os',
5351
out_signature='',
54-
arg_keys=['path', 'error'],
52+
arg_keys=['path', 'error']
5553
)
5654
async def ReportError(self, path, error):
5755
self.report_error(path, error)
5856

59-
def report_error(self, path, error):
60-
pass
61-
6257
@ravel.method(
6358
in_signature='os',
6459
out_signature='',
65-
arg_keys=['service', 'url'],
60+
arg_keys=['service', 'url']
6661
)
6762
def RequestBrowser(self, path, url):
6863
raise NotImplementedError
@@ -71,7 +66,7 @@ def RequestBrowser(self, path, url):
7166
in_signature='oa{sv}',
7267
out_signature='a{sv}',
7368
args_keyword='request',
74-
result_keyword='reply',
69+
result_keyword='reply'
7570
)
7671
async def RequestInput(self, request, reply):
7772
request = dbus_utils.convert_from_dbussy(request)
@@ -80,33 +75,33 @@ async def RequestInput(self, request, reply):
8075
for (k, v) in input.items()}
8176
reply[0] = input
8277

83-
def request_input(self, request):
84-
pass
78+
def agent_abort(self):
79+
raise ravel.ErrorReturn(ERROR_AGENT_CANCELLED, 'Input cancelled')
8580

8681

8782
class Listener(object):
8883

89-
def listen(self):
84+
def __init__(self):
9085
dbus_utils.BUS.listen_signal(
91-
interface='net.connman.Manager',
86+
interface=INTERFACE_MANAGER,
9287
fallback=True,
9388
func=self._on_property_changed,
9489
path='/',
9590
name='PropertyChanged')
9691
dbus_utils.BUS.listen_signal(
97-
interface='net.connman.Service',
92+
interface=INTERFACE_MANAGER,
9893
fallback=True,
99-
func=self._on_property_changed,
94+
func=self._on_services_changed,
10095
path='/',
101-
name='PropertyChanged')
96+
name='ServicesChanged')
10297
dbus_utils.BUS.listen_signal(
103-
interface='net.connman.Manager',
98+
interface=INTERFACE_SERVICE,
10499
fallback=True,
105-
func=self._on_services_changed,
100+
func=self._on_property_changed,
106101
path='/',
107-
name='ServicesChanged')
102+
name='PropertyChanged')
108103
dbus_utils.BUS.listen_signal(
109-
interface='net.connman.Technology',
104+
interface=INTERFACE_TECHNOLOGY,
110105
fallback=True,
111106
func=self._on_technology_changed,
112107
path='/',
@@ -129,10 +124,6 @@ async def _on_technology_changed(self, name, value, path):
129124
await self.on_technology_changed(name, value, path)
130125

131126

132-
def agent_abort():
133-
raise ravel.ErrorReturn(ERROR_AGENT_CANCELLED, 'Input cancelled')
134-
135-
136127
def clock_get_properties():
137128
return dbus_utils.call_method(BUS_NAME, '/', INTERFACE_CLOCK, 'GetProperties')
138129

@@ -153,14 +144,6 @@ def manager_get_technologies():
153144
return dbus_utils.call_method(BUS_NAME, '/', INTERFACE_MANAGER, 'GetTechnologies')
154145

155146

156-
def manager_register_agent():
157-
return dbus_utils.call_method(BUS_NAME, '/', INTERFACE_MANAGER, 'RegisterAgent', PATH_AGENT)
158-
159-
160-
def manager_unregister_agent():
161-
return dbus_utils.call_method(BUS_NAME, '/', INTERFACE_MANAGER, 'UnregisterAgent', PATH_AGENT)
162-
163-
164147
def service_connect(path):
165148
return dbus_utils.run_method(BUS_NAME, path, INTERFACE_SERVICE, 'Connect')
166149

resources/lib/dbus_obex.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import dbus_utils
2+
import dbussy
3+
import ravel
4+
5+
BUS_NAME = 'org.bluez.obex'
6+
ERROR_REJECTED = 'org.bluez.Error.Rejected'
7+
INTERFACE_AGENT = 'org.bluez.obex.Agent1'
8+
INTERFACE_AGENT_MANAGER = 'org.bluez.obex.AgentManager1'
9+
PATH_OBEX = '/org/bluez/obex'
10+
PATH_AGENT = '/kodi/agent/obex'
11+
12+
13+
@ravel.interface(ravel.INTERFACE.SERVER, name=INTERFACE_AGENT)
14+
class Agent(dbus_utils.Agent):
15+
16+
def __init__(self):
17+
super().__init__(BUS_NAME, PATH_AGENT)
18+
19+
def manager_register_agent(self):
20+
dbus_utils.call_method(
21+
BUS_NAME, PATH_OBEX, INTERFACE_AGENT_MANAGER, 'RegisterAgent', PATH_AGENT)
22+
23+
@ravel.method(
24+
in_signature='',
25+
out_signature=''
26+
)
27+
def Release(self):
28+
pass
29+
30+
@ravel.method(
31+
in_signature='o',
32+
out_signature='s',
33+
arg_keys=['path'],
34+
result_keyword='reply'
35+
)
36+
def AuthorizePush(self, path):
37+
name = self.authorize_push(path)
38+
reply[0] = (dbus.Signature('s'), name)
39+
40+
@ravel.method(
41+
in_signature='',
42+
out_signature=''
43+
)
44+
def Cancel(self):
45+
pass
46+
47+
def reject(self, message):
48+
raise dbus.DBusError(ERROR_REJECTED, message)

0 commit comments

Comments
 (0)