summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/device-api.txt18
-rw-r--r--src/device.c47
2 files changed, 65 insertions, 0 deletions
diff --git a/doc/device-api.txt b/doc/device-api.txt
index 71abb294..104ec176 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 71bfea56..d85d41cd 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) },
{ }
};