- adv_setup->service_data = g_malloc0(sizeof(char) * (len - 1));
- memcpy(adv_setup->service_data, (ptr + 2), (len - 1));
- adv_setup->service_data_len = len - 1;
+ if (adv_setup->service_data == NULL) {
+ /* first service data */
+ adv_setup->service_data = g_malloc0(sizeof(char) * (len));
+ adv_setup->service_data[0] = len -1; /*length1 + service_data1*/
+ memcpy(adv_setup->service_data + 1, (ptr + 2), (len - 1));
+ adv_setup->service_data_len = len;
+ } else {
+ /* Next service data */
+ char *prev_service_data = adv_setup->service_data;
+ int prev_service_len = adv_setup->service_data_len;
+
+ /* create new memory */
+ adv_setup->service_data = g_malloc0(sizeof(char) * (len + prev_service_len));
+ memcpy(adv_setup->service_data, prev_service_data, prev_service_len);
+ adv_setup->service_data[prev_service_len] = len -1; /*length2 + service_data2*/
+ memcpy(adv_setup->service_data + prev_service_len + 1, (ptr + 2), (len - 1));
+
+ adv_setup->service_data_len = prev_service_len + len;
+
+ /* remove the existing memory */
+ g_free(prev_service_data);
+ }
+ BT_INFO("service data is packed:");
+ print_adv_data((unsigned char *)adv_setup->service_data, adv_setup->service_data_len);