前言
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和回复消息。