📄 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
//////////////////////////////////////////////////////////////////////
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));
Init();
}
CEpgDeal::~CEpgDeal()
{
DeInit();
}
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);
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);
}
Chancel ch;
strcpy(ch.szName, "CCTV 2");
ch.lfrequent = 23434;
// DealBuildEpg();
// DealLocateTodayEpg();
// DealLocateCur5Epg();
// CheckCurChan();
CheckDownLoad();
// DealBuildEpgFromFile("01.txt");
// DealDbDelChancel(NULL);
// DealDbAddChancel(&ch);
// DealDbAddChancel(&ch);
return TRUE;
}
BOOL CEpgDeal::DeInit()
{
if(bOpenRecord)
m_pRecordset->Close();
if(m_pConnection->State)
m_pConnection->Close();
ReleaseListChan();
ReleaseListEpg();
return TRUE;
}
void CEpgDeal::ReleaseListChan()
{
if(m_listChan)
{
delete []m_listChan;
m_listChan = NULL;
m_nChan = 0;
}
}
void CEpgDeal::AllocListChan(int n)
{
ReleaseListChan();
m_listChan = new Chancel[n];
ZeroMemory(m_listChan, sizeof(Chancel) * n);
m_nChan = 0;
}
void CEpgDeal::ReleaseListEpg()
{
if(m_listEpg)
{
delete []m_listEpg;
m_listEpg = NULL;
m_nEpg = 0;
}
}
void CEpgDeal::AllocListEpg(int n)
{
ReleaseListEpg();
m_listEpg = new EpgInfo[n];
ZeroMemory(m_listEpg, sizeof(EpgInfo) * n);
m_nChan = 0;
}
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;
}
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;
}
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:
m_curstatus = 1;
break;
}
return lRet;
}
LRESULT CEpgDeal::DealGetProp(UINT nID, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = -1;
switch(nID)
{
case WM_CHAN_LIST_LIB:
DealDbLocateAllChancel(0);
*(int*)wParam = m_nChan;
*(LPChancel*)lParam = m_listChan;
break;
case WM_CHAN_LIST:
m_curChan.tvFav = (BOOL)wParam;
DealDbLocateAllChancel(1);
lRet = m_nChan;
*(LPChancel*)lParam = m_listChan;
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_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;
}
return lRet;
}
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;
}
return lRet;
}
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;
}
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;
}
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;
}
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)
{
pChan->m_nNum = l++;
s.Format("TV-%ld", l);
strcpy(pChan->szName, s.LockBuffer());
if(pChan->RegCode == 0)
pChan->m_nEpgNum = 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);
m_pRecordset->PutCollect("nNum", (long)pChan->m_nNum );
m_pRecordset->PutCollect("tvSel", (long)pChan->tvSel);
m_pRecordset->PutCollect("tvFav", (long)pChan->tvFav);
m_pRecordset->Update();
return TRUE;
}catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}
return FALSE;
}
BOOL CEpgDeal::DealDbDelChancel(LPChancel pChan)
{
if(DealDbOpenChan())
{
try
{
LONG l; // = m_pRecordset->GetRecordCount();
if(pChan)
{
CString s;
s.Format("select * from tv where RegCode=%d and nNum = %d",
pChan->RegCode, pChan->m_nNum);
l = DealDbLocate(s);
if(l == 1)
{
m_pRecordset->MoveFirst();
m_pRecordset->Delete(adAffectCurrent);
//将后面的编号往前移
s.Format("Select * from tv where RegCode=%d and nNum > %d",
pChan->RegCode, pChan->m_nNum);
if(DealDbLocate(s)>0)
{
m_pRecordset->MoveFirst();
l = pChan->m_nNum ;
while(!m_pRecordset->adoEOF)
{
m_pRecordset->PutCollect("nNum", l++);
m_pRecordset->Update();
m_pRecordset->MoveNext();
}
}
return TRUE;
}
else
return FALSE;
}
else
{
if(l>0)
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
while(!m_pRecordset->adoEOF)
{
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->MoveNext();
}
return TRUE;
}
}
}catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}
return FALSE;
}
BOOL CEpgDeal::DealDbChancelUpDown(int pos, LPChancel pChan)
{
CString s;
LONG lRet;
s.Format("select * from tv where RegCode =%d order by nNum",
pChan->RegCode);
lRet = DealDbLocate(s);
if(lRet > 0 && pChan->m_nNum>=0 && pChan->m_nNum < lRet)
{
pos += pChan->m_nNum;
if(pos<0)
pos += lRet;
pos %= lRet;
try{
m_pRecordset->Move((long)pos);
m_pRecordset->PutCollect("nNum", (long)pChan->m_nNum);
m_pRecordset->Update();
m_pRecordset->Move((long)(pChan->m_nNum - pos));
m_pRecordset->PutCollect("nNum", (long)pos);
m_pRecordset->Update();
return TRUE;
}catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}
return FALSE;
}
BOOL CEpgDeal::DealDbEditChancel(LPChancel pChan)
{
if(DealDbOpenChan())
{
//找到编号所在记录,然后,更新记录即可
CString s;
LONG lRet;
BOOL bRept = TRUE;;
again:
s.Format("select * from tv where RegCode= %d and nNum = %d",
pChan->RegCode, pChan->m_nNum);
lRet = DealDbLocate(s);
try
{
if(lRet == 1)
{
m_pRecordset->MoveFirst();
m_pRecordset->PutCollect("tvName", _variant_t(pChan->szName));
m_pRecordset->PutCollect("tvNum", (long)pChan->m_nEpgNum);
m_pRecordset->PutCollect("tvFav", (long)pChan->tvFav);
m_pRecordset->PutCollect("tvFrq", pChan->lfrequent);
m_pRecordset->PutCollect("tvFName", _variant_t(pChan->tvFName));
m_pRecordset->Update();
if(bRept)
{
//如果文件名为空的话,就退出
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -