C++调用迅雷接口解析XML下载功能(迅雷下载功能)
迅雷下载库的网址:http://thunderplatform.xunlei.com
// FileName: Download.h
#pragma once
#include "lib\XLDownload.h"
#include "lib\XLError.h"
#include <vector>// 下载队列的大小,决定同时开启下载线程的数量
const int LIMIT = 2;struct Down
{
// 解析出来的下载地址
CString strDownURL;
// 保存的路径
CString strSavePath;
};struct Flag
{
DWORD dwFlag; // 记录下载线程实时状态
LONG lTaskId; // 记录对应任务ID号
ULONGLONG ullFileSize; // 下载文件大小
ULONGLONG ullRecvSize; // 已下载大小
};class CDownload
{
private:
// 保存下载的日志信息
std::vector<CString> strLogArr;// 解析XML文件
//void Analysis (LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd);
void Analysis (LPCTSTR lpPathXML);
// 开始下载
void Start (void);// 调用迅雷的下载接口
void CreateDownThread (int n);// 下载任务查询监控线程
static void DownQury (LPVOID ptr);// 保存日志
void SaveLog (LPCTSTR lpPathAndName);public:
// 保存解析出来的下载队列
std::vector<Down> strDownArr;// 记录最新的下载位置
int m_nIndex;// 下载队列的大小,对应位为1时,该下载位为空,可以启动新的下载线程
struct Flag Flags[LIMIT];// 总共的下载数
int m_nTotal;// 失败的下载数
int m_nFail;// 成功的下载数
int m_nSuccess;CDownload();
~CDownload();
BOOL DownloadFilesByXML(LPCTSTR lpPahtXML);
};
// FileName: Download.cpp
#include "stdafx.h"
#include "Download.h"
#include <Shlwapi.h>
#include <locale.h>
#pragma comment(lib, "lib\\XLDownload.lib")// 包含XTP界面库头文件
#include "XTToolkitPro.h"CDownload::CDownload()
{
// 初始化
m_nIndex = 0;// 初始化为没有下载线程
for (int n=0; n<LIMIT; n++)
{
Flags .dwFlag = 1;
Flags .lTaskId = n;
}m_nSuccess = 0;
m_nTotal = 0;
m_nFail = 0;
}CDownload::~CDownload()
{}
BOOL CDownload::DownloadFilesByXML(LPCTSTR lpPathXML)
{
DWORD dwRet = XL_SUCCESS;// 检测XML文件是否存在
if (!PathFileExists(lpPathXML))
{
::MessageBox(NULL, _T("XML文件不存在!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}// 解析XML文件
Analysis(lpPathXML);
// 统计下载链接数
m_nTotal = strDownArr.size();// 开始下载
Start();return TRUE;
}//void CDownload::Analysis(LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd)
void CDownload::Analysis(LPCTSTR lpPathXML)
{
// 读取XML文件
CXTPPropExchangeXMLNode px(TRUE, NULL, _T("DownLoadInfo"));if (!px.LoadFromFile(lpPathXML))
{::MessageBox(NULL, _T("打开XML文件出错!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return;
}if (!px.OnBeforeExchange())
{
::MessageBox(NULL, _T("OnBeforeExchange false!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return;
}px.SetCompactMode(TRUE);
CXTPPropExchangeEnumeratorPtr enumItem(px.GetEnumerator(_T("Item")));
POSITION posItem = enumItem->GetPosition();CString strLocalName;
Down down;// 遍历所有的结点
while (posItem)
{
CXTPPropExchangeSection sec(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);
}
}
}// 下载任务查询
void CDownload::DownQury (LPVOID ptr)
{
CDownload* pDown = (CDownload*)ptr;
bool nSign = true;
DWORD dwRst;
TCHAR errorBuf[500];
DWORD dwSize = 500;
CString strLog;// 如果没有下载完成一直下载
while ((pDown->m_nIndex < (pDown->strDownArr).size()) || nSign)
{
int n = 0;
LONG temp = -1;
nSign = false;while (n<LIMIT)
{
switch(pDown->Flags .dwFlag)
{
// 没有下载,开始新的下载
case 1 :
pDown->CreateDownThread(n);
dwRst = XLQueryTaskInfo(pDown->Flags .lTaskId, &temp, &(pDown->Flags .ullFileSize), &(pDown->Flags .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 .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;// 成功下载完, 开始新的下载
case 11:
pDown->CreateDownThread(n);
dwRst = XLQueryTaskInfo(pDown->Flags .lTaskId, &temp, &(pDown->Flags .ullFileSize), &(pDown->Flags .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 .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;
// 下载失败,开始新的下载
case 12:
pDown->CreateDownThread(n);
dwRst = XLQueryTaskInfo(pDown->Flags .lTaskId, &temp, &(pDown->Flags .ullFileSize), &(pDown->Flags .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 .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 .lTaskId, &temp, &(pDown->Flags .ullFileSize), &(pDown->Flags .ullRecvSize));
pDown->Flags .dwFlag = temp;
if (temp == enumTaskStatus_Download)
{
nSign = true;
}
}
n++;
}
//Sleep(1);
}// 保存日志
pDown->SaveLog(_T("C:\\down.log"));CString strTemp;
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 (int n=0; n<LIMIT; n++)
{
pDown->Flags .dwFlag = 1;
pDown->Flags .lTaskId = n;
// 无论是否下载成功,都必须调用XLStopTask
XLStopTask(pDown->Flags .lTaskId);
}//释放资源
XLUninitDownloadEngine();
}void CDownload::Start (void)
{
int nIndex = 0;// 1、初始化下载引擎
if ( FALSE == XLInitDownloadEngine() )
{
::MessageBox(NULL, _T("初始化下载引擎失败!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return;
}// 下载任务查询监控线程
::CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)DownQury, this, 0, NULL);
}// 调用迅雷的下载接口
void CDownload::CreateDownThread (int n)
{
DWORD dwRst = 0;
if (m_nIndex < strDownArr.size())
{
dwRst = XLURLDownloadToFile(strDownArr[m_nIndex].strSavePath, strDownArr[m_nIndex].strDownURL, NULL, Flags .lTaskId);
if (dwRst == XL_SUCCESS)
{
Flags .dwFlag = enumTaskStatus_Download;
m_nIndex++;
m_nSuccess++;
}
}
else
{
m_nIndex = strDownArr.size();
}
}void CDownload::SaveLog (LPCTSTR lpPathAndName)
{
CStdioFile file;
std::vector<CString>::iterator iter;// 保存现在的语言环境
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);
}
您可能感兴趣的文章:
- 迅雷 API 接口说明文档 -调用迅雷自动下载
- java微信开发API解析(三)-高级功能的前奏----获取以及保存接口调用凭证
- 调用Xerces C++ XML解析库引起的内存泄漏
- 如何调用并解析调用远程接口返回的xml数据
- 使用c++开发客户端调用XML-RPC 接口
- java 调用 webService Xfire接口,xml解析为object
- 在QQ群里有人提问有没有C语言的XML解析,偶然想到了这个问题:C++调用C库,简单试验:
- asp通过json调用webservice接口,并获取返回的xml数据及解析
- java jna调用迅雷接口下载
- php 调用接口的post方法,还有解析返回的xml数据
- 接口的调用及xml的解析
- 迅雷 API 接口说明文档 -调用迅雷自动下载
- java微信开发API解析(三)-高级功能的前奏----获取以及保存接口调用凭证 标签: 微信java办微信开发微信文档解析 2016-04-06 20:50 1101人阅读 评论(0) 收藏 举报
- python3.4.3 调用http接口 解析response xml后插入数据库
- 调用接口,解析返回的的string类型xml文档
- Java调用WebService接口实现发送手机短信验证码功能
- C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good
- Log打印(打印行号、函数调用、Json解析、XML解析、点击跳转、Log信息保存)
- javascript轻松实现调用xslt解析xml
- Filter接口的实例调用和配置,在Web.xml配置文件中有顺序的