函数实现详解
相关实现代码在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;
}
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.鸿蒙版性能优化指南
.......
请求资源为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;
}