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 }