往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(一)
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(二)
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(三)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(一)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(二)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(三)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(四)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(五)
- OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(六)
- OpenHarmony轻量系统服务管理|客户代理的工厂模式机制详解
- OpenHarmony轻量系统服务管理|进程间通信的客户端代理详解(一)
- OpenHarmony轻量系统服务管理|进程间通信的客户端代理详解(二)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(一)
- 持续更新中……
一、前言
实现代码在distributedschedule_samgr_lite\samgr_server\source\samgr_server.c
。
二、宏定义及数据结构
#define MAX_SYSCAP_NAME_LEN 64 //系统能力名称的最大长度
#define MAX_SA_SIZE 0x100 //sa中最大数目
#define RETRY_TIMES 3 //重试次数
#define RETRY_INTERVAL 1 //重试间隔
#define MAX_SYSCAP_NUM_PER_REPLY 118//对于syscap,每次响应的最大数目
//函数指针
typedef int(*ProcFunc)(SamgrServer *server, int32 option, void *origin, IpcIo *req, IpcIo *reply);
typedef enum MsgId {
MSG_CLEAN, //清除数据
}MsgId;//消息ID
struct SamgrProxy {
INHERIT_SERVER_IPROXY;//继承服务端的代理
};
struct SamgrServer {
INHERIT_SERVICE; //继承service
INHERIT_IPROXY_ENTRY(SamgrProxy); //继承代理入口
Identity identity; //标识服务名、功能名和消息队列
Endpoint *samgr; //samgr的通信端点
MutexId mtx; //锁
SAStore store; //存储服务和功能的信息
IpcAuthInterface *ipcAuth; //继承了INHERIT_IUNKNOWN的结构体,包含GetCommunicationStrategy和IsCommunicationAllowed两个函数指针
MutexId sysCapMtx; //互斥锁,用于syscap的互斥
Vector sysCapabilitys; //syscap的集合
};
struct SysCapImpl {
char name[MAX_SYSCAP_NAME_LEN + 1]; //name
BOOL isRegister; //标识是否注册
};
//静态全局变量,定义一个Samgr的server
static SamgrServer g_server = {
.GetName = GetName,
.Initialize = Initialize,
.GetTaskConfig = GetTaskConfig,
.MessageHandle = MessageHandle,
SERVER_IPROXY_IMPL_BEGIN,
.Invoke = Invoke,
IPROXY_END,
};
//本地处理函数的集合,内部的每一个元素都是一个函数指针
static ProcFunc g_functions[] = {
[RES_ENDPOINT] = ProcEndpoint, //针对资源类型为ENDPOINT的处理函数
[RES_FEATURE] = ProcFeature, //针对资源类型为feature的处理函数
[RES_SYSCAP] = ProcSysCap, //针对资源类型为SysCap的处理函数
};
三、函数实现详解
获取syscap的名称
//获取SysCap的name
static const char *GetSysCapName(const SysCapImpl *serviceImpl)
{
if (serviceImpl == NULL) {
return NULL;
}
//返回name
return serviceImpl->name;
}
初始化Samgr服务
/*
函数功能:初始化g_server并注册json中的syscap信息
函数描述:初始化g_server的各个成员,并创建一个名为samgr的通信端点作为主endpoint。
然后解析指定文件路径下的json文件,将文件中描述的syscap信息添加到g_server的sysCapabilitys中
*/
static void InitializeRegistry(void)
{
HILOG_INFO(HILOG_MODULE_SAMGR, "Initialize Registry!");
//初始化锁
g_server.mtx = MUTEX_InitValue();
//初始化store
SASTORA_Init(&g_server.store);
//为当前进程创建一个IPC通信端点endpoint,用于跨进程间通信。endpoint的地址注册函数设置为RegisterSamgrEndpoint,用于配置主EndPoint的地址
g_server.samgr = SAMGR_CreateEndpoint("samgr", RegisterSamgrEndpoint);
//将IPC通信代理服务g_server注册到samgr中
SAMGR_GetInstance()->RegisterService((Service *)&g_server);
//初始化锁
g_server.sysCapMtx = MUTEX_InitValue();
//创建vector对象,GetSysCapName作为获取key值的函数,strcmp作为key的比较函数
g_server.sysCapabilitys = VECTOR_Make((VECTOR_Key)GetSysCapName, (VECTOR_Compare)strcmp);
//解析json文件,将json文件中描述的syscap添加到g_server的sysCapabilitys中
ParseSysCap();
HILOG_INFO(HILOG_MODULE_SAMGR, "InitializeRegistry ParseSysCap size: %d", VECTOR_Size(&(g_server.sysCapabilitys)));
}
SYS_SERVICE_INIT(InitializeRegistry);
用户鉴权
//判断origin的userID是否符合条件
static BOOL CanRequest(const void *origin)
{
//返回origin的userID
pid_t uid = GetCallingUid(origin);
//若uid小于UID_HAP,则返回true,否则返回false
return uid < UID_HAP;
}
查询服务名
//获取服务名称
static const char *GetName(Service *service)
{
(void)service;
//这里返回的是当前g_server的名称,即SAMGR_SERVICE服务
return SAMGR_SERVICE;
}
服务初始化
/*
函数功能:服务初始化
函数参数:@service:SamgrServer服务
@identity:身份标识
函数描述:配置SamgrServer服务的信息,包括Saname和identity。然后注册到当前进程通信端点的routers中。
*/
static BOOL Initialize(Service *service, Identity identity)
{
SamgrServer *server = (SamgrServer *)service;
//赋值身份标识
server->identity = identity;
//初始化saname,包含service的name和feature的name,此时服务名为SAMGR_SERVICE,功能名无
SaName saName = {SAMGR_SERVICE, NULL};
//将saName, identity等信息封装成router,添加到当前进程通信端点endpoint的routers中。
//当endpoint的routers中存在对象时,会为endpoint创建一个专门接收和分发其他进程发来的消息。
SAMGR_AddRouter(server->samgr, &saName, &server->identity, GET_IUNKNOWN(*server));
return TRUE;
}
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: