📄 ~rightvod.~cpp
字号:
// RightVOD.cpp : implementation file
//
#include "stdafx.h"
#include "..\dvrmanager.h"
#include "net.h"
#include "ip_port.h"
#include "RightVOD.h"
#include "RightLogin.h"
#include "../utils/common.h"
#include "../utils/update_data.h"
#include "vector"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRightVOD dialog
CString add_comma(DWORD x, TCHAR comma = _T(','))
{
std::vector<TCHAR> a;
DWORD y = x;
int k=0;
for( int i=0; y; i++ )
{
if( k && (((k+1) % 4) == 0) )
{
a.push_back(comma);
k++;
}
// else
// {
a.push_back(_T('0')+(y%10));
y/=10;
k++;
// }
}
a.push_back(_T('\0'));
CString xx = &a[0];
xx.MakeReverse();
return xx;
}
CRightVOD* CRightVOD::self = NULL;
CRightVOD* CRightVOD::the_one() {return self;}
CRightVOD::CRightVOD(CWnd* pParent /*=NULL*/)
: baseclass(CRightVOD::IDD, pParent), vod_opened(false)
{
//{{AFX_DATA_INIT(CRightVOD)
m_channel = -1;
m_which = -1;
m_starttime = CTime::GetCurrentTime();
//}}AFX_DATA_INIT
ZeroMemory(&opt1, sizeof(opt1));
ZeroMemory(&opt2, sizeof(opt2));
self = this;
}
void CRightVOD::DoDataExchange(CDataExchange* pDX)
{
baseclass::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRightVOD)
DDX_Control(pDX, ID_S, m_s);
DDX_Control(pDX, IDBTN_FRAME, m_btn_frame);
DDX_Control(pDX, ID_DATE, m_startdate);
DDX_Control(pDX, IDBTN_STOP, m_btn_stop);
DDX_Control(pDX, IDBTN_PLAY, m_btn_play);
DDX_Control(pDX, IDBTN_PAUSE, m_btn_pause);
DDX_Control(pDX, IDBTN_FF, m_btn_ff);
DDX_Control(pDX, IDBTN_FB, m_btn_fb);
DDX_Control(pDX, ID_7, m_7);
DDX_Control(pDX, IDLST_FILES, m_files);
DDX_Control(pDX, IDLST_DATE, m_date);
DDX_Control(pDX, IDCB_WHICH, m_cbwhich);
DDX_Control(pDX, IDCB_CHANNEL, m_cbchannel);
DDX_Control(pDX, IDBTN_REFRESH, m_btn_refresh);
DDX_Control(pDX, ID_TITLE, m_title);
DDX_Control(pDX, ID_4, m_4);
DDX_Control(pDX, ID_3, m_3);
DDX_Control(pDX, ID_2, m_2);
DDX_Control(pDX, ID_1, m_1);
DDX_CBIndex(pDX, IDCB_CHANNEL, m_channel);
DDX_CBIndex(pDX, IDCB_WHICH, m_which);
DDX_DateTimeCtrl(pDX, IDTIME_START, m_starttime);
//}}AFX_DATA_MAP
CString str;
m_cbwhich.GetWindowText(str);
UINT ids[] = {IDCB_CHANNEL, IDLST_DATE, IDLST_FILES};
for( int i=0; i<SIZE_OF(ids); i++ )
{
GetDlgItem(ids[i])->EnableWindow(!str.IsEmpty() && !vod_opened );
}
m_cbwhich.EnableWindow(!vod_opened);
m_cbchannel.GetWindowText(str);
GetDlgItem(IDBTN_REFRESH)->EnableWindow(!str.IsEmpty());
bool pause_enable = false;
if( vod_opened )
pause_enable = true;
if( paused() )
pause_enable = false;
m_btn_play.EnableWindow(!pause_enable);
m_btn_pause.EnableWindow(pause_enable);
// int idx = m_files.GetCurSel();
// UINT ids1[] = {IDTIME_START, IDBTN_PLAY};
// for( i=0; i<SIZE_OF(ids1); i++ )
// {
// GetDlgItem(ids1[i])->EnableWindow(m_files.GetCurSel()!=-1);
// }
m_btn_stop.EnableWindow(vod_opened);
m_btn_ff.EnableWindow(vod_opened);
m_btn_fb.EnableWindow(vod_opened);
m_btn_frame.EnableWindow(vod_opened);
m_btn_pause.EnableWindow(pause_enable);
GetDlgItem(IDTIME_START)->EnableWindow(!vod_opened);
GetDlgItem(IDBTN_REFRESH)->EnableWindow(!vod_opened);
}
BEGIN_MESSAGE_MAP(CRightVOD, baseclass)
//{{AFX_MSG_MAP(CRightVOD)
ON_CBN_SELCHANGE(IDCB_WHICH, OnSelchangeWhich)
ON_CBN_SELCHANGE(IDCB_CHANNEL, OnSelchangeChannel)
ON_BN_CLICKED(IDBTN_REFRESH, OnRefresh)
ON_LBN_SELCHANGE(IDLST_DATE, OnDate)
ON_BN_CLICKED(IDBTN_PLAY, OnPlay)
ON_BN_CLICKED(IDBTN_PAUSE, OnPause)
ON_BN_CLICKED(IDBTN_STOP, OnStop)
ON_BN_CLICKED(IDBTN_FF, OnFf)
ON_BN_CLICKED(IDBTN_FB, OnFb)
ON_LBN_SELCHANGE(IDLST_FILES, OnFiles)
ON_BN_CLICKED(IDBTN_FRAME, OnFrame)
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_UPDATE_DATA, on_update_data)
ON_MESSAGE(WM_OPEN_VOD, on_vod_opened)
ON_MESSAGE(WM_CLOSE_VOD, on_vod_closed)
ON_MESSAGE(WM_SET_VOD_SPEED, on_vod_set_speed)
MSG2(NTM_OPT_GET_OK, on_get_ok)
MSG2(WM_LOGGED_OUT, on_logged_out)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRightVOD message handlers
BOOL CRightVOD::OnInitDialog()
{
baseclass::OnInitDialog();
init_label(m_1);
init_label(m_3);
init_label(m_4);
// init_label(m_5);
init_label(m_startdate);
init_title(m_title);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
CString CRightVOD::get_alias()
{
CString alias;
UpdateData();
if( m_which == -1 )
return alias;
m_cbwhich.GetLBText(m_which, alias);
return alias;
}
void CRightVOD::OnSelchangeWhich()
{
GET_ALIAS;
fill_combo_chnls(alias, &m_cbchannel);
m_channel = 0;
UpdateData(FALSE);
OnRefresh();
}
void CRightVOD::OnSelchangeChannel()
{
UpdateData();
OnRefresh();
}
void CRightVOD::on_join()
{
if( m_cbwhich.GetCount() == 0 )
{
fill_combo(&m_cbwhich);
m_cbchannel.EnableWindow(FALSE);
}
}
void CRightVOD::on_leave()
{
// m_cbwhich.ResetContent();
// m_cbchannel.ResetContent();
// m_date.ResetContent();
// m_files.ResetContent();
}
//void CRightVOD::on_get_ok(DWORD ip, USHORT port, NET_OPTIONS no, void* stuff)
MSG3(on_get_ok, CRightVOD)
{
NET_OPTIONS no = (NET_OPTIONS)w;
void* stuff = (void*)l;
if( no == OPT_VOD_DATE )
{
TREC_DATELIST* d = (TREC_DATELIST*)stuff;
memcpy(&opt1, stuff, 1+d->num*sizeof(TREC_DATE));
PostMessage(WM_UPDATE_DATA, FALSE, OPT_VOD_DATE);
}
if( no == OPT_VOD_FILE )
{
TREC_FILESEGLIST* f = (TREC_FILESEGLIST*)stuff;
memcpy(&opt2, stuff, 5+f->num*sizeof(TREC_FILESEG));
PostMessage(WM_UPDATE_DATA, FALSE, OPT_VOD_FILE);
}
return 0;
}
void CRightVOD::OnRefresh()
{
GET_ALIAS;
get_net_opt(alias, OPT_VOD_DATE, m_channel, m_hWnd);
}
const LPCTSTR date_format = _T("%04d-%02d-%02d");
const LPCTSTR file_format = _T("%02d:%02d:%02d ~ %02d:%02d:%02d @ %s Kb");
LRESULT CRightVOD::on_update_data(WPARAM w, LPARAM l)
{
if( w == FALSE )
{
if( l == OPT_VOD_DATE )
{
m_date.SetRedraw(FALSE);
m_date.ResetContent();
for( int i=0; i<opt1.num; i++ )
{
CString str;
TREC_DATE* p = &opt1.rec_date[i];
if( p->month == 0 )
continue;
/* 2003-10-17, nodman
* 修正: 2003-42-1
* 主机传来的日期格式有误
*/
if( p->month > 32 )
{
p->month -= 32;
}
str.Format(date_format, p->year, p->month, p->day);
// e.g. "2003-08-20"
/* 修正: 2003-10-15
* 不允许有重复的日期
*/
if( m_date.FindString(-1, str) == -1 )
{
int idx = m_date.AddString(str);
/*
byte x[4];
x[0] = p->year - 2000;
x[1] = p->month;
x[2] = p->day;
x[3] = 0;
*/
m_date.SetItemData(idx, i);
}
}
m_date.SetRedraw();
}
if( l == OPT_VOD_FILE )
{
m_files.SetRedraw(FALSE);
m_files.ResetContent();
for( int i=0; i<opt2.num; i++ )
{
CString str;
TREC_FILESEG* f = &opt2.rec_fileseg[i];
str.Format(file_format,
f->bgn_hour, f->bgn_minute, f->bgn_second,
f->end_hour, f->end_minute, f->end_second,
add_comma(f->size));
int idx = m_files.AddString(str);
m_files.SetItemData(idx, i);
}
m_files.SetRedraw();
}
}
UpdateData(w);
return 0;
}
void CRightVOD::OnSelchangeDate()
{
GET_ALIAS;
int idx = m_date.GetCurSel();
if( idx == -1 )
return;
idx = m_date.GetItemData(idx);
byte x[4];
x[0] = opt1.rec_date[idx].year - 2000;
x[1] = opt1.rec_date[idx].month;
x[2] = opt1.rec_date[idx].day;
x[3] = m_channel;
get_net_opt(alias, OPT_VOD_FILE, *(DWORD*)x, m_hWnd);
}
BOOL CRightVOD::PreTranslateMessage(MSG* msg)
{
if( msg->message == WM_LBUTTONDBLCLK )
{
if( msg->hwnd == m_date.m_hWnd )
OnSelchangeDate();
if( msg->hwnd == m_files.m_hWnd )
OnSelchangeFiles();
}
return baseclass::PreTranslateMessage(msg);
}
void CRightVOD::OnSelchangeFiles()
{
OnPlay();
}
void CRightVOD::OnDate()
{
int idx = m_date.GetCurSel();
if( idx == -1 )
return;
idx = m_date.GetItemData(idx);
CString str;
TREC_DATE& d = opt1.rec_date[idx];
str.Format(date_format, d.year, d.month, d.day);
m_startdate.SetText(str);
start_ft.year = d.year-2000;
start_ft.month = d.month;
start_ft.day = d.day;
OnSelchangeDate();
}
void CRightVOD::OnFiles()
{
int idx = m_files.GetCurSel();
if( idx == -1 )
return;
idx = m_files.GetItemData(idx);
TREC_FILESEG& f = opt2.rec_fileseg[idx];
m_starttime = CTime(2003, 12, 20, f.bgn_hour, f.bgn_minute, f.bgn_second);
UpdateData(FALSE);
}
void CRightVOD::OnPlay()
{
if( vod_opened )
{
if( get_vod_speed() != VS_DEFAULT )
{
CRightLogin::the_one()->PostMessage(WM_SET_VOD_SPEED, VS_PLAYx1);
UpdateData();
return;
}
else
return;
}
GET_ALIAS;
ULONG ip;
USHORT port;
get_addr(alias, ip, port);
ip_port ipp(ip, port);
/*
* 日期:根据用户在Date列表框中的选择
* 时间:根据用户在Files列表框中的选择, 并且可以任意指定
*/
start_ft.channel = m_channel;
start_ft.hour = m_starttime.GetHour();
start_ft.minute = m_starttime.GetMinute();
start_ft.second = m_starttime.GetSecond();
CRightLogin::the_one()->SendMessage(WM_OPEN_VOD, (WPARAM)&start_ft, (LPARAM)&ipp);
}
void CRightVOD::OnStop()
{
CRightLogin::the_one()->PostMessage(WM_CLOSE_VOD);
}
void CRightVOD::OnPause()
{
CRightLogin::the_one()->PostMessage(WM_SET_VOD_SPEED, VS_PAUSE);
UpdateData();
}
void CRightVOD::OnFf()
{
if( !vod_opened )
return;
VOD_SPEED vs = get_vod_speed();
switch(vs)
{
case VS_FFx1:
vs = VS_FFx2;
break;
case VS_FFx2:
vs = VS_FFx3;
break;
case VS_FFx3:
vs = VS_FFx1;
break;
default:
vs = VS_FFx1;
break;
}
CRightLogin::the_one()->PostMessage(WM_SET_VOD_SPEED, vs);
}
void CRightVOD::OnFb()
{
if( !vod_opened )
return;
VOD_SPEED vs = get_vod_speed();
switch(vs)
{
case VS_FBx1:
vs = VS_FBx2;
break;
case VS_FBx2:
vs = VS_FBx3;
break;
case VS_FBx3:
vs = VS_FBx1;
break;
default:
vs = VS_FBx1;
break;
}
CRightLogin::the_one()->PostMessage(WM_SET_VOD_SPEED, vs);
}
void CRightVOD::OnFrame()
{
CRightLogin::the_one()->PostMessage(WM_SET_VOD_SPEED, VS_FRAME);
}
/*
* 从video_channel传来
*/
LRESULT CRightVOD::on_vod_opened(WPARAM, LPARAM)
{
vod_opened = true;
UpdateData();
return 0;
}
LRESULT CRightVOD::on_vod_closed(WPARAM, LPARAM)
{
vod_opened = false;
UpdateData();
info_balloon(IDS_VOD_END);
return 0;
}
void CRightVOD::OnTimer(UINT nIDEvent)
{
baseclass::OnTimer(nIDEvent);
}
ON_LOGGED_OUT(CRightVOD);
VOD_SPEED CRightVOD::get_vod_speed()
{
return (VOD_SPEED)CRightLogin::the_one()->SendMessage(WM_GET_VOD_SPEED);
}
bool CRightVOD::paused()
{
return get_vod_speed() == VS_PAUSE;
}
LRESULT CRightVOD::on_vod_set_speed(WPARAM, LPARAM)
{
UpdateData();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -