往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理|samgr_server功能详解(一)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(二)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(三)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(四)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(五)
- OpenHarmony轻量系统服务管理|samgr_server功能详解(六)
- OpenHarmony分布式调度详解|dmslite.c
- OpenHarmony分布式调度详解|dmslite_feature.c 源码阅读
- OpenHarmony分布式调度详解|dmslite_session.c
- OpenHarmony分布式调度详解|dmslite_tlv_common.c
- OpenHarmony分布式调度详解|dmslite_famgr.c
- OpenHarmony分布式调度详解|dmslite_msg_handler.c
- 持续更新中……
前言
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和回复消息。
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: