1 /*
2 * Copyright (C) 2024 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
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the copyright holders nor the names of
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * 4. Any redistribution, use, or modification is done solely for
17 * personal benefit and not for any commercial purpose or for
18 * monetary gain.
19 *
20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24 * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * Please inquire about commercial licensing options at
34 * [email protected]
35 *
36 */
37
38 #define BTSTACK_FILE__ "obex_srm_client.c"
39
40 #include "btstack_debug.h"
41
42 #include "classic/goep_client.h"
43 #include "classic/obex.h"
44 #include "classic/obex_srm_client.h"
45
obex_srm_client_init(obex_srm_client_t * obex_srm)46 void obex_srm_client_init(obex_srm_client_t * obex_srm){
47 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_DISABLED;
48 obex_srm->srmp_waiting = false;
49 obex_srm_client_reset_fields(obex_srm);
50 }
51
obex_srm_client_set_waiting(obex_srm_client_t * obex_srm,bool waiting)52 void obex_srm_client_set_waiting(obex_srm_client_t * obex_srm, bool waiting){
53 log_info("Set SRMP Waiting: %u", (int) waiting);
54 obex_srm->srmp_waiting = waiting;
55 }
56
obex_srm_client_reset_fields(obex_srm_client_t * obex_srm)57 void obex_srm_client_reset_fields(obex_srm_client_t * obex_srm){
58 obex_srm->srm_value = OBEX_SRM_DISABLE;
59 obex_srm->srmp_value = OBEX_SRMP_NEXT;
60 }
61
obex_srm_client_handle_headers(obex_srm_client_t * obex_srm)62 void obex_srm_client_handle_headers(obex_srm_client_t *obex_srm) {
63 // Update SRM state based on SRM headers
64 switch (obex_srm->srm_state){
65 case OBEX_SRM_CLIENT_STATE_W4_CONFIRM:
66 switch (obex_srm->srm_value){
67 case OBEX_SRM_ENABLE:
68 switch (obex_srm->srmp_value){
69 case OBEX_SRMP_WAIT:
70 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_ENABLED_BUT_WAITING;
71 break;
72 default:
73 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_ENABLED;
74 break;
75 }
76 break;
77 default:
78 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_DISABLED;
79 break;
80 }
81 break;
82 case OBEX_SRM_CLIENT_STATE_ENABLED_BUT_WAITING:
83 switch (obex_srm->srmp_value){
84 case OBEX_SRMP_WAIT:
85 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_ENABLED_BUT_WAITING;
86 break;
87 default:
88 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_ENABLED;
89 break;
90 }
91 break;
92 default:
93 break;
94 }
95 log_info("Handle SRM %u, SRMP %u -> new SRM state %u", obex_srm->srm_value, obex_srm->srmp_value,obex_srm->srm_state);
96 }
97
obex_srm_client_prepare_header(obex_srm_client_t * obex_srm,uint16_t goep_cid)98 void obex_srm_client_prepare_header(obex_srm_client_t *obex_srm, uint16_t goep_cid){
99 if (goep_client_version_20_or_higher(goep_cid)){
100 // add SRM Enable Header if not enabled yet
101 if (obex_srm->srm_state == OBEX_SRM_CLIENT_STATE_DISABLED){
102 obex_srm->srm_state = OBEX_SRM_CLIENT_STATE_W4_CONFIRM;
103 log_info("Prepare: add SRM Enable");
104 goep_client_header_add_srm_enable(goep_cid);
105 }
106 // add SRMP Waiting header if waiting is active
107 if (obex_srm->srmp_waiting){
108 log_info("Prepare: add SRMP Waiting");
109 goep_client_header_add_srmp_waiting(goep_cid);
110 }
111 }
112 }
113
obex_srm_client_is_srm_active(obex_srm_client_t * obex_srm)114 bool obex_srm_client_is_srm_active(obex_srm_client_t *obex_srm){
115 return (obex_srm->srm_state == OBEX_SRM_CLIENT_STATE_ENABLED) && (obex_srm->srmp_waiting == false);
116 }
117