diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-07 20:30:15 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-07 20:30:15 +0000 |
commit | fa6159b9a4d2e54d94d56e215474ea07155366a1 (patch) | |
tree | 275990fd17f00661d979bb762cb047d01d771a8f | |
parent | 6b1cc18f00d0dd894a5293de7fff7e85b1a00294 (diff) |
serial: added code to extract the channel
-rw-r--r-- | serial/manager.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/serial/manager.c b/serial/manager.c index 2fa8faba..0b35f6e6 100644 --- a/serial/manager.c +++ b/serial/manager.c @@ -35,6 +35,8 @@ #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> #include <bluetooth/hci_lib.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h> #include "dbus.h" #include "logging.h" @@ -107,7 +109,11 @@ static void record_reply(DBusPendingCall *call, void *data) { struct pending_connection *pc = data; DBusMessage *reply = dbus_pending_call_steal_reply(call); + sdp_record_t *rec; + const uint8_t *rec_bin; + sdp_list_t *protos; DBusError derr; + int len, scanned, ch; dbus_error_init(&derr); if (dbus_set_error_from_message(&derr, reply)) { @@ -122,7 +128,45 @@ static void record_reply(DBusPendingCall *call, void *data) goto fail; } - /* FIXME: extract the record */ + if (!dbus_message_get_args(reply, &derr, + DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len, + DBUS_TYPE_INVALID)) { + err_not_supported(pc->conn, pc->msg); + error("%s: %s", derr.name, derr.message); + goto fail; + } + + if (len == 0) { + err_not_supported(pc->conn, pc->msg); + error("Invalid service record length"); + goto fail; + } + + rec = sdp_extract_pdu(rec_bin, &scanned); + if (!rec) { + error("Can't extract SDP record."); + err_not_supported(pc->conn, pc->msg); + goto fail; + } + + if (len != scanned || (sdp_get_access_protos(rec, &protos) < 0)) { + sdp_record_free(rec); + err_not_supported(pc->conn, pc->msg); + goto fail; + } + + ch = sdp_get_proto_port(protos, RFCOMM_UUID); + sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL); + sdp_list_free(protos, NULL); + + if (ch < 1 || ch > 30) { + error("Channel out of range: %d", ch); + sdp_record_free(rec); + err_not_supported(pc->conn, pc->msg); + } + + /* FIXME: Check if there is a pending connection */ + fail: dbus_message_unref(reply); dbus_error_free(&derr); |