1*e001955aSMatthias Ringwald /* 2*e001955aSMatthias Ringwald * Copyright (C) 2023 BlueKitchen GmbH 3*e001955aSMatthias Ringwald * 4*e001955aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*e001955aSMatthias Ringwald * modification, are permitted provided that the following conditions 6*e001955aSMatthias Ringwald * are met: 7*e001955aSMatthias Ringwald * 8*e001955aSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*e001955aSMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*e001955aSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*e001955aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*e001955aSMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*e001955aSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*e001955aSMatthias Ringwald * contributors may be used to endorse or promote products derived 15*e001955aSMatthias Ringwald * from this software without specific prior written permission. 16*e001955aSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*e001955aSMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*e001955aSMatthias Ringwald * monetary gain. 19*e001955aSMatthias Ringwald * 20*e001955aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*e001955aSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*e001955aSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*e001955aSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24*e001955aSMatthias Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*e001955aSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*e001955aSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*e001955aSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*e001955aSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*e001955aSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*e001955aSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*e001955aSMatthias Ringwald * SUCH DAMAGE. 32*e001955aSMatthias Ringwald * 33*e001955aSMatthias Ringwald * Please inquire about commercial licensing options at 34*e001955aSMatthias Ringwald * [email protected] 35*e001955aSMatthias Ringwald * 36*e001955aSMatthias Ringwald */ 37*e001955aSMatthias Ringwald 38*e001955aSMatthias Ringwald #define BTSTACK_FILE__ "opp_srm.c" 39*e001955aSMatthias Ringwald 40*e001955aSMatthias Ringwald #include "btstack_config.h" 41*e001955aSMatthias Ringwald 42*e001955aSMatthias Ringwald #include <stdint.h> 43*e001955aSMatthias Ringwald 44*e001955aSMatthias Ringwald #include "btstack_event.h" 45*e001955aSMatthias Ringwald 46*e001955aSMatthias Ringwald #include "classic/obex.h" 47*e001955aSMatthias Ringwald #include "classic/obex_parser.h" 48*e001955aSMatthias Ringwald #include "classic/goep_server.h" 49*e001955aSMatthias Ringwald 50*e001955aSMatthias Ringwald #include "classic/obex_srm_server.h" 51*e001955aSMatthias Ringwald 52*e001955aSMatthias Ringwald void obex_srm_init (obex_srm_t *obex_srm){ 53*e001955aSMatthias Ringwald obex_srm->srm_value = OBEX_SRM_DISABLE; 54*e001955aSMatthias Ringwald obex_srm->srmp_value = OBEX_SRMP_NEXT; 55*e001955aSMatthias Ringwald 56*e001955aSMatthias Ringwald obex_srm->srm_state = OBEX_SRM_STATE_DISABLED; 57*e001955aSMatthias Ringwald } 58*e001955aSMatthias Ringwald 59*e001955aSMatthias Ringwald void obex_srm_header_store (obex_srm_t *obex_srm, 60*e001955aSMatthias Ringwald uint8_t header_id, 61*e001955aSMatthias Ringwald uint16_t total_len, 62*e001955aSMatthias Ringwald uint16_t data_offset, 63*e001955aSMatthias Ringwald const uint8_t *data_buffer, 64*e001955aSMatthias Ringwald uint16_t data_len) 65*e001955aSMatthias Ringwald { 66*e001955aSMatthias Ringwald switch (header_id) { 67*e001955aSMatthias Ringwald case OBEX_HEADER_SINGLE_RESPONSE_MODE: 68*e001955aSMatthias Ringwald obex_parser_header_store(&obex_srm->srm_value, 1, total_len, data_offset, data_buffer, data_len); 69*e001955aSMatthias Ringwald break; 70*e001955aSMatthias Ringwald case OBEX_HEADER_SINGLE_RESPONSE_MODE_PARAMETER: 71*e001955aSMatthias Ringwald obex_parser_header_store(&obex_srm->srmp_value, 1, total_len, data_offset, data_buffer, data_len); 72*e001955aSMatthias Ringwald break; 73*e001955aSMatthias Ringwald default: 74*e001955aSMatthias Ringwald break; 75*e001955aSMatthias Ringwald } 76*e001955aSMatthias Ringwald } 77*e001955aSMatthias Ringwald 78*e001955aSMatthias Ringwald static void obex_srm_handle_headers (obex_srm_t *obex_srm) 79*e001955aSMatthias Ringwald { 80*e001955aSMatthias Ringwald switch (obex_srm->srm_state) { 81*e001955aSMatthias Ringwald case OBEX_SRM_STATE_DISABLED: 82*e001955aSMatthias Ringwald if (obex_srm->srm_value == OBEX_SRM_ENABLE) { 83*e001955aSMatthias Ringwald if (obex_srm->srmp_value == OBEX_SRMP_WAIT) { 84*e001955aSMatthias Ringwald obex_srm->srm_state = OBEX_SRM_STATE_SEND_CONFIRM_WAIT; 85*e001955aSMatthias Ringwald } else { 86*e001955aSMatthias Ringwald obex_srm->srm_state = OBEX_SRM_STATE_SEND_CONFIRM; 87*e001955aSMatthias Ringwald } 88*e001955aSMatthias Ringwald } 89*e001955aSMatthias Ringwald break; 90*e001955aSMatthias Ringwald case OBEX_SRM_STATE_ENABLED_WAIT: 91*e001955aSMatthias Ringwald if (obex_srm->srmp_value == OBEX_SRMP_NEXT) { 92*e001955aSMatthias Ringwald obex_srm->srm_state = OBEX_SRM_STATE_ENABLED; 93*e001955aSMatthias Ringwald } 94*e001955aSMatthias Ringwald break; 95*e001955aSMatthias Ringwald default: 96*e001955aSMatthias Ringwald break; 97*e001955aSMatthias Ringwald } 98*e001955aSMatthias Ringwald } 99*e001955aSMatthias Ringwald 100*e001955aSMatthias Ringwald void obex_srm_add_srm_headers (obex_srm_t *obex_srm, 101*e001955aSMatthias Ringwald uint16_t goep_cid) 102*e001955aSMatthias Ringwald { 103*e001955aSMatthias Ringwald switch (obex_srm->srm_state) { 104*e001955aSMatthias Ringwald case OBEX_SRM_STATE_SEND_CONFIRM: 105*e001955aSMatthias Ringwald goep_server_header_add_srm_enable (goep_cid); 106*e001955aSMatthias Ringwald obex_srm->srm_state = OBEX_SRM_STATE_ENABLED; 107*e001955aSMatthias Ringwald break; 108*e001955aSMatthias Ringwald case OBEX_SRM_STATE_SEND_CONFIRM_WAIT: 109*e001955aSMatthias Ringwald goep_server_header_add_srm_enable (goep_cid); 110*e001955aSMatthias Ringwald obex_srm->srm_state = OBEX_SRM_STATE_ENABLED_WAIT; 111*e001955aSMatthias Ringwald break; 112*e001955aSMatthias Ringwald default: 113*e001955aSMatthias Ringwald break; 114*e001955aSMatthias Ringwald } 115*e001955aSMatthias Ringwald } 116*e001955aSMatthias Ringwald 117*e001955aSMatthias Ringwald bool obex_srm_is_enabled (obex_srm_t *obex_srm) 118*e001955aSMatthias Ringwald { 119*e001955aSMatthias Ringwald obex_srm_handle_headers (obex_srm); 120*e001955aSMatthias Ringwald return obex_srm->srm_state == OBEX_SRM_STATE_ENABLED; 121*e001955aSMatthias Ringwald } 122*e001955aSMatthias Ringwald 123