OpenHarmony轻量系统服务管理|samgr_server功能详解(四)

往期知识点记录:

函数实现详解

相关实现代码在distributedschedule_samgr_lite\samgr_server\source\samgr_server.c。前面的文章分析了两种资源类型的处理函数,即endpointfeature,本文开始分析syscap的系列函数。对于syscap共有OP_PUTOP_GETOP_ALL三种操作类型的处理函数。

syscap处理函数的入口
//syscap处理函数,根据不同的操作类型调用不同的处理函数
static int ProcSysCap(SamgrServer *server, int32 option, void *origin, IpcIo *req, IpcIo *reply)
{   
    //判断origin的userID是否符合条件
    if (CanRequest(origin) == FALSE) {
        //uid超出最大限制
        //记录错误日志
        HILOG_ERROR(HILOG_MODULE_SAMGR, "ProcSysCap no permission");
        //发送响应消息EC_PERMISSION
        IpcIoPushInt32(reply, EC_PERMISSION);
        return EC_PERMISSION;
    }
    //操作类型检查
    if (option != OP_PUT && option != OP_GET && option != OP_ALL) {
        //操作类型不合法,则响应EC_INVALID
        IpcIoPushInt32(reply, EC_INVALID);
        return EC_INVALID;
    }
    //记录开始日志
    HILOG_DEBUG(HILOG_MODULE_SAMGR, "ProcSysCap option: %d begin", option);
    if (option == OP_PUT) {//操作类型为PUT
        //向SamgrServer注册syscacp,更改指定sysCap的注册状态为true
        int32 ret = ProcAddSysCap(server, req);
        //将操作结果ret作为响应消息,发送给请求者
        IpcIoPushInt32(reply, ret);
    } else if (option == OP_GET) {//操作类型为GET
        //查询指定syscap的注册状态
        BOOL ret = ProcGetSysCap(server, req);
        //将EC_SUCCESS作为响应消息,发送给请求者
        IpcIoPushInt32(reply, EC_SUCCESS);
        //将操作结果ret作为响应消息,发送给请求者
        IpcIoPushBool(reply, ret);
    } else if (option == OP_ALL) {
        //操作类型为ALL
        //获取指定下标后的所有已注册的syscap的数目,并将已注册syscap的name作为响应发送给请求者
        ProcGetAllSysCap(server, req, reply);
    } else {
        //记录错误日志
        HILOG_WARN(HILOG_MODULE_SAMGR, "ProcSysCap error option: %d", option);
        IpcIoPushInt32(reply, EC_INVALID);
        return EC_INVALID;
    }
    //记录结束日志
    HILOG_DEBUG(HILOG_MODULE_SAMGR, "ProcSysCap end");
    return EC_SUCCESS;
}
请求资源为syscap操作类型为PUT的处理函数
/*
    函数功能:向SamgrServer注册syscacp
    函数返回:注册成功 返回EC_SUCCESS,注册失败 返回EC_INVALID or EC_FAILURE
    函数描述:从请求消息中获取待注册的syscap,然后查询SamgrServer中是否存在该syscap。
             若存在则更改注册状态为true,若不存在则返回EC_FAILURE
*/
static int32 ProcAddSysCap(SamgrServer *server, IpcIo *req)
{
    size_t len = 0;
    //从req中读取消息,获取syscap的name和长度
    char *sysCap = (char *)IpcIoPopString(req, &len);
    if (sysCap == NULL || len == 0 || len > MAX_SYSCAP_NAME_LEN) {
        HILOG_ERROR(HILOG_MODULE_SAMGR, "ProcAddSysCap sysCap invalid");
        return EC_INVALID;
    }
    //加锁,互斥添加
    MUTEX_Lock(server->sysCapMtx);
    //获取SamgrServer对象的Vector
    Vector *sysCapablitys = &(server->sysCapabilitys);
    //按sysCap的值进行查找,返回对应的下标
    int16 pos = VECTOR_FindByKey(sysCapablitys, (void *)sysCap);
    if (pos < 0) {
        //指定的sysCap不存在,返回EC_FAILURE
        MUTEX_Unlock(server->sysCapMtx);
        return EC_FAILURE;
    }
    //按pos查找,返回对应的SysCapImpl实例
    SysCapImpl *serviceImpl = (SysCapImpl *)VECTOR_At(sysCapablitys, pos);
    if (serviceImpl == NULL || serviceImpl->name == NULL) {
        //返回的为NULL,返回EC_FAILURE
        MUTEX_Unlock(server->sysCapMtx);
        return EC_FAILURE;
    }
    //修改注册状态为true
    serviceImpl->isRegister = TRUE;
    MUTEX_Unlock(server->sysCapMtx);
    return EC_SUCCESS;
}
请求资源为syscap操作类型为GET的处理函数
/*
    函数功能:查询指定syscap的注册状态
    函数返回:已注册 返回true,未注册 返回false
    函数描述:从请求消息中获取待查询的syscap,然后查询SamgrServer中是否存在该syscap.
             若存在则返回它的注册状态,若不存在则返回false
*/
static BOOL ProcGetSysCap(const SamgrServer *server, IpcIo *req)
{
    size_t len = 0;
    //从req中读取消息,获取syscap的name和长度
    char *sysCap = (char *)IpcIoPopString(req, &len);
    if (sysCap == NULL || len == 0 || len > MAX_SYSCAP_NAME_LEN) {
        HILOG_ERROR(HILOG_MODULE_SAMGR, "ProcGetSysCap sysCap invalid");
        return FALSE;
    }
    MUTEX_Lock(server->sysCapMtx);
    //获取SamgrServer对象的Vector
    Vector *sysCapablitys = &(server->sysCapabilitys);
    //按sysCap的值进行查找,返回对应的下标
    int16 pos = VECTOR_FindByKey(sysCapablitys, (void *)sysCap);
    if (pos < 0) {
        //指定的sysCap不存在,返回FALSE
        MUTEX_Unlock(server->sysCapMtx);
        return FALSE;
    }
    //按pos查找,返回对应的SysCapImpl实例
    SysCapImpl *serviceImpl = (SysCapImpl *)VECTOR_At(sysCapablitys, pos);
    if (serviceImpl == NULL) {
        //返回的为NULL,返回FALSE
        MUTEX_Unlock(server->sysCapMtx);
        return FALSE;
    }
    //获取SysCapImpl的注册状态
    BOOL res = (serviceImpl->isRegister == TRUE);
    MUTEX_Unlock(server->sysCapMtx);
    return res;
}

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值