#ifndef RT_AVDOutgoing_C_H_
#define RT_AVDOutgoing_C_H_

#include "common_c.h"
#include "musermanager_c.h"

/**
* 房间中聊天模块回调接口.
*
* 聊天模块回调接口定义了房间中聊天相关的通知。
*/
typedef struct AVDOutgoing_Callback {
	/** 外呼用户创建操作异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 用户创建错误代码。
	* @param[in] roomId 房间Id。
	* @param[in] userId 用户Id。
	* @param[in] user_address 用户真实地址
	* @sa createOutgoingUser
	*/
	void(*onCreateOutgoingUser)(uint32& callId, Result result, const char* roomId, const char* userid, const char* user_address);
	/** 外呼用户删除操作异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 用户删除错误代码。
	* @param[in] roomId 房间Id。
	* @param[in] userId 用户Id。
	* @param[in] user_address 用户真实地址
	* @sa destoryOutgoingUser
	*/
	void(*onDestoryOutgoingUser)(uint32& callId, Result result, const char* roomId, const char* userid, const char* user_address);
	/** 外呼用户列表查询操作异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 用户列表查询错误代码。
	* @param[in] roomId 房间Id。
	* @param[out] ncount 请求数量；实际返回数量。
	* @param[out] users 用户列表集合。
	*
	* @sa getOutgoingUsers
	*/
	void(*onGetOutgoingUsers)(uint32& callId, Result result, const char* roomId, const LPAVDUser& users, uint32 numOfUser);
	AVDOutgoing_Callback() {
		onCreateOutgoingUser = NULL;
		onDestoryOutgoingUser = NULL;
		onGetOutgoingUsers = NULL;
	}
}*LPAVDOutgoing_Callback;

///
extern "C" {
	/** 初始化外呼接口
	*
	* @param[in] cb 引擎回调指针。
	* @note 初始化外呼接口前必须已经完成了AVD引擎的初始化工作。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_outgoing_init(LPAVDOutgoing_Callback cb);
	/** 反初始化外呼接口
	*
	* @note 外呼接口反初始化后，外呼相关接口都无效。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_outgoing_uninit();

	// 外呼接口
	/** 外呼用户创建
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in] roomId 房间Id。
	* @param[in] user 用户信息，参考Room.join中对user的说明。
	* @param[in] user_address 用户真实地址，根据外呼用户的类型有区别：
	* 如rtsp为“rtsp://192.168.0.1:6549/avd”
	*	sip 为“sip://192.168.0.1:6549/avd"
	*	h323为“h323://192.168.0.1:6549/avd"
	* @param[in] loginName 用户真实地址的登陆名。
	* @param[in] loginPass 用户真实地址的登陆密码。
	* @param[in] assist_address 辅流取流地址，若有辅流，辅流也导入房间，房间中用户可以订阅主流或辅流。
	* @note外呼用户创建为异步操作，调用此接口后等待回调中函数onCreateOutgoingUserResult回调，判断是否获取成功。
	*	   外呼用户包括： rtsp外呼；h323外呼；sip外呼等；
	* @return 返回错误代码。
	* @sa onCreateOutgoingUser
	*/
	RT_API_EXPORT Result avd_outgoing_createOutgoingUser(uint32& callId, const char* roomId, const AVDUser& user,
		const char* user_address, const char* loginName, const char* loginPass, const char* assist_address = NULL);
	/** 外呼用户删除
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in] roomId 房间Id。
	* @param[in] userId 用户Id。
	* @param[in] user_address 用户真实地址
	* @note外呼用户删除为异步操作，调用此接口后等待回调中函数onDestoryOutgoingUser回调，判断是否获取成功。
	* @return 返回错误代码。
	* @sa onDestoryOutgoingUser
	*/
	RT_API_EXPORT Result avd_outgoing_destoryOutgoingUser(uint32& callId, const char* roomId, const char* userid, const char* user_address);
	/** 外呼用户列表查询
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in] roomId 房间Id，此参数可为空，如果为空，返回整个服务器上的外呼用户列表；否则返回某一房间的外呼用户列表。
	* @note外呼用户列表查询为异步操作，调用此接口后等待回调中函数onGetOutgoingUsers回调，判断是否获取成功。
	* @return 返回错误代码。
	* @sa onGetOutgoingUsers
	*/
	RT_API_EXPORT Result avd_outgoing_getOutgoingUsers(uint32& callId, const char* roomId);
}

#endif//RT_AVDOutgoing_C_H_
