📄 epgdeal.cpp
字号:
TCHAR szDir[255];
int nLen;
nLen = GetModuleFileName(NULL, szDir, 255);
CString strFileName;
strFileName = pWnd->m_initParam.szZipPath;
if(!strFileName.IsEmpty())
{
strFileName += "\\epg.zip";
}
else
{
pWnd->bdownloading = FALSE;
return 0;
}
CHttpSocket HttpSocket;
CString strServer,strObject;
unsigned short nPort;
DWORD dwServiceType;
long nLength;
const char *pRequestHeader = NULL;
CString strRequest = pWnd->m_initParam.szDownPath;
if(strRequest.IsEmpty())
strRequest = _T("http://www.cctv.com/download/showtime.zip");
AfxParseURL(strRequest,dwServiceType,strServer,strObject,nPort);
pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)strServer,(LPTSTR)(LPCTSTR)strObject,nLength);
HttpSocket.Socket();
BOOL bRes = FALSE;
bRes = HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer);
if(!bRes)
{
pWnd->bdownloading = FALSE;
pWnd->DealCallBackDownPercent(-1);
return 0;
}
HttpSocket.SendRequest();
HttpSocket.SetTimeout(20000,0);
char szValue[30];
HttpSocket.GetField("content-length",szValue,30);
int nSvrState = HttpSocket.GetServerState();
int nFileSize = atoi(szValue);
int nCompletedSize = 0;
CFile DownloadFile;
DownloadFile.Open(strFileName,CFile::modeCreate | CFile::modeWrite);
char pData[1024];
int nReceSize = 0;
DWORD dwStartTime,dwEndTime;
while(nCompletedSize < nFileSize)
{
dwStartTime = GetTickCount();
nReceSize = HttpSocket.Receive(pData,1024);
if(nReceSize == 0)
{
break;
}
if(nReceSize == -1)
{
break;
}
dwEndTime = GetTickCount();
DownloadFile.Write(pData,nReceSize);
nCompletedSize += nReceSize;
if(nCompletedSize != nFileSize)
pWnd->DealCallBackDownPercent((100.0*nCompletedSize)/nFileSize);
}
DownloadFile.Close();
CPackManage pack;
BOOL bRet;
if(nCompletedSize == nFileSize)
{
//删除原来的epg目录
if(pack.LoadResourcePack(strFileName))
bRet = pack.ExtractPack();
}
if(bRet)
pWnd->DealCallBackDownPercent(100);
else
pWnd->DealCallBackDownPercent(-1);
pWnd->bdownloading = FALSE;
return 0;
}
BOOL CEpgDeal::DownLoadEpg()
{
//删除掉原来的epg文件目录
bdownloading = TRUE;
AfxBeginThread(DownloadThread,(void *)this);
return TRUE;
}
BOOL CEpgDeal::DealDbLocateAllChancel(int ncode)
{
CString s;
LONG lRet;
ReleaseListChan();
if(m_curChan.tvFav && ncode == 1)
{
CString ss;
ss = "FALSE";
s.Format("select * from tv where RegCode = %d and tvFav=true order by nNum"
, ncode);
}
else
s.Format("select * from tv where RegCode = %d order by nNum"
, ncode);
lRet = DealDbLocate(s);
if(lRet > 0)
m_pRecordset->MoveFirst();
else
return FALSE;
AllocListChan(lRet);
// m_listChan = new Chancel[lRet];
// m_nChan = 0;
for(int i=0;i< lRet; i++)
{
DealDbGetCurChanRecrod();
m_pRecordset->MoveNext();
}
return TRUE;
}
BOOL CEpgDeal::DealCopyAsCur(int nRegCode, int srcReg)
{
CString s;
LONG lRet;
int i;
s.Format("delete * from tv where RegCode =%d", nRegCode);
lRet = DealDbDelete(s);
s.Format("select * from tv where RegCode = %d order by tvNum", srcReg);
lRet = DealDbLocate(s);
if(lRet > 0)
m_pRecordset->MoveFirst();
else
return FALSE;
ReleaseListChan();
AllocListChan(lRet);
for(i= 0;i < lRet ; i++)
{
DealDbGetCurChanRecrod();
m_listChan[i].RegCode = nRegCode;
m_pRecordset->MoveNext();
}
for(i= 0;i < lRet; i++)
{
DealDbAddChancel(&m_listChan[i]);
}
return TRUE;
}
BOOL CEpgDeal::DealDbCheckHasEpg(LPChancel pChan)
{
CString s, s1;
LONG lRet;
BOOL bRet = TRUE;
//更新频道编号
DealDbChancelXX(pChan);
//先简单判断有无内部编号
s.Format("select * from tv where RegCode = %d and nNum = %d",
pChan->RegCode,pChan->m_nNum);
lRet = DealDbLocate(s);
if(lRet == 1) //有内部编号
{
ReleaseListChan();
AllocListChan(1);
DealDbGetCurChanRecrod();
pChan->m_nEpgNum = m_listChan[0].m_nEpgNum;
strcpy(pChan->tvFName, m_listChan[0].tvFName);
}
else //查找库存中的与之
{
//先找到电台内部编号
s.Format("select * from tv where tvFName= \"%s\" and RegCode= 0", pChan->tvFName);
lRet = DealDbLocate(s);
if(lRet == 1)
{
ReleaseListChan();
AllocListChan(1);
DealDbGetCurChanRecrod();
pChan->m_nEpgNum = m_listChan[0].m_nEpgNum;
strcpy(pChan->tvFName, m_listChan[0].tvFName);
}
else
return FALSE;
}
//判断有无Epg信息
CTime t = CTime::GetCurrentTime();
s1 = t.Format("%m/%d/%Y");
s.Format("select * from epginf where tvNum =%d and datediff(\"d\", tvStartT, #%s#)=0 order by tvStartT"
, pChan->m_nEpgNum, s1.LockBuffer());
int ncnt =2;
again:
lRet = DealDbLocate(s);
if(lRet == 0)
{
//无Epg信息,则查找文件,将Epg信息写入到数据库中
bRet = DealBuildEpgFromFile(pChan->m_nEpgNum, pChan->tvFName);
ncnt --;
if(ncnt == 1)
goto again;
}
return bRet;
}
BOOL CEpgDeal::DealAddBak()
{
CString s;
LONG lRet;
BakTv bakls;
//取得最大编号,
s.Format("select * from Baktv order by nLNum");
lRet = DealDbLocate(s);
if(lRet > 0)
m_pRecordset->MoveLast();
else
{
bakls.nRegCode = 100;
goto con;
}
DealDbGetCurrentBak(&bakls);
if(bakls.nRegCode < 100)
bakls.nRegCode = 100;
else
bakls.nRegCode ++;
con:
//加入信息到tv表中
DealCopyAsCur(bakls.nRegCode, 1);
//加入信息到baktv表中。
COleDateTime oledt = COleDateTime::GetCurrentTime();
oledt.GetAsSystemTime(bakls.startTime);
if(DealDbOpenBakTv())
{
_variant_t vtdate;
vtdate.vt = VT_DATE;
vtdate.date = oledt;
m_pRecordset->AddNew();
m_pRecordset->PutCollect("nLNum", (long)bakls.nRegCode);
m_pRecordset->PutCollect("BakDate", vtdate);
m_pRecordset->Update();
}
else
{
s.Format("delete * from tv where RegCode = %d", bakls.nRegCode);
DealDbDelete(s);
}
return TRUE;
}
BOOL CEpgDeal::DealDbGetCurrentBak(LPBakTv pbak)
{
VARIANT var;
COleDateTime oledt;
var = m_pRecordset->GetCollect("nLNum");
pbak->nRegCode = var.iVal;
var = m_pRecordset->GetCollect("BakDate");
oledt = var.date;
oledt.GetAsSystemTime(pbak->startTime);
return TRUE;
}
BOOL CEpgDeal::DealDbGetAllBak(CStringList *slist)
{
CString s;
LONG lRet;
BakTv bktv;
s.Format("select * from Baktv order by BakDate");
lRet = DealDbLocate(s);
if(lRet<1)
return FALSE;
m_pRecordset->MoveFirst();
for(int i= 0;i < lRet ;i ++)
{
DealDbGetCurrentBak(&bktv);
CTime t(bktv.startTime);
s = t.Format("%Y-%m-%d %H:%M:%S");
slist->AddTail(s);
m_pRecordset->MoveNext();
}
return TRUE;
}
BOOL CEpgDeal::DealGetNumBak(int nNum, LPBakTv ptv)
{
CString s;
LONG lRet;
s.Format("select * from Baktv order by BakDate");
lRet = DealDbLocate(s);
if(lRet<1)
return FALSE;
if(nNum<0 || nNum >= lRet)
return FALSE;
m_pRecordset->Move(nNum);
DealDbGetCurrentBak(ptv);
return TRUE;
}
BOOL CEpgDeal::DealDelBakTv(int nRegcode)
{
BOOL bRet;
CString s;
s.Format("delete * from tv where RegCode = %d", nRegcode);
bRet = DealDbDelete(s);
if(bRet)
{
s.Format("delete * from baktv where nLNum = %d", nRegcode);
bRet = DealDbDelete(s);
}
return bRet;
}
LRESULT CEpgDeal::DealCallBack(UINT nID, WPARAM wParam, LPARAM lParam)
{
if(m_pfn)
return m_pfn(WM_MSG_EPG, nID, wParam, lParam);
else
return -1l;
}
BOOL CEpgDeal::DealSearchStart()
{
CString s;
s = "delete * from tv where regcode = 1";
if(!DealDbDelete(s))
return FALSE;
DealCallBack(MAKELONG(WM_SEARCH_START, WM_EPG_DONE), 0, 0);
return TRUE;
}
BOOL CEpgDeal::DealSearchCance()
{
DealCallBack(MAKELONG(WM_SEARCH_CANCEL, WM_EPG_DONE), 0, 0);
return TRUE;
}
BOOL CEpgDeal::DealSearchEnd()
{
// if(!DealCopyAsCur(1, 4))
// return FALSE;
DealCallBack(MAKELONG(WM_SEARCH_END, WM_EPG_DONE), 0, 0);
return TRUE;
}
BOOL CEpgDeal::DealSearchOne(long freq)
{
Chancel ch;
ZeroMemory(&ch, sizeof(Chancel));
ch.RegCode = 1;
ch.lfrequent = freq;
ch.m_nNum = -1;
if(DealDbAddChancel(&ch))
{
DealCallBack(MAKELONG(WM_SEARCH_ONE, WM_EPG_DONE), 0, (LPARAM)&ch);
return TRUE;
}
return FALSE;
}
BOOL CEpgDeal::DealEnterEditChan()
{
//判断是否为第一次进入
if(m_curstatus== 3)
return TRUE;
//备份当前记录
return DealCopyAsCur(5, 1);
}
BOOL CEpgDeal::DealLeaveEditChan(int nID)
{
//如果当前为取消更新
switch(nID)
{
case WM_CHAN_CANCEL:
return DealCopyAsCur(1, 5);
case WM_CHAN_UPDATE:
return DealCopyAsCur(5, 1);
}
return FALSE;
}
void CEpgDeal::DealCallBackDownPercent(int nPos)
{
if(nPos == 100) //下载完成
{
DealCallBack(MAKELONG(WM_DOWN_SUCCES, WM_EPG_GET), 0, (LPARAM)nPos);
return;
}
if(nPos == -1) //下载失败
{
DealCallBack(MAKELONG(WM_DOWN_FAILED, WM_EPG_GET), 0, (LPARAM)nPos);
return;
}
//下载进度
DealCallBack(MAKELONG(WM_DOWN_PERCENT, WM_EPG_GET), 0, (LPARAM)nPos);
}
BOOL CEpgDeal::DealGetEpgFile(LPVOID *pVoid, int n)
{
CString s = m_initParam.szZipPath;
if(!pVoid)
return FALSE;
s += "\\节目单";
WIN32_FILE_ATTRIBUTE_DATA *attrdata;
WIN32_FIND_DATA fdata;
BYTE *pBt = new BYTE [1024];
BOOL bRet;
HANDLE hFile;
fvec.clear();
bRet = GetFileAttributesEx (s, GetFileExInfoStandard, (void *)pBt);
if(!bRet)
{
delete []pBt;
return FALSE;
}
attrdata = (WIN32_FILE_ATTRIBUTE_DATA *)pBt;
if(attrdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
s += "\\*.txt";
hFile = FindFirstFile(s, &fdata);
if(hFile)
{
fvec.push_back(fdata.cFileName);
while(FindNextFile(hFile, &fdata))
fvec.push_back(fdata.cFileName);
}
}
*pVoid = &fvec;
delete []pBt;
return bRet;
}
BOOL CEpgDeal::DealDbChancelXX(LPChancel pChan)
{
CString s;
LONG lRet;
if(pChan->lfrequent == -2)
return true;
if(!pChan->tvFav) //没有使用喜好
{
switch(pChan->lfrequent)
{
case -3 ://down
pChan->m_nNum--;
break;
case -1: //up:
pChan->m_nNum++;
break;
default:
pChan->m_nNum+= pChan->lfrequent;
}
s.Format("select * from tv where RegCode =%d order by nNum",
pChan->RegCode);
lRet = DealDbLocate(s);
if(pChan->m_nNum<0)
pChan->m_nNum += lRet;
pChan->m_nNum %= lRet;
return true;
}
else //使用喜好
{
VARIANT var;
bool bfind = false;
int i;
s.Format("select * from tv where RegCode =%d tvFav =%d order by nNum",
pChan->RegCode, pChan->tvFav);
lRet = DealDbLocate(s);
try
{
if(lRet>0)
{
//如果是切换到某一个频道
if(pChan->lfrequent>-1 && pChan->lfrequent<lRet)
{
m_pRecordset->Move(pChan->lfrequent);
var = m_pRecordset->GetCollect("nNum");
pChan->m_nNum = var.iVal;
return true;
}
m_pRecordset->MoveFirst();
}
for(i=0;i<lRet;i++)
{
var = m_pRecordset->GetCollect("nNum");
if(bfind && pChan->lfrequent == -3 ) //up
{
pChan->m_nNum = var.iVal;
return true;
}
if(var.iVal == pChan->m_nNum)
{
bfind = true;
}
if(bfind && pChan->lfrequent == -3) //down
{
if(i==0)
m_pRecordset->MoveLast();
else
m_pRecordset->MovePrevious();
var = m_pRecordset->GetCollect("nNum");
pChan->m_nNum = var.iVal;
}
m_pRecordset->MoveNext();
}
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
return false;
}
if(bfind || lRet>0)
{
m_pRecordset->MoveFirst();
var = m_pRecordset->GetCollect("nNum");
pChan->m_nNum = var.iVal;
return true;
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -