• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2
3import gobject
4
5import sys
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9
10class Rejected(dbus.DBusException):
11	_dbus_error_name = "org.bluez.Error.Rejected"
12
13class Agent(dbus.service.Object):
14	exit_on_release = True
15
16	def set_exit_on_release(self, exit_on_release):
17		self.exit_on_release = exit_on_release
18
19	@dbus.service.method("org.bluez.Agent",
20					in_signature="", out_signature="")
21	def Release(self):
22		print "Release"
23		if self.exit_on_release:
24			mainloop.quit()
25
26	@dbus.service.method("org.bluez.Agent",
27					in_signature="os", out_signature="")
28	def Authorize(self, device, uuid):
29		print "Authorize (%s, %s)" % (device, uuid)
30		authorize = raw_input("Authorize connection (yes/no): ")
31		if (authorize == "yes"):
32			return
33		raise Rejected("Connection rejected by user")
34
35	@dbus.service.method("org.bluez.Agent",
36					in_signature="o", out_signature="s")
37	def RequestPinCode(self, device):
38		print "RequestPinCode (%s)" % (device)
39		return raw_input("Enter PIN Code: ")
40
41	@dbus.service.method("org.bluez.Agent",
42					in_signature="o", out_signature="u")
43	def RequestPasskey(self, device):
44		print "RequestPasskey (%s)" % (device)
45		passkey = raw_input("Enter passkey: ")
46		return dbus.UInt32(passkey)
47
48	@dbus.service.method("org.bluez.Agent",
49					in_signature="ou", out_signature="")
50	def DisplayPasskey(self, device, passkey):
51		print "DisplayPasskey (%s, %d)" % (device, passkey)
52
53	@dbus.service.method("org.bluez.Agent",
54					in_signature="ou", out_signature="")
55	def RequestConfirmation(self, device, passkey):
56		print "RequestConfirmation (%s, %d)" % (device, passkey)
57		confirm = raw_input("Confirm passkey (yes/no): ")
58		if (confirm == "yes"):
59			return
60		raise Rejected("Passkey doesn't match")
61
62	@dbus.service.method("org.bluez.Agent",
63					in_signature="s", out_signature="")
64	def ConfirmModeChange(self, mode):
65		print "ConfirmModeChange (%s)" % (mode)
66
67	@dbus.service.method("org.bluez.Agent",
68					in_signature="", out_signature="")
69	def Cancel(self):
70		print "Cancel"
71
72def create_device_reply(device):
73	print "New device (%s)" % (device)
74	mainloop.quit()
75
76def create_device_error(error):
77	print "Creating device failed: %s" % (error)
78	mainloop.quit()
79
80if __name__ == '__main__':
81	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
82
83	bus = dbus.SystemBus()
84	manager = dbus.Interface(bus.get_object("org.bluez", "/"),
85							"org.bluez.Manager")
86
87	if len(sys.argv) > 1:
88		path = manager.FindAdapter(sys.argv[1])
89	else:
90		path = manager.DefaultAdapter()
91
92	adapter = dbus.Interface(bus.get_object("org.bluez", path),
93							"org.bluez.Adapter")
94
95	path = "/test/agent"
96	agent = Agent(bus, path)
97
98	mainloop = gobject.MainLoop()
99
100	if len(sys.argv) > 2:
101		if len(sys.argv) > 3:
102			device = adapter.FindDevice(sys.argv[2])
103			adapter.RemoveDevice(device)
104
105		agent.set_exit_on_release(False)
106		adapter.CreatePairedDevice(sys.argv[2], path, "DisplayYesNo",
107					reply_handler=create_device_reply,
108					error_handler=create_device_error)
109	else:
110		adapter.RegisterAgent(path, "DisplayYesNo")
111		print "Agent registered"
112
113	mainloop.run()
114
115	#adapter.UnregisterAgent(path)
116	#print "Agent unregistered"
117