avrcp.c (a0f524f0c0783c3d05ff6802feeb92a61d9db829) | avrcp.c (227d16a53b98d7af4a4ae1aaa120a80c32074b9e) |
---|---|
1/* 2 * Copyright (C) 2016 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright --- 566 unchanged lines hidden (view full) --- 575 record_id = sdp_event_query_attribute_byte_get_record_id(packet); 576 // log_info("SDP Record: Nr: %d", record_id); 577 } 578 579 if (sdp_event_query_attribute_byte_get_attribute_length(packet) <= attribute_value_buffer_size) { 580 attribute_value[sdp_event_query_attribute_byte_get_data_offset(packet)] = sdp_event_query_attribute_byte_get_data(packet); 581 582 if ((uint16_t)(sdp_event_query_attribute_byte_get_data_offset(packet)+1) == sdp_event_query_attribute_byte_get_attribute_length(packet)) { | 1/* 2 * Copyright (C) 2016 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright --- 566 unchanged lines hidden (view full) --- 575 record_id = sdp_event_query_attribute_byte_get_record_id(packet); 576 // log_info("SDP Record: Nr: %d", record_id); 577 } 578 579 if (sdp_event_query_attribute_byte_get_attribute_length(packet) <= attribute_value_buffer_size) { 580 attribute_value[sdp_event_query_attribute_byte_get_data_offset(packet)] = sdp_event_query_attribute_byte_get_data(packet); 581 582 if ((uint16_t)(sdp_event_query_attribute_byte_get_data_offset(packet)+1) == sdp_event_query_attribute_byte_get_attribute_length(packet)) { |
583 | |
584 switch(sdp_event_query_attribute_byte_get_attribute_id(packet)) { 585 case BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST: 586 if (de_get_element_type(attribute_value) != DE_DES) break; 587 for (des_iterator_init(&des_list_it, attribute_value); des_iterator_has_more(&des_list_it); des_iterator_next(&des_list_it)) { 588 uint8_t * element = des_iterator_get_element(&des_list_it); 589 if (de_get_element_type(element) != DE_UUID) continue; 590 uint32_t uuid = de_get_uuid32(element); 591 switch (uuid){ --- 44 unchanged lines hidden (view full) --- 636 de_element_get_uint16(des_iterator_get_element(&prot_it), &sdp_query_context.avrcp_version); 637 break; 638 default: 639 break; 640 } 641 } 642 } 643 break; | 583 switch(sdp_event_query_attribute_byte_get_attribute_id(packet)) { 584 case BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST: 585 if (de_get_element_type(attribute_value) != DE_DES) break; 586 for (des_iterator_init(&des_list_it, attribute_value); des_iterator_has_more(&des_list_it); des_iterator_next(&des_list_it)) { 587 uint8_t * element = des_iterator_get_element(&des_list_it); 588 if (de_get_element_type(element) != DE_UUID) continue; 589 uint32_t uuid = de_get_uuid32(element); 590 switch (uuid){ --- 44 unchanged lines hidden (view full) --- 635 de_element_get_uint16(des_iterator_get_element(&prot_it), &sdp_query_context.avrcp_version); 636 break; 637 default: 638 break; 639 } 640 } 641 } 642 break; |
643 case BLUETOOTH_ATTRIBUTE_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS: { 644 // log_info("SDP Attribute: 0x%04x", sdp_event_query_attribute_byte_get_attribute_id(packet)); 645 if (de_get_element_type(attribute_value) != DE_DES) break; 646 647 des_iterator_t des_list_0_it; 648 uint8_t *element_0; 649 650 des_iterator_init(&des_list_0_it, attribute_value); 651 element_0 = des_iterator_get_element(&des_list_0_it); 652 653 for (des_iterator_init(&des_list_it, element_0); des_iterator_has_more(&des_list_it); des_iterator_next(&des_list_it)) { 654 uint8_t *des_element; 655 uint8_t *element; 656 uint32_t uuid; 657 658 if (des_iterator_get_type(&des_list_it) != DE_DES) continue; 659 660 des_element = des_iterator_get_element(&des_list_it); 661 des_iterator_init(&prot_it, des_element); 662 element = des_iterator_get_element(&prot_it); 663 664 if (de_get_element_type(element) != DE_UUID) continue; 665 666 uuid = de_get_uuid32(element); 667 switch (uuid){ 668 case BLUETOOTH_PROTOCOL_L2CAP: 669 if (!des_iterator_has_more(&prot_it)) continue; 670 des_iterator_next(&prot_it); 671 de_element_get_uint16(des_iterator_get_element(&prot_it), &sdp_query_context.avrcp_browsing_l2cap_psm); 672 break; 673 case BLUETOOTH_PROTOCOL_AVCTP: 674 if (!des_iterator_has_more(&prot_it)) continue; 675 des_iterator_next(&prot_it); 676 de_element_get_uint16(des_iterator_get_element(&prot_it), &sdp_query_context.avrcp_browsing_version); 677 break; 678 default: 679 break; 680 } 681 } 682 } 683 break; |
|
644 default: 645 break; 646 } 647 } 648 } else { 649 log_error("SDP attribute value buffer size exceeded: available %d, required %d", attribute_value_buffer_size, sdp_event_query_attribute_byte_get_attribute_length(packet)); 650 } 651 break; 652 653 case SDP_EVENT_QUERY_COMPLETE: 654 log_info("General query done with status %d.", sdp_event_query_complete_get_status(packet)); 655 if (!sdp_query_context.role_supported || !sdp_query_context.avrcp_l2cap_psm){ 656 sdp_query_context.connection->state = AVCTP_CONNECTION_IDLE; 657 avrcp_emit_connection_established(sdp_query_context.avrcp_context->avrcp_callback, sdp_query_context.connection->avrcp_cid, sdp_query_context.connection->remote_addr, SDP_SERVICE_NOT_FOUND); 658 break; 659 } | 684 default: 685 break; 686 } 687 } 688 } else { 689 log_error("SDP attribute value buffer size exceeded: available %d, required %d", attribute_value_buffer_size, sdp_event_query_attribute_byte_get_attribute_length(packet)); 690 } 691 break; 692 693 case SDP_EVENT_QUERY_COMPLETE: 694 log_info("General query done with status %d.", sdp_event_query_complete_get_status(packet)); 695 if (!sdp_query_context.role_supported || !sdp_query_context.avrcp_l2cap_psm){ 696 sdp_query_context.connection->state = AVCTP_CONNECTION_IDLE; 697 avrcp_emit_connection_established(sdp_query_context.avrcp_context->avrcp_callback, sdp_query_context.connection->avrcp_cid, sdp_query_context.connection->remote_addr, SDP_SERVICE_NOT_FOUND); 698 break; 699 } |
660 log_info("AVRCP Control PSM 0x%02x", sdp_query_context.avrcp_l2cap_psm); | 700 log_info("AVRCP Control PSM 0x%02x, Browsing PSM 0x%02x", sdp_query_context.avrcp_l2cap_psm, sdp_query_context.avrcp_browsing_l2cap_psm); |
661 662 sdp_query_context.connection->state = AVCTP_CONNECTION_W4_L2CAP_CONNECTED; 663 l2cap_create_channel(sdp_query_context.avrcp_context->packet_handler, sdp_query_context.connection->remote_addr, sdp_query_context.avrcp_l2cap_psm, l2cap_max_mtu(), NULL); 664 break; 665 } 666} 667 668static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connection_t * connection, uint8_t *packet, uint16_t size){ --- 935 unchanged lines hidden --- | 701 702 sdp_query_context.connection->state = AVCTP_CONNECTION_W4_L2CAP_CONNECTED; 703 l2cap_create_channel(sdp_query_context.avrcp_context->packet_handler, sdp_query_context.connection->remote_addr, sdp_query_context.avrcp_l2cap_psm, l2cap_max_mtu(), NULL); 704 break; 705 } 706} 707 708static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connection_t * connection, uint8_t *packet, uint16_t size){ --- 935 unchanged lines hidden --- |