diff --git a/src/shared/ad.c b/src/shared/ad.c
index 1bf013d..aca4e23 100644
--- a/src/shared/ad.c
+++ b/src/shared/ad.c
struct bt_ad {
int ref_count;
+ char *name;
struct queue *service_uuids;
struct queue *manufacturer_data;
struct queue *solicit_uuids;
queue_destroy(ad->service_data, uuid_destroy);
+ free(ad->name);
+
free(ad);
}
return length;
}
+static size_t name_length(const char *name, size_t *pos)
+{
+ size_t len;
+
+ if (!name)
+ return 0;
+
+ len = 2 + strlen(name);
+
+ if (len > MAX_ADV_DATA_LEN - *pos)
+ len = MAX_ADV_DATA_LEN - *pos;
+
+ return len;
+}
+
static size_t calculate_length(struct bt_ad *ad)
{
size_t length = 0;
length += uuid_data_length(ad->service_data);
+ length += name_length(ad->name, &length);
+
return length;
}
}
}
+static void serialize_name(const char *name, uint8_t *buf, uint8_t *pos)
+{
+ int len;
+ uint8_t type = EIR_NAME_COMPLETE;
+
+ if (!name)
+ return;
+
+ len = strlen(name);
+ if (len > MAX_ADV_DATA_LEN - (*pos + 2)) {
+ type = EIR_NAME_SHORT;
+ len = MAX_ADV_DATA_LEN - (*pos + 2);
+ }
+
+ buf[(*pos)++] = len + 1;
+ buf[(*pos)++] = type;
+
+ memcpy(buf + *pos, name, len);
+ *pos += len;
+}
+
uint8_t *bt_ad_generate(struct bt_ad *ad, size_t *length)
{
uint8_t *adv_data;
serialize_service_data(ad->service_data, adv_data, &pos);
+ serialize_name(ad->name, adv_data, &pos);
+
return adv_data;
}
queue_remove_all(ad->service_data, NULL, NULL, uuid_destroy);
}
+
+bool bt_ad_add_name(struct bt_ad *ad, const char *name)
+{
+ if (!ad)
+ return false;
+
+ free(ad->name);
+
+ ad->name = strdup(name);
+
+ return true;
+}
+
+void bt_ad_clear_name(struct bt_ad *ad)
+{
+ if (!ad)
+ return;
+
+ free(ad->name);
+ ad->name = NULL;
+}
diff --git a/src/shared/ad.h b/src/shared/ad.h
index 709563d..161602d 100644
--- a/src/shared/ad.h
+++ b/src/shared/ad.h
bool bt_ad_remove_service_data(struct bt_ad *ad, bt_uuid_t *uuid);
void bt_ad_clear_service_data(struct bt_ad *ad);
+
+bool bt_ad_add_name(struct bt_ad *ad, const char *name);
+
+void bt_ad_clear_name(struct bt_ad *ad);