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

📄 ~rightvod.~cpp

📁 实时监控
💻 ~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 + -