往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(1)
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(2)
- OpenHarmony轻量系统服务管理-samgr:common赏析及实现
- OpenHarmony轻量系统服务管理-samgr:iunknown赏析
- OpenHarmony轻量系统服务管理-samgr:iunknown实现分析
- OpenHarmony轻量系统服务管理samgr-message赏析
- OpenHarmony轻量系统服务管理samgr-message实现分析(1)
- OpenHarmony轻量系统服务管理samgr-message实现分析(2)
- OpenHarmony轻量系统服务管理samgr-service赏析
- OpenHarmony轻量系统服务管理samgr-samgr_lite赏析
- OpenHarmony轻量系统服务管理samgr-feature赏析及实现
- OpenHarmony轻量系统服务管理samgr-service实现分析(1)
- OpenHarmony轻量系统服务管理samgr-service实现分析(2)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(1)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(2)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(一)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(二)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(三)
- 持续更新中……
本文继续分析samgr_lite的函数实现。文件位于distributedschedule_samgr_lite\samgr\source\samgr_lite.c
函数实现分析
为服务注册子功能
/*
函数功能:注册功能
函数描述:向服务中注册指定的功能,该服务需要是SVC_INIT状态。
将feature封装为FeatureImpl对象,再添加到ServiceImpl的features中
*/
static BOOL RegisterFeature(const char *serviceName, Feature *feature)
{
if (IsInvalidFeature(feature)) {
return FALSE;
}
//根据name获取对应的serviceImpl对象
ServiceImpl *serviceImpl = GetService(serviceName);
if (serviceImpl == NULL || serviceImpl->inited != SVC_INIT) {
//需要在服务初始化前注册feature
return FALSE;
}
//根据serviceImpl和featureName获取FeatureImpl对象
if (DEFAULT_GetFeature(serviceImpl, feature->GetName(feature)) != NULL) {
//服务中已存在当前的FeatureImpl
return FALSE;
}
//将feature封装为FeatureImpl对象,再添加到ServiceImpl的features中
int16 featureId = DEFAULT_AddFeature(serviceImpl, feature);
if (featureId < 0) {
return FALSE;
}
return TRUE;
}
删除服务中的子功能
/*
函数功能:删除功能
函数描述:删除服务中的指定功能,该功能的iunknown不能为NULL,否则返回NULL。
先停止功能然后删除,并返回被删除的feature。
*/
static Feature *UnregisterFeature(const char *serviceName, const char *featureName)
{
//通过serviceName获取serviceImpl对象
ServiceImpl *serviceImpl = GetService(serviceName);
if (serviceImpl == NULL) {
return NULL;
}
//删除serviceImpl中名称为featureName的feature,删除的同时停止feature
return DEFAULT_DeleteFeature(serviceImpl, featureName);
}
注册API接口
/*
函数功能:注册API接口
函数描述:向指定服务的指定功能注册API接口。
若该功能不存在,则注册到服务的默认API中。
若该功能存在且未注册API,则进行注册,否则失败。
*/
static BOOL RegisterFeatureApi(const char *serviceName, const char *feature, IUnknown *publicApi)
{
//判断指定的IUnknown是否有效
if (IsInvalidIUnknown(publicApi)) {
return FALSE;
}
//在samgr中查找指定name的serviceImpl对象
ServiceImpl *serviceImpl = GetService(serviceName);
if (serviceImpl == NULL) {
return FALSE;
}
//若feature为NULL,则将publicApi添加到serviceImpl->defaultApi
if (feature == NULL) {
if (serviceImpl->defaultApi != NULL) {
//已注册有默认接口,返回false
return FALSE;
}
serviceImpl->defaultApi = publicApi;
return TRUE;
}
//服务中存在子功能
//根据serviceImpl和feature获取FeatureImpl对象
FeatureImpl *featureImpl = DEFAULT_GetFeature(serviceImpl, feature);
if (featureImpl == NULL) {
return FALSE;
}
//为featureImpl添加接口,FeatureImpl包含两个成员:feature和iUnknown
return SAMGR_AddInterface(featureImpl, publicApi);
}
删除API接口
/*
函数功能:删除API接口
函数返回:成功 返回被删除的iunknown,失败 返回NULL
函数描述:删除指定服务下指定功能的API接口
若参数feature为NULL,则删除serviceImpl中的defaultApi。
若不为NULL,则删除指定的featureImpl的iunknown
*/
static IUnknown *UnregisterFeatureApi(const char *serviceName, const char *feature)
{
//在samgr中查找指定name的serviceImpl对象
ServiceImpl *serviceImpl = GetService(serviceName);
if (serviceImpl == NULL) {
return NULL;
}
//若feature为NULL,则将serviceImpl->defaultApi置为NULL
if (feature == NULL) {
IUnknown *iUnknown = serviceImpl->defaultApi;
serviceImpl->defaultApi = NULL;
return iUnknown;
}
//若feature不为NULL,则将featureImpl的iUnknown成员赋值为NULL,并返回iUnknown
return SAMGR_DelInterface(DEFAULT_GetFeature(serviceImpl, feature));
}
注册默认API接口
/*
函数功能:注册默认API接口
函数返回:注册成功返回true,注册失败返回false
函数描述:向服务注册默认的API接口。
即将iunknown赋值给serviceImpl->defaultApi
*/
static BOOL RegisterDefaultFeatureApi(const char *serviceName, IUnknown *publicApi)
{
//feature为NULL,将接口赋给serviceImpl->defaultApi
return RegisterFeatureApi(serviceName, NULL, publicApi);
}
删除默认API接口
/*
函数功能:删除默认API接口
函数返回:删除成功返回被删除的iunknown,删除失败返回NULL
函数描述:删除服务的默认API接口。
即将serviceImpl->defaultApi置为NULL
*/
static IUnknown *UnregisterDefaultFeatureApi(const char *serviceName)
{
//feature为NULL,则将serviceImpl->defaultApi置为NULL
return UnregisterFeatureApi(serviceName, NULL);
}
获取默认API接口
//获取服务默认的API接口
static IUnknown *GetDefaultFeatureApi(const char *serviceName)
{
//第二个参数为NULL,则返回serviceImpl->defaultApi;
return GetFeatureApi(serviceName, NULL);
}
注册系统能力
//添加系统能力
static int32 AddSystemCapability(const char *sysCap)
{
//参数检查
if (sysCap == NULL || strlen(sysCap) == 0 || strlen(sysCap) > MAX_SYSCAP_NAME_LEN) {
return EC_INVALID;
}
//注册系统能力
return SAMGR_RegisterSystemCapabilityApi(sysCap, TRUE);
}
查询系统能力是否存在
//判断sysCap是否已存在,在注册前进行判断
static BOOL HasSystemCapability(const char *sysCap)
{
if (sysCap == NULL || strlen(sysCap) == 0 || strlen(sysCap) > MAX_SYSCAP_NAME_LEN) {
return FALSE;
}
//判断sysCap是否已存在
return SAMGR_QuerySystemCapabilityApi(sysCap);
}
获取已注册的系统能力
//获取可用的系统能力
static int32 GetSystemAvailableCapabilities(char sysCaps[MAX_SYSCAP_NUM][MAX_SYSCAP_NAME_LEN], int32 *sysCapNum)
{
if (sysCaps == NULL || sysCapNum == NULL) {
return EC_INVALID;
}
//获取所有已注册的syscap的数目存储在size中,并将所有的syscap的name存在sysCaps中
return SAMGR_GetSystemCapabilitiesApi(sysCaps, sysCapNum);
}
获取API接口
/*
函数功能:获取API接口
函数返回:获取成功返回API接口,获取失败返回NULL
函数描述:获取指定服务下指定功能的API接口。
若该功能存在,则返回featureImpl的成员iUnknown
若该功能不存在,则返回服务的默认API接口
*/
static IUnknown *GetFeatureApi(const char *serviceName, const char *feature)
{
//根据服务名获取samgr中的serviceImpl对象
ServiceImpl *serviceImpl = GetService(serviceName);
if (serviceImpl == NULL) {
//当前进程没有这个服务,需要向其他进程查询
return SAMGR_FindServiceApi(serviceName, feature);
}
//从serviceImpl对象中获取指定featurename的featureImpl对象
FeatureImpl *featureImpl = DEFAULT_GetFeature(serviceImpl, feature);
if (featureImpl == NULL && feature == NULL) {
//featureImpl对象不存在且featurename为NULL
//返回服务的默认API接口
return serviceImpl->defaultApi;
}
//返回featureImpl的成员iUnknown
return SAMGR_GetInterface(featureImpl);
}
获取未初始化服务的下标
/*
函数功能:获取状态为SVC_INIT的服务下标
函数返回:找到则返回对应的下标,未找到则返回最后一个对象的下一个下标,在这里表现为vector的size值
函数描述:遍历samgr维护的所有服务,查找状态为SVC_INIT的服务,返回对应的下标
*/
static short GetUninitializedPos()
{
//获取samgr实例
SamgrLiteImpl *manager = GetImplement();
//加锁
MUTEX_Lock(manager->mutex);
//获取samgr维护的服务数量
int16 size = VECTOR_Size(&(manager->services));
int16 i;
//遍历所有对象,若有状态为SVC_INIT的,则返回下标
for (i = 0; i < size; ++i) {
//根据指定下标获取ServiceImpl对象
ServiceImpl *service = (ServiceImpl *)VECTOR_At(&(manager->services), i);
if (service == NULL) {
continue;
}
if (service->inited == SVC_INIT) {
//解锁,若不进行解锁操作,函数返回会发生死锁现象
MUTEX_Unlock(manager->mutex);
return i;
}
}
MUTEX_Unlock(manager->mutex);
return size;
}
本部分还有许多函数待分析,将在后续的文章进行分析。
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: