TIMSignalingManager.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. // Copyright (c) 2023 Tencent. All rights reserved.
  2. #ifndef SRC_PLATFORM_CROSS_PLATFORM_INCLUDE_TIM_SIGNALING_MANAGER_H_
  3. #define SRC_PLATFORM_CROSS_PLATFORM_INCLUDE_TIM_SIGNALING_MANAGER_H_
  4. #include "TIMCloudDef.h"
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. // 模块简介
  9. // - 信令接口,包含通话邀请相关功能
  10. //
  11. // 模块参数说明
  12. // - API 的参数采用 json 字符串格式,请使用文件中预先定义的 JsonKey 进行参数传递和解析
  13. // - 如果参数中包含非英文字符,请使用 UTF-8 编码
  14. //
  15. // 模块回调说明
  16. // 1. 回调的类型:
  17. // - 调用 API 时传入的 TIMCommCallback 回调,用于异步返回 API 的调用结果
  18. // - 调用 TIMSetXXXCallback 设置的全局回调,用于接收后台推送的通知
  19. // 2. 回调触发的线程:
  20. // - 对于 Windows 平台,当在主线程中调用 @ref TIMInit 接口时,SDK 会将所有回调抛到主线程,请确保主线程已创建消息循环;否则,回调将在 SDK 内部的逻辑线程触发
  21. // - 对于 Android 平台,当调用 @ref TIMInit 接口的线程支持消息循环时,SDK 会将所有回调抛到该线程;否则,回调将在 SDK 内部的逻辑线程触发
  22. // - 对于 iOS 和 MAC 平台,SDK 默认将所有回调抛到主线程
  23. // - 对于 Linux 平台,暂不支持将回调抛到主线程,回调将在 SDK 内部的逻辑线程触发
  24. /////////////////////////////////////////////////////////////////////////////////
  25. //
  26. // 一. 信令相关配置选项定义
  27. //
  28. /////////////////////////////////////////////////////////////////////////////////
  29. // 1.1 信令响应类型
  30. enum TIMSignalingActionType {
  31. // 未定义
  32. TIMSignalingActionType_Unknown,
  33. // 邀请方发起邀请
  34. TIMSignalingActionType_Invite,
  35. // 邀请方取消邀请
  36. TIMSignalingActionType_CancelInvite,
  37. // 被邀请方接受邀请
  38. TIMSignalingActionType_AcceptInvite,
  39. // 被邀请方拒绝邀请
  40. TIMSignalingActionType_RejectInvite,
  41. // 邀请超时
  42. TIMSignalingActionType_InviteTimeout,
  43. };
  44. /////////////////////////////////////////////////////////////////////////////////
  45. //
  46. // 二. 信令事件回调定义
  47. //
  48. /////////////////////////////////////////////////////////////////////////////////
  49. /**
  50. * 2.1 收到邀请的回调
  51. *
  52. * @param invite_id 邀请 ID
  53. * @param inviter 邀请者 userID
  54. * @param group_id 群组 ID
  55. * @param json_invitee_list 被邀请者 userID 列表,json 字符串类型
  56. * @param data 自定义字段
  57. * @param user_data ImSDK负责透传的用户自定义数据,未做任何处理
  58. */
  59. typedef void (*TIMSignalingReceiveNewInvitationCallback)(const char* invite_id, const char* inviter, const char* group_id,
  60. const char* json_invitee_list, const char* data, const void* user_data);
  61. /**
  62. * 2.2 邀请被取消的回调
  63. *
  64. * @param invite_id 邀请 ID
  65. * @param inviter 邀请者 userID
  66. * @param data 自定义字段
  67. * @param user_data ImSDK负责透传的用户自定义数据,未做任何处理
  68. */
  69. typedef void (*TIMSignalingInvitationCancelledCallback)(const char* invite_id, const char* inviter, const char* data, const void* user_data);
  70. /**
  71. * 2.3 被邀请者接受邀请的回调
  72. *
  73. * @param invite_id 邀请 ID
  74. * @param invitee 被邀请者 userID
  75. * @param data 自定义字段
  76. * @param user_data ImSDK负责透传的用户自定义数据,未做任何处理
  77. */
  78. typedef void (*TIMSignalingInviteeAcceptedCallback)(const char* invite_id, const char* invitee, const char* data, const void* user_data);
  79. /**
  80. * 2.4 被邀请者拒绝邀请的回调
  81. *
  82. * @param invite_id 邀请 ID
  83. * @param invitee 被邀请者 userID
  84. * @param data 自定义字段
  85. * @param user_data ImSDK负责透传的用户自定义数据,未做任何处理
  86. */
  87. typedef void (*TIMSignalingInviteeRejectedCallback)(const char* invite_id, const char* invitee, const char* data, const void* user_data);
  88. /**
  89. * 2.5 邀请超时的回调
  90. *
  91. * @param invite_id 邀请 ID
  92. * @param json_invitee_list 被邀请者 userID 列表,json 字符串类型
  93. * @param user_data ImSDK负责透传的用户自定义数据,未做任何处理
  94. */
  95. typedef void (*TIMSignalingInvitationTimeoutCallback)(const char* invite_id, const char* json_invitee_list, const void* user_data);
  96. /**
  97. * 2.6 邀请被修改的回调(6.7 及其以上版本支持)
  98. *
  99. * @param invite_id 邀请 ID
  100. * @param data 自定义字段
  101. * @param user_data ImSDK负责透传的用户自定义数据,未做任何处理
  102. */
  103. typedef void (*TIMSignalingInvitationModifiedCallback)(const char* invite_id, const char* data, const void* user_data);
  104. /////////////////////////////////////////////////////////////////////////////////
  105. //
  106. // 三. 注册信令事件回调 API
  107. //
  108. /////////////////////////////////////////////////////////////////////////////////
  109. /**
  110. * 3.1 设置收到信令邀请的回调
  111. *
  112. * @param cb 收到信令邀请的回调,请参考 @ref TIMSignalingReceiveNewInvitationCallback
  113. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  114. */
  115. TIM_API void TIMSetSignalingReceiveNewInvitationCallback(TIMSignalingReceiveNewInvitationCallback cb, const void *user_data);
  116. /**
  117. * 3.2 设置信令邀请被取消的回调
  118. *
  119. * @param cb 信令邀请被取消的回调,请参考 @ref TIMSignalingInvitationCancelledCallback
  120. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  121. */
  122. TIM_API void TIMSetSignalingInvitationCancelledCallback(TIMSignalingInvitationCancelledCallback cb, const void *user_data);
  123. /**
  124. * 3.3 设置信令邀请被接收者同意的回调
  125. *
  126. * @param cb 同意信令邀请的回调,请参考 @ref TIMSignalingInviteeAcceptedCallback
  127. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  128. */
  129. TIM_API void TIMSetSignalingInviteeAcceptedCallback(TIMSignalingInviteeAcceptedCallback cb, const void *user_data);
  130. /**
  131. * 3.4 设置信令邀请被接收者拒绝的回调
  132. *
  133. * @param cb 拒绝信令邀请的回调,请参考 @ref TIMSignalingInviteeRejectedCallback
  134. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  135. */
  136. TIM_API void TIMSetSignalingInviteeRejectedCallback(TIMSignalingInviteeRejectedCallback cb, const void *user_data);
  137. /**
  138. * 3.5 设置信令邀请超时的回调
  139. *
  140. * @param cb 信令邀请超时的回调,请参考 @ref TIMSignalingInvitationTimeoutCallback
  141. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  142. */
  143. TIM_API void TIMSetSignalingInvitationTimeoutCallback(TIMSignalingInvitationTimeoutCallback cb, const void *user_data);
  144. /**
  145. * 3.6 设置信令邀请被修改的回调
  146. *
  147. * @param cb 信令邀请被修改的回调,请参考 @ref TIMSignalingInvitationModifiedCallback
  148. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  149. */
  150. TIM_API void TIMSetSignalingInvitationModifiedCallback(TIMSignalingInvitationModifiedCallback cb, const void *user_data);
  151. /////////////////////////////////////////////////////////////////////////////////
  152. //
  153. // 四. 信令 API
  154. //
  155. /////////////////////////////////////////////////////////////////////////////////
  156. /**
  157. * 4.1 邀请某个人
  158. *
  159. * @param invitee 被邀请人的 userID
  160. * @param data 自定义数据
  161. * @param online_user_only 是否只有在线用户才能收到邀请,如果设置为 true,只有在线用户才能收到,并且 invite 操作也不会产生历史消息(针对该次 invite 的后续 cancel、accept、reject、timeout 操作也同样不会产生历史消息)
  162. * @param json_offline_push_info 离线推送时携带的标题和声音,其中 desc 为必填字段,推送的时候会默认展示 desc 信息,Json key 的定义请参考 @ref OfflinePushConfig
  163. * @param timeout 超时时间,单位 s,如果设置为 0,SDK 不会做超时检测,也不触发 @ref TIMSignalingInvitationTimeoutCallback 回调
  164. * @param invite_id_buffer 出参,邀请 ID,分配内存大小不能低于 128 字节,如果不需要,可传入 nullptr,调用接口后,可以读取到以 '\0' 结尾的字符串
  165. * @param cb 回调
  166. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  167. * @return int 返回TIM_SUCC表示接口调用成功(接口只有返回TIM_SUCC,回调cb才会被调用),其他值表示接口调用失败。每个返回值的定义请参考 @ref TIMResult
  168. *
  169. * __示例__
  170. * @code{.cpp}
  171. * Json::Value json_offline_push_info;
  172. * json_offline_push_info[kTIMOfflinePushConfigDesc] = "push desc";
  173. *
  174. * const size_t kMessageIDLength = 128;
  175. * char invite_id_buffer[kMessageIDLength] = {0};
  176. * int ret = TIMSignalingInvite("user", "custom data", true, json_offline_push_info, 30, invite_id_buffer,
  177. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  178. * if (ERR_SUCC == code) {
  179. * // 邀请成功
  180. * } else {
  181. * // 邀请失败
  182. * }
  183. * }, nullptr);
  184. * @endcode
  185. */
  186. TIM_API int TIMSignalingInvite(const char* invitee, const char* data, bool online_user_only, const char* json_offline_push_info, int timeout, char* invite_id_buffer, TIMCommCallback cb, const void* user_data);
  187. /**
  188. * 4.2 邀请群内的某些人
  189. *
  190. * @param group_id 发起邀请所在群组
  191. * @param json_invitee_array 被邀请人列表,且被邀请人必须已经在群组内,否则邀请无效
  192. * @param data 自定义字段
  193. * @param online_user_only 是否只有在线用户才能收到邀请,如果设置为 true,只有在线用户才能收到,并且 invite 操作也不会产生历史消息(针对该次 invite 的后续 cancel、accept、reject、timeout 操作也同样不会产生历史消息)
  194. * @param timeout 超时时间,单位 s,如果设置为 0,SDK 不会做超时检测,也不触发 @ref TIMSignalingInvitationTimeoutCallback 回调
  195. * @param invite_id_buffer 出参,邀请ID,分配内存大小不能低于 128 字节,如果不需要,可传入 nullptr,调用接口后,可以读取到以 '\0' 结尾的字符串
  196. * @param cb 回调
  197. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  198. * @return int 返回TIM_SUCC表示接口调用成功(接口只有返回TIM_SUCC,回调cb才会被调用),其他值表示接口调用失败。每个返回值的定义请参考 @ref TIMResult
  199. *
  200. * __示例__
  201. * @code{.cpp}
  202. * Json::Value json_invitee_array(Json::arrayValue);
  203. * json_invitee_array.append("user1");
  204. * json_invitee_array.append("user2");
  205. *
  206. * const size_t kMessageIDLength = 128;
  207. * char invite_id_buffer[kMessageIDLength] = {0};
  208. * int ret = TIMSignalingInviteInGroup("group_id", json_invitee_array, "custom data", true, 30, invite_id_buffer,
  209. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  210. * if (ERR_SUCC == code) {
  211. * // 邀请成功
  212. * } else {
  213. * // 邀请失败
  214. * }
  215. * }, nullptr);
  216. * @endcode
  217. */
  218. TIM_API int TIMSignalingInviteInGroup(const char* group_id, const char* json_invitee_array, const char* data, bool online_user_only, int timeout, char* invite_id_buffer, TIMCommCallback cb, const void* user_data);
  219. /**
  220. * 4.3 邀请方取消邀请
  221. *
  222. * @param invite_id 邀请 ID
  223. * @param data 自定义字段
  224. * @param cb 回调
  225. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  226. * @return int 返回TIM_SUCC表示接口调用成功(接口只有返回TIM_SUCC,回调cb才会被调用),其他值表示接口调用失败。每个返回值的定义请参考 @ref TIMResult
  227. *
  228. * @note 如果所有被邀请人都已经处理了当前邀请(包含超时),不能再取消当前邀请。
  229. *
  230. * __示例__
  231. * @code{.cpp}
  232. * const char *invite_id = "XXX-XXX-XXX-XXX";
  233. * int ret = TIMSignalingCancel(invite_id, "",
  234. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  235. * if (ERR_SUCC == code) {
  236. * // 取消成功
  237. * } else {
  238. * // 取消失败
  239. * }
  240. * }, nullptr);
  241. * @endcode
  242. */
  243. TIM_API int TIMSignalingCancel(const char* invite_id, const char* data, TIMCommCallback cb, const void* user_data);
  244. /**
  245. * 4.4 被邀请方接受邀请
  246. *
  247. * @param invite_id 邀请 ID
  248. * @param data 自定义字段
  249. * @param cb 回调
  250. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  251. * @return int 返回TIM_SUCC表示接口调用成功(接口只有返回TIM_SUCC,回调cb才会被调用),其他值表示接口调用失败。每个返回值的定义请参考 @ref TIMResult
  252. *
  253. * @note 不能接受不是针对自己的邀请,请在收到 @ref TIMSignalingReceiveNewInvitation 回调的时候先判断 json_invitee_array 有没有自己,如果没有自己,不能 accept 邀请。
  254. *
  255. * __示例__
  256. * @code{.cpp}
  257. * const char *invite_id = "XXX-XXX-XXX-XXX";
  258. * int ret = TIMSignalingAccept(invite_id, "",
  259. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  260. * if (ERR_SUCC == code) {
  261. * // 接受邀请成功
  262. * } else {
  263. * // 接受邀请失败
  264. * }
  265. * }, nullptr);
  266. * @endcode
  267. */
  268. TIM_API int TIMSignalingAccept(const char* invite_id, const char* data, TIMCommCallback cb, const void* user_data);
  269. /**
  270. * 4.5 被邀请方拒绝邀请
  271. *
  272. * @param invite_id 邀请 ID
  273. * @param data 自定义字段
  274. * @param cb 回调
  275. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  276. * @return int 返回TIM_SUCC表示接口调用成功(接口只有返回TIM_SUCC,回调cb才会被调用),其他值表示接口调用失败。每个返回值的定义请参考 @ref TIMResult
  277. *
  278. * @note 不能拒绝不是针对自己的邀请,请在收到 @ref TIMSignalingReceiveNewInvitation 回调的时候先判断 json_invitee_array 有没有自己,如果没有自己,不能 reject 邀请。
  279. *
  280. * __示例__
  281. * @code{.cpp}
  282. * const char *invite_id = "XXX-XXX-XXX-XXX";
  283. * int ret = TIMSignalingReject(invite_id, "",
  284. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  285. * if (ERR_SUCC == code) {
  286. * // 拒绝邀请成功
  287. * } else {
  288. * // 拒绝邀请失败
  289. * }
  290. * }, nullptr);
  291. * @endcode
  292. */
  293. TIM_API int TIMSignalingReject(const char* invite_id, const char* data, TIMCommCallback cb, const void* user_data);
  294. /**
  295. * 4.6 获取信令信息
  296. *
  297. * @param json_msg 消息 json 字符串
  298. * @param json_signaling_info_cb 获取信令消息的回调,您可以在该回调中根据 code == ERR_SUCC 来确定当前 json_msg 为信令消息
  299. * @param user_data 用户自定义数据,ImSDK只负责传回给回调函数cb,不做任何处理
  300. * @return int 返回TIM_SUCC表示接口调用成功(接口只有返回TIM_SUCC,回调cb才会被调用),其他值表示接口调用失败。每个返回值的定义请参考 @ref TIMResult
  301. *
  302. * @note
  303. * 如果 invite 设置 online_user_only 为 false,每次信令操作(包括 invite、cancel、accept、reject、timeout)都会产生一条自定义消息,该消息会通过 @ref TIMRecvNewMsgCallback 抛给用户,用户也可以通过历史消息拉取,如果需要根据信令信息做自定义化文本展示,可以调用下面接口获取信令信息。
  304. *
  305. * __示例__
  306. * @code{.cpp}
  307. * const char *json_msg = "";
  308. * int ret = TIMGetSignalingInfo(json_msg,
  309. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  310. * if (ERR_SUCC == code) {
  311. * // 当前消息是信令消息
  312. * } else {
  313. * // 当前消息为普通消息
  314. * }
  315. * }, nullptr);
  316. * @endcode
  317. */
  318. TIM_API int TIMGetSignalingInfo(const char *json_msg, TIMCommCallback json_signaling_info_cb, const void* user_data);
  319. /**
  320. * 4.7 修改邀请信令(6.7 及其以上版本支持)
  321. *
  322. * @note 仅支持修改邀请信令的自定义字段 data。只有在线用户才能收到的邀请信令不能被修改。
  323. *
  324. * __示例__
  325. * @code{.cpp}
  326. * const char *invite_id = "XXX-XXX-XXX-XXX";
  327. * int ret = TIMSignalingModifyInvitation(invite_id, "",
  328. * [](int32_t code, const char* desc, const char* json_params, const void* user_data){
  329. * if (ERR_SUCC == code) {
  330. * // 修改邀请成功
  331. * } else {
  332. * // 修改邀请失败
  333. * }
  334. * }, nullptr);
  335. * @endcode
  336. */
  337. TIM_API int TIMSignalingModifyInvitation(const char* invite_id, const char* data, TIMCommCallback cb, const void* user_data);
  338. /////////////////////////////////////////////////////////////////////////////////
  339. //
  340. // 五. 信令 API 参数相关的 Json Key 定义
  341. //
  342. /////////////////////////////////////////////////////////////////////////////////
  343. //------------------------------------------------------------------------------
  344. // 5.1 SignalingInfo(信令基础信息定义)
  345. // string, 只读, 邀请 ID
  346. static const char* kTIMSignalingInfoInviteID = "signaling_info_invite_id";
  347. // string, 只读, 群组 ID
  348. static const char* kTIMSignalingInfoGroupID = "signaling_info_group_id";
  349. // string, 只读, 邀请方的 ID
  350. static const char* kTIMSignalingInfoInviter = "signaling_info_inviter";
  351. // string, 只读, 被邀请方列表
  352. static const char* kTIMSignalingInfoInviteeList = "signaling_info_invitee_list";
  353. // string, 只读, 信令自定义内容
  354. static const char* kTIMSignalingInfoData = "signaling_info_data";
  355. // int @ref TIMSignalingActionType, 只读, 信令响应类型
  356. static const char* kTIMSignalingInfoActionType = "signaling_info_action_type";
  357. // int, 只读, 超时时间
  358. static const char* kTIMSignalingInfoTimeout = "signaling_info_timeout";
  359. #ifdef __cplusplus
  360. }
  361. #endif // __cplusplus
  362. #endif // SRC_PLATFORM_CROSS_PLATFORM_INCLUDE_TIM_SIGNALING_MANAGER_H_