函数实现详解
向sastore中添加服务和功能的信息
/*
函数功能:将identity中的handle和token保存到saStore中
函数参数:@saStore:系统能力存储
@service:service的name
@feature:feature的name
@identity:SvcIdentity类型包含handle、token、cookie三个成员,handle赋值给service,token赋值给feature
函数返回:保存成功 返回EC_SUCCESS,保存失败 返回EC_INVALID/EC_NOSPACE/EC_NOMEMORY
函数描述:首先根据service在saStore中查找对应的ListNode结点
然后根据feature在ListNode对应的serviceinfo中查找下属的feature结点。
若找到则表示待存储的信息已存在,不需要保存,返回EC_SUCCESS。
若未找到则先创建feature结点,保存identity的token值,用头插法将其插入到已有的feature链表中。
再判断service对应的ListNode是否存在,若不存在则创建ListNode结点。
在ListNode的serviceInfo中保存identity的handle,用头插法将其插入到已有的ListNode链表中
*/
int SASTORA_Save(SAStore *saStore, const char *service, const char *feature, const SvcIdentity *identity)
{
//参数检查
if (saStore == NULL || service == NULL || identity == NULL) {
return EC_INVALID
}
//查找service对应的ListNode结点
ListNode *curNode = FindServiceByName(saStore->root, service)
//获取service下属的feature链表的头节点
FeatureNode *fNode = (curNode == NULL) ? NULL : curNode->info.head
//在feature链表中匹配对应的feature
fNode = FindFeatureByName(fNode, feature)
if (fNode != NULL) {
//待保存的信息已存在,直接返回EC_SUCCESS
return EC_SUCCESS
}//fNode为NULL
if (saStore->saSize >= MAX_SA_NUM) {
//存储数目超限,返回EC_NOSPACE
return EC_NOSPACE
}
//申请FeatureNode结点的内存
fNode = SAMGR_Malloc(sizeof(FeatureNode))
if (fNode == NULL) {
//内存不足,返回EC_NOMEMORY
return EC_NOMEMORY
}
//更新结点的token值
fNode->token = identity->token
//feature == NULL 的bool值,若feature为NULL,则当前结点为默认结点
fNode->isDefault = feature == NULL
fNode->name[0] = 0
if (feature != NULL) {
//对fNode的name赋值
if (strcpy_s(fNode->name, MAX_NAME_LEN, feature) != EOK) {
SAMGR_Free(fNode)
return EC_INVALID
}
}
if (curNode == NULL) {
//未找到service对应的ListNode结点,创建新的ListNode结点
curNode = SAMGR_Malloc(sizeof(ListNode))
if (curNode == NULL) {
//内存不足,返回EC_NOMEMORY
SAMGR_Free(fNode)
return EC_NOMEMORY
}
//更新service的name
if (strcpy_s(curNode->info.name, MAX_NAME_LEN, service) != EOK) {
//拷贝失败,释放已申请的内存,并返回EC_INVALID
SAMGR_Free(fNode)
SAMGR_Free(curNode)
return EC_INVALID
}
//更新handle值
curNode->info.handle = identity->handle
curNode->info.head = NULL
//采用链表的头插法,在serviceinfo链表的头部增加结点
curNode->next = saStore->root
saStore->root = curNode
}
//采用链表的头插法,在featurenode链表的头部增加结点
fNode->next = curNode->info.head
curNode->info.head = fNode
//size增加
saStore->saSize++
return EC_SUCCESS
}
从sastore中获取服务和功能对应的身份标识
/*
函数功能:查找服务和功能对应的identity
函数参数:@saStore:系统功能存储
@service:服务名称
@feature:功能名称
函数返回:查找成功 返回对应的identity,查找失败 返回无效的identity
函数描述:在satore中,根据服务名获取handle值,根据功能名获取token值,然后返回identity
*/
SvcIdentity SASTORA_Find(SAStore *saStore, const char *service, const char *feature)
{
//初始化
SvcIdentity identity = {(uint32)INVALID_INDEX, (uint32)INVALID_INDEX, (uint32)INVALID_INDEX}
//根据service的name查找saStore->root中对应的ListNode结点
ListNode *curNode = FindServiceByName(saStore->root, service)
if (curNode == NULL) {
//若没找到该服务,则返回无效的identity
return identity
}
//找到该服务,从中获取handle值
identity.handle = curNode->info.handle
//在该服务下属的功能中,根据feature的name查找对应的FeatureNode结点
FeatureNode *featureNode = FindFeatureByName(curNode->info.head, feature)
if (featureNode != NULL) {
//找到对应的功能结点,则获取token值
identity.token = featureNode->token
}
//返回identity
return identity
}
DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案)
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
根据handle清空服务和功能信息
/*
函数功能:清除handle对应的服务信息和功能信息
函数描述:遍历ListNode链表,查询与handle匹配的serviceInfo。
从该链表中删除serviceInfo对应的ListNode结点,并且将该节点下的所有FeatureNode结点释放
*/
static void SASTORA_ClearServiceByHandle(SAStore *saStore, uint32 handle)
{
//获取根节点
ListNode *node = saStore->root
ListNode *prev = NULL
//遍历ListNode链表,找到与handle匹配的serviceInfo,删除对应的ListNode结点
while (node != NULL) {
if (node->info.handle == handle) {//找到对应的ListNode结点
//指向待删除的结点
ListNode *freeNode = node
//链表删除结点的操作
if (prev != NULL) {
prev->next = node->next
node = node->next
} else {
saStore->root = node->next
node = node->next
}
//删除ListNode中的serviceInfo下属的所有FeatureNode
FreeTreeNode(saStore, freeNode)
continue
}
//未找到,指针向后移动
prev = node
node = node->next
}
}
删除指定服务下的所有功能信息
static void FreeTreeNode(SAStore *saStore, ListNode *node)
{
while (node->info.head != NULL) {
FeatureNode *freeNode = node->info.head;
node->info.head = node->info.head->next;
SAMGR_Free(freeNode);
saStore->saSize--;
}
SAMGR_Free(node);
}