* Copyright (C) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "rfcomm_defs.h"
static List *g_serverList;
* @brief Create server list when RFCOMM initialize.
*
*/
void RfcommCreateServerList()
{
LOG_INFO("%{public}s", __func__);
g_serverList = ListCreate(NULL);
}
* @brief Free server list when RFCOMM finalize.
*
*/
void RfcommDestroyServerList()
{
LOG_INFO("%{public}s", __func__);
ListNode *node = NULL;
RfcommServerInfo *server = NULL;
if (g_serverList == NULL) {
LOG_DEBUG("%{public}s Server list is NULL.", __func__);
return;
}
node = ListGetFirstNode(g_serverList);
while (node != NULL) {
server = ListGetNodeData(node);
free(server);
node = ListGetNextNode(node);
}
ListDelete(g_serverList);
g_serverList = NULL;
}
* @brief The function is used to register the server.
*
* @param scn The server's number.
* @param mtu The maximum size of data received at a time.
* @param eventMask The collection of events followed by upper layers.
* @param callback The callback function used by rfcomm to notify uppers of data or events.
* @param context The content passed in from the upper layer.
* It will be brought back to the upper layer when callback is called.
* @return The pointer of the new server in the server list.
*/
RfcommServerInfo *RfcommCreateServer(
uint8_t scn, uint16_t mtu, uint32_t eventMask, RFCOMM_EventCallback callback, void *context)
{
LOG_INFO("%{public}s scn:%hhu, mtu:%hu", __func__, scn, mtu);
if (g_serverList == NULL) {
LOG_DEBUG("%{public}s Server list is NULL.", __func__);
return NULL;
}
RfcommServerInfo *server = malloc(sizeof(RfcommServerInfo));
if (server == NULL) {
return NULL;
}
server->eventMask = eventMask;
server->scn = scn;
server->maxRevSize = mtu;
server->context = context;
server->callBack = callback;
ListAddLast(g_serverList, server);
return server;
}
* @brief Remove server node from server list and free the server resources.
*
* @param server The pointer of the server in the server list.
*/
void RfcommRemoveServer(RfcommServerInfo *server)
{
LOG_INFO("%{public}s", __func__);
if (g_serverList == NULL) {
LOG_DEBUG("%{public}s Server list is NULL.", __func__);
return;
}
ListRemoveNode(g_serverList, server);
free(server);
}
* @brief This function is used to find the specified server using server number.
*
* @param scn The server number.
* @return The pointer of the server in the server list.
*/
RfcommServerInfo *RfcommGetServerByScn(uint8_t scn)
{
LOG_INFO("%{public}s scn:%hhu", __func__, scn);
RfcommServerInfo *server = NULL;
ListNode *node = NULL;
if (g_serverList == NULL) {
LOG_DEBUG("%{public}s Server list is NULL.", __func__);
return NULL;
}
node = ListGetFirstNode(g_serverList);
while (node != NULL) {
server = ListGetNodeData(node);
if (server->scn == scn) {
return server;
}
node = ListGetNextNode(node);
}
return NULL;
}