OpenHarmony分布式调度详解|dmslite_msg_handler.c

36 阅读2分钟

前言

foundation\distributedschedule\dmsfwk_lite\source\dmslite_msg_handler.c文件中包括两个函数:StartAbilityFromRemoteHandler()用于接收会话消息数据解析得到的启动FA的命令id,用于启动FA;ReplyMsgHandler()用于回复消息。

代码分析

远程启动ability

/**
 * 函数功能:远程启动Ability处理
 * 函数参数:
 *      tlvHead:tlv数据链表
 *      onStartAbilityDone:启动Ability的回调函数
 * 函数返回值:
 *      权限检查后返回一个StartAbilityFromRemote对象,用于启动ability
 * 描述:
 * 1.从TlvNode格式的数据中获取包名、ability名和签名
 * 2.声明一个用于封装需要检查的信息的permissionCheckInfo结构体,并将包名、ability名和签名封装在permissionCheckInfo中
 * 3.调用CheckRemotePermission进行权限检查
 * 4.如果检查不通过,返回错误码
 * 5.如果检查通过,调用StartAbilityFromRemote,启动ability
 */
int32_t StartAbilityFromRemoteHandler(const TlvNode *tlvHead, StartAbilityCallback onStartAbilityDone)
{
    // 根据tlv数据中的type值,从tlv链表中获取bundleName、abilityName、callerSignature
    const char *calleeBundleName = UnMarshallString(tlvHead, DMS_TLV_TYPE_CALLEE_BUNDLE_NAME);
    const char *calleeAbilityName = UnMarshallString(tlvHead, DMS_TLV_TYPE_CALLEE_ABILITY_NAME);
    const char *callerSignature = UnMarshallString(tlvHead, DMS_TLV_TYPE_CALLER_SIGNATURE);
    // 将bundleName、abilityName和sigture封装为一个PermissionCheckInfo对象,并进行权限检查
    PermissionCheckInfo permissionCheckInfo;
    permissionCheckInfo.calleeAbilityName = calleeAbilityName;
    permissionCheckInfo.calleeBundleName = calleeBundleName;
    permissionCheckInfo.callerSignature = callerSignature;
    int32_t errCode = CheckRemotePermission(&permissionCheckInfo);
    if (errCode != DMS_EC_SUCCESS) { // 如果不为0,权限检查不通过
        HILOGE("[Remote permission check failed]");
        return errCode;
    }
    return StartAbilityFromRemote(calleeBundleName, calleeAbilityName, onStartAbilityDone);
}
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.鸿蒙版性能优化指南
.......

处理回复消息

/**
 * 函数功能:处理消息回复
 * 函数参数:
 *         tlvHead:tlv数据链表
 * 函数返回值:
 *        返回一个type为REPLY_ERR_CODE的Uint64类型的value
 */
int32_t ReplyMsgHandler(const TlvNode *tlvHead)
{
    CloseDMSSession(); // 关闭Session会话,关闭相应的sessionId,将全局变量g_curSessionId和g_curBusy设置为默认值
    return UnMarshallUint64(tlvHead, REPLY_ERR_CODE); // 将TlvNode中的value值转换为Uint64类型并返回
}

总结

该文件中主要包含一些对解析后的命令id的操作,目前只支持两种操作——远程启动ability和回复消息。