C++调用迅雷接口解析XML下载功能(迅雷下载功能)
迅雷下载库的网址:http://thunderplatform.xunlei.com
//FileName:Download.h
#pragmaonce
#include"lib\XLDownload.h"
#include"lib\XLError.h"
#include<vector>
//下载队列的大小,决定同时开启下载线程的数量
constintLIMIT=2;
structDown
{
//解析出来的下载地址
CStringstrDownURL;
//保存的路径
CStringstrSavePath;
};
structFlag
{
DWORDdwFlag; //记录下载线程实时状态
LONGlTaskId; //记录对应任务ID号
ULONGLONGullFileSize; //下载文件大小
ULONGLONGullRecvSize; //已下载大小
};
classCDownload
{
private:
//保存下载的日志信息
std::vector<CString>strLogArr;
//解析XML文件
//voidAnalysis(LPCTSTRlpPathXML,LPCTSTRlpBegin,LPCTSTRlpEnd);
voidAnalysis(LPCTSTRlpPathXML);
//开始下载
voidStart(void);
//调用迅雷的下载接口
voidCreateDownThread(intn);
//下载任务查询监控线程
staticvoidDownQury(LPVOIDptr);
//保存日志
voidSaveLog(LPCTSTRlpPathAndName);
public:
//保存解析出来的下载队列
std::vector<Down>strDownArr;
//记录最新的下载位置
intm_nIndex;
//下载队列的大小,对应位为1时,该下载位为空,可以启动新的下载线程
structFlagFlags[LIMIT];
//总共的下载数
intm_nTotal;
//失败的下载数
intm_nFail;
//成功的下载数
intm_nSuccess;
CDownload();
~CDownload();
BOOLDownloadFilesByXML(LPCTSTRlpPahtXML);
};
//FileName:Download.cpp
#include"stdafx.h"
#include"Download.h"
#include<Shlwapi.h>
#include<locale.h>
#pragmacomment(lib,"lib\\XLDownload.lib")
//包含XTP界面库头文件
#include"XTToolkitPro.h"
CDownload::CDownload()
{
//初始化
m_nIndex=0;
//初始化为没有下载线程
for(intn=0;n<LIMIT;n++)
{
Flags[n].dwFlag=1;
Flags[n].lTaskId=n;
}
m_nSuccess=0;
m_nTotal=0;
m_nFail=0;
}
CDownload::~CDownload()
{
}
BOOLCDownload::DownloadFilesByXML(LPCTSTRlpPathXML)
{
DWORDdwRet=XL_SUCCESS;
//检测XML文件是否存在
if(!PathFileExists(lpPathXML))
{
::MessageBox(NULL,_T("XML文件不存在!"),_T("友情提示"),MB_OK|MB_ICONEXCLAMATION);
returnFALSE;
}
//解析XML文件
Analysis(lpPathXML);
//统计下载链接数
m_nTotal=strDownArr.size();
//开始下载
Start();
returnTRUE;
}
//voidCDownload::Analysis(LPCTSTRlpPathXML,LPCTSTRlpBegin,LPCTSTRlpEnd)
voidCDownload::Analysis(LPCTSTRlpPathXML)
{
//读取XML文件
CXTPPropExchangeXMLNodepx(TRUE,NULL,_T("DownLoadInfo"));
if(!px.LoadFromFile(lpPathXML))
{
::MessageBox(NULL,_T("打开XML文件出错!"),_T("友情提示"),MB_OK|MB_ICONEXCLAMATION);
return;
}
if(!px.OnBeforeExchange())
{
::MessageBox(NULL,_T("OnBeforeExchangefalse!"),_T("友情提示"),MB_OK|MB_ICONEXCLAMATION);
return;
}
px.SetCompactMode(TRUE);
CXTPPropExchangeEnumeratorPtrenumItem(px.GetEnumerator(_T("Item")));
POSITIONposItem=enumItem->GetPosition();
CStringstrLocalName;
Downdown;
//遍历所有的结点
while(posItem)
{
CXTPPropExchangeSectionsec(enumItem->GetNext(posItem));
if(sec->IsLoading())
{
PX_String(sec->GetSection(_T("URL")),NULL,down.strDownURL);
PX_String(sec->GetSection(_T("LocalPath")),NULL,down.strSavePath);
PX_String(sec->GetSection(_T("LocalName")),NULL,strLocalName);
down.strSavePath+=strLocalName;
//路径转换
down.strSavePath.Replace("/","\\");
strDownArr.push_back(down);
}
}
}
//下载任务查询
voidCDownload::DownQury(LPVOIDptr)
{
CDownload*pDown=(CDownload*)ptr;
boolnSign=true;
DWORDdwRst;
TCHARerrorBuf[500];
DWORDdwSize=500;
CStringstrLog;
//如果没有下载完成一直下载
while((pDown->m_nIndex<(pDown->strDownArr).size())||nSign)
{
intn=0;
LONGtemp=-1;
nSign=false;
while(n<LIMIT)
{
switch(pDown->Flags[n].dwFlag)
{
//没有下载,开始新的下载
case1:
pDown->CreateDownThread(n);
dwRst=XLQueryTaskInfo(pDown->Flags[n].lTaskId,&temp,&(pDown->Flags[n].ullFileSize),&(pDown->Flags[n].ullRecvSize));
if(dwRst==XL_SUCCESS&&pDown->m_nIndex<pDown->strDownArr.size())
{
pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
pDown->strLogArr.push_back(_T("state:suceess"));
pDown->Flags[n].dwFlag=temp;
}
else
{
if(pDown->m_nIndex<pDown->strDownArr.size())
{
pDown->m_nFail+=1;
XLGetErrorMsg(dwRst,errorBuf,dwSize);
pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
strLog.Format(_T("state:%s"),errorBuf);
pDown->strLogArr.push_back(strLog);
}
pDown->m_nIndex+=1;
}
break;
//成功下载完,开始新的下载
case11:
pDown->CreateDownThread(n);
dwRst=XLQueryTaskInfo(pDown->Flags[n].lTaskId,&temp,&(pDown->Flags[n].ullFileSize),&(pDown->Flags[n].ullRecvSize));
if(dwRst==XL_SUCCESS&&pDown->m_nIndex<pDown->strDownArr.size())
{
pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
pDown->strLogArr.push_back(_T("state:suceess"));
pDown->Flags[n].dwFlag=temp;
}
else
{
if(pDown->m_nIndex<pDown->strDownArr.size())
{
pDown->m_nFail+=1;
XLGetErrorMsg(dwRst,errorBuf,dwSize);
pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
strLog.Format(_T("state:%s"),errorBuf);
pDown->strLogArr.push_back(strLog);
}
pDown->m_nIndex+=1;
}
break;
//下载失败,开始新的下载
case12:
pDown->CreateDownThread(n);
dwRst=XLQueryTaskInfo(pDown->Flags[n].lTaskId,&temp,&(pDown->Flags[n].ullFileSize),&(pDown->Flags[n].ullRecvSize));
if(dwRst==XL_SUCCESS&&pDown->m_nIndex<pDown->strDownArr.size())
{
pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
pDown->strLogArr.push_back(_T("state:suceess"));
pDown->Flags[n].dwFlag=temp;
}
else
{
if(pDown->m_nIndex<pDown->strDownArr.size())
{
pDown->m_nFail+=1;
XLGetErrorMsg(dwRst,errorBuf,dwSize);
pDown->strLogArr.push_back(pDown->strDownArr[pDown->m_nIndex].strDownURL);
strLog.Format(_T("state:%s"),errorBuf);
pDown->strLogArr.push_back(strLog);
}
pDown->m_nIndex+=1;
}
break;
//默认处理
default:
XLQueryTaskInfo(pDown->Flags[n].lTaskId,&temp,&(pDown->Flags[n].ullFileSize),&(pDown->Flags[n].ullRecvSize));
pDown->Flags[n].dwFlag=temp;
if(temp==enumTaskStatus_Download)
{
nSign=true;
}
}
n++;
}
//Sleep(1);
}
//保存日志
pDown->SaveLog(_T("C:\\down.log"));
CStringstrTemp;
strTemp.Format(_T("下载完成!下载总数:%d成功总数%d失败总数%d日志存在位置:C:\\down.log"),pDown->m_nTotal,pDown->m_nSuccess,pDown->m_nFail);
::MessageBox(NULL,strTemp,_T("友情提示"),MB_OK);
pDown->m_nSuccess=0;
pDown->m_nTotal=0;
pDown->m_nFail=0;
//恢复初始状态
pDown->m_nIndex=0;
//恢复为下载队列为空
for(intn=0;n<LIMIT;n++)
{
pDown->Flags[n].dwFlag=1;
pDown->Flags[n].lTaskId=n;
//无论是否下载成功,都必须调用XLStopTask
XLStopTask(pDown->Flags[n].lTaskId);
}
//释放资源
XLUninitDownloadEngine();
}
voidCDownload::Start(void)
{
intnIndex=0;
//1、初始化下载引擎
if(FALSE==XLInitDownloadEngine())
{
::MessageBox(NULL,_T("初始化下载引擎失败!"),_T("友情提示"),MB_OK|MB_ICONEXCLAMATION);
return;
}
//下载任务查询监控线程
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DownQury,this,0,NULL);
}
//调用迅雷的下载接口
voidCDownload::CreateDownThread(intn)
{
DWORDdwRst=0;
if(m_nIndex<strDownArr.size())
{
dwRst=XLURLDownloadToFile(strDownArr[m_nIndex].strSavePath,strDownArr[m_nIndex].strDownURL,NULL,Flags[n].lTaskId);
if(dwRst==XL_SUCCESS)
{
Flags[n].dwFlag=enumTaskStatus_Download;
m_nIndex++;
m_nSuccess++;
}
}
else
{
m_nIndex=strDownArr.size();
}
}
voidCDownload::SaveLog(LPCTSTRlpPathAndName)
{
CStdioFilefile;
std::vector<CString>::iteratoriter;
//保存现在的语言环境
char*old_locale=_strdup(setlocale(LC_CTYPE,NULL));
//设置中文环境
setlocale(LC_CTYPE,"chs");
if(file.Open(lpPathAndName,CFile::modeCreate|CFile::modeWrite))
{
for(iter=strLogArr.begin();iter!=strLogArr.end();iter++)
{
file.WriteString(*iter);
file.WriteString(_T("\n"));
}
}
file.Close();
//还原语言区域的设置
setlocale(LC_CTYPE,old_locale);
// 释放内存
free(old_locale);
}
相关文章
- C++学习——c++逗号操作符说明(附加全部运算符优先级)
- C++ stringstream 字符串格式化与格式转换方法
- c++语言截取字符串,详解C++ string常用截取字符串方法
- C++按位异或运算符
- c++和java哪个好学_c++语言和Java语言,初学者该如何选择?「建议收藏」
- Windows10中使用VS2022和Cmake编译构建C++开源日志库-spdlog
- C++ OpenCV手动截取图像做透视变换
- C++ 中文周刊 第103期
- 【C++】string类接口的了解和使用
- C++11(右值引用)
- C++中的字符串类型详解编程语言
- C++实现数组的排序/插入重新排序/以及逆置操作详解
- linux系统中c++写日志文件功能分享
- C++广播通信实例
- Lua教程(一):在C++中嵌入Lua脚本