⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ~rightlogin.~cpp

📁 实时监控
💻 ~CPP
📖 第 1 页 / 共 2 页
字号:
// RightLogin.cpp : implementation file
//

#include "stdafx.h"
#include "../Resource.h"
#include "../dlgs/dlgipalias.h"
#include "../toolbars/RightLogin.h"
#include "../utils/common.h"
#include "../utils/custom_msgs.h"
#include "../video/video_channel.h"
#include "../toolbars/rightlocal.h"
#include "click_btn.h"
#include "popup_menu.h"
#include "reg.h"
#include "msgbox.h"

#include "rightvod.h"
#include "rightlr.h"
//#include "vector_remove.h"

/*
 *	默认本地网络端口 8101
 */
#define LOCAL_PORT 8101

LPCTSTR rkLastStatus = _T("Settings\\LastStatus");
LPCTSTR rvIPPort = _T("IPPort");

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRightLogin dialog
CRightLogin* CRightLogin::self = NULL;
CRightLogin* CRightLogin::the_one() {return self;}
CRightLogin::CRightLogin(CWnd* pParent /*=NULL*/)
	: baseclass(CRightLogin::IDD, pParent), net(0)
{
	//{{AFX_DATA_INIT(CRightLogin)
	m_loginip = _T("Outside");
	m_password = _T("");
	m_strChannelIndex = _T("");
	m_strChannelIP = _T("");
	m_strVideoTitle = _T("");
	m_priv = _T("");
	//}}AFX_DATA_INIT

	self = this;

//	set_font(_T("宋体"), 9);
}

ip_port CRightLogin::current_sel_ipp()
{
	int idx = m_lstLogged.GetCurSel();
	if( idx == -1 )
		return ip_port(1,0);
	idx = m_lstLogged.GetItemData(idx);
	channel_info& ref = cmgr[idx];

	return ref.get_ip_port();
}

void CRightLogin::DoDataExchange(CDataExchange* pDX)
{
	if( !pDX->m_bSaveAndValidate && net)
	{
		ip_port ipp = current_sel_ipp();
		PRIVILEGE p = net_get_privilege(net, ipp.get_ip(), ipp.look_port());
		switch(p)
		{
		case USER:
			m_priv.LoadString(IDS_USER);
			break;
		case ADMIN:
			m_priv.LoadString(IDS_ADMIN);
			break;
		case NONE:
		default:
			m_priv.LoadString(IDS_INVALID);
			break;
		}
		/*
		 *	m_10 does not update data sometime somehow... ???
		 *	force it to do it !!!
		 */
		m_10.SetText(m_priv);
	}
	baseclass::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRightLogin)
	DDX_Control(pDX, IDBTN_CLOSE_REMOTE, m_btn_rclose);
	DDX_Control(pDX, ID_PRIV, m_10);
	DDX_Control(pDX, ID_VIDEO_TITLE, m_l3);
	DDX_Control(pDX, ID_CHANNEL_IP, m_l2);
	DDX_Control(pDX, ID_CHANNEL_INDEX, m_l1);
	DDX_Control(pDX, ID_S, m_s);
	DDX_Control(pDX, IDBTN_CLOSE, m_btn_close);
	DDX_Control(pDX, IDBTN_ALIAS, m_btn_alias);
	DDX_Control(pDX, IDBTN_LOGOUT, m_btn_logout);
	DDX_Control(pDX, IDBTN_LOGIN, m_btn_login);
	DDX_Control(pDX, ID_GROUP2, m_grp2);
	DDX_Control(pDX, ID_GROUP1, m_grp1);
	DDX_Control(pDX, IDLST_LOGGED_IN, m_lstLogged);
	DDX_Control(pDX, ID_8, m_8);
	DDX_Control(pDX, ID_7, m_7);
	DDX_Control(pDX, ID_6, m_6);
	DDX_Control(pDX, ID_5, m_5);
	DDX_Control(pDX, ID_3, m_3);
	DDX_Control(pDX, ID_2, m_2);
	DDX_Control(pDX, ID_1, m_1);
	DDX_Text(pDX, IDED_LOGINIP, m_loginip);
	DDX_Text(pDX, IDED_PASSWORD, m_password);
	DDX_Text(pDX, ID_CHANNEL_INDEX, m_strChannelIndex);
	DDX_Text(pDX, ID_CHANNEL_IP, m_strChannelIP);
	DDX_Text(pDX, ID_VIDEO_TITLE, m_strVideoTitle);
	DDX_Text(pDX, ID_PRIV, m_priv);
	//}}AFX_DATA_MAP

	m_btn_login.EnableWindow(!m_loginip.IsEmpty());
	
	//int idx = m_lstLogged.GetCurSel();
	m_btn_logout.EnableWindow(!m_loginip.IsEmpty());

	m_btn_close.EnableWindow(video_channel::current_sel()->is_video_opened());
	m_btn_rclose.EnableWindow(video_channel::current_sel()->is_video_opened());
}

BEGIN_MESSAGE_MAP(CRightLogin, baseclass)
	//{{AFX_MSG_MAP(CRightLogin)
	ON_BN_CLICKED(IDBTN_CLOSE, OnClose)
	ON_BN_CLICKED(IDBTN_LOGIN, OnLogin)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDBTN_LOGOUT, OnLogout)
	ON_BN_CLICKED(IDBTN_ALIAS, OnAlias)
	ON_MESSAGE(WM_UPDATE_DATA, OnUpdateData)
	ON_LBN_SELCHANGE(IDLST_LOGGED_IN, OnSelchangeList)
	ON_EN_CHANGE(IDED_LOGINIP, OnChangeLoginip)
	ON_BN_CLICKED(IDBTN_CLOSE_REMOTE, OnCloseRemote)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_UPDATE_DATA, OnUpdateData)
	ON_MESSAGE(WM_CONNECT, OnConnect)
	ON_MESSAGE(WM_OPEN_VOD, on_open_vod)
	ON_MESSAGE(WM_CLOSE_VOD, on_close_vod)
	ON_MESSAGE(WM_SET_VOD_SPEED, on_set_vod_speed)
	ON_MESSAGE(WM_GET_VOD_SPEED, on_get_vod_speed)
	ON_MESSAGE(WM_LOCAL_REC, on_local_rec)
	ON_MESSAGE(WM_GET_LOCAL_REC, on_get_local_rec)
	ON_MESSAGE(WM_UPDATE_WINDOW, on_update_wnd)
	ON_BN_CLICKED(IDM_CLOSE, OnClose)
	MSG2(NTM_CMD_LOGIN_OK, on_login)
	MSG2(NTM_CMD_CHANNEL_OPENED, on_channel_opened)
	MSG2(NTM_CMD_CHANNEL_CLOSED, on_channel_closed)
	MSG2(NTM_ALARM, on_alarm)
	ON_MESSAGE(WM_SNAPSHOT, on_snapshot)
	ON_MESSAGE(WM_VIDEO_WND_INVOKED, on_video_wnd)
	ON_MESSAGE(WM_TOGGLE_MUTE, on_mute)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRightLogin message handlers

CLabel& init_label(CLabel& l)
{
	COLORREF cl = RGB(255,255,255);
	//COLORREF cl = 0;
	l.SetTransparent(TRUE).SetTextColor(cl);
	return l;
}

CLabel& init_title(CLabel& l)
{
	l.SetTransparent(TRUE).SetFontBold(TRUE).
		SetFontSize(9).
		SetTextColor(RGB(0,0,80));
	return l;
}

/*
 *	对话框初始化, 分配资源
 */
BOOL CRightLogin::OnInitDialog() 
{
	baseclass::OnInitDialog();
	
//	m_grp1.init();
//	m_grp2.init();
	
	init_label(m_1);
	init_label(m_2);
//	init_label(m_3);	m_3.SetFontBold(TRUE);
//	init_label(m_4);	m_4.SetFontBold(TRUE);
	init_label(m_5);
	init_label(m_6);
	init_label(m_7);
	init_label(m_8);
	init_label(m_10);

	init_label(m_l1);
	init_label(m_l2);
	init_label(m_l3);


	init_title(m_3);

	ipmgr.load_reg();
	
	m_loginip = read_string(rkLastStatus, rvIPPort);
	UpdateData(FALSE);

	net = net_create(0, LOCAL_PORT, m_hWnd);
/*	if( net == 0 )
	{
		AfxMessageBox(IDS_FATAL_NET_CREATE, MB_OK | MB_ICONERROR );
		AfxGetMainWnd()->SendMessage(WM_COMMAND, IDCANCEL);
		return FALSE;
	}
*/
	VIDEO_RENDERER dm = (VIDEO_RENDERER)read_dword(rkSettings, rvRender, YUY2);
	BOOL video_mem = read_dword(rkSettings, rvMem, 0);
	net_set_video_renderer(net, dm, video_mem);

#ifdef _DEBUG
//	channel_info ci(ip_port("192.168.0.91:8101"), 4, 1);
//	cmgr.add(ci);
//	update_list();
#endif


//	CString str;
//	GetWindowText(str);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

/*
 *	对话框销毁, 释放所有资源
 */
void CRightLogin::OnDestroy()
{
	close_all();

	UpdateData();
	write_string(rkLastStatus, rvIPPort, m_loginip);

	net_destroy(net);

	baseclass::OnDestroy();
}

/*
 *	尝试登录
 */
void CRightLogin::login(LPCTSTR ipport, LPCTSTR password)
{
	ip_port ip = ipmgr.trans_ip(ipport);
	
	net_login(net, ip.get_ip(), ip.look_port(), password);
}

void CRightLogin::close_all()
{
	if( CRightLocal::the_one()->m_close_on_exit )
	{
		VOID (WINAPI *abs_close)(NET_HANDLE h, int group) = net_close_local_channel;
		if( CRightLocal::the_one()->m_close_remote )
			abs_close = net_close_remote_channel;

		for( int i=0; i<video_channel::count(); i++ )
			abs_close(net, i);
	}
}

/*
 *	尝试登出
 */
void CRightLogin::logout()
{
	/*
	 *	如果未登录任何主机, 返回
	 */
	if( m_lstLogged.GetCount() == 0 )
		return;

	/*
	 *	从登录IP:Port得到要登出的主机地址
	 */
	UpdateData();
	ip_port ipp = ipmgr.trans_ip(m_loginip);
	if( !ipp )
		return;

	channel_info* ci = cmgr.find(ipp);
	// 没找到匹配的已登录的主机, 返回
	if( !ci )
		return;

//	close_all();

	/*
	 *	发送登出请求
	 */
	net_logout(net, ci->get_ip(), ci->look_port(), CRightLocal::the_one()->m_close_on_exit);

	/*
	 *	删除列表中的登录项
	 */
	ci->logout();
	cmgr.remove(*ci);
	update_list();

	/*
	 *	通知各个工具栏, 刚刚断开一个主机
	 */
	AfxGetMainWnd()->SendMessage(WM_LOGGED_OUT, (WPARAM)(LPCTSTR)m_loginip);
}

/*
 *	登录按钮响应
 */
void CRightLogin::OnLogin() 
{
	UpdateData();
	login(m_loginip, m_password);
}

/*
 *	登出按钮响应
 */
void CRightLogin::OnLogout() 
{
	logout();

	UpdateData();
}

/*
 *	刷新登录列表
 */
void CRightLogin::update_list()
{
	CString str;
	CString alias;
	int idx = 0;

	// 清空listbox先
	m_lstLogged.ResetContent();

	for( int i=0; i<cmgr.count(); i++ )
	{
		channel_info& ref = cmgr[i];
		ip_port ip = ref.get_ip_port();
		alias = ipmgr.get_alias(ip);

		str.Format(IDS_LOGGED_IN_FMT, alias, ref.get_channels());
		idx = m_lstLogged.AddString(str);
		
		// ListBox 的 ItemData 是 ChannelInfo序号
		m_lstLogged.SetItemData(idx, i);
	}

	m_lstLogged.SetCurSel(0);
	//UpdateData(FALSE);
	PostMessage(WM_UPDATE_DATA, FALSE);
}

/*
 *	来自主机网络消息: 登录成功
 *	附带信息: IP, Port, 该主机视频通道总数
 */
//void CRightLogin::on_login_success(IPPORT_TYPE, ULONG channel_count, int privilege)
MSG3(on_login, CRightLogin)
{
	nt_cmd_login_ok* clo = (nt_cmd_login_ok*)w;

	channel_info ci(clo->ip, clo->port, clo->channel_count, clo->privilege);
	cmgr.add(ci);
	update_list();

	m_loginip = ipmgr.get_alias(clo->ip, clo->port);
	PostMessage(WM_UPDATE_DATA);

	info_balloon(IDS_LOGIN_LOGGED_IN);

#ifdef _DEBUG
//	DWORD addr[2] = {clo->ip, clo->port};
//	DWORD alarm[3] = {0, 3, 0};
//	AfxGetMainWnd()->SendMessage(NTM_ALARM, (WPARAM)addr, (LPARAM)alarm);
#endif
	return 0;
}

/*
 *	来自主机网络消息: 视频通道关闭成功
 *	附带信息: IP, Port, 关闭成功的视频通道号(主机端)
 */
//void CRightLogin::on_channel_closed(IPPORT_TYPE, ULONG channel)
MSG3(on_channel_closed, CRightLogin)
{
	ULONG ip = w;
	USHORT port = HSHORT(l);
	SHORT channel = LSHORT(l);

	channel_info* ref = cmgr.find(ip_port(ip, port));
	if( !ref )
		return 0;
	ref->close(channel);

	return 0;
}

/*
 *	来自主机网络消息: 视频通道关闭成功
 *	附带信息: IP, Port, 成功打开的视频通道号(主机端)
 */
//void CRightLogin::on_channel_opened(IPPORT_TYPE, ULONG mip, USHORT mport, ULONG channel)
MSG3(on_channel_opened, CRightLogin)
{
	ULONG ip = w;
	USHORT port = HSHORT(l);
	SHORT channel = LSHORT(l);
	
	channel_info* ci = cmgr.find(ip_port(ip,port));
	if( !ci )
		return 0;

	video_channel* p = video_channel::current_sel();
	ci->open(channel, p);
	

	//通道打开, 该通知刚才申请打开通道的视频窗口了
	p->PostMessage(NTM_CMD_CHANNEL_OPENED, w, l);

	PostMessage(WM_VIDEO_WND_INVOKED, (WPARAM)p, WM_LBUTTONDOWN);

	return 0;
}

/*
 *	打开IP别名对话框
 */
void CRightLogin::OnAlias()
{
	UpdateData();

	CDlgIPAlias dlg;
	dlg.caller = this;
	dlg.ipmgr = &ipmgr;

	ip_port ipp(m_loginip);
	if( ipp.look_port() )
	{
		dlg.m_ip = m_loginip;
	}
	dlg.DoModal();
}

/*
 *	拦截ListBox的鼠标点击消息
 */
BOOL CRightLogin::PreTranslateMessage(MSG* pMsg)
{
	if( pMsg->message == WM_KEYDOWN )
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -