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 ---