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

📄 update.cpp

📁 奇迹世界更新程序源代码,其中包括一些文档
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "WZ_UM.h"
#include "ReadScript.h"
#include "resource.h"
#include "UpdateDefine.h"
#include "Tlhelp32.h"

#include ".\wz_um.h"


///////////////////////////////////////////////////////////////////////////////////////
/*
	扁夯 诀单捞飘 努贰胶 : 捞 努贰胶俊辑 FTP 客 HTTP 诀单捞飘 努贰胶啊 惑加 罐绰促.
*/

WZ_DECLAREDLL CWZUpdateModule::CWZUpdateModule()
{
	InitializeCriticalSection (& m_critERROR_MSG);

	memset (m_szIPADDR, '\0', sizeof(m_szIPADDR));
	m_wPORT = 0;
	memset (m_szID, '\0', sizeof(m_szID));
	memset (m_szPASS, '\0', sizeof(m_szPASS));
	m_lpFN_EventCallbackProc = NULL;
	m_iCurrentState = STATE_DISCONNECTED;
	m_bCancelUpdate = FALSE;
	m_uUpdateFolderCount = 0;
	m_strtUpdatingFileInfo.lpszErrorMsg = m_szLastErrorMsg;
	m_bUseEventProc = FALSE;
	m_nUpdateThreadID = 0;
	m_bLoadUpdateInfo = FALSE;
	m_nServerNumber = 0;
}


WZ_DECLAREDLL CWZUpdateModule::CWZUpdateModule (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS)
{
	InitializeCriticalSection (& m_critERROR_MSG);

	strcpy (m_szIPADDR, lpszIPADDR);
	m_wPORT = wPORT;
	strcpy (m_szID, lpszID);
	strcpy (m_szPASS, lpszPASS);
	m_lpFN_EventCallbackProc = NULL;
	m_iCurrentState = STATE_DISCONNECTED;
	m_bCancelUpdate = FALSE;
	m_uUpdateFolderCount = 0;
	m_strtUpdatingFileInfo.lpszErrorMsg = m_szLastErrorMsg;
	m_bUseEventProc = FALSE;
	m_nUpdateThreadID = 0;
	m_bLoadUpdateInfo = FALSE;
	m_nServerNumber = 0;
}


WZ_DECLAREDLL CWZUpdateModule::~CWZUpdateModule()
{
	DeleteCriticalSection(&m_critERROR_MSG);
}


WZ_DECLAREDLL VOID CWZUpdateModule::SetLastErrorMsg (INT iERROR_MODE, INT iERROR_CODE, LPSTR szUSER_MSG)
{
	EnterCriticalSection (& m_critERROR_MSG);

	DWORD dwERROR_CODE = iERROR_CODE;
	DWORD dwBUFFER_LEN = sizeof(m_szLastErrorMsg);

	switch (iERROR_MODE)
	{
	case CWZUpdateModule::ERROR_SYSTEM :
		if (iERROR_CODE >= 12000)
			InternetGetLastResponseInfo (&dwERROR_CODE, m_szLastErrorMsg, &dwBUFFER_LEN);
		else
			FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, iERROR_CODE, 0, m_szLastErrorMsg, sizeof (m_szLastErrorMsg), NULL);

		m_iLastErrorMode = CWZUpdateModule::ERROR_SYSTEM;
		m_strtUpdatingFileInfo.iErrorCode = iERROR_CODE;
		break;
	case CWZUpdateModule::ERROR_USER :
		strcpy (m_szLastErrorMsg, szUSER_MSG);
		m_iLastErrorMode = CWZUpdateModule::ERROR_USER;
		m_strtUpdatingFileInfo.iErrorCode = 0;
		break;
	default :
		m_szLastErrorMsg[0] = '\0';
		m_iLastErrorMode = CWZUpdateModule::ERROR_NONE;
		m_strtUpdatingFileInfo.iErrorCode = 0;
		break;
	}

	AddEvent( EVENT_ERROR );

	LeaveCriticalSection (& m_critERROR_MSG);
}


WZ_DECLAREDLL const LPSTR CWZUpdateModule::GetLastErrorMsg()
{
	return m_szLastErrorMsg;
}


WZ_DECLAREDLL const INT CWZUpdateModule::GetLastErrorCode()
{
	return m_iLastErrorCode;
}


WZ_DECLAREDLL unsigned __stdcall CWZUpdateModule::UpdateWorkerThread (LPVOID lpParam)
{
	CWZUpdateModule * lpWZUM = (CWZUpdateModule *) lpParam;

	if ( lpWZUM->UpdateRun() == TRUE )
		lpWZUM->AddEvent( EVENT_UPDATE_END_SUCCESS );
	else
		lpWZUM->AddEvent( EVENT_UPDATE_END_FAIL );
	
	return 0;
}


WZ_DECLAREDLL BOOL CWZUpdateModule::LoadLocalVerInfo()
{
	if( IsUpdateInfoLoad() )
	{
		byte byVer[3];
		GetVersionFromString( m_info.m_szServerVer[m_nServerNumber], byVer[0], byVer[1], byVer[2] );
		m_btLocalVer1 = byVer[0];
		m_btLocalVer2 = byVer[1];
		m_btLocalVer3 = byVer[2];
		m_uLocalTotalVersion = GetTotalVersion( m_btLocalVer1, m_btLocalVer2, m_btLocalVer3 );
	}
	else
		return FALSE;

	return TRUE;
}


WZ_DECLAREDLL BOOL CWZUpdateModule::SaveLocalVerInfo()
{
	return m_info.SaveVersionInfo( m_btLocalVer1, m_btLocalVer2, m_btLocalVer3, m_nServerNumber );
}


WZ_DECLAREDLL BOOL CWZUpdateModule::CheckVersion(LPSTR lpszFilePath)
{
	if ( (!lpszFilePath) || (!strcmp(lpszFilePath, "")))
		return FALSE;

	m_uUpdateFolderCount = 0;

	SMDToken Token;
	
	__try
	{
		if( (SMDFile = fopen(m_szVersionFileName, "r")) == NULL )
			return FALSE;
		
		while(TRUE)
		{
			Token = (*GetToken)();
			if( Token == END )
				break;

			if( Token == NAME ) 
			{
				strcpy(m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_szFolderName, TokenString);

				byte byVer[3];
				GetVersionFromString( TokenString, byVer[0], byVer[1], byVer[2] );

				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_btVer1 = byVer[0];
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_btVer2 = byVer[1];
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_btVer3 = byVer[2];
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_uTotalVersion = GetTotalVersion( byVer[0], byVer[1], byVer[2] );

				//货肺款 滚傈捞 泅犁 肺拿狼 滚傈焊促 农促搁.. 诀单捞飘且 弃歹狼 俺荐甫 刘啊矫挪促.
				if (m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_uTotalVersion > m_uLocalTotalVersion)
					m_uUpdateFolderCount++;

				if( m_uUpdateFolderCount > MAX_FOLDERINFO-1 )
					return FALSE;
			}
		}
	}
	__finally 
	{
		if (SMDFile)
			fclose(SMDFile);

		CHAR szVERFILE_NAME [MAX_PATH], szVERFILE_EXE [MAX_PATH], szVERFILE_FULLNAME [MAX_PATH];
		_splitpath (lpszFilePath, NULL, NULL, szVERFILE_NAME, szVERFILE_EXE);
		wsprintf(szVERFILE_FULLNAME, "%s%s", szVERFILE_NAME, szVERFILE_EXE);
		DeleteFile (szVERFILE_FULLNAME);
	}

	return TRUE;
}


// 捞 窃荐绰 辑滚狼 滚傈颇老阑 促款 罐酒辑, 泅犁 努扼捞攫飘狼 滚傈苞 厚背窍咯,
// 诀单捞飘甫 且瘤 救 且瘤甫 搬沥窍绰 窃荐促.
// 滚傈眉农 角菩搁, RESULT_FAIL
// 诀单捞飘 颇老捞 绝栏搁, RESULT_NOMORE_UPDATE_FILES
// 己傍捞搁, RESULT_SUCCESS
WZ_DECLAREDLL eRESULT_CONSTANT CWZUpdateModule::CheckUpdateFiles()
{
	// 1 . 辑滚俊 乐绰 滚傈 颇老阑 促款 罐绰促.
	// 泅犁 促款罐阑妨绰 辑滚狼 弃歹俊 乐绰 滚傈 颇老阑 促款 罐绰促. 罐篮 颇老篮 肺拿俊 促款罐绰促.
	TCHAR szVerFilePath[MAX_PATH];
	GetVersionFilePath( szVerFilePath, MAX_PATH );
	if ( !DownloadFile( szVerFilePath ) )
		return RESULT_FAIL;
	
	// 2 . 罐篮 滚傈 颇老俊辑 泅犁 努扼捞攫飘狼 滚傈苞 厚背窍咯 罐阑 颇老捞 乐栏搁 秦寸 弃歹俊辑 格废颇老阑 罐绰促.
	if ( !CheckVersion(m_szVersionFileName) )
	{
		MessageBox (HWND_DESKTOP, "checking version file error", "error", MB_OK | MB_ICONERROR);
		return RESULT_FAIL;
	}

	if (m_uUpdateFolderCount == 0)  //诀单捞飘 且 颇老捞 绝促.
		return RESULT_NOMORE_UPDATE_FILES;

	return RESULT_SUCCESS;
}


// lpszFilePath绰 府胶飘 颇老狼 捞抚捞促. 扁夯利栏肺 wz_filelist.dat 捞促.
WZ_DECLAREDLL BOOL CWZUpdateModule::UpdateRun()
{
	CHAR szCurrentLocalDirectory [MAX_PATH];						// 泅犁 肺拿 龋胶飘狼 叼泛配府 版肺
	CHAR szCurrentLocalFilePath [MAX_PATH]={0,};					// 肺拿 龋胶飘狼 叼泛配府 版肺

	CHAR szErrorMsg[256] = {0,};									// 俊矾 皋矫瘤 免仿侩

	m_strtUpdatingFileInfo.Reset();

	// 泅犁 角青颇老狼 叼泛配府甫 备茄促.
	GetModuleDirectory( szCurrentLocalDirectory, MAX_PATH );

	// 诀单捞飘 傈俊 泅犁狼 肺拿 滚傈阑 舅赴促.
	LoadLocalVerInfo();
	m_strtUpdatingFileInfo.btVer1 = m_btLocalVer1; 
	m_strtUpdatingFileInfo.btVer2 = m_btLocalVer2; 
	m_strtUpdatingFileInfo.btVer3 = m_btLocalVer3; 
	AddEvent( EVNET_VERSION_ALARM );

	for (UINT i = 0 ; i < m_uUpdateFolderCount ; i++ )
	{
		//颇老府胶飘 颇老狼 版肺甫 掘绢柯促.
		CHAR szFileListFilePath[MAX_PATH];	
		GetFileListFilePath( szFileListFilePath, MAX_PATH, m_strtUpdateFolderInfo[i].m_szFolderName );

		//府胶飘 颇老 促款肺靛, 促款罐阑 困摹甫 瘤沥窍瘤 臼栏搁 角青颇老捞 乐绰 镑俊 促款肺靛 茄促.
		if ( !DownloadFile(szFileListFilePath) )
			return FALSE;
		
		char szVerFolerPath[MAX_PATH];	
		GetVersionFolderPath( szVerFolerPath, MAX_PATH, m_strtUpdateFolderInfo[i].m_szFolderName );
		
		__try
		{
			BOOL bRet = DownloadFilesOnFileList( szVerFolerPath );
			if( bRet == FALSE)
				return FALSE;   //窍唱父 肋 给登档, 橇肺弊伐阑 辆丰茄促.

			// 咯扁鳖瘤 吭栏搁 拉 滚傈栏肺狼 诀单捞飘啊 己傍茄 巴捞骨肺 诀等 滚傈 历厘
			m_btLocalVer1 = m_strtUpdateFolderInfo[i].m_btVer1;
			m_btLocalVer2 = m_strtUpdateFolderInfo[i].m_btVer2;
			m_btLocalVer3 = m_strtUpdateFolderInfo[i].m_btVer3;
			SaveLocalVerInfo();				

			// 诀单捞飘 吝 橇肺弊伐 滚傈阑 舅赴促.
			m_strtUpdatingFileInfo.btVer1 = m_btLocalVer1; 
			m_strtUpdatingFileInfo.btVer2 = m_btLocalVer2; 
			m_strtUpdatingFileInfo.btVer3 = m_btLocalVer3; 
			AddEvent( EVNET_VERSION_ALARM );

			//////////////////////////////////////////////////////////////////////////
		}
		__finally 
		{
			if (SMDFile)
				fclose(SMDFile);

			DeleteFile( DEFAULT_FILELIST_FILE );
			DeleteFile( m_szVersionFileName );
			m_iCurrentState = STATE_CONNECTED;
		}
	}

	return TRUE;
}


WZ_DECLAREDLL BOOL CWZUpdateModule::AddEvent(int nEvent)
{
	// 泅犁 惑怕啊 DISCONNECTED惑怕捞搁 妮归窃荐甫 龋免窍瘤 臼绰促.
	BOOL bRet = FALSE;
	if ( m_lpFN_EventCallbackProc != NULL && m_bUseEventProc != FALSE )			
	{
		m_lpFN_EventCallbackProc( nEvent, (LPVOID) this, m_strtUpdatingFileInfo);

⌨️ 快捷键说明

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