Exemple #1
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_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();
    }
}
Exemple #3
0
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;
    }
}
Exemple #4
0
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;
    }
}