// 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_)