📄 geohttpdown.cpp
字号:
BreakLength0=m_stHttpDlInfo.BreakInfo0.BreakLength0;
BreakLength1=m_stHttpDlInfo.BreakInfo1.BreakLength1;
BreakLength1-=LOffet; //这样计算可以得到子线程实际下载的字节数
BreakLength2=m_stHttpDlInfo.BreakInfo2.BreakLength2;
BreakLength2-=LOffet*2;
BreakLength3=m_stHttpDlInfo.BreakInfo3.BreakLength3;
BreakLength3-=LOffet*3;
BreakLength4=m_stHttpDlInfo.BreakInfo4.BreakLength4;
BreakLength4-=LOffet*4;
nCompletedSize=BreakLength0+BreakLength1+BreakLength2+BreakLength3+BreakLength4;
//保存下在完成数
m_stHttpDlInfo.CFG->CFG_SetInt("COMPLETEDSIZE",nCompletedSize);
//finish = nCompletedSize;
if(nCompletedSize<=FileLength && nCompletedSize>0)
{
//---计算已完成的百分比---
dwCompleted=nCompletedSize;
dwCompleted/=1024;
dwPercent=FileLength;
dwPercent/=1024;
dwPercent=dwCompleted*100/dwPercent;
sTemp="";
sTemp.Format("%ld",dwPercent);
sTemp+="%";
WriteDownLoadLog(m_DownInfo->nPID,2,sTemp);
//保存下载百分比
m_stHttpDlInfo.CFG->CFG_SetString("PERCENT",sTemp);
//计算下载速度
//单位时间内线程下载字节数和
m_stHttpDlInfo.fSpeed = m_stHttpDlInfo.BreakInfo0.lSpeed0 +
m_stHttpDlInfo.BreakInfo1.lSpeed1+m_stHttpDlInfo.BreakInfo2.lSpeed2+
m_stHttpDlInfo.BreakInfo3.lSpeed3+m_stHttpDlInfo.BreakInfo4.lSpeed4;
mmSpeed=(long)(m_stHttpDlInfo.fSpeed);
sTemp="";
long lSpeed=mmSpeed;
if(lSpeed>=1024L)
{
lSpeed/=1024L;
sTemp="";
sTemp.Format("%ldkb/s",lSpeed);
WriteDownLoadLog(m_DownInfo->nPID,6,sTemp);
}
else
{
sTemp="";
sTemp.Format("%ldb/s",lSpeed);
WriteDownLoadLog(m_DownInfo->nPID,6,sTemp);
}
}
//---计算剩余时间---
long lbps=mmSpeed; //xxbyte/s
if(lbps>0L)
{
long lComp=FileLength-nCompletedSize; //lComp xxbps
long elhh,elmm,elss;
CalueSpareTimer(elhh,elmm,elss,lComp,lbps);
m_stTimeList.eHH=(int)elhh;
m_stTimeList.eMM=(int)elmm;
m_stTimeList.eSS=(int)elss;
sTemp="";
char sz[9];
FormatTime(m_stTimeList.eHH,m_stTimeList.eMM,m_stTimeList.eSS,sz);
WriteDownLoadLog(m_DownInfo->nPID,5,sz);
}
//break;
}
}//if
else //断点下载
{
//设置下载百分比和速率
long FileLength=m_stHttpDlInfo.lFileLength; //文件总长度
long BreakLength0,BreakLength1,BreakLength2,BreakLength3,BreakLength4; //5个子线程已经下载完的字节数
long nCompletedSize; //已经下载完的总字节数
//long nCompletedSize; //已经下载完的总字节数
long dwPercent,dwCompleted; //已完的百分比,已经下载完的总字节数
long mmSpeed; //每秒下载的字节数(xxkb/s)
CString sTemp;
if(FileLength>0L)
{
long LOffet=FileLength/5L;
m_stHttpDlInfo.fSpeed =0.00;
BreakLength0=m_stHttpDlInfo.BreakInfo0.BreakLength0;
BreakLength1=m_stHttpDlInfo.BreakInfo1.BreakLength1;
BreakLength1-=LOffet; //这样计算可以得到子线程实际下载的字节数
BreakLength2=m_stHttpDlInfo.BreakInfo2.BreakLength2;
BreakLength2-=LOffet*2;
BreakLength3=m_stHttpDlInfo.BreakInfo3.BreakLength3;
BreakLength3-=LOffet*3;
BreakLength4=m_stHttpDlInfo.BreakInfo4.BreakLength4;
BreakLength4-=LOffet*4;
nCompletedSize=BreakLength0+BreakLength1+BreakLength2+
BreakLength3+BreakLength4;
//保存下在完成数
m_stHttpDlInfo.CFG->CFG_SetInt("COMPLETEDSIZE",nCompletedSize);
nCompletedSize+=m_stHttpDlInfo.Completed;
//finish = nCompletedSize;
if(nCompletedSize<=FileLength && nCompletedSize>0)
{
//---计算已完成的百分比---
dwCompleted=nCompletedSize;
dwCompleted/=1024;
dwPercent=FileLength;
dwPercent/=1024;
dwPercent=dwCompleted*100/dwPercent;
sTemp="";
sTemp.Format("%ld",dwPercent);
sTemp+="%";
WriteDownLoadLog(m_DownInfo->nPID,2,sTemp);
//保存下载百分比
m_stHttpDlInfo.CFG->CFG_SetString("PERCENT",sTemp);
//计算下载速度
//单位时间内线程下载字节数和
//判断数据有有效性(这样计算,以为有可能有线程已经下载完毕,不加无效值)
if(m_stHttpDlInfo.BreakInfo0.lSpeed0>0)
m_stHttpDlInfo.fSpeed += m_stHttpDlInfo.BreakInfo0.lSpeed0;
if(m_stHttpDlInfo.BreakInfo1.lSpeed1>0)
m_stHttpDlInfo.fSpeed +=m_stHttpDlInfo.BreakInfo1.lSpeed1;
if(m_stHttpDlInfo.BreakInfo2.lSpeed2>0)
m_stHttpDlInfo.fSpeed +=m_stHttpDlInfo.BreakInfo2.lSpeed2;
if(m_stHttpDlInfo.BreakInfo3.lSpeed3>0)
m_stHttpDlInfo.fSpeed +=m_stHttpDlInfo.BreakInfo3.lSpeed3;
if(m_stHttpDlInfo.BreakInfo4.lSpeed4>0)
m_stHttpDlInfo.fSpeed +=m_stHttpDlInfo.BreakInfo4.lSpeed4;
mmSpeed=(long)(m_stHttpDlInfo.fSpeed);
sTemp="";
long lSpeed=mmSpeed;
if(lSpeed>=1024L)
{
lSpeed/=1024L;
sTemp="";
sTemp.Format("%ldkb/s",lSpeed);
WriteDownLoadLog(m_DownInfo->nPID,6,sTemp);
}
else
{
sTemp="";
sTemp.Format("%ldb/s",lSpeed);
WriteDownLoadLog(m_DownInfo->nPID,6,sTemp);
}
//---计算剩余时间---
long lbps=mmSpeed; //xxbyte/s
if(lbps>0L)
{
long lComp=FileLength-nCompletedSize; //lComp xxbps
long elhh,elmm,elss;
CalueSpareTimer(elhh,elmm,elss,lComp,lbps);
m_stTimeList.eHH=(int)elhh;
m_stTimeList.eMM=(int)elmm;
m_stTimeList.eSS=(int)elss;
sTemp="";
char sz[9];
FormatTime(m_stTimeList.eHH,m_stTimeList.eMM,m_stTimeList.eSS,sz);
WriteDownLoadLog(m_DownInfo->nPID,5,sz);
}
}
}
}
}break;
}
}
void FormatTime(int ihh,int imm,int iss,char sz[])
{
char hh[10],mm[10],ss[10];
if(ihh<10)
{
_itoa(ihh,hh,10);
hh[1]=hh[0];
hh[0]='0';
hh[2]='\0';
}
else
_itoa(ihh,hh,10);
if(imm<10)
{
_itoa(imm,mm,10);
mm[1]=mm[0];
mm[0]='0';
mm[2]='\0';
}
else
_itoa(imm,mm,10);
if(iss<10)
{
_itoa(iss,ss,10);
ss[1]=ss[0];
ss[0]='0';
ss[2]='\0';
}
else
_itoa(iss,ss,10);
sz[0]=hh[0];
sz[1]=hh[1];
sz[2]=':';
sz[3]=mm[0];
sz[4]=mm[1];
sz[5]=':';
sz[6]=ss[0];
sz[7]=ss[1];
sz[8]='\0';
}
void CGeoHttpDown::StartClock(WPARAM wParam,LPARAM lParam)
{
LPCLOCK clock = (LPCLOCK)lParam;
SetTimer(clock->ID,clock->time,NULL);
}
//获得主机名字
CString GetHostName(const char* url,const char* strObject)
{
CString host; //主机
CString strurl=url;
int nPos = strurl.Find(strObject);
host = strurl.Mid(0,nPos+1);
//去http://
host = host.Mid(7,host.GetLength()-8);
return host;
}
//获得引用名字
CString getRefererName(const char* url)
{
CString Referer;
CString strurl=url;
int nPos = strurl.ReverseFind('/');
Referer = strurl.Mid(0,nPos);
return Referer;
}
//写列表控件下载信息
void WriteDownLoadLog(int item,int subitem,CString log)
{
//状态
LPINSERTLISTlog LPLog = new INSERTLISTlog;
CMainFrame* pMainFrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CMyInsaneBTView* pView = NULL;
pView = (CMyInsaneBTView*)pMainFrm->GetActiveView();
LPLog->m_nitem = item;
LPLog->nSubItem =subitem;
LPLog->m_Log = log;
pView->SendMessage(WM_SETLISTLOG,0,(LPARAM)LPLog);
}
//获得下载信息
void GetDownLoadLog(int item,int subitem,CString& log)
{
CMainFrame* pMainFrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CMyInsaneBTView* pView = NULL;
pView = (CMyInsaneBTView*)pMainFrm->GetActiveView();
log = pView->m_downlisctr.GetItemText(item,subitem);
}
void CalueFloat(CString &f1,CString &b2,CString ss)
{
f1=ss.Left(ss.GetLength()-3);
b2=ss.Right(2);
}
void CalueSpareTimer(long &hh,long &mm,long &ss,long lComp,long lbps)
{
CString f1,b2,sTemp;
float fComp,fbps;
fComp=(float)lComp;
if(lbps>1024L)
fComp/=1024.0f;
fbps=(float)lbps;
if(lbps>1024L)
fbps/=1024.0f;
fComp/=fbps;
float fss=fComp;
fss/=60.0f;
sTemp="";
sTemp.Format("%.2f",fss);
CalueFloat(f1,b2,sTemp);
fss=(float)_ttol((LPCTSTR)b2);
float fmm=(float)_ttol((LPCTSTR)f1);
fss*=0.01f;
fss*=60.0f; //%.0f 12s
//Calue "mm"
fmm/=60.0f;
sTemp="";
f1="";
b2="";
sTemp.Format("%.2f",fmm);
CalueFloat(f1,b2,sTemp);
fmm=(float)_ttol((LPCTSTR)b2);
float fhh=(float)_ttol((LPCTSTR)f1);
fmm*=0.01f;
fmm*=60.0f; //%.0f 23m
hh=(long)fhh;
mm=(long)fmm;
ss=(long)fss;
}
//修改下载完成文件后缀名
void ChangeFileName(CString& sPath)
{
CString snew = sPath.Left(sPath.GetLength()-4);
CFile::Rename(sPath,snew);
}
//创建 DOWN_INFO结构
void CGeoHttpDown::create_DownInfo(const map<CString,CString>&CFGMAP)
{
m_DownInfo = new DOWN_INFO();
ASSERT(m_DownInfo!=NULL);
//无信号
m_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
m_DownInfo->nSocketLinkNum = 3;
CMainFrame* pMainFrame =(CMainFrame*) AfxGetApp()->m_pMainWnd;
m_DownInfo->bIsFileDown = false; //断点下载
m_DownInfo->nBreakRev = 1;
//URL
m_DownInfo->strLocationUrl = CFGMAP.find("URL")->second;
m_DownInfo->pMainFrame = pMainFrame; //主框架
//文件保存路径
m_DownInfo->strFilePath =CFGMAP.find("FULLPATH")->second;
//文件大小
CString tmp = CFGMAP.find("FILESIZE")->second;
m_DownInfo->lFileLength = (long)atof(tmp.GetBuffer(1));
//PID
tmp = CFGMAP.find("PID")->second;
m_DownInfo->nPID = (int)atof(tmp.GetBuffer(1));
//进度
tmp = CFGMAP.find("PERCENT")->second;
tmp = tmp.Left(tmp.GetLength()-1);
m_DownInfo->fPercent = (float)atof(tmp.GetBuffer(1));
//下载用时
CString time = CFGMAP.find("USETIME")->second;
m_usetime.nPID = m_DownInfo->nPID;
SetTime(time);
m_stHttpDlInfo.time = time;
m_stHttpDlInfo.m_HandleStop = CreateEvent(NULL, TRUE, TRUE, NULL);
m_stHttpDlInfo.m_Break_handle = CreateEvent(NULL, TRUE, FALSE, NULL);
//文件名字
tmp = CFGMAP.find("FILENAME")->second;
tmp = tmp.Left(tmp.GetLength()-4);
m_stHttpDlInfo.m_Filename = tmp;
//已下载
tmp = CFGMAP.find("COMPLETEDSIZE")->second;
m_stHttpDlInfo.Completed = (long)atof(tmp.GetBuffer(1));
//设置线程断点位置
tmp = CFGMAP.find("BREAKPOINT0")->second;
m_stHttpDlInfo.BreakInfo0.BreakLength0 = (long)atof(tmp.GetBuffer(1));
m_stHttpDlInfo.BreakInfo0.lFromeByte = m_stHttpDlInfo.BreakInfo0.BreakLength0;
tmp = CFGMAP.find("LENGTH0")->second;
m_stHttpDlInfo.BreakInfo0.lToByte = (long)atof(tmp.GetBuffer(1));
tmp = CFGMAP.find("BREAKPOINT1")->second;
m_stHttpDlInfo.BreakInfo1.BreakLength1 = (long)atof(tmp.GetBuffer(1));
m_stHttpDlInfo.BreakInfo1.lFromeByte = m_stHttpDlInfo.BreakInfo1.BreakLength1;
tmp = CFGMAP.find("LENGTH1")->second;
m_stHttpDlInfo.BreakInfo1.lToByte = (long)atof(tmp.GetBuffer(1));
tmp = CFGMAP.find("BREAKPOINT2")->second;
m_stHttpDlInfo.BreakInfo2.BreakLength2 = (long)atof(tmp.GetBuffer(1));
m_stHttpDlInfo.BreakInfo2.lFromeByte = m_stHttpDlInfo.BreakInfo2.BreakLength2;
tmp = CFGMAP.find("LENGTH2")->second;
m_stHttpDlInfo.BreakInfo2.lToByte = (long)atof(tmp.GetBuffer(1));
tmp = CFGMAP.find("BREAKPOINT3")->second;
m_stHttpDlInfo.BreakInfo3.BreakLength3 = (long)atof(tmp.GetBuffer(1));
m_stHttpDlInfo.BreakInfo3.lFromeByte = m_stHttpDlInfo.BreakInfo3.BreakLength3;
tmp = CFGMAP.find("LENGTH0")->second;
m_stHttpDlInfo.BreakInfo3.lToByte = (long)atof(tmp.GetBuffer(1));
tmp = CFGMAP.find("BREAKPOINT4")->second;
m_stHttpDlInfo.BreakInfo4.BreakLength4 = (long)atof(tmp.GetBuffer(1));
m_stHttpDlInfo.BreakInfo4.lFromeByte = m_stHttpDlInfo.BreakInfo4.BreakLength4;
tmp = CFGMAP.find("LENGTH4")->second;
m_stHttpDlInfo.BreakInfo4.lToByte = (long)atof(tmp.GetBuffer(1));
CMainFrame* pFrmMain = (CMainFrame*)m_DownInfo->pMainFrame;
m_pView = (CMyInsaneBTView*)pFrmMain->GetActiveView();
//m_stHttpDlInfo.CFG = new CBreakPointDown;
m_stHttpDlInfo.m_HandleStop = CreateEvent(NULL, TRUE, TRUE, NULL);
m_stHttpDlInfo.m_Stop =true;
m_stHttpDlInfo.m_HTTPDOWNCLS = this;
pFrmMain->m_http_info.push_back(&m_stHttpDlInfo);
}
void CGeoHttpDown::SetTime(CString time)
{
//00:00:06 HH:MM:SS
//:HH
int nPos = time.Find(":");
m_usetime.nHH = (int)atof(time.Left(2).GetBuffer(1));
time = time.Mid(nPos+1,time.GetLength()-nPos);
//MM
nPos = time.Find(":");
m_usetime.nMM = (int)atof(time.Left(2).GetBuffer(1));
time = time.Mid(nPos+1,time.GetLength()-nPos);
//SS
m_usetime.nSS = (int)atof(time.Left(2).GetBuffer(1));
}
//判断下载的文件是否存在
bool FindFile(const char* sPath)
{
CFileFind Find;
if(Find.FindFile(sPath))
{
//文件已经存在,是否删除
CSureDlg dlg;
dlg.DoModal();
if(sure) //删除该文件
{
CFile::Remove(sPath);
return true;
}
return false; //不删除,不下载
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -