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

📄 patch.cpp

📁 传奇2客户端源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Patch.cpp: implementation of the CPatch class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Patch.h"

#define PATCH_SECTION			"PATCH_FTP"
#define PATCH_VERSION			"LastUpdate"
#define PATCH_SETVER_NAME		"FTPSerVerIP"
#define PATCH_SERVER_PORT		"FTPSerVerPort"
#define PATCH_USER_ID			"UserID"
#define PATCH_USER_PASS			"PassWord"

#define IDB_PATCH_BASE                  109
#define IDB_PATCH_COVER                 110

#define DEFAULT_PATCH_SERVER	"192.168.0.202" //"wemade.nefficient.co.kr"
#define DEFAULT_PATCH_PORT		INTERNET_DEFAULT_FTP_PORT
#define DEFAULT_PATCH_UID		"anonymous"
#define DEFAULT_PATCH_PASS		NULL
#define DEFAULT_LAST_PATCH_DATE	"20020120"
#define DEFAULT_VERSION			"20011219"
#define DEFAULT_REG_PATH		"SOFTWARE\\WEMADE Entertainment\\固福狼傈汲2ei"

#define PATCH_INI_FILE_NAME		"\\Mir2Patch.ini"
#define PATCHED_LIST_FILE		"Patch.lst"
#define PATCH_LIST_FILE_LIST	"Mir2Patch.lst"
#define PATCH_LAST_DATE			"Last Patch Date"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CPatch::CPatch()
{
	char	m_szPatchServerIP[16];
	char	FullPathFileName[MAX_PATH];

	m_TheAmount		=	0;
	m_AnAmount		=	0;
	m_PatchState	=	0;
	m_HInet			=	NULL;
	m_HFileFtp		=	NULL;
	m_HFtp			=	NULL;

	GetCurrentDirectory(MAX_PATH,FullPathFileName);
 	strcat(FullPathFileName,PATCH_INI_FILE_NAME);

	m_Server_Port	=	DEFAULT_PATCH_PORT;

						GetPrivateProfileString(PATCH_SECTION,PATCH_SETVER_NAME,DEFAULT_PATCH_SERVER
												,m_szPatchServerIP,16,FullPathFileName);

	m_Server_Port	=	GetPrivateProfileInt(PATCH_SECTION,PATCH_SERVER_PORT,m_Server_Port,FullPathFileName);
						GetPrivateProfileString(PATCH_SECTION,PATCH_USER_ID,DEFAULT_PATCH_UID
												,m_UID,11,FullPathFileName);
						GetPrivateProfileString(PATCH_SECTION,PATCH_USER_PASS,DEFAULT_PATCH_PASS
												,m_PASS,11,FullPathFileName);

	m_HInet = OpenInet("MIR2Patch");
	m_HFtp	= ConnectInet(m_HInet,m_szPatchServerIP,m_Server_Port,m_UID,m_PASS);
}

CPatch::~CPatch()
{
	for(int i = 0 ; i< m_FACount;i++)
		delete m_ppFilesData[i];

	if ( m_HFtp )
	{
		InternetCloseHandle(m_HFtp);
		m_HFtp = NULL;
	}

	if ( m_HInet)
	{
		InternetCloseHandle(m_HInet);
		m_HInet = NULL;
	}

	if(m_xBmp[0]!=NULL) DeleteObject(m_xBmp[0]);
	if(m_xBmp[1]!=NULL) DeleteObject(m_xBmp[1]);
}


short CPatch::Progress(long Total, long Current)
{

	if( Total < Current ) return 0;

	return (short((Current * 100.0) / Total));
}

HINTERNET CPatch::OpenInet(char* name)
{
	HINTERNET	tHInet;
	tHInet = InternetOpen(name,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
	if(tHInet == NULL)
	{
		// Error Handle
	}
	return tHInet;
}

HINTERNET CPatch::ConnectInet(HINTERNET hInet, char *sIP, WORD lPort, char *pID, char *pPass)
{
	DWORD		LenStr;
	DWORD		dwErrorCode;
	char		szErrorBuffer[512];
	HINTERNET	thInet;

	thInet = InternetConnect( hInet,sIP,lPort,pID, pPass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE,0);
	if ( thInet == NULL )
	{
		LenStr =0;
		dwErrorCode =0;
		dwErrorCode = GetLastError();
		InternetGetLastResponseInfo(&dwErrorCode,szErrorBuffer,&LenStr);
	}
	return thInet;
}


BOOL	CPatch::WillBePatch(VOID)
{
	int				CmpResult;
	int				BufferSize;
	char			Version[8];
	char			szTemp[MAX_PATH];
	char			FileBuffer[4100];
	DWORD			dwReadLen;
	DWORD			dwErrNum;
	FILE*			HFile;
	FileListHeader	FLHeader;

	BufferSize=0;
	dwReadLen = 0;
	BufferSize = 4100;
	ZeroMemory(FileBuffer,4100);

	m_hFile = NULL;
	m_hFile = CreateFile (PATCH_LIST_FILE_LIST, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

	if((dwErrNum=GetLastError())==ERROR_FILE_EXISTS)
	{
		// 拳老捞 粮犁窍搁 促矫 罐酒扼
		DeleteFile(PATCH_LIST_FILE_LIST);
		m_hFile = CreateFile (PATCH_LIST_FILE_LIST, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
	}

	// Make Update Directory from FTP
	m_szPatchDate[8] = '\0';
	strcpy(szTemp,m_szPatchDate);
	strcat(szTemp,"\\");
	strcat(szTemp,PATCH_LIST_FILE_LIST);
	m_HFileFtp = FtpOpenFile( m_HFtp,szTemp, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0);

	while(1)						// 拳老 罐绰 何盒.
	{
		if (InternetReadFile( m_HFileFtp, FileBuffer, (DWORD)BufferSize, &dwReadLen) != FALSE)
		{
			if ( (int)dwReadLen != BufferSize )
			{
				BufferSize = (int)dwReadLen;
				WriteFile( m_hFile, FileBuffer, (DWORD)BufferSize, &dwReadLen, NULL);
				break;
			}
			else
			{
				WriteFile( m_hFile, FileBuffer, (DWORD)BufferSize, &dwReadLen, NULL);
			}
		}
		else 
		{
			break;
		}
	}

	CloseHandle(m_hFile);
	InternetCloseHandle(m_HFileFtp);

	m_PatchState	=	0;
	m_hFile			=	NULL;
	m_HFileFtp		=	NULL;

	if(!jRegGetKey(_T(DEFAULT_REG_PATH), _T(PATCH_LAST_DATE), (LPBYTE)Version))
	{
		strcpy(Version,DEFAULT_LAST_PATCH_DATE);	// Default Last Patch Date
	}

	ZeroMemory(FLHeader.VersionDate,sizeof(FLHeader.VersionDate));

	if((HFile = fopen(PATCH_LIST_FILE_LIST,"r")) == NULL)	return FALSE;		

	fread(FLHeader.VersionDate,sizeof(char),sizeof(FLHeader.VersionDate),HFile);

	fclose(HFile);

	FLHeader.VersionDate[sizeof(FLHeader.VersionDate)] = NULL;

	CmpResult=strncmp(FLHeader.VersionDate, Version,8);	

	if(CmpResult>0)
	{
		return TRUE;
		// Patch 罐酒具 窃
	}
	else
	{
		if(CmpResult==0)
		{
			// Patch 罐阑 鞘夸 绝澜
			return FALSE;
		}
		else
		{
			// 泅力 啊瘤绊 乐绰巴捞 辑滚俊辑 瘤盔窍绰芭 焊促 弥辟 滚傈捞促 ぱ.ぱ?
			return FALSE;
		}
	}
}


HRESULT CPatch::GetFtpFiles(VOID)	// 咯扁俊辑 File List甫 盒籍秦辑 GetFile阑 拌加 倒妨临巴  return -1l : Error  0: End 1: Continue
{
	static int		Pos=0;
	char			szTemp[MAX_PATH];
	char			szDirStr[MAX_PATH];
	char			szFileName[MAX_PATH];

	UnCompressedFileNode* FileNode;
// 咯扁俊辑 Last Patch Date甫 掘绢具 茄促.
	if(m_bEndPatch != TRUE)
	{
		if(m_PatchState == 3)
		{
			m_bEndPatch = TRUE;
			return 0l;
		}
		else
		{
			if((m_PatchState == 2) || (m_PatchState == 0)) 
			{
				Pos ++;
				if(m_PatchState == 2)
				{
					if(m_hFile != NULL)   
					{
						CloseHandle(m_hFile);
						m_hFile = NULL;
					}

	  				if(m_HFileFtp != NULL) 
					{
						InternetCloseHandle(m_HFileFtp);
						m_HFileFtp=NULL;
					}

					if(Pos > m_FACount)
					{
						m_PatchState = 0;
						m_bPatched   = TRUE;
						m_bEndPatch  = TRUE;
						return 0l;
					}
				}

				FileNode = GetFileNode(Pos - 1);
				ZeroMemory(szFileName, MAX_PATH);
				ZeroMemory(szTemp, MAX_PATH);

				DWORD dwErrNum;
				ZeroMemory(szDirStr, MAX_PATH);

				if(strcmp(FileNode->szFileName, "Mir2Patch.exe") == 0)	// Patch 拳老 老 版快
				{
					DeleteFile(FileNode->szFileName);
					if(!jRegGetKey(_T(DEFAULT_REG_PATH), _T("setup path"), (LPBYTE)szDirStr))
					{
						ZeroMemory(szDirStr, MAX_PATH);
						GetCurrentDirectory(MAX_PATH, szDirStr);
						szDirStr[strlen(szDirStr)] ='\\';
						szDirStr[strlen(szDirStr)] = NULL;
					}
					for ( INT nCnt = strlen(szDirStr); nCnt >= 0; nCnt--)
					{
						if ( szDirStr[nCnt] == '\\' )
						{
							szDirStr[nCnt+1] = NULL;
							break;
						}
					}					
				}
				else
				{
					strcpy(szDirStr, m_UpdatePath);
				}

				strcpy(szFileName, FileNode->szFileName);
				strcpy(szTemp, szDirStr);
				strcat(szTemp, szFileName);
					
				m_hFile = CreateFile (szTemp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
				if((dwErrNum=GetLastError()) == ERROR_FILE_EXISTS)
				{
					// 拳老捞 捞固 粮犁 且 版快 弊 拳老狼 农扁甫 犬牢
					// 诀单捞飘 窍妨绰 拳老焊促 累篮 拳老狼 版快
					// 犁措肺 诀单捞飘 登瘤 臼篮 拳老 捞骨肺 促矫 诀单捞飘甫 罐绰促.
					m_hFile = CreateFile (szTemp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
					DWORD High_FileSize;
					DWORD Low_FileSize;
					High_FileSize = 0;
					Low_FileSize = 0;
					Low_FileSize = GetFileSize(m_hFile, &High_FileSize);
					CloseHandle(m_hFile);
					m_hFile = NULL;
					if(Low_FileSize <= (DWORD)FileNode->lFileSize)
					{
						BOOL bResult = DeleteFile(szTemp);
						if (bResult)
						{
							//	Success
			//					MessageBox(NULL,"File Delete & ReCreate","Message",MB_OK); 
							m_hFile = CreateFile (szTemp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
						}
						else
						{
			//					MessageBox(NULL,"File Delete Fail","Message",MB_OK); 
							//	Fail 
							return -1l;
						}
					}
				}
				strcpy(szTemp, m_szPatchDate);
				strcat(szTemp, "\\");
				strcat(szTemp, szFileName);
				m_HFileFtp = FtpOpenFile(m_HFtp, szTemp, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0);
			}
			else
			{
				FileNode = GetFileNode(Pos - 1);
			}
			strcpy(szTemp, m_szPatchDate);
			strcat(szTemp, "\\");
			strcat(szTemp, szFileName);

⌨️ 快捷键说明

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