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

📄 httpupdate.cpp

📁 奇迹世界更新程序源代码,其中包括一些文档
💻 CPP
字号:

#include "WZ_UM.h"


WZ_DECLAREDLL CWZHttpUpdateModule::CWZHttpUpdateModule ()
{
	m_enUpdateType = USING_HTTP;
}


WZ_DECLAREDLL CWZHttpUpdateModule::CWZHttpUpdateModule (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS)
	: CWZUpdateModule (lpszIPADDR, wPORT, lpszID, lpszPASS)
{
	m_enUpdateType = USING_HTTP;
}


WZ_DECLAREDLL CWZHttpUpdateModule::~CWZHttpUpdateModule ()
{

}


WZ_DECLAREDLL BOOL CWZHttpUpdateModule::Connect ()
{
	m_iCurrentState = STATE_CONNECTING;

	// error check
	if (! strcmp (m_szIPADDR, "")) {
		m_iCurrentState = STATE_DISCONNECTED;
		return FALSE;
	}
	if (! m_wPORT)
		m_wPORT = PORT_HTTP;


	m_hINET_SESSION = InternetOpen ("UPDATE_HTTP", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
	if (! m_hINET_SESSION) {
		// "牢磐齿 楷搬 角菩"
		m_iCurrentState = STATE_DISCONNECTED;
		SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
		return FALSE;
	}
	
	m_hHTTP_CONNECTION =InternetConnect(m_hINET_SESSION, m_szIPADDR, m_wPORT, m_szID, m_szPASS, INTERNET_SERVICE_HTTP,0,0);
	if (m_hHTTP_CONNECTION==NULL) {
		// "HTTP 俊 立加且 荐 绝嚼聪促."
		InternetCloseHandle(m_hINET_SESSION);
		m_iCurrentState = STATE_DISCONNECTED;
		SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
		return FALSE;
	}

	m_iCurrentState = STATE_CONNECTED;
	return TRUE;
}


WZ_DECLAREDLL BOOL CWZHttpUpdateModule::Connect (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS)
{
	strcpy (m_szIPADDR, lpszIPADDR);
	m_wPORT = wPORT;

	if (!lpszID)
		strcpy (m_szID, "");
	else
		strcpy (m_szID, lpszID);

	if (!lpszPASS)
		strcpy (m_szPASS, "");
	else
		strcpy (m_szPASS, lpszPASS);
	
	return this->Connect();
}


WZ_DECLAREDLL VOID CWZHttpUpdateModule::Disconnect ()
{
	m_iCurrentState = STATE_DISCONNECTED;

	if( m_hHTTP_CONNECTION )
	{		
		InternetCloseHandle(m_hHTTP_CONNECTION);
		m_hHTTP_CONNECTION = NULL;
	}
	if( m_hINET_SESSION )
	{
		InternetCloseHandle(m_hINET_SESSION);
		m_hINET_SESSION = NULL;
	}
}


WZ_DECLAREDLL BOOL CWZHttpUpdateModule::DownloadFile (LPSTR lpszRemoteFilePath, LPSTR lpszLocalFilePath)
{
	CHAR	lpszRemoteFileName [MAX_PATH];
	CHAR	lpszRemoteFileEXE [MAX_PATH];
	CHAR	lpszRealLocalFilePath [MAX_PATH];

	HINTERNET hHTTP_FILE_REQ = NULL;
	HANDLE	hLocalFile = INVALID_HANDLE_VALUE;


	// 咯扁辑 肺拿 颇老捞抚捞 绝促搁 盔拜颇老捞抚苞 悼老窍霸 父电促.
	_splitpath(lpszRemoteFilePath, NULL, NULL, lpszRemoteFileName, lpszRemoteFileEXE );
	if ((!lpszLocalFilePath) || (! strcmp(lpszLocalFilePath, "")))
		wsprintf (lpszRealLocalFilePath, ".\\%s%s", lpszRemoteFileName, lpszRemoteFileEXE);
	else {
		if (lpszLocalFilePath[strlen(lpszLocalFilePath)-1] != '\\')
			wsprintf (lpszRealLocalFilePath, "%s\\%s%s", lpszLocalFilePath, lpszRemoteFileName, lpszRemoteFileEXE);
		else
			wsprintf (lpszRealLocalFilePath, "%s%s%s", lpszLocalFilePath, lpszRemoteFileName, lpszRemoteFileEXE);
	}
	
	wsprintf(m_strtUpdatingFileInfo.szFileName, "%s%s", lpszRemoteFileName, lpszRemoteFileEXE);	// 颇老 惑怕 备炼眉俊 泅犁 罐阑 颇老捞抚 历厘

	__try {
		// 1 . 肺拿 颇老 父甸扁
		hLocalFile = CreateFile (lpszRealLocalFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
		if (hLocalFile == INVALID_HANDLE_VALUE) {
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
			return FALSE;
		}

		// 2 . 盔拜瘤 颇老 凯扁
		INT iCount = MAX_RETRY_DOWNLOADING;
		while(iCount--)
		{
			if (!hHTTP_FILE_REQ)
				hHTTP_FILE_REQ = HttpOpenRequest(m_hHTTP_CONNECTION, "GET", lpszRemoteFilePath, NULL, NULL, NULL, 0, 0);

			if (! HttpSendRequest (hHTTP_FILE_REQ, NULL, 0, NULL, 0)) {
				Sleep(100);
			}
			else break;
		}
		if( iCount  < 1 )
		{
			// 颇老阑 茫阑荐 绝促.
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, m_strtUpdatingFileInfo.iErrorCode);
			DeleteFile (lpszRealLocalFilePath);
			return FALSE;
		}

		// 3 . 颇老 农扁 掘扁
		DWORD dwFileLength = 0;
		CHAR szBuffer [16];
		DWORD dwBufferSize = sizeof (szBuffer), dwIndex = 0;	// dwIndex 甫 0 栏肺 (吝夸 !!)
		BOOL bResult = HttpQueryInfo(hHTTP_FILE_REQ, HTTP_QUERY_CONTENT_LENGTH, szBuffer, &dwBufferSize, &dwIndex);
		if (!bResult) {
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
			return FALSE;
		}
		dwFileLength = atoi (szBuffer);


		
		DWORD dwNowRecvBytes, dwNowWrittenBytes, dwTotalWrittenBytes, dwAvailableSize;
		dwNowRecvBytes = dwNowWrittenBytes = dwTotalWrittenBytes = dwAvailableSize = 0;


		if(dwFileLength >= 0)
		{
			m_strtUpdatingFileInfo.uWholeFileSize = dwFileLength;
			m_strtUpdatingFileInfo.uNowFileSize = 0;
			AddEvent( EVENT_FILEDOWNLOAD_START );

			while(TRUE)
			{
				if (! InternetQueryDataAvailable(hHTTP_FILE_REQ, & dwAvailableSize, 0, 0) ) {
					SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
					return FALSE;
				}

				if (dwAvailableSize > sizeof (m_HTTP_cBUFFER)) 
					dwAvailableSize = sizeof (m_HTTP_cBUFFER);

				if (! InternetReadFile(hHTTP_FILE_REQ, m_HTTP_cBUFFER, dwAvailableSize, &dwNowRecvBytes) ) {
					SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
					return FALSE;
				}
				
				if (! WriteFile (hLocalFile, m_HTTP_cBUFFER, dwNowRecvBytes, &dwNowWrittenBytes, NULL)) {
					SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
					return FALSE;
				}

				dwTotalWrittenBytes += dwNowWrittenBytes;
				m_strtUpdatingFileInfo.uNowFileSize = dwTotalWrittenBytes;
				
				AddEvent( EVENT_FILEDOWNLOAD_WORKING );

				if (!dwNowRecvBytes)
					break;

				if(dwTotalWrittenBytes >= dwFileLength)
					break;
				
				// 诀单捞飘 累诀捞 吝埃俊 秒家登菌促搁 唱埃促.
				if( m_bCancelUpdate )
				{
					DeleteFile (lpszRealLocalFilePath);
					m_bCancelUpdate = FALSE;
					return FALSE;
				}
			}
		}
		else
		{
			// 盔拜瘤 颇老 农扁啊 0焊促 累促. (俊矾啊 酒匆 荐档 乐澜)
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError());
		}

		AddEvent( EVENT_FILEDOWNLOAD_END );
		
		//m_strtUpdatingFileInfo.uNowFileNum++;		// 捞扒 促款肺靛 颇老捞 己傍窍搁 观俊辑 秦霖促.
	}
	__finally {
		if (hHTTP_FILE_REQ)
			InternetCloseHandle(hHTTP_FILE_REQ);
		if (hLocalFile != INVALID_HANDLE_VALUE)
			CloseHandle(hLocalFile);
	}
	
	return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -