OpenHarmony轻量系统服务管理|系统功能的存储机制详解(三)

100 篇文章 0 订阅
100 篇文章 1 订阅

往期知识点记录:

函数实现详解

向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🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值