www.pudn.com > WZ_UpdateModule_DLL.rar > HttpUpdate.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; 
}