C++調(diào)用迅雷接口解析XML下載功能(迅雷下載功能)
迅雷下載庫(kù)的網(wǎng)址:http://thunderplatform.xunlei.com
// FileName: Download.h
#pragma once
#include "lib\XLDownload.h"
#include "lib\XLError.h"
#include <vector>
// 下載隊(duì)列的大小,決定同時(shí)開(kāi)啟下載線(xiàn)程的數(shù)量
const int LIMIT = 2;
struct Down
{
// 解析出來(lái)的下載地址
CString strDownURL;
// 保存的路徑
CString strSavePath;
};
struct Flag
{
DWORD dwFlag; // 記錄下載線(xiàn)程實(shí)時(shí)狀態(tài)
LONG lTaskId; // 記錄對(duì)應(yīng)任務(wù)ID號(hào)
ULONGLONG ullFileSize; // 下載文件大小
ULONGLONG ullRecvSize; // 已下載大小
};
class CDownload
{
private:
// 保存下載的日志信息
std::vector<CString> strLogArr;
// 解析XML文件
//void Analysis (LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd);
void Analysis (LPCTSTR lpPathXML);
// 開(kāi)始下載
void Start (void);
// 調(diào)用迅雷的下載接口
void CreateDownThread (int n);
// 下載任務(wù)查詢(xún)監(jiān)控線(xiàn)程
static void DownQury (LPVOID ptr);
// 保存日志
void SaveLog (LPCTSTR lpPathAndName);
public:
// 保存解析出來(lái)的下載隊(duì)列
std::vector<Down> strDownArr;
// 記錄最新的下載位置
int m_nIndex;
// 下載隊(duì)列的大小,對(duì)應(yīng)位為1時(shí),該下載位為空,可以啟動(dòng)新的下載線(xiàn)程
struct Flag Flags[LIMIT];
// 總共的下載數(shù)
int m_nTotal;
// 失敗的下載數(shù)
int m_nFail;
// 成功的下載數(shù)
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界面庫(kù)頭文件
#include "XTToolkitPro.h"
CDownload::CDownload()
{
// 初始化
m_nIndex = 0;
// 初始化為沒(méi)有下載線(xiàn)程
for (int n=0; n<LIMIT; n++)
{
Flags[n].dwFlag = 1;
Flags[n].lTaskId = n;
}
m_nSuccess = 0;
m_nTotal = 0;
m_nFail = 0;
}
CDownload::~CDownload()
{
}
BOOL CDownload::DownloadFilesByXML(LPCTSTR lpPathXML)
{
DWORD dwRet = XL_SUCCESS;
// 檢測(cè)XML文件是否存在
if (!PathFileExists(lpPathXML))
{
::MessageBox(NULL, _T("XML文件不存在!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
// 解析XML文件
Analysis(lpPathXML);
// 統(tǒng)計(jì)下載鏈接數(shù)
m_nTotal = strDownArr.size();
// 開(kāi)始下載
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("打開(kāi)XML文件出錯(cuò)!"), _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;
// 遍歷所有的結(jié)點(diǎn)
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;
// 路徑轉(zhuǎn)換
down.strSavePath.Replace('/', '\\');
strDownArr.push_back(down);
}
}
}
// 下載任務(wù)查詢(xún)
void CDownload::DownQury (LPVOID ptr)
{
CDownload* pDown = (CDownload*)ptr;
bool nSign = true;
DWORD dwRst;
TCHAR errorBuf[500];
DWORD dwSize = 500;
CString strLog;
// 如果沒(méi)有下載完成一直下載
while ((pDown->m_nIndex < (pDown->strDownArr).size()) || nSign)
{
int n = 0;
LONG temp = -1;
nSign = false;
while (n<LIMIT)
{
switch(pDown->Flags[n].dwFlag)
{
// 沒(méi)有下載,開(kāi)始新的下載
case 1 :
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;
// 成功下載完, 開(kāi)始新的下載
case 11:
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;
// 下載失敗,開(kāi)始新的下載
case 12:
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;
// 默認(rèn)處理
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"));
CString strTemp;
strTemp.Format(_T("下載完成! 下載總數(shù):%d 成功總數(shù)%d 失敗總數(shù)%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;
// 恢復(fù)初始狀態(tài)
pDown->m_nIndex = 0;
// 恢復(fù)為下載隊(duì)列為空
for (int n=0; n<LIMIT; n++)
{
pDown->Flags[n].dwFlag = 1;
pDown->Flags[n].lTaskId = n;
// 無(wú)論是否下載成功,都必須調(diào)用XLStopTask
XLStopTask(pDown->Flags[n].lTaskId);
}
//釋放資源
XLUninitDownloadEngine();
}
void CDownload::Start (void)
{
int nIndex = 0;
// 1、初始化下載引擎
if ( FALSE == XLInitDownloadEngine() )
{
::MessageBox(NULL, _T("初始化下載引擎失敗!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return;
}
// 下載任務(wù)查詢(xún)監(jiān)控線(xiàn)程
::CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)DownQury, this, 0, NULL);
}
// 調(diào)用迅雷的下載接口
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[n].lTaskId);
if (dwRst == XL_SUCCESS)
{
Flags[n].dwFlag = enumTaskStatus_Download;
m_nIndex++;
m_nSuccess++;
}
}
else
{
m_nIndex = strDownArr.size();
}
}
void CDownload::SaveLog (LPCTSTR lpPathAndName)
{
CStdioFile file;
std::vector<CString>::iterator iter;
// 保存現(xiàn)在的語(yǔ)言環(huán)境
char * old_locale = _strdup(setlocale(LC_CTYPE,NULL));
// 設(shè)置中文環(huán)境
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();
// 還原語(yǔ)言區(qū)域的設(shè)置
setlocale(LC_CTYPE, old_locale);
// 釋放內(nèi)存
free(old_locale);
}
上一篇:C語(yǔ)言嵌入informix基礎(chǔ)入門(mén)示例講解
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼
本文標(biāo)題:C++調(diào)用迅雷接口解析XML下載功能(迅雷下載功能)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3892.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類(lèi)算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改