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