Add GetServiceAttribute function.
This is needed for the headset profile.
Change-Id: I6668c28cf27512262d585cdeeadd6c0b69c5edd9
diff --git a/src/device.c b/src/device.c
index 4ffc124..ff4231c 100644
--- a/src/device.c
+++ b/src/device.c
@@ -769,6 +769,74 @@
return NULL;
}
+static DBusMessage *get_service_attribute_value_reply(DBusMessage *msg, DBusConnection *conn,
+ sdp_data_t *attr)
+{
+ DBusMessage *reply;
+ DBusMessageIter iter;
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return;
+ sdp_data_t *curr;
+ sdp_list_t *ap = 0;
+ for (; attr; attr = attr->next) {
+ sdp_list_t *pds = 0;
+ for (curr = attr->val.dataseq; curr; curr = curr->next)
+ pds = sdp_list_append(pds, curr->val.dataseq);
+ ap = sdp_list_append(ap, pds);
+ }
+
+ int ch = sdp_get_proto_port(ap, RFCOMM_UUID);
+ sdp_list_foreach(ap, (sdp_list_func_t) sdp_list_free, NULL);
+ sdp_list_free(ap, NULL);
+ ap = NULL;
+
+ dbus_message_append_args(reply, DBUS_TYPE_INT32, &ch, DBUS_TYPE_INVALID);
+
+ return reply;
+}
+
+static DBusMessage *get_service_attribute_value(DBusConnection *conn,
+ DBusMessage *msg,
+ void *user_data)
+{
+ struct btd_device *device = user_data;
+ const sdp_record_t *rec;
+ sdp_data_t *attr_data;
+ const char *pattern;
+ uint16_t attrId;
+ int err;
+
+ if (device->browse)
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
+ "Discover in progress");
+ if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern,
+ DBUS_TYPE_UINT16, &attrId,
+ DBUS_TYPE_INVALID) == FALSE)
+ goto fail;
+
+ if (strlen(pattern) == 0)
+ return btd_error_invalid_args(msg);
+
+ rec = btd_device_get_record(device, pattern);
+ if (rec == NULL) {
+ error("rec is NULL");
+ goto fail;
+ }
+
+ attr_data = sdp_data_get(rec, attrId);
+
+ if (attr_data == NULL) {
+ error("attr in null");
+ goto fail;
+ }
+ return get_service_attribute_value_reply(msg, conn, attr_data);
+fail:
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
+ "GetServiceAttribute Failed");
+}
+
static GDBusMethodTable device_methods[] = {
{ "GetProperties", "", "a{sv}", get_properties },
{ "SetProperty", "sv", "", set_property },
@@ -777,6 +845,7 @@
{ "CancelDiscovery", "", "", cancel_discover },
{ "Disconnect", "", "", disconnect,
G_DBUS_METHOD_FLAG_ASYNC},
+ { "GetServiceAttributeValue", "sq", "i", get_service_attribute_value},
{ }
};