本文接续上文继续对service.c中相关函数的实现进行分析。
默认的消息处理函数
/*
函数功能:默认的消息处理函数,处理IUnknown发送的请求消息
函数参数:@serviceImpl:serviceImpl对象
@identity:身份标识
@msg:请求消息
函数返回:无返回值
函数描述:首先判断身份是否合法,然后再调用相应的消息处理函数。
判断身份标识中的featureid是否有效,若无效则调用service的消息处理函数
若有效则调用对应的feature的消息处理函数
*/
void DEFAULT_MessageHandle(ServiceImpl *serviceImpl, const Identity *identity, Request *msg)
{
//参数检查
if (serviceImpl->serviceId != identity->serviceId) {
//身份标识identity中指示的serviceId与当前服务不匹配
return;
}
if (identity->featureId < 0) {
//未指定feature,则调用service的消息处理函数
if (serviceImpl->service->MessageHandle != NULL) {
//用于处理调用者发送的请求
serviceImpl->service->MessageHandle(serviceImpl->service, msg);
}
return;
}
//有指定featureid,则调用对应的feature处理消息
//判断featureid是否合法
if (VECTOR_Size(&serviceImpl->features) <= identity->featureId) {
return;
}
//根据featureid返回对应的featureImpl对象,featureid对应于features中的feature的下标
FeatureImpl *featureImpl = (FeatureImpl *)VECTOR_At(&(serviceImpl->features), identity->featureId);
if (featureImpl == NULL) {
return;
}
//通过对应的feature处理消息,用于处理调用者发送的请求
featureImpl->feature->OnMessage(featureImpl->feature, msg);
}
停止服务
/*
函数功能:停止指定的服务
函数描述:调用本函数用于停止一个服务,停止服务本质上就是停止服务(service)下属的所有子功能(feature)。
最后更新状态为SVC_INIT
*/
void DEFAULT_StopService(ServiceImpl *service)
{
if (service == NULL) {
return;
}
//配置身份标识
Identity id = {service->serviceId, INVALID_INDEX, (service->taskPool != NULL) ? service->taskPool->queueId : NULL};
//获取features中feature的个数
int16 size = VECTOR_Size(&service->features);
int16 i;
//遍历features集合
for (i = 0; i < size; ++i) {
//根据下标返回FeatureImpl对象
FeatureImpl *featureImpl = (FeatureImpl *)VECTOR_At(&(service->features), i);
if (featureImpl == NULL) {
continue;
}
//标识指定的feature
id.featureId = i;
//停止feature
featureImpl->feature->OnStop(featureImpl->feature, id);
}
//更新状态为SVC_INIT
service->inited = SVC_INIT;
}
获取feature实例对象
/*
函数功能:获取featureimpl对象
函数描述:查询并返回serviceimpl的features中指定name的featureimpl对象
*/
FeatureImpl *DEFAULT_GetFeature(ServiceImpl *serviceImpl, const char *featureName)
{
//参数检查
if (serviceImpl == NULL || featureName == NULL) {
return NULL;
}
//根据featureName查询,返回相应元素下标
short pos = VECTOR_FindByKey(&(serviceImpl->features), (void *)featureName);
//返回指定下标的FeatureImpl对象
return (FeatureImpl *)VECTOR_At(&(serviceImpl->features), pos);
}
获取feature的身份标识
/*
函数功能:获取指定feature的身份标识
函数参数:@serviceImpl:服务对象
@feature:feature的name
函数描述:首先判断serviceImpl是否为NULL,若为NULL则返回初始身份标识。
若不为NULL则更新identity.serviceId值和identity.queueId。
然后在serviceImpl的features集合中,根据指定的featurename查找对应的featureImpl对象。
若找到对应的featureImpl对象,则更新identity.featureid
若未找到,则不更新。最后返回identity
*/
Identity DEFAULT_GetFeatureId(ServiceImpl *serviceImpl, const char *feature)
{
//初始身份标识
Identity identity = {INVALID_INDEX, INVALID_INDEX, NULL};
if (serviceImpl == NULL) {
return identity;
}
//更新服务标识
identity.serviceId = serviceImpl->serviceId;
if (serviceImpl->taskPool != NULL) {
//服务绑定的任务池不为NULL,则获取任务池绑定的消息队列ID
identity.queueId = serviceImpl->taskPool->queueId;
}
//根据feature的name获取对应的featureimpl下标
int16 pos = VECTOR_FindByKey(&(serviceImpl->features), (void *)feature);
//根据下标返回FeatureImpl对象
FeatureImpl *featureImpl = (FeatureImpl *)VECTOR_At(&(serviceImpl->features), pos);
if (featureImpl == NULL) {
//指定下标的featureImpl对象不存在
return identity;
}
//若查询成功,则赋值pos
identity.featureId = pos;
return identity;
}
删除服务中指定的子功能
//删除serviceImpl中名称为featureName的feature,删除的同时停止feature
Feature *DEFAULT_DeleteFeature(ServiceImpl *serviceImpl, const char *featureName)
{
//参数检查
if (serviceImpl == NULL || featureName == NULL) {
return NULL;
}
//获取指定featureName在features中的下标
int16 pos = VECTOR_FindByKey(&(serviceImpl->features), (void *)featureName);
if (pos < 0 || !SAMGR_IsNoInterface((FeatureImpl *)VECTOR_At(&serviceImpl->features, pos))) {
//下标不合法,或者featureImpl不为NULL且featureImpl的接口不为NULL
return NULL;
}
//将features中指定下标的元素与NULL值交换,起到删除的作用。
//成功 返回被替换的元素,失败 返回NULL
FeatureImpl *featureImpl = (FeatureImpl *)VECTOR_Swap(&(serviceImpl->features), pos, NULL);
if (featureImpl == NULL) {
return NULL;
}
//标识服务ID
Identity id = {serviceImpl->serviceId, INVALID_INDEX, NULL};
//停止指定的feature
featureImpl->feature->OnStop(featureImpl->feature, id);
//返回feature,并释放featureImpl占用的空间
Feature *feature = featureImpl->feature;
SAMGR_Free(featureImpl);
return feature;
}
获取子功能名称
//根据featureImpl返回相应的feature的name
static const char *GetFeatureName(const FeatureImpl *featureImpl)
{
if (featureImpl == NULL) {
return NULL;
}
//获取feature的name并返回
return featureImpl->feature->GetName(featureImpl->feature);
}
总是有很多小伙伴反馈说:OpenHarmony开发不知道学习哪些技术?不知道需要重点掌握哪些OpenHarmony开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙全栈开发学习路线与学习文档给大家用来跟着学习。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。
OpenHarmony 开发环境搭建:https://gitcode.com/HarmonyOS_MN/733GH/overview
《OpenHarmony源码解析》
搭建开发环境
系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……