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

📄 epgdeal.cpp

📁 得到本周内的电视节目预告! f
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// EpgDeal.cpp: implementation of the CEpgDeal class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TmEpg.h"
#include "EpgDeal.h"
#include "httpsocket.h"
#include "PackManage.h"
#include "shared/filemisc.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DWORD WINAPI ThreadcurEpg(LPVOID pVoid)
{
	CEpgDeal *pThis = (CEpgDeal *)pVoid;
	pThis->DealBuildEpgFromFile(pThis->m_curChan.m_nEpgNum, pThis->m_curChan.tvFName);
	SetEvent(pThis->hexitcurEvt);
	return 0;
}
DWORD WINAPI ThreadconEpg(LPVOID pVoid)
{
	DWORD dwret;
	int num;
//	CString sfname;
	NonEpg non;
	CEpgDeal *pThis = (CEpgDeal *)pVoid;
	while(TRUE)
	{
		//查找一个没有epg的数据
		num = pThis->vcnon.size();
		if(num == 0)
		{
			SetEvent(pThis->hexitconEvt);
			return 0;
		}
		memcpy(&non, &pThis->vcnon[num - 1], sizeof(NonEpg));

		dwret = WaitForSingleObject(pThis->hconEvent, 100);
		if(dwret == WAIT_OBJECT_0)
		{
			SetEvent(pThis->hexitconEvt);
			return 0;
		}
		//如果当前在下载不加载
		if(pThis->bdownloading)
			continue;
		//加载epg数据
		pThis->DealBuildEpgFromFile(non.num, non.sfname);
		pThis->vcnon.pop_back();
	}
	return 0;
}
//##ModelId=46676C9901C5
bool CEpgDeal::DealGetEmptyEpg()
{
	CString s;
	int num;
	CUIntArray arNum;
	CStringArray arFname;
	LONG lRet, lret2;
	CString s1;
	
	s.Format("select * from tv where regcode = 0 order by tvNum");

	lRet = DealDbLocate(s);
	VARIANT var;
	int i;

	NonEpg ne;
	vcnon.clear();
	try
	{
	if(lRet>0)
		m_pRecordset->MoveFirst();
	for(i= 0; i< lRet; i++)
	{
		var = m_pRecordset->GetCollect("tvNum");
		arNum.Add(var.intVal);
		var = m_pRecordset->GetCollect("tvFName");
		arFname.Add(var.bstrVal);
		m_pRecordset->MoveNext();
	}
	}
	catch(_com_error e)
	{
	//	AfxMessageBox(e.ErrorMessage());
		return FALSE;
	}
	CTime t = CTime::GetCurrentTime();
	s1 = t.Format("%d/%m/%Y");

	for(i = 0;i< lRet; i++)
	{
		num = arNum[i];
		s = arFname[i];
		//查看今天有无epg信息
		s.Format(_T("select * from epginf where tvnum = %d and datediff(\"d\", tvStartT, #%s#)<=0")
			, num, s1.LockBuffer());
		lret2 = DealDbLocate(s);
		if(lret2 == 0 )
		{
			ZeroMemory(&ne, sizeof(NonEpg));
			ne.num = arNum[i];
			lstrcpy(ne.sfname, arFname[i].LockBuffer());
			vcnon.push_back(ne);
//			cnum = arNum[i];
//			cfname = arFname[i];
			;
		}
	}
	return true;
}
//##ModelId=46676C95031C
CEpgDeal::CEpgDeal()
{
	m_nChan = 0;
	m_nEpg = 0;
	m_listEpg = NULL;
	m_listChan = NULL;
	bdownloading = FALSE;
	m_curstatus = 1;
	m_pfn = NULL;
	ZeroMemory(&m_initParam, sizeof(InitParam));
	m_initParam.lChannear  = 2000;
	m_initParam.bSearchSave = true;
	
	hexitcurEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
	hexitconEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
	hconEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	SetEvent(hexitcurEvt);
	Init();

	::CreateThread(NULL, 0, ThreadconEpg, (LPVOID)this, 0, NULL);
}

//##ModelId=46676C950399
CEpgDeal::~CEpgDeal()
{
	SetEvent(hconEvent);
	WaitForSingleObject(hexitcurEvt, INFINITE);
	WaitForSingleObject(hexitconEvt, INFINITE);
	CloseHandle(hexitcurEvt);
	CloseHandle(hexitconEvt);	
	CloseHandle(hconEvent);
	DeInit();
}
//##ModelId=46676C9600CB
BOOL CEpgDeal::Init()
{
	bOpenRecord = FALSE;
	HRESULT hr;
	TCHAR szPath[255];
	DWORD dwRet;
	dwRet = GetModuleFileName(NULL, szPath, 255);
	if(dwRet<1)
		return FALSE;
	CString s, source;
	s = szPath;
	dwRet = s.ReverseFind('\\');
	s = s.Left(dwRet+1);
	
	strcpy(m_initParam.szZipPath, s.LockBuffer());
	strcpy(m_initParam.szDownPath, "http://www.cctv.com/download/showtime.zip");

	s += "\\tm.epg";

	source.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s", s.LockBuffer());
	try
	{
		hr = m_pConnection.CreateInstance("ADODB.Connection");
		if(FAILED(hr))
			return FALSE;
		hr = m_pConnection->Open(source.AllocSysString(),
			"","",adModeUnknown);///连接数据库
		if(FAILED(hr))
			return FALSE;
		hr = m_pRecordset.CreateInstance("ADODB.RecordSet");
		if(FAILED(hr))
			return FALSE;

	}
	catch(_com_error e)
	{
		CString s;
		s.Format("%s", e.ErrorMessage());
	//	AfxMessageBox(s);
	}
#ifdef NODOWNLOADEPG
	DealGetEmptyEpg();
#endif

	memset(&m_curChan, 0, sizeof(Chancel));
	m_curChan.m_nNum = 0;
	m_curChan.RegCode = 1;
	DealGetXXXChance(&m_curChan);
//	DealSearchStart();
//	DealSearchOne(1);
//	DealSearchEnd();	
#ifdef NODOWNLOADEPG
	CheckDownLoad();
#endif

	return TRUE;
}
//##ModelId=46676C960138
BOOL CEpgDeal::DeInit()
{
	if(bOpenRecord)
		m_pRecordset->Close();
	if(m_pConnection->State)
		m_pConnection->Close(); 

	ReleaseListChan();
	ReleaseListEpg();

	return TRUE;
}
//##ModelId=46676C960213
void CEpgDeal::ReleaseListChan()
{
	if(m_listChan)
	{
		delete []m_listChan;
		m_listChan = NULL;
		m_nChan = 0;
	}
}
//##ModelId=46676C9602FD
void CEpgDeal::AllocListChan(int n)
{
	ReleaseListChan();
	m_listChan = new Chancel[n];
	ZeroMemory(m_listChan, sizeof(Chancel) * n);
	m_nChan = 0;
}
//##ModelId=46676C9601A5
void CEpgDeal::ReleaseListEpg()
{
	if(m_listEpg)
	{
		delete []m_listEpg;
		m_listEpg = NULL;
		m_nEpg = 0;
	}
}
//##ModelId=46676C960290
void CEpgDeal::AllocListEpg(int n)
{
	ReleaseListEpg();
	m_listEpg = new EpgInfo[n];
	ZeroMemory(m_listEpg, sizeof(EpgInfo) * n);
	m_nChan = 0;
}
//##ModelId=46676C96001F
LRESULT CEpgDeal::MsgProc(UINT msg, UINT nID, WPARAM wParam, LPARAM lParam)
{
	LRESULT lRet;
	if(msg == WM_MSG_EPG)
	{
		WORD hiwd, liwd;
		hiwd = HIWORD(nID);
		liwd = LOWORD(nID);
		switch(hiwd)
		{
		case WM_EPG_GET:
			lRet = DealGetProp(liwd, wParam, lParam);
			break;
		case WM_EPG_SET:
			lRet = DealSetProp(liwd, wParam, lParam);
			break;
		case WM_EPG_DONE:
			lRet = DealDone(liwd, wParam, lParam);
			break;

		}
	}

	return lRet;
}
//##ModelId=46676C97005D
LRESULT CEpgDeal::DealDone(UINT nID, WPARAM wParam, LPARAM lParam)
{
	LRESULT lRet;
	switch(nID)
	{
	case WM_BAK_CUR:
		lRet = DealAddBak();
		break;
	case WM_CHAN_EDIT:
		DealEnterEditChan();
		lRet = DealDbEditChancel((LPChancel)lParam);
		break;
	case WM_CHAN_DEL:
		DealEnterEditChan();
		lRet = DealDbDelChancel((LPChancel)lParam);
		break;
	case WM_CHAN_ADD:
		DealEnterEditChan();
		lRet = DealDbAddChancel((LPChancel)lParam);
		break;
	case WM_CHAN_UP:
		DealEnterEditChan();
		lRet = DealDbChancelUpDown(-1, (LPChancel)lParam);
		break;
	case WM_CHAN_DOWN:
		DealEnterEditChan();
		lRet = DealDbChancelUpDown(1, (LPChancel)lParam);
		break;
	case WM_DEL_BAK:
		lRet = DealDelBakTv((int)wParam);
		break;
	case WM_REVSER_CHAN:
		lRet = DealCopyAsCur((int)wParam, (int)lParam);
		break;
	case WM_SEARCH_START:
		m_curstatus = 2;
		lRet = DealSearchStart();
		break;
	case WM_SEARCH_END:
		lRet = DealSearchEnd();
		break;
	case WM_SEARCH_CANCEL:
		lRet = DealSearchCance();
		break;
	case WM_SEARCH_ONE:
		lRet = DealSearchOne((long)lParam);
		break;
	case WM_CHAN_CANCEL:
	case WM_CHAN_UPDATE:
		lRet = DealLeaveEditChan(nID);
		break;
	case WM_DOWN_EPG:
		bdownloading = TRUE;
		lRet = DownLoadEpg();
		break;
	case WM_CLEAR_EPG:
		DealClear();
		lRet = 0;
		break;
	}
	switch(nID)
	{
	case WM_CHAN_EDIT:
	case WM_CHAN_DEL:
	case WM_CHAN_ADD:
	case WM_CHAN_UP:
	case WM_CHAN_DOWN:
		m_curstatus = 3;
		break;
	case WM_SEARCH_END:
	case WM_SEARCH_CANCEL:
		m_curstatus = 1;
		break;
	case WM_CHAN_UPDATE:
	case WM_CHAN_CANCEL:
		if(m_curstatus !=2)	//当没有搜台时
			m_curstatus = 1;
		break;
	}
	return lRet;
}
//##ModelId=46676C96037A
LRESULT CEpgDeal::DealGetProp(UINT nID, WPARAM wParam, LPARAM lParam)
{
	LRESULT lRet = -1;

	switch(nID)
	{
	case WM_CHAN_LIST_LIB:
		lRet = DealDbLocateAllChancel(0);
		*(int*)wParam = m_nChan;
		*(LPChancel*)lParam = m_listChan;
		break;
	case WM_CHAN_LIST:
		{
			bool bret = m_curChan.tvFav;
			m_curChan.tvFav = (BOOL)wParam;
			DealDbLocateAllChancel(1);
			lRet = m_nChan;
			*(LPChancel*)lParam = m_listChan;
			m_curChan.tvFav = bret;
		}
		break;		
	case WM_LIST_CHAN:
		DealDbLocateAllChancel((int)wParam);
		lRet = m_nChan;
		*(LPChancel*)lParam = m_listChan;
		break;		
	case WM_EPG_CUR:
		lRet = DealLocateCur5Epg((LPChancel)wParam);
		lRet = m_nEpg;	
		*(LPEpgInfo*)lParam = m_listEpg;
		break;
	case WM_EPG_CUR_DAY:
		DealLocateTodayEpg((LPChancel)wParam);
		lRet = m_nEpg;	
		*(LPEpgInfo*)lParam = m_listEpg;
		break;
	case WM_EPG_XXX:	//取得某天或是某个时间区域内的epg信息
		DealLocateXXXEpg((LPVOID)wParam, &m_curChan);
		lRet = m_nEpg;
		*(LPEpgInfo*)lParam = m_listEpg;
		break;
	case WM_BAKCHAN_LIST:
		lRet = DealDbGetAllBak((CStringList*)lParam);
		break;
	case WM_BAKCHAN_CUR:
		lRet = DealGetNumBak((int)wParam, (LPBakTv)lParam);
		break;
	case WM_DOWN_ADDR:
		strcpy((CHAR *)lParam, m_initParam.szDownPath);
		break;
	case WM_DOWN_FOLD:
		strcpy((CHAR*)lParam, m_initParam.szZipPath);
		break;
	case WM_EPG_FILE:
		lRet = DealGetEpgFile((LPVOID*)lParam, (int)wParam);
		break;
	case WM_SAVE_SEARCH:
		lRet = m_initParam.bSearchSave;
		break;
	case WM_CHAN_NEAR:
		lRet = m_initParam.lChannear ;
		break;
	case WM_CHAN_CUR:
		lRet = 1;
		memcpy((LPChancel)lParam, &m_curChan, sizeof(Chancel));
		break;
	case WM_CHAN_NUM:
		{
			CString s;
			switch(wParam)
			{
			case 0:
			case 1:
				if(lParam == 1)		//喜好
				{
					s.Format(_T("select * from tv where regcode = %d and tvfav = true"),
						wParam);
					lRet = DealDbLocate(s);
				}
				else				//非喜好
				{
					s.Format(_T("select * from tv where regcode = %d"),
						wParam);
					lRet = DealDbLocate(s);				
				}
			}
		}
	}
	return lRet;
}
//##ModelId=46676C970000
LRESULT CEpgDeal::DealSetProp(UINT nID, WPARAM wParam, LPARAM lParam)
{
	LRESULT lRet =1l ;
	switch(nID)
	{
	case WM_DEFINE_CALLBACK:
		m_pfn = (MsgCallbackProc)lParam;
		break;
	case WM_DESOTRY_CALLBACK:
		m_pfn = NULL;
		break;
	case WM_DOWN_ADDR:
		strcpy(m_initParam.szDownPath, (CHAR *)lParam);
		break;
	case WM_DOWN_FOLD:
		strcpy(m_initParam.szZipPath, (CHAR*)lParam);
		break;
	case WM_SAVE_SEARCH:
		lRet = 1;
		m_initParam.bSearchSave = (bool)lParam;
		break;	
	case WM_CHAN_NEAR:
		lRet = 1;
		m_initParam.lChannear = (long)lParam;
		break;	
	case WM_CHAN_CUR:
#ifdef MYFORREPORT
		memcpy(&m_curChan,(LPChancel)lParam,  sizeof(Chancel));		
#else
		m_curChan.m_nNum = ((LPChancel)lParam)->m_nNum;
#endif		
		lRet = DealGetXXXChance(&m_curChan);
		memcpy((LPChancel)lParam, &m_curChan, sizeof(Chancel));
		break;
	}
	return lRet;
}
//##ModelId=46676C970196
BOOL CEpgDeal::DealDbOpenChan()
{
	HRESULT hr;
	try
	{
		if(bOpenRecord)
			m_pRecordset->Close();
		hr = m_pRecordset->Open("SELECT * FROM tv ORDER BY tvnum",
		_variant_t((IDispatch*)m_pConnection,true),
		adOpenStatic,adLockOptimistic,adCmdText);
		if(FAILED(hr))
		{
			bOpenRecord = FALSE;
			return FALSE;
		}
		bOpenRecord = TRUE;
	}
	catch(_com_error e)
	{
	//	AfxMessageBox(e.ErrorMessage());
		return FALSE;
	}
	return TRUE;
}
//##ModelId=46676C9701F4
BOOL CEpgDeal::DealDbOpenEpg()
{
	HRESULT hr;
	try
	{
		if(bOpenRecord)
			m_pRecordset->Close();

		hr = m_pRecordset->Open("SELECT * FROM EpgInf ORDER BY tvnum",
		_variant_t((IDispatch*)m_pConnection,true),
		adOpenStatic,adLockOptimistic,adCmdText);
		if(FAILED(hr))
		{
			bOpenRecord = FALSE;
			return FALSE;
		}
		bOpenRecord = TRUE;
	}
	catch(_com_error e)
	{
	//	AfxMessageBox(e.ErrorMessage());
		return FALSE;
	}
	return TRUE;
}
//##ModelId=46676C970251
BOOL CEpgDeal::DealDbOpenBakTv()
{
	HRESULT hr;
	try
	{
		if(bOpenRecord)
			m_pRecordset->Close();
	
		hr = m_pRecordset->Open("SELECT * FROM Baktv order by nLNum",
		_variant_t((IDispatch*)m_pConnection,true),
		adOpenStatic,adLockOptimistic,adCmdText);
		if(FAILED(hr))
		{
			bOpenRecord = FALSE;
			return FALSE;
		}
		bOpenRecord = TRUE;
	}catch(_com_error e)
	{
	//	AfxMessageBox(e.ErrorMessage());
		return FALSE;
	}
	return TRUE;
}
//##ModelId=46676C97029F
BOOL CEpgDeal::DealDbAddChancel(LPChancel pChan)
{
	if(DealDbOpenChan())
	{
		CString s;
		s.Format("select * from tv where RegCode = %d", pChan->RegCode);
		
		LONG l = DealDbLocate(s);
		if(pChan->m_nNum == -1)
		{
			s.Format("TV-%ld", l);
			strcpy(pChan->szName, s.LockBuffer());
			if(pChan->RegCode == 0)
				pChan->m_nEpgNum = l;
		}	
		pChan->m_nNum = l++;
		try
		{
			m_pRecordset->AddNew();

			m_pRecordset->PutCollect("tvName", _variant_t(pChan->szName));
			m_pRecordset->PutCollect("tvfrq", pChan->lfrequent);
			m_pRecordset->PutCollect("tvnum", (long)pChan->m_nEpgNum);
			m_pRecordset->PutCollect("tvFName", _variant_t(pChan->tvFName));
			m_pRecordset->PutCollect("RegCode", (long)pChan->RegCode);

⌨️ 快捷键说明

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