OpenHarmony轻量系统服务管理samgr-service实现分析(2)

100 篇文章 0 订阅
100 篇文章 1 订阅

往期知识点记录:

本文接续上文继续对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);
}

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值