#ifndef RT_Screen_C_H_
#define RT_Screen_C_H_

#include "common_c.h"

/**
* 房间中屏幕窗口共享模块回调接口.
*
* 屏幕窗口共享模块回调接口定义了房间中屏幕窗口共享相关的通知和异步操作返回。
*/
typedef struct Screen_Callback {
	/// 通知
	/** 屏幕窗口状态更改通知
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] status 屏幕窗口状态。
	* @param[in] winId 屏幕窗口Id，唯一标示一个屏幕或者一个应用窗口。
	* @note 当屏幕窗口状态更改后，房间内所有用户接收到此通知。
	*/
	void(*screen_onScreenStatusNotify)(AVDHandle screenHandle, AVDScreenStatus status, const char* winId);
	/** 屏幕窗口数据更改通知
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] level 屏幕窗口整形数据。
	* @param[in] description 屏幕窗口字符串数据。
	* @param[in] fromId 屏幕窗口Id，唯一标示一个屏幕窗口。
	* @note 当屏幕窗口数据更改后，房间内所有用户接收到此通知, notify when publishLocalScreen(Camera), updateScreenData。
	*/
	void(*screen_onScreenDataNotify)(AVDHandle screenHandle, int level, const char* description, const char* winId);
	/** 屏幕窗口视频发布通知
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] win 屏幕窗口信息，屏幕信息中level和description为应用层数据，应用层可以使用这些字段保存次屏幕窗口相关的应用逻辑数据，方便标示、订阅视频。
	*
	* @note 当屏幕窗口视频发布时，房间内所有用户接收到此通知；因通知的重要程度，将从screen_onScreenStatusNotify中分离出此状态。
	* @sa avd_screen_publishScreen
	*/
	void(*screen_onPublishScreenNotify)(AVDHandle screenHandle, const AVDScreenWindow& win);
	/** 屏幕窗口视频取消发布通知
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] win 屏幕窗口信息。
	*
	* @note 当屏幕窗口视频取消发布时，房间内所有用户接收到此通知；因通知的重要程度，将从screen_onScreenStatusNotify中分离出此状态。
	* @sa avd_screen_unpublishScreen
	*/
	void(*screen_onUnpublishScreenNotify)(AVDHandle screenHandle, const AVDScreenWindow& win);
	/// 异步返回
	/** 本用户订阅屏幕窗口异步返回
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *winId 屏幕窗口Id，唯一标示一个屏幕或者一个应用窗口。
	*
	* @sa avd_screen_subscribe
	*/
	void(*screen_onSubscribeResult)(AVDHandle screenHandle, Result result, const char* winId);
	/** 本用户取消订阅屏幕窗口异步返回
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *winId 屏幕窗口Id，唯一标示一个屏幕或者一个应用窗口。
	*
	* @sa avd_screen_unsubscribe
	*/
	void(*screen_onUnsubscribeResult)(AVDHandle screenHandle, Result result, const char* winId);
	/** 本用户发布屏幕窗口异步返回
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *winId 屏幕窗口Id，唯一标示一个屏幕或者一个应用窗口。
	*
	* @sa avd_screen_publishScreen
	*/
	void(*screen_onPublishScreenResult)(AVDHandle screenHandle, Result result, const char* winId);
	/** 本用户取消发布屏幕窗口异步返回
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] result 错误代码。
	* @param[in] *winId 屏幕窗口Id，唯一标示一个屏幕或者一个应用窗口。
	*
	* @sa avd_screen_unpublishScreen
	*/
	void(*screen_onUnpublishScreenResult)(AVDHandle screenHandle, Result result, const char* winId);
	Screen_Callback() {
		screen_onScreenStatusNotify = NULL;
		screen_onScreenDataNotify = NULL;
		screen_onPublishScreenNotify = NULL;
		screen_onUnpublishScreenNotify = NULL;
		screen_onSubscribeResult = NULL;
		screen_onUnsubscribeResult = NULL;
		screen_onPublishScreenResult = NULL;
		screen_onUnpublishScreenResult = NULL;
	}
}*LPScreen_Callback;

///
extern "C" {
	/**
	* 房间中屏幕窗口共享模块接口.
	*
	* 房间屏幕窗口共享模块定义房间中屏幕窗口共享相关功能接口。
	*/

	/** 初始屏幕窗口共享模块接口
	*
	* @param[in] roomHandle 房间句柄。
	* @param[in] cb 屏幕窗口共享模块回调接口指针。
	* @param[out] screenHandle 屏幕窗口共享模块句柄。
	* @return 返回错误代码。
	* @sa Screen_Callback
	*/
	RT_API_EXPORT Result avd_screen_init(AVDHandle roomHandle, LPScreen_Callback cb, AVDHandle& screenHandle);
	/** 反初始屏幕窗口共享模块接口
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_screen_uninit(AVDHandle screenHandle);
	/** 发布共享屏幕窗口视频
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] win 屏幕窗口信息，用户可以在信息结构的level和description字段中放置应用层逻辑数据，方便视频描述和订阅。
	* @return 返回错误代码。
	* @note 发布操作为异步操作，操作结果在 screen_onPublishScreenResult 中返回。
	* @sa screen_onPublishScreenResult
	*/
	RT_API_EXPORT Result avd_screen_publishScreen(AVDHandle screenHandle, const AVDScreenWindow& win);
	/** 取消发布共享屏幕视频
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @return 返回错误代码。
	* @note 取消发布操作为异步操作，操作结果在 screen_onUnpublishScreenResult 中返回。
	* @sa screen_onUnpublishScreenResult
	*/
	RT_API_EXPORT Result avd_screen_unpublishScreen(AVDHandle screenHandle);
	/** 共享屏幕窗口视频切换另外一屏幕窗口
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] *winId 屏幕窗口Id。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_screen_swithToScreen(AVDHandle screenHandle, const char* winId);
	/** 订阅共屏屏幕窗口视频
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] *winId 屏幕窗口Id，唯一标示一路共享的屏幕窗口视频。
	* @return 返回错误代码。
	* @note 订阅操作为异步操作，操作结果在 screen_onSubscribeResult 中返回。
	* @sa screen_onSubscribeResult
	*/
	RT_API_EXPORT Result avd_screen_subscribe(AVDHandle screenHandle, const char* winId);
	/** 取消订阅共屏屏幕窗口视频
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] winId 屏幕窗口Id，唯一标示一路共享的屏幕窗口视频。
	* @return 返回错误代码。
	* @note 取消订阅操作为异步操作，操作结果在 screen_onUnsubscribeResult 中返回。
	* @sa screen_onUnsubscribeResult
	*/
	RT_API_EXPORT Result avd_screen_unsubscribe(AVDHandle screenHandle, const char* winId);
	/** 获取已发布的共享窗口数量
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @return 麦克风数量。
	*/
	RT_API_EXPORT int	 avd_screen_getPublishedScreenCount(AVDHandle screenHandle);
	/** 根据索引获取发布的共享窗口信息
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] index 索引编号，从0开始。
	* @param[out] win 共享窗口信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_screen_getPublishedScreen(AVDHandle screenHandle, uint32 index, AVDScreenWindow& win);
	/** 获取发布的共享窗口信息列表
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in,out] ncount 请求窗口数量；实际消息返回数量。
	* @param[out] *&wins 共享窗口集合存放列表。
	* @note 调用此方法之前一定要调用avd_screen_getPublishedScreenCount获取到已发布的共享窗口实际数量。
	* @return 返回错误代码。
	* @sa avd_screen_getPublishedScreenCount
	*/
	RT_API_EXPORT Result avd_screen_getPublishedScreens(AVDHandle screenHandle, uint32& ncount, AVDScreenWindow*& wins);
	/** 获取已订阅的共享窗口数量
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @return 共享窗口数量。
	*/
	RT_API_EXPORT int	 avd_screen_getSubscribedScreenCount(AVDHandle screenHandle);
	/** 根据索引获取已订阅的共享窗口信息
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] index 索引编号，从0开始。
	* @param[out] win 共享窗口信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_screen_getSubscribedScreen(AVDHandle screenHandle, uint32 index, AVDScreenWindow& win);
	/** 获取已订阅的共享窗口信息列表
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in,out] ncount 请求窗口数量；实际消息返回数量。
	* @param[out] *&wins 共享窗口集合存放列表。
	* @note 调用此方法之前一定要调用avd_screen_getSubscribedScreenCount获取到已订阅的共享窗口实际数量。
	* @return 返回错误代码。
	* @sa avd_screen_getSubscribedScreenCount
	*/
	RT_API_EXPORT Result avd_screen_getSubscribedScreens(AVDHandle screenHandle, uint32& ncount, AVDScreenWindow*& wins);
	// render video
	/** 关联共享的屏幕窗口视频数据和显示对象，在render中显示图像
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] *winId 屏幕窗口Id，唯一标示一路共享的屏幕窗口视频。
	* @param[in] renderHandle 显示对象句柄。
	*
	* @note 视频数据可以在多个显示对象上显示，而一个显示对象某一时刻只能显示一路视频。
	*		在屏幕窗口视频发布到房间中，或者远端屏幕窗口视频订阅成功后，调用此接口完成视频与显示对象的对接，从而在显示对象中显示视频。
	* @return 返回错误代码。
	* @sa avd_render_createattachRender
	*/
	RT_API_EXPORT Result avd_screen_attachRender(AVDHandle screenHandle, const char* winId, AVDHandle renderHandle);
	/** 解除屏幕窗口视频的所有显示对象关联
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] winId 屏幕窗口Id，唯一标示一路共享的屏幕窗口视频。
	* @return 返回错误代码。
	* @sa avd_screen_removeRender
	*/
	RT_API_EXPORT Result avd_screen_detachRenderWithDeviceId(AVDHandle screenHandle, const char* winId);
	/** 解除某一显示对象与屏幕窗口视频的关联
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] renderHandle 显示对象句柄。
	* @sa avd_screen_removeRenderWithDeviceId
	*/
	RT_API_EXPORT Result avd_screen_detachRender(AVDHandle screenHandle, AVDHandle renderHandle);
	// screen manager
	/** 获取可以共享的窗口数量
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @return 共享窗口数量。
	*/
	RT_API_EXPORT uint32 avd_screen_getScreenWindowCount(AVDHandle screenHandle);
	/** 根据索引获取可以共享窗口信息
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] index 索引编号，从0开始。
	* @param[out] win 共享窗口信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_screen_getScreenWindow(AVDHandle screenHandle, uint32 index, AVDScreenWindow& win);
	/** 获取可以共享窗口信息列表
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in,out] ncount 请求窗口数量；实际消息返回数量。
	* @param[out] *&wins 共享窗口集合存放列表。
	* @return 返回错误代码。
	* @note 调用此方法之前一定要调用avd_screen_getScreenWindowCount获取到共享窗口的实际的数量。
	* @sa avd_screen_getScreenWindowCount
	*/
	RT_API_EXPORT Result avd_screen_getScreenWindows(AVDHandle screenHandle, uint32& ncount, AVDScreenWindow*& wins);
#if defined(RT_DESKTOP)
	/** 开启注释
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] screenId 已经publish的ScreenWindow 的ID。
	* @return 返回错误代码。
	* @note
	* 共享端调用的前置条件是：screenId指向的ScreenWindow已共享
	* 浏览端调用的前置条件是：screenId指向的ScreenWindow已订阅，并且已在Render中渲染，
	* 内部会根据Render确定注释在本地显示的窗口，调用startOtherAnnotation(screenId, render)
	* 调用该接口，工具条是SDK内部已实现，如果需要自己定制工具条 请参照mannotation.h文件
	* @sa startOtherAnnotation
	*/
	RT_API_EXPORT Result avd_screen_startAnnotation(AVDHandle screenHandle, const char* screenId);

	/** 关闭注释
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] screenId 已经publish的ScreenWindow 的ID。
	* @return 返回错误代码。
	* @note
	* 只是停止注释，内部不会调用UnpublishScreen，
	*/
	RT_API_EXPORT Result avd_screen_stopAnnotation(AVDHandle screenHandle, const char* screenId);

	/** 开始浏览端注释
	*
	* @param[in] screenHandle 屏幕窗口共享模块句柄。
	* @param[in] screenId 要注释的，已经publish的ScreenWindow 的ID。
	* @param[in] render 已经publish的Screen所在的渲染窗口，而不是新建的渲染窗口。
	* @return 返回错误代码。
	* @note
	* screenId指向的ScreenWindow已订阅，并且会在Render中渲染
	*/
	RT_API_EXPORT Result avd_screen_startOtherAnnotation(AVDHandle screenHandle, const char* screenId, AVDHandle renderHandle);

	/** 设置注释工具条的起始位置
	*
	* @param[in] x 窗口位置x。
	* @param[in] y 窗口位置y。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_screen_setAnnotationBarPosition(AVDHandle screenHandle, int x, int y);
#endif
	/** 共屏屏幕窗口数据更改
	*
	* @param[in] deviceId 屏幕窗口Id，唯一标示一个屏幕窗口。
	* @param[in] level 屏幕窗口整形数据。
	* @param[in] description 屏幕窗口字符串数据。
	* @sa onScreenDataNotify
	*/
	RT_API_EXPORT Result  avd_screen_updateScreenData(AVDHandle screenHandle, const char* deviceId, int level, const char*  description);
}

#endif//RT_Screen_C_H_
