void handleServiceNameData(uint32_t attribute_value_length, uint32_t data_offset, uint8_t data){ // Get Header Len if (data_offset == 0){ de_state_size(data, &sn_de_header_state); sdp_service_name_header_size = sn_de_header_state.addon_header_bytes + 1; return; } // Get Header if (data_offset < sdp_service_name_header_size){ de_state_size(data, &sn_de_header_state); return; } // Process payload int name_len = attribute_value_length - sdp_service_name_header_size; int name_pos = data_offset - sdp_service_name_header_size; if (name_pos < SDP_SERVICE_NAME_LEN){ sdp_service_name[name_pos] = data; name_pos++; // terminate if name complete if (name_pos >= name_len){ sdp_service_name[name_pos] = 0; } // terminate if buffer full if (name_pos == SDP_SERVICE_NAME_LEN){ sdp_service_name[name_pos] = 0; } } // notify on last char if (data_offset == attribute_value_length - 1 && sdp_rfcom_channel_nr!=0){ sdp_query_rfcomm_service_event_t value_event = { SDP_QUERY_RFCOMM_SERVICE, sdp_rfcom_channel_nr, (uint8_t *) sdp_service_name }; (*sdp_app_callback)((sdp_query_event_t*)&value_event, sdp_app_context); sdp_rfcom_channel_nr = 0; } }
void handleServiceNameData(uint32_t attribute_value_length, uint32_t data_offset, uint8_t data){ // Get Header Len if (data_offset == 0){ de_state_size(data, &sn_de_header_state); sdp_service_name_header_size = sn_de_header_state.addon_header_bytes + 1; return; } // Get Header if (data_offset < sdp_service_name_header_size){ de_state_size(data, &sn_de_header_state); return; } // Process payload int name_len = attribute_value_length - sdp_service_name_header_size; int name_pos = data_offset - sdp_service_name_header_size; if (name_pos < SDP_SERVICE_NAME_LEN){ sdp_service_name[name_pos] = data; name_pos++; // terminate if name complete if (name_pos >= name_len){ sdp_service_name[name_pos] = 0; } // terminate if buffer full if (name_pos == SDP_SERVICE_NAME_LEN){ sdp_service_name[name_pos] = 0; } } // notify on last char if (data_offset == attribute_value_length - 1 && sdp_rfcomm_channel_nr!=0){ emit_service(); } }
void handleProtocolDescriptorListData(uint32_t attribute_value_length, uint32_t data_offset, uint8_t data){ // init state on first byte if (data_offset == 0){ pdl_state = GET_PROTOCOL_LIST_LENGTH; } // printf("handleProtocolDescriptorListData (%u,%u) %02x\n", attribute_value_length, data_offset, data); switch(pdl_state){ case GET_PROTOCOL_LIST_LENGTH: if (!de_state_size(data, &de_header_state)) break; // printf(" query: PD List payload is %d bytes.\n", de_header_state.de_size); // printf(" query: PD List offset %u, list size %u\n", de_header_state.de_offset, de_header_state.de_size); pdl_state = GET_PROTOCOL_LENGTH; break; case GET_PROTOCOL_LENGTH: // check size if (!de_state_size(data, &de_header_state)) break; // printf(" query: PD Record payload is %d bytes.\n", de_header_state.de_size); // cache protocol info protocol_offset = de_header_state.de_offset; protocol_size = de_header_state.de_size; pdl_state = GET_PROTOCOL_ID_HEADER_LENGTH; break; case GET_PROTOCOL_ID_HEADER_LENGTH: protocol_offset++; if (!de_state_size(data, &de_header_state)) break; protocol_id = 0; protocol_id_bytes_to_read = de_header_state.de_size; // printf(" query: ID data is stored in %d bytes.\n", protocol_id_bytes_to_read); pdl_state = GET_PROTOCOL_ID; break; case GET_PROTOCOL_ID: protocol_offset++; protocol_id = (protocol_id << 8) | data; protocol_id_bytes_to_read--; if (protocol_id_bytes_to_read > 0) break; // printf(" query: Protocol ID: %04x.\n", protocol_id); if (protocol_offset >= protocol_size){ pdl_state = GET_PROTOCOL_LENGTH; // printf(" query: Get next protocol\n"); break; } pdl_state = GET_PROTOCOL_VALUE_LENGTH; protocol_value_bytes_received = 0; break; case GET_PROTOCOL_VALUE_LENGTH: protocol_offset++; if (!de_state_size(data, &de_header_state)) break; protocol_value_size = de_header_state.de_size; pdl_state = GET_PROTOCOL_VALUE; sdp_rfcom_channel_nr = 0; break; case GET_PROTOCOL_VALUE: protocol_offset++; protocol_value_bytes_received++; // printf(" query: protocol_value_bytes_received %u, protocol_value_size %u\n", protocol_value_bytes_received, protocol_value_size); if (protocol_value_bytes_received < protocol_value_size) break; if (protocol_id == 0x0003){ // printf("\n\n ******* Data ***** %02x\n\n", data); sdp_rfcom_channel_nr = data; } // printf(" query: protocol done\n"); // printf(" query: Protocol offset %u, protocol size %u\n", protocol_offset, protocol_size); if (protocol_offset >= protocol_size) { pdl_state = GET_PROTOCOL_LENGTH; break; } pdl_state = GET_PROTOCOL_ID_HEADER_LENGTH; // printf(" query: Get next protocol\n"); break; default: break; } }
void parse(uint8_t eventByte) { // count all bytes list_offset++; record_offset++; // log_info(" parse BYTE_RECEIVED %02x", eventByte); switch(state) { case GET_LIST_LENGTH: if (!de_state_size(eventByte, &de_header_state)) break; list_offset = de_header_state.de_offset; list_size = de_header_state.de_size; // log_info("parser: List offset %u, list size %u", list_offset, list_size); record_counter = 0; state = GET_RECORD_LENGTH; break; case GET_RECORD_LENGTH: // check size if (!de_state_size(eventByte, &de_header_state)) break; // log_info("parser: Record payload is %d bytes.", de_header_state.de_size); record_offset = de_header_state.de_offset; record_size = de_header_state.de_size; state = GET_ATTRIBUTE_ID_HEADER_LENGTH; break; case GET_ATTRIBUTE_ID_HEADER_LENGTH: if (!de_state_size(eventByte, &de_header_state)) break; attribute_id = 0; log_info("ID data is stored in %d bytes.", (int) de_header_state.de_size); state = GET_ATTRIBUTE_ID; break; case GET_ATTRIBUTE_ID: attribute_id = (attribute_id << 8) | eventByte; de_header_state.de_size--; if (de_header_state.de_size > 0) break; log_info("parser: Attribute ID: %04x.", attribute_id); state = GET_ATTRIBUTE_VALUE_LENGTH; attribute_bytes_received = 0; attribute_bytes_delivered = 0; attribute_value_size = 0; de_state_init(&de_header_state); break; case GET_ATTRIBUTE_VALUE_LENGTH: attribute_bytes_received++; { sdp_query_attribute_value_event_t attribute_value_event = { SDP_QUERY_ATTRIBUTE_VALUE, record_counter, attribute_id, attribute_value_size, attribute_bytes_delivered++, eventByte }; (*sdp_query_callback)((sdp_query_event_t*)&attribute_value_event); } if (!de_state_size(eventByte, &de_header_state)) break; attribute_value_size = de_header_state.de_size + attribute_bytes_received; state = GET_ATTRIBUTE_VALUE; break; case GET_ATTRIBUTE_VALUE: attribute_bytes_received++; { sdp_query_attribute_value_event_t attribute_value_event = { SDP_QUERY_ATTRIBUTE_VALUE, record_counter, attribute_id, attribute_value_size, attribute_bytes_delivered++, eventByte }; (*sdp_query_callback)((sdp_query_event_t*)&attribute_value_event); } // log_info("paser: attribute_bytes_received %u, attribute_value_size %u", attribute_bytes_received, attribute_value_size); if (attribute_bytes_received < attribute_value_size) break; // log_info("parser: Record offset %u, record size %u", record_offset, record_size); if (record_offset != record_size) { state = GET_ATTRIBUTE_ID_HEADER_LENGTH; // log_info("Get next attribute"); break; } record_offset = 0; // log_info("parser: List offset %u, list size %u", list_offset, list_size); if (list_size > 0 && list_offset != list_size) { record_counter++; state = GET_RECORD_LENGTH; log_info("parser: END_OF_RECORD"); break; } list_offset = 0; de_state_init(&de_header_state); state = GET_LIST_LENGTH; record_counter = 0; log_info("parser: END_OF_RECORD & DONE"); break; default: break; } }