往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(一)
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(二)
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(三)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(一)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(二)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(三)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(四)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(五)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(六)
- OpenHarmony轻量系统服务管理|客户代理的工厂模式机制详解
- OpenHarmony轻量系统服务管理|进程间通信的客户端代理详解(一)
- OpenHarmony轻量系统服务管理|进程间通信的客户端代理详解(二)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(一)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(二)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(三)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(四)
- 持续更新中……
函数实现详解
相关实现代码在distributedschedule_samgr_lite\samgr_server\source\samgr_server.c
。前面的文章分析了两种资源类型的处理函数,即endpoint
和feature
,本文开始分析syscap
的系列函数。对于syscap
共有OP_PUT、OP_GET和OP_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🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: