📄 updatepage.cpp
字号:
// UpdatePage.cpp : implementation file
//
#include "stdafx.h"
#include "minica.h"
#include "MiniMainDlg.h"
#include "UpdatePage.h"
#include "Evp.h"
#include ".\GenericClass\Language.h"
#include "minict.h"
#include "mmsystem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CUpdatePage property page
IMPLEMENT_DYNCREATE(CUpdatePage, CPropertyPage)
CUpdatePage::CUpdatePage() : CPropertyPage(CUpdatePage::IDD)
{
//{{AFX_DATA_INIT(CUpdatePage)
//}}AFX_DATA_INIT
m_sExePath = ((CMiniCaApp *)AfxGetApp())->GetAppPath();//可执行文件路径
m_sIniGuid = "{4238FF04-E193-46e4-97A9-177238839CD2}";//iniGUID
m_sIniUrl = "http://minica.91i.net/minica/miniup.txt";
m_TaskLen = m_UpLen = m_OneLen = 0;
m_bUpdate = FALSE;
m_bReset = TRUE;//默认重启
m_pParent = NULL;
}
CUpdatePage::~CUpdatePage()
{
}
void CUpdatePage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUpdatePage)
DDX_Control(pDX, IDC_BUP, m_Bup);
DDX_Control(pDX, IDC_PROGRESS2, m_Prog2);
DDX_Control(pDX, IDC_PROGRESS1, m_Prog1);
DDX_Control(pDX, IDC_LISTCTRL, m_UpList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUpdatePage, CPropertyPage)
//{{AFX_MSG_MAP(CUpdatePage)
ON_BN_CLICKED(IDC_BUP, OnBup)
ON_NOTIFY(NM_RCLICK, IDC_LISTCTRL, OnRclickListctrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUpdatePage message handlers
//{4238FF04-E193-46e4-97A9-177238839CD2}
BOOL CUpdatePage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_Bup.SetThemeHelper(((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
m_Bup.SetIcon(IDI_ICON17);
m_Bup.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
// TODO: Add extra initialization here
m_UpList.SetExtendedStyle(LVS_EX_UNDERLINECOLD|LVS_EX_FULLROWSELECT);
CImageList * pImgList = ((CMiniCaApp *)AfxGetApp())->GetImgList();
m_UpList.SetImageList(pImgList,LVSIL_SMALL);//用来改变LISTCTRL行宽度
m_UpList.InsertColumn(0, MiniCT_1700, LVCFMT_LEFT,100); //下载文件
m_UpList.InsertColumn(1, MiniCT_1701, LVCFMT_LEFT,100); //文件大小
m_UpList.InsertColumn(2, MiniCT_1702, LVCFMT_LEFT,100); //状态
m_UpList.InsertColumn(3, MiniCT_1703, LVCFMT_LEFT,50); //速度
m_UpList.InsertColumn(4, MiniCT_1704, LVCFMT_LEFT,120); //文件描述
m_pParent = GetParent();
if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
{
m_Prog1.SetBitmap(IDB_BITMAP_PROG);
m_Prog2.SetBitmap(IDB_BITMAP_PROG);
}
// CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_tooltip.Create(this); m_tooltip.Activate(TRUE); // TODO: Use one of the following forms to add controls: // m_tooltip.AddTool(GetDlgItem(IDC_<name>), <string-table-id>); // m_tooltip.AddTool(GetDlgItem(IDC_<name>), "<text>"); }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
UINT CUpdatePage::DownHttpFile(LPCTSTR lpszUrl, LPCTSTR lpszLocal,UINT uIndex,
LPCTSTR szFileName,
BOOL bShowProg)
{
DWORD dwFlags;
DWORD dwResult = INTERNET_ERROR_OPEN;
if(!InternetGetConnectedState(&dwFlags, 0))
{
AddEvent(M_ERROR, MiniCT_1705); //网络未连接
return INTERNET_ERROR_OPEN;
}
if(dwFlags & INTERNET_CONNECTION_OFFLINE)//take appropriate steps
{
AddEvent(M_ERROR, MiniCT_1706); //离线连接
return INTERNET_ERROR_OPEN;
}
CHAR strAgent[64]; //waring 如果 strAgent = {0} ,可能导致下载失败
sprintf(strAgent, "Agent%ld", timeGetTime());
HINTERNET hOpen;
if(!(dwFlags & INTERNET_CONNECTION_PROXY))
hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
else
hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hOpen)
{
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
lvItem.iItem = uIndex;
lvItem.iSubItem = 0;
lvItem.iImage = 12;
m_UpList.SetItem(&lvItem);//开始下载
m_UpList.SetItemText(uIndex,2, MiniCT_1707); //下载中...
dwResult = InternetGetFile(hOpen, lpszUrl, lpszLocal,uIndex,szFileName,bShowProg);//是否显示进度
InternetCloseHandle(hOpen);
return dwResult;
}
else
{
GetLastError();
return 0;
}
}
UINT CUpdatePage::InternetGetFile (HINTERNET IN hOpen, // Handle from InternetOpen() //SetItemState(n, LVIS_SELECTED, LVIS_SELECTED); //设置选中
LPCTSTR szUrl, // Full URL
LPCTSTR szFilePath, UINT uIndex,/*列表中第几个文件*/ LPCTSTR szFileName,BOOL bShowProg)
{
DWORD dwSize;
CHAR szHead[] = "Accept: */*\r\n\r\n";
VOID* szTemp[16384];
HINTERNET hConnect;
FILE * pFile;
if ( !(hConnect = InternetOpenUrl ( hOpen, szUrl, szHead,
lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
{
return INTERNET_ERROR_OPENURL;
}
if ( !(pFile = fopen (szFilePath, "wb" ) ) )
{
return INTERNET_ERROR_FILEOPEN;
}
DWORD dwByteToRead = 0;
DWORD dwSizeOfRq = 4;
DWORD dwBytes = 0;
if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
(LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
{
dwByteToRead = 0;
}
if(bShowProg)
{
char buf[300] = {0};
wsprintf(buf,"%s%s...",MiniCT_1708, szFileName); //下载
AddEvent(M_WARING,buf);
}
DWORD start;
DWORD end;
DWORD time;
time = 10;
start = timeGetTime();
do
{
// Keep coping in 16 KB chunks, while file has any data left.
// Note: bigger buffer will greatly improve performance.
if (!InternetReadFile (hConnect, szTemp, 16384, &dwSize) )
{
fclose (pFile);
GetLastError();
return INTERNET_ERROR_READFILE;
}
if (!dwSize)
break; // Condition of dwSize=0 indicate EOF. Stop.
else
fwrite(szTemp, sizeof (char), dwSize , pFile);
if(bShowProg)//显示进度
{
dwBytes += dwSize;
m_UpLen += dwSize;
m_Prog1.SetPos(dwBytes*100/m_OneLen);
m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
FLOAT fSpeed = 0;
fSpeed = (float)dwBytes;
fSpeed /= ((float)time)/1000.0f;
fSpeed /= 1024.0f;
end = timeGetTime();
time = end - start;
if(time == 0)
time = 10;
CString strSpeed;
strSpeed.Format("%2.2f",fSpeed);
m_UpList.SetItemText(uIndex,3,strSpeed);
}
} // do
while (TRUE);
fflush (pFile);
fclose (pFile);
return 0;//成功
}
void CUpdatePage::CheckDonwloadThread()
{
m_bUpdate = TRUE;
BOOL bNeedReset = FALSE;
m_TaskLen = 0;
m_UpList.DeleteAllItems();
//得到系统临时目录
// AddEvent(M_WARING,"获取系统临时目录...");
TCHAR szTempPath[MAX_PATH] = {0};
if (GetTempPath(MAX_PATH, szTempPath) == 0)
{
AddEvent(M_ERROR, MiniCT_1709);
m_bUpdate = FALSE;
return;
}
//得到临时文件名
char szIniPath[256] = {0};
UINT nResult = GetTempFileName (szTempPath, _T("~mc"), 0, szIniPath);
AddEvent(M_WARING, MiniCT_1710); //下载版本信息...
//首先解析m_sIniUrl,http -> DownHttpFile;ftp - > DownFtpFile
if(_strnicmp(m_sIniUrl.GetBuffer(0), "http:", 5) == 0)//http协议
{
m_sIniUrl.ReleaseBuffer();
if(DownHttpFile(m_sIniUrl, szIniPath, 0 ,"",FALSE))//0 成功; 1 失败
{
m_bUpdate = FALSE;
return;
}
}
else if(_strnicmp(m_sIniUrl.GetBuffer(0), "ftp:", 4) == 0)
{
m_sIniUrl.ReleaseBuffer();
if(ConnectFtp("sServerName", 21, "sUserName", "sUserPwd"))
{
if(DownFtpFile(m_sIniUrl, szIniPath))//0 成功; 1 失败
{
m_bUpdate = FALSE;
return;
}
}
}
AddEvent(M_WARING, MiniCT_1711); //分析版本信息...
//分析版本信息
char buf[255]={0};
//[MiniCA]
//GUID={4238FF04-E193-46e4-97A9-177238839CD2}
GetPrivateProfileString("MiniCA", "GUID","",buf,50, szIniPath);
if(strcmp(buf,m_sIniGuid)!=0)//版本文件错误
{
AddEvent(M_ERROR, MiniCT_1712);//版本信息无效!
m_bUpdate = FALSE;
return;
}
GetPrivateProfileString("TOTAL", "ToTal","1",buf,255, szIniPath);
int nUpdateCount = atoi(buf);//需要更新的文件个数
if(nUpdateCount == 0)
{
AddEvent(M_ERROR, MiniCT_1713); //版本信息中指定升级文件为0!
m_bUpdate = FALSE;
return;//升级文件个数为0
}
stuUPDATE * pStuUPDATE = new stuUPDATE[nUpdateCount];
memset(pStuUPDATE,0,sizeof(stuUPDATE)*nUpdateCount);
char strIndex[7];
for(int i=0,j=0,nCount = 0;i<nUpdateCount;i++)
{
// stuUPDATE * pUPDATE = new stuUPDATE;
wsprintf(strIndex,"INDEX%d",i+1);
char sFileName[256] = {0}, //名称
sFileUrl[256] = {0}, //网址
// sPath[256] = {0},//本地路径
sFileLen[256] = {0},//文件长度
sFileCrc[256] = {0},//文件CRC
sFilePath[256] = {0},//路径+文件名
sFileDepict[256] = {0},//文件描述
sFileOperate[5] = {0};//文件操作方式
GetPrivateProfileString(strIndex, "FileName","",sFileName,255, szIniPath);//文件名称
if(strlen(sFileName)==0)//缺少文件名称
continue;
GetPrivateProfileString(strIndex, "FileUrl","",sFileUrl,255, szIniPath);//网络路径
if(strlen(sFileUrl)==0)//网络路径缺少
continue;
GetPrivateProfileString(strIndex, "FilePath","",sFilePath,255, szIniPath);//相对路径
GetPrivateProfileString(strIndex, "FileLength","",sFileLen,255, szIniPath);//文件大小
if(atoi(sFileLen)==0)//文件长度为0
continue;
GetPrivateProfileString(strIndex, "FileDepict","",sFileDepict,255, szIniPath);//文件描述
GetPrivateProfileString(strIndex, "FileOperate","",sFileOperate,5, szIniPath);//文件操作方式
GetPrivateProfileString(strIndex, "FileGuid","",sFileCrc,255, szIniPath);//文件CRC,比较
wsprintf(buf,"%s %s ...",MiniCT_1714, sFileName); //检测版本
AddEvent(M_WARING,buf);
char FilePath[255] = {0};//本地文件完整路径
char dir[255] = {0};
wsprintf(FilePath,"%s\\%s\\%s",m_sExePath.GetBuffer(0),sFilePath,sFileName);
unsigned char md_value[MAX_MD_SIZE] = "";
unsigned int md_len;
char outMsg[255] = {0};
if(CEvp::Digest("md5",FilePath,0,md_value,&md_len, outMsg))//本地存在文件
{
if(sFileCrc == LmToHText(md_value,md_len))//文件相同,不加入队列
{
//检测是否注册或运行
FileOperate(FilePath,sFileOperate);//文件操作
continue;
}
}
// Create a masked image list large enough to hold the icons.
//添加
//向list中添加信息 stuUPDATE
LVITEM lvItem;
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.state = 0;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.pszText = sFileName;
lvItem.iImage = 11;// 11 - 15
//设置DATA为CRC,下载完毕后检验用
// lvItem.lParam = uCrc; m_PtrList
m_UpList.InsertItem(&lvItem);
m_UpList.SetItemText(j,1,sFileLen);
m_UpList.SetItemText(j,2, MiniCT_1715);
// m_UpList.SetItemText(j,3,");
m_UpList.SetItemText(j,4,sFileDepict);
//增加数组信息
strncpy(pStuUPDATE[j].FileGuid, sFileCrc,255);
pStuUPDATE[j].FileLength = atoi(sFileLen);
strncpy(pStuUPDATE[j].FileName, sFileName,255);
strncpy(pStuUPDATE[j].FileOperate,sFileOperate,5);
strncpy(pStuUPDATE[j].FilePath,sFilePath,255);
strncpy(pStuUPDATE[j].FileUrl,sFileUrl,255);
//下载总长度增加
j++;
m_TaskLen += atoi(sFileLen);
nCount++;
}
//下载文件
if(nCount == 0)
{
AddEvent(M_OK, MiniCT_1716); //操作完成,没有需要升级的文件
m_bUpdate = FALSE;
return;
}
for(i=0;i<nCount;i++)
{
// ::SetFocus(m_hListCtrl);
m_UpList.SetItemText(i,2, MiniCT_1717); //尝试中....
m_UpList.EnsureVisible(i,FALSE);
char dir[255] = {0};
wsprintf(dir,"%s\\%s\\",m_sExePath.GetBuffer(0),pStuUPDATE[i].FilePath);//路径
//测试路径是否存在
if(!CMiniCaApp::MakeSureDirectoryPathExists(dir))
{
char buf[300] = {0};
wsprintf(buf,"%s%s", MiniCT_1718, dir); //无法建立目录
m_UpLen+= pStuUPDATE[i].FileLength;
m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
// m_Prog2.Invalidate();
m_UpList.SetItemText(i, 2, MiniCT_1719);
AddEvent(M_ERROR,buf);
continue;
}
/* if(_mkdir(dir) == -1)
{
if(errno==ENOENT)//目录没有发现
{
char buf[300] = {0};
wsprintf(buf,"无法建立目录%s",dir);
m_UpLen+= pStuUPDATE[i].FileLength;
m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
// m_Prog2.Invalidate();
m_UpList.SetItemText(i,2,"下载失败");
AddEvent(M_ERROR,buf);
continue;
}
}*/
char FilePath[255] = {0};//本地文件完整路径
char FilePathTemp[255] = {0};//本地文件完整路径
//尝试下载文件
wsprintf(FilePath,"%s%s...", MiniCT_1720, pStuUPDATE[i].FileName); //尝试下载
AddEvent(M_WARING,FilePath);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -