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