📚往期学习笔录📰:

📰 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
📰 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
📰 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
📰 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
📰 记录一场鸿蒙开发岗位面试经历~
📰 持续更新中……


前言

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);
}

处理回复消息

/**
 * 函数功能:处理消息回复
 * 函数参数:
 *         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和回复消息。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐