/***************************************************************
* Name: downloadMain.cpp
* Purpose: Code for Application Frame
* Author: (alan)
* Created: 2008-11-14
* License:
**************************************************************/
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#ifdef WX_PRECOMP
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include
"wx_pch.h"
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#endif
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#ifdef __BORLANDC__
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#pragma hdrstop
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#endif
//__BORLANDC__
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include
"downloadMain.h"
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include <curl/curl.h>
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include <curl/types.h>
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include <curl/easy.h>
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include
"update.h"
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include <wx/msgdlg.h>
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#include <wx/utils.h>
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#define TIMER_ID 22222
//事件监听声明
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
BEGIN_EVENT_TABLE(downloadDialog, GUIDialog)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
EVT_TIMER(TIMER_ID, downloadDialog::OnTimer)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
END_EVENT_TABLE()
enum wxbuildinfoformat
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
short_f, long_f
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
};
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxString wxbuildinfo(wxbuildinfoformat format)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxString wxbuild(wxVERSION_STRING);
if (format == long_f )
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#
if defined(__WXMSW__)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxbuild << _T(
"-Windows");
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#elif defined(__WXMAC__)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxbuild << _T(
"-Mac");
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#elif defined(__UNIX__)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxbuild << _T(
"-Linux");
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#endif
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#
if wxUSE_UNICODE
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxbuild << _T(
"-Unicode build");
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#
else
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxbuild << _T(
"-ANSI build");
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
#endif
// wxUSE_UNICODE
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
return wxbuild;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
//声明一个文件结构体
struct FtpFile
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
char *filename;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
FILE *stream;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
};
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
downloadDialog::downloadDialog(wxDialog *dlg)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
: GUIDialog(dlg)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
//创建一个定时器,制定TIMER_ID
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
m_timerdown =
new wxTimer(
this, TIMER_ID);
//定时器开始运行,这里会自动执行OnTimer函数
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
m_timerdown->Start(100);
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
downloadDialog::~downloadDialog()
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
//定时器操作
void downloadDialog::OnTimer(wxTimerEvent &
event)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
downloadfile();
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
//文件写入流
int my_fwrite(
void *buffer, size_t size, size_t nmemb,
void *stream)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
struct FtpFile *
out=(
struct FtpFile *)stream;
if (
out && !
out->stream)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
out->stream=fopen(
out->filename,
"wb");
if (!
out->stream)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
return -1;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
return fwrite(buffer, size, nmemb,
out->stream);
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
//进度条显示函数
int wxcurldav_dl_progress_func(
void* ptr,
double rDlTotal,
double rDlNow,
double rUlTotal,
double rUlNow)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
wxGauge* pGauge = (wxGauge*) ptr;
if(pGauge)
//设置进度条的值
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
pGauge->SetValue(100.0 * (rDlNow/rDlTotal));
return 0;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
}
//下载文件函数
void downloadDialog::downloadfile()
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
//创建curl对象
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
CURL *curl;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
CURLcode res;
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
m_staticText2->SetLabel(wxT(
"请耐心等待程序下载更新包..."));
struct FtpFile ftpfile=
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
//定义下载到本地的文件位置和路径
"tmp.exe",NULL
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
};
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
curl_global_init(CURL_GLOBAL_DEFAULT);
//curl初始化
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
curl = curl_easy_init();
//curl对象存在的情况下执行操作
if (curl)
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
{
//设置远端地址
![](https://i-blog.csdnimg.cn/blog_migrate/d608a01840fefd0e145dfeac03617766.png)
curl_easy_setopt(curl, CURLOPT_URL,
"http://dl_dir.qq.com/minigamefile/QQGame2008ReleaseP2_web_setup.EXE");
//执行写入文件流操作
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
//curl的进度条声明
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
//回调进度条函数
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, wxcurldav_dl_progress_func);
//设置进度条名称
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, m_gauge1);
//进度条
m_gauge1->SetValue(0);
//写入文件
res = curl_easy_perform(curl);
m_gauge1->SetValue(100);
//释放curl对象
curl_easy_cleanup(curl);
if (CURLE_OK != res)
;
}
if (ftpfile.stream)
{
//关闭文件流
fclose(ftpfile.stream);
}
//释放全局curl对象
curl_global_cleanup();
//这一步很重要,停止定时器,不然程序会无休止的运行下去
m_timerdown->Stop();
//执行刚下载完毕的程序,进行程序更新
int pid = ::wxExecute(_T("tmp.exe"));
wxMessageBox(wxT("下载完毕,程序开始执行更新操作......"));
}
void downloadDialog::OnClose(wxCloseEvent &event)
{
Destroy();
}
void downloadDialog::OnQuit(wxCommandEvent &event)
{
Destroy();
}
void downloadDialog::OnAbout(wxCommandEvent &event)
{
}