📄 ~rightlogin.~cpp
字号:
// 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 + -