Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

111 lines
3.7 KiB
C++

// DownloadFile.h: interface for the CFileTransfer_crul class.
//
//////////////////////////////////////////////////////////////////////
//导入libcurl库----------------------------------------------------------
#define CURL_STATICLIB
#ifdef _DEBUG
#pragma comment(lib,"libcurl_a_debug.lib")
#else
#pragma comment(lib,"libcurl_a.lib")
#endif
#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "winmm.lib" )
#pragma comment ( lib, "wldap32.lib" )
#pragma comment ( lib, "Advapi32.lib")
#include "./curl/curl.h"
#if !defined(AFX_DOWNLOADFILE_H__9E1240AF_55EA_4F75_8220_B9D763C0CDAB__INCLUDED_)
#define AFX_DOWNLOADFILE_H__9E1240AF_55EA_4F75_8220_B9D763C0CDAB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
typedef enum
{
OPT_URL_ADDRESS = 0,
OPT_DOWNLOAD_PATH,
OPT_DOWNLOAD_NAME,
OPT_NEED_PROGRESS,
OPT_NEED_ERRORINFO,
OPT_TIMEOUT,
OPT_HTTPS_ACCESS,
OPT_SSL_CERTIFY
}EnOptFlag;
typedef struct ST_CALLBACK_WRITE_INFO
{
FILE* pFile;
void* pFileTrans;
ST_CALLBACK_WRITE_INFO()
{
pFile = NULL;
pFileTrans = NULL;
}
}STWriteInfo;
//目前的传输方法只限制于单线程
class CFileTransfer_crul
{
public:
// BOOL GetFileList(char *f_buff);
DOUBLE GetFileSize();
static inline DOUBLE GetRecvSize() { return m_RecvFileSize; };
bool DownloadFile();
void SetOption(EnOptFlag enFlag, CString strInfo, bool bFlag = false);
bool Inital(); //对crul的信息进行初始化以及进行版本检查
void UnInital();//
void PrintLog(CString strLog);
//获取下载文件的文件总大小
inline curl_off_t GetFileTotalSize(){return m_lTotalRecvFileSize;}
//获取下载文件的已经下载的大小
inline curl_off_t GetCurDownloadSize(){return m_lCurRecvSize;}
//获取下载的文件的文件名
inline void GetFileName(CString &strFileName){strFileName = m_strSaveName;}
//初始化日志信息
void InitalLogInfo();
//对目标Url的返回值进行有效性判断
bool GetUrlResConValild();
CFileTransfer_crul();
virtual ~CFileTransfer_crul();
protected:
CURL *m_pCrEasyHandl;
CURL *m_pCrPuteasyHandl;
// FILE* m_pDownLoadFile;
FILE* m_pLog;
CString m_strUrl; //设置目标文件的下载地址
CString m_strSavePath; //设置文件的保存路径
CString m_strSaveName; //设置目标文件的保存名字
bool m_bIsNeedProgress; //是否需要显示进度
bool m_bIsNeedErrInfo; //是否需要显示错误信息
int m_nTimeOut; //下载的超时时间
bool m_bIsGobalInitial;
bool m_bIsHttpsFlag; //是否是https访问
bool m_bIsSSLCertify; //是否进行SSL验证
private:
static VOID SetRecvSize(size_t f_size);
static size_t WriteToFile( void *ptr, size_t size, size_t nmemb, void *userp);
//显示进度信息的回调函数,其中dltotal:期望下载的文件的大小,dlnow:已经下载的文件大小
//ultotal:希望上传的文件的大小 ulnow:目前已经上传的大小
static int xferinfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
static DOUBLE m_RecvFileSize; //获取当前文件下载的大小
curl_off_t m_lTotalRecvFileSize; //下载文件的总大小
curl_off_t m_lCurRecvSize; //当前已经接收的文件大小
static size_t WriteToBuff( void *ptr, size_t size, size_t nmemb, void *userp);
//用做URL测试的回调些函数,该函数什么都不操作直接返回,用于代替在URL测试时,直接使用默认的回调函数输出到标准输出时,
//有时候回写入失败的问题
static size_t WriteFuncForUrlTest(void *ptr, size_t size, size_t nmemb, void *userp);
static int m_nWriteFileSize; //获取目标文件的大小
};
#endif // !defined(AFX_DOWNLOADFILE_H__9E1240AF_55EA_4F75_8220_B9D763C0CDAB__INCLUDED_)