Diff between e90b16a04d6f23742fcad105cb29cf75218d617d and 7dae3e94c9e0349a2d4508a0013655d6cbb78f36

Changed Files

File Additions Deletions Status
doc/device-api.txt +18 -0 modified
src/device.c +47 -0 modified

Full Patch

diff --git a/doc/device-api.txt b/doc/device-api.txt
index 71abb29..104ec17 100644
--- a/doc/device-api.txt
+++ b/doc/device-api.txt
@@ -106,6 +106,24 @@ Methods		dict GetProperties()
 			Possible errors: org.bluez.Error.DoesNotExist
 					 org.bluez.Error.NotConnected
 
+		void Pair(object agent, string capability)
+
+			This method will connect to the remote device,
+			initiate pairing and then retrieve all SDP records
+			(or GATT primary services).
+
+			The agent object path is assumed to reside within the
+			process (D-Bus connection instance) that calls this
+			method. No separate registration procedure is needed
+			for it and it gets automatically released once the
+			pairing operation is complete.
+
+			The capability parameter is the same as for the
+			Adapter.RegisterAgent method.
+
+			Possible errors: org.bluez.Error.InvalidArguments
+					 org.bluez.Error.Failed
+
 Signals		PropertyChanged(string name, variant value)
 
 			This signal indicates a changed value of the given
diff --git a/src/device.c b/src/device.c
index 71bfea5..d85d41c 100644
--- a/src/device.c
+++ b/src/device.c
@@ -66,6 +66,13 @@
 #include "attrib-server.h"
 #include "attrib/client.h"
 
+#define IO_CAPABILITY_DISPLAYONLY	0x00
+#define IO_CAPABILITY_DISPLAYYESNO	0x01
+#define IO_CAPABILITY_KEYBOARDONLY	0x02
+#define IO_CAPABILITY_NOINPUTNOOUTPUT	0x03
+#define IO_CAPABILITY_KEYBOARDDISPLAY	0x04
+#define IO_CAPABILITY_INVALID		0xFF
+
 #define DISCONNECT_TIMER	2
 #define DISCOVERY_TIMER		2
 
@@ -1187,6 +1194,43 @@ static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg,
 	return NULL;
 }
 
+static uint8_t parse_io_capability(const char *capability)
+{
+	if (g_str_equal(capability, ""))
+		return IO_CAPABILITY_DISPLAYYESNO;
+	if (g_str_equal(capability, "DisplayOnly"))
+		return IO_CAPABILITY_DISPLAYONLY;
+	if (g_str_equal(capability, "DisplayYesNo"))
+		return IO_CAPABILITY_DISPLAYYESNO;
+	if (g_str_equal(capability, "KeyboardOnly"))
+		return IO_CAPABILITY_KEYBOARDONLY;
+	if (g_str_equal(capability, "NoInputNoOutput"))
+		return IO_CAPABILITY_NOINPUTNOOUTPUT;
+	if (g_str_equal(capability, "KeyboardDisplay"))
+		return IO_CAPABILITY_KEYBOARDDISPLAY;
+	return IO_CAPABILITY_INVALID;
+}
+
+static DBusMessage *pair_device(DBusConnection *conn, DBusMessage *msg,
+								void *data)
+{
+	struct btd_device *device = data;
+	const char *agent_path, *capability;
+	uint8_t io_cap;
+
+	if (!dbus_message_get_args(msg, NULL,
+					DBUS_TYPE_OBJECT_PATH, &agent_path,
+					DBUS_TYPE_STRING, &capability,
+					DBUS_TYPE_INVALID))
+		return btd_error_invalid_args(msg);
+
+	io_cap = parse_io_capability(capability);
+	if (io_cap == IO_CAPABILITY_INVALID)
+		return btd_error_invalid_args(msg);
+
+	return device_create_bonding(device, msg, agent_path, io_cap);
+}
+
 static const GDBusMethodTable device_methods[] = {
 	{ GDBUS_ASYNC_METHOD("DiscoverServices",
 			GDBUS_ARGS({ "pattern", "s" }),
@@ -1195,6 +1239,9 @@ static const GDBusMethodTable device_methods[] = {
 	{ GDBUS_METHOD("CancelDiscovery", NULL, NULL, cancel_discover) },
 	{ GDBUS_ASYNC_METHOD("Disconnect", NULL, NULL, disconnect) },
 	{ GDBUS_ASYNC_METHOD("Connect", NULL, NULL, dev_connect) },
+	{ GDBUS_ASYNC_METHOD("Pair",
+			GDBUS_ARGS({ "agent", "o" }, { "capability", "s" }),
+			NULL, pair_device) },
 	{ }
 };