往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(1)
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(2)
- OpenHarmony轻量系统服务管理-samgr:common赏析及实现
- OpenHarmony轻量系统服务管理-samgr:iunknown赏析
- OpenHarmony轻量系统服务管理-samgr:iunknown实现分析
- OpenHarmony轻量系统服务管理samgr-message赏析
- OpenHarmony轻量系统服务管理samgr-message实现分析(1)
- OpenHarmony轻量系统服务管理samgr-message实现分析(2)
- OpenHarmony轻量系统服务管理samgr-service赏析
- OpenHarmony轻量系统服务管理samgr-samgr_lite赏析
- OpenHarmony轻量系统服务管理samgr-feature赏析及实现
- OpenHarmony轻量系统服务管理samgr-service实现分析(1)
- OpenHarmony轻量系统服务管理samgr-service实现分析(2)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(1)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(2)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(一)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(二)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(三)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(四)
- OpenHarmony轻量系统服务管理|samgr_client功能详解
- OpenHarmony轻量系统服务管理|消息处理中的流控机制详解
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(一)
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(二)
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(三)
- 持续更新中……
函数实现详解
向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;
}
根据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;
}
}
删除指定服务下的所有功能信息
//将ListNode中的serviceInfo下属的所有FeatureNode删除并释放内存
static void FreeTreeNode(SAStore *saStore, ListNode *node)
{
//遍历该结点下的所有featureNode,并释放内存
while (node->info.head != NULL) {//直到该结点下的featureNode为NULL才退出循环
FeatureNode *freeNode = node->info.head;
node->info.head = node->info.head->next;
//释放FeatureNode结点的内存
SAMGR_Free(freeNode);
//更新维护的数量
saStore->saSize--;
}
//释放ListNode结点的内存
SAMGR_Free(node);
}
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: