⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updatepage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -