xref: /btstack/src/classic/obex_srm_server.c (revision e001955a16d4f5b0387e27146cbc7cce418747cc)
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