summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2006-04-09 09:00:55 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2006-04-09 09:00:55 +0000
commit99ab0e609a4590d0027ae42d95ed1ca0b6c2e86f (patch)
tree475763f0a838cac5708503c17117075f6d7a67c2
parente0d05942e436393256b61f111d5924add57840c7 (diff)
Use slist for device classes
-rw-r--r--hcid/dbus-adapter.c47
-rw-r--r--hcid/dbus.c18
-rw-r--r--hcid/dbus.h2
3 files changed, 23 insertions, 44 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index 106c6152..3de4b9b1 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -1153,14 +1153,18 @@ static DBusHandlerResult handle_dev_get_remote_minor_class_req(DBusConnection *c
return send_reply_and_unref(conn, reply);
}
+static void append_class_string(const char *class, DBusMessageIter *iter)
+{
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &class);
+}
+
static DBusHandlerResult handle_dev_get_remote_service_cls_req(DBusConnection *conn,
DBusMessage *msg,
void *data)
{
DBusMessage *reply;
DBusMessageIter iter, array_iter;
- const char **service_classes;
- int i;
+ struct slist *service_classes;
uint32_t class;
if (get_remote_class(conn, msg, data, &class) < 0)
@@ -1171,21 +1175,16 @@ static DBusHandlerResult handle_dev_get_remote_service_cls_req(DBusConnection *c
return DBUS_HANDLER_RESULT_NEED_MEMORY;
service_classes = service_classes_str(class);
- if (!service_classes) {
- error("Unable to create service classes list");
- return error_failed(conn,msg, ENOMEM);
- }
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array_iter);
- for (i = 0; service_classes[i] != NULL; i++)
- dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &service_classes[i]);
+ slist_foreach(service_classes, (slist_func_t)append_class_string, &array_iter);
dbus_message_iter_close_container(&iter, &array_iter);
- free(service_classes);
+ slist_free(service_classes);
return send_reply_and_unref(conn, reply);
}
@@ -2194,40 +2193,20 @@ const char *minor_class_str(uint32_t class)
return "";
}
-/* Return NULL terminated array of strings */
-const char **service_classes_str(uint32_t class)
+struct slist *service_classes_str(uint32_t class)
{
uint8_t services = class >> 16;
- const char **classes;
- int i, class_count = 0;
-
- classes = malloc(sizeof(const char *));
- if (!classes)
- return NULL;
-
- classes[0] = NULL;
+ struct slist *l = NULL;
+ int i;
for (i = 0; i < (sizeof(service_cls) / sizeof(*service_cls)); i++) {
- const char **tmp;
-
if (!(services & (1 << i)))
continue;
- class_count++;
-
- tmp = realloc(classes, sizeof(const char *) * (class_count + 1));
- if (!tmp) {
- free(classes);
- return NULL;
- }
-
- classes = tmp;
-
- classes[class_count - 1] = service_cls[i];
- classes[class_count] = NULL;
+ l = slist_append(l, (void *)service_cls[i]);
}
- return classes;
+ return l;
}
diff --git a/hcid/dbus.c b/hcid/dbus.c
index a74b0309..3fed5397 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -902,6 +902,11 @@ failed:
bt_free(local_addr);
}
+static void append_class_string(const char *class, DBusMessageIter *iter)
+{
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &class);
+}
+
void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi)
{
char filename[PATH_MAX + 1];
@@ -915,10 +920,10 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i
struct discovered_dev_info *dev;
char *local_addr, *peer_addr, *name = NULL;
const char *major_ptr, *minor_ptr;
- const char **service_classes;
+ struct slist *service_classes;
const dbus_int16_t tmp_rssi = rssi;
bdaddr_t tmp;
- int id, i;
+ int id;
name_status_t name_status = NAME_PENDING;
baswap(&tmp, local); local_addr = batostr(&tmp);
@@ -957,21 +962,16 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor_ptr);
service_classes = service_classes_str(class);
- if (!service_classes) {
- error("Unable to create service class strings");
- goto failed;
- }
/* add the service classes */
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array_iter);
- for (i = 0; service_classes[i] != NULL; i++)
- dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &service_classes[i]);
+ slist_foreach(l, (slist_func_t)append_class_string, &array_iter);
dbus_message_iter_close_container(&iter, &array_iter);
- free(service_classes);
+ slist_free(service_classes);
if (dbus_connection_send(connection, signal_device, NULL) == FALSE) {
error("Can't send D-Bus remote device found signal");
diff --git a/hcid/dbus.h b/hcid/dbus.h
index 663394b6..5ae2b7b8 100644
--- a/hcid/dbus.h
+++ b/hcid/dbus.h
@@ -131,7 +131,7 @@ DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void
const char *major_class_str(uint32_t class);
const char *minor_class_str(uint32_t class);
-const char **service_classes_str(uint32_t class);
+struct slist *service_classes_str(uint32_t class);
DBusHandlerResult bluez_new_failure_msg(DBusConnection *conn, DBusMessage *msg, const uint32_t ecode);