1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "rfcomm_defs.h"
17 
18 static List *g_serverList;
19 
20 /**
21  * @brief Create server list when RFCOMM initialize.
22  *
23  */
RfcommCreateServerList()24 void RfcommCreateServerList()
25 {
26     LOG_INFO("%{public}s", __func__);
27 
28     g_serverList = ListCreate(NULL);
29 }
30 
31 /**
32  * @brief Free server list when RFCOMM finalize.
33  *
34  */
RfcommDestroyServerList()35 void RfcommDestroyServerList()
36 {
37     LOG_INFO("%{public}s", __func__);
38 
39     ListNode *node = NULL;
40     RfcommServerInfo *server = NULL;
41 
42     if (g_serverList == NULL) {
43         LOG_DEBUG("%{public}s Server list is NULL.", __func__);
44         return;
45     }
46 
47     // Release server information.
48     node = ListGetFirstNode(g_serverList);
49     while (node != NULL) {
50         server = ListGetNodeData(node);
51         free(server);
52         node = ListGetNextNode(node);
53     }
54 
55     // Free server list.
56     ListDelete(g_serverList);
57     g_serverList = NULL;
58 }
59 
60 /**
61  * @brief The function is used to register the server.
62  *
63  * @param scn       The server's number.
64  * @param mtu       The maximum size of data received at a time.
65  * @param eventMask The collection of events followed by upper layers.
66  * @param callback  The callback function used by rfcomm to notify uppers of data or events.
67  * @param context   The content passed in from the upper layer.
68  *                  It will be brought back to the upper layer when callback is called.
69  * @return The pointer of the new server in the server list.
70  */
RfcommCreateServer(uint8_t scn,uint16_t mtu,uint32_t eventMask,RFCOMM_EventCallback callback,void * context)71 RfcommServerInfo *RfcommCreateServer(
72     uint8_t scn, uint16_t mtu, uint32_t eventMask, RFCOMM_EventCallback callback, void *context)
73 {
74     LOG_INFO("%{public}s scn:%hhu, mtu:%hu", __func__, scn, mtu);
75 
76     if (g_serverList == NULL) {
77         LOG_DEBUG("%{public}s Server list is NULL.", __func__);
78         return NULL;
79     }
80 
81     RfcommServerInfo *server = malloc(sizeof(RfcommServerInfo));
82     if (server == NULL) {
83         return NULL;
84     }
85 
86     server->eventMask = eventMask;
87     server->scn = scn;
88     server->maxRevSize = mtu;
89     server->context = context;
90     server->callBack = callback;
91 
92     // Add the new server into server list.
93     ListAddLast(g_serverList, server);
94 
95     return server;
96 }
97 
98 /**
99  * @brief Remove server node from server list and free the server resources.
100  *
101  * @param server The pointer of the server in the server list.
102  */
RfcommRemoveServer(RfcommServerInfo * server)103 void RfcommRemoveServer(RfcommServerInfo *server)
104 {
105     LOG_INFO("%{public}s", __func__);
106 
107     if (g_serverList == NULL) {
108         LOG_DEBUG("%{public}s Server list is NULL.", __func__);
109         return;
110     }
111 
112     ListRemoveNode(g_serverList, server);
113 
114     free(server);
115 }
116 
117 /**
118  * @brief This function is used to find the specified server using server number.
119  *
120  * @param scn The server number.
121  * @return The pointer of the server in the server list.
122  */
RfcommGetServerByScn(uint8_t scn)123 RfcommServerInfo *RfcommGetServerByScn(uint8_t scn)
124 {
125     LOG_INFO("%{public}s scn:%hhu", __func__, scn);
126 
127     RfcommServerInfo *server = NULL;
128     ListNode *node = NULL;
129 
130     if (g_serverList == NULL) {
131         LOG_DEBUG("%{public}s Server list is NULL.", __func__);
132         return NULL;
133     }
134 
135     node = ListGetFirstNode(g_serverList);
136     while (node != NULL) {
137         server = ListGetNodeData(node);
138         if (server->scn == scn) {
139             return server;
140         }
141         node = ListGetNextNode(node);
142     }
143 
144     return NULL;
145 }