* mime_properties is a bitmask and should reflect the fields found in
* the incoming oob.
*/
-int __near_bluetooth_parse_oob_record(uint8_t version, uint8_t *bt_data,
+int __near_bluetooth_parse_oob_record(struct bt_data *data,
uint16_t *mime_properties, near_bool_t pair)
{
struct near_oob_data *oob;
uint16_t bt_oob_data_size;
- uint8_t *ptr = bt_data;
+ uint8_t *ptr = data->data;
uint8_t marker;
char *tmp;
oob = g_try_malloc0(sizeof(struct near_oob_data));
- if (version == BT_MIME_V2_1) {
+ if (data->type == BT_MIME_V2_1) {
/*
* Total OOB data size (including size bytes)
* Some implementations (e.g. Android 4.1) stores
* byte (and the payload size IS the oob data size).
*/
bt_oob_data_size =
- GUINT16_FROM_LE(get_unaligned((uint16_t *) bt_data));
+ GUINT16_FROM_LE(get_unaligned((uint16_t *) ptr));
if (bt_oob_data_size > 0xFF) /* Big Endian */
bt_oob_data_size = GUINT16_FROM_BE(bt_oob_data_size);
bt_oob_data_size -= 2 ; /* remove oob datas size len */
/* First item: BD_ADDR (mandatory) */
- ptr = &bt_data[2];
+ ptr = &data->data[2];
oob->bd_addr = g_strdup_printf("%02X:%02X:%02X:%02X:%02X:%02X",
ptr[5], ptr[4], ptr[3], ptr[2], ptr[1], ptr[0]);
if (bt_oob_data_size)
bt_parse_eir(ptr, bt_oob_data_size, oob,
mime_properties);
- } else if (version == BT_MIME_V2_0) {
+ } else if (data->type == BT_MIME_V2_0) {
marker = *ptr++; /* could be '$' */
oob->bd_addr = g_strdup_printf(
{
struct near_ndef_mime_payload *mime = NULL;
int err = 0;
+ struct bt_data data;
DBG("");
+ memset(&data, 0, sizeof(data));
+
if ((ndef_data == NULL) || ((offset + payload_length) > ndef_length))
return NULL;
DBG("MIME Type '%s' action: %d", mime->type, action);
if (strcmp(mime->type, BT_MIME_STRING_2_1) == 0) {
mime->handover.carrier_type = NEAR_CARRIER_BLUETOOTH;
- err = __near_bluetooth_parse_oob_record(BT_MIME_V2_1,
- &ndef_data[offset], &mime->handover.properties,
- action);
+ data.type = BT_MIME_V2_1;
+ data.size = record->header->payload_len;
+ memcpy(data.data, ndef_data + offset, data.size);
} else if (strcmp(mime->type, BT_MIME_STRING_2_0) == 0) {
mime->handover.carrier_type = NEAR_CARRIER_BLUETOOTH;
- err = __near_bluetooth_parse_oob_record(BT_MIME_V2_0,
- &ndef_data[offset], &mime->handover.properties,
- action);
+ data.type = BT_MIME_V2_0;
+ data.size = record->header->payload_len;
+ memcpy(data.data, ndef_data + offset, data.size);
}
+ if (data.size > 0)
+ err = __near_bluetooth_parse_oob_record(&data,
+ &mime->handover.properties, action);
+
if (err < 0) {
DBG("Parsing mime error %d", err);
g_free(mime->type);
int __near_bluetooth_init(void);
void __near_bluetooth_cleanup(void);
-int __near_bluetooth_parse_oob_record(uint8_t version, uint8_t *bt_data,
+int __near_bluetooth_parse_oob_record(struct bt_data *data,
uint16_t *properties, near_bool_t pair);
int __near_bluetooth_pair(void *data);
uint8_t *__near_bluetooth_local_get_properties(int *bt_data_len,