📄 mhautopatchdlg.cpp
字号:
bConnecting = TRUE;
m_bVersionChecking = FALSE;
// MessageBox( "Try to Reconnect!", g_szMBErrCap, MB_OK );
// MessageBox( "橇肺弊伐阑 促矫 角青秦 林技夸." );
// QuitPatchDialog(TRUE);
return TRUE;
*/
//---------------------------------------
}
switch( *((DWORD*)pvdata) )
{
case FM_CONNECTED:
{
OnConnected( pvdata );
}
return TRUE;
case FM_GET_CURRENT_DIRECTORY:
{
OnGetCurrentDirectory( pvdata );
}
return TRUE;
case FM_GETFILELIST:
{
OnGetFileList( pvdata );
}
return TRUE;
case FM_CONFIRM:
{
OnConfirm( pvdata );
}
return TRUE;
case FM_DOWNLOAD:
{
OnDownLoad( pvdata );
}
return TRUE;
}
}
return TRUE;
case WM_RUNPROGRAM:
{
OnRunProgram();
}
return TRUE;
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CMHAutoPatchDlg::OnConnected( LPVOID pvdata )
{
bConnecting = FALSE;
Connect_data* pcd = (Connect_data*)pvdata;
// FM_GET_CURRENT_DIRECTORY
dd.pvExcuteContext = (PVOID) FM_GET_CURRENT_DIRECTORY;
iR = g_pFtp->GetCurrentDirectory( g_hSession, &dd);
_ASSERTE( iR == 0);
//滚怜眉农 甸绢皑.
m_bVersionChecking = TRUE;
}
/*
//1. 泅犁 滚怜阑 罐绰促.
void CMHAutoPatchDlg::OnGetCurVersion( LPVOID pvdata )
{
}
*/
void CMHAutoPatchDlg::OnGetCurrentDirectory( LPVOID pvdata )
{
Connect_data* pcd = (Connect_data*)pvdata;
/* //000
// FM_GETFILELIST
ld_zip.pvExcuteContext = (PVOID) FM_GETFILELIST;
ld_zip.dwFileMax = FIND_DATA_MAX;
ld_zip.pFile = pwfd;
ld_zip.pszSearchFile = MHFile;
iR = g_pFtp->GetList( g_hSession, &ld_zip);
_ASSERTE( iR == 0);
*/
/*
//捞芭 泪矫 林籍
//刚历 滚怜颇老阑 促款罐绰促.
//---
fd_newversion.pvExcuteContext = (PVOID) FM_CONFIRM;
fd_newversion.bResume = FALSE;
lstrcpy( fd_newversion.szRemoteFile, newverFilename);
lstrcpy( fd_newversion.szLocalFile, newverFilename);
iR = g_pFtp->DownloadFile( g_hSession, &fd_newversion);
_ASSERTE( iR == 0);
//---
*/
ld_zip.pvExcuteContext = (PVOID) FM_GETFILELIST;
ld_zip.dwFileMax = FIND_DATA_MAX;
ld_zip.pFile = pwfd;
ld_zip.pszSearchFile = newverFilename;//MH_VERSION_INFO_FILE;
iR = g_pFtp->GetList( g_hSession, &ld_zip);
_ASSERTE( iR == 0);
}
void CMHAutoPatchDlg::OnGetFileList( LPVOID pvdata )
{
List_data* pld = (List_data*)pvdata;
if( pld->dwFileNum == 0 )
{
/* //000
///////////////////////////////////////////////////// SC_DOWNLOAD_NOTICE
fd_newversion.pvExcuteContext = (PVOID) FM_CONFIRM;
fd_newversion.bResume = FALSE;
lstrcpy( fd_newversion.szRemoteFile, newverFilename);
lstrcpy( fd_newversion.szLocalFile, newverFilename);
MessageBox(newverFilename,0,0);
iR = g_pFtp->DownloadFile( g_hSession, &fd_newversion);
_ASSERTE( iR == 0);
return;
*/
// 啊厘 烤朝 滚怜 何磐 罐绰促.
//---
if( m_bVersionChecking )
{
MessageBox( "Now Uploading Patch Files. Try Again Later.", g_szMBErrCap );
g_pFtp->Shutdown(g_hSession);
QuitPatchDialog( TRUE );
return;
}
FILE* fporn = fopen( MH_VERSION_INFO_FILE, "r" );
if(fporn == NULL)
{
MessageBox( "Failed to Open Version File", g_szMBErrCap, MB_OK );
g_pFtp->Shutdown(g_hSession);
QuitPatchDialog( TRUE );
return;
}
char Version[64];
fscanf( fporn, "%s", Version );
fclose( fporn );
memcpy( szOldestFile, Version, VERSION_HEADER_TEXT_LENGTH);
sprintf( &szOldestFile[VERSION_HEADER_TEXT_LENGTH], "00000000.zip" );
///////////////////////////////////////////////////// FM_GETFILELIST
ld_zip.pvExcuteContext = (PVOID) FM_GETFILELIST;
ld_zip.dwFileMax = FIND_DATA_MAX;
ld_zip.pFile = pwfd;
ld_zip.pszSearchFile = szOldestFile;
iR = g_pFtp->GetList( g_hSession, &ld_zip);
_ASSERTE( iR == 0);
return;
//---
}
if( m_bVersionChecking )
{
fd_newversion.pvExcuteContext = (PVOID) FM_CONFIRM;
fd_newversion.bResume = FALSE;
lstrcpy( fd_newversion.szRemoteFile, newverFilename);
lstrcpy( fd_newversion.szLocalFile, newverFilename);
iR = g_pFtp->DownloadFile( g_hSession, &fd_newversion);
_ASSERTE( iR == 0);
return;
}
dwFileSizeMax = pld->pFile->nFileSizeLow;
///////////////////////////////////////////////////// SC_DOWNLOAD_ZIP
fd_zip.pvExcuteContext = (PVOID) FM_DOWNLOAD;
fd_zip.bResume = FALSE;
lstrcpy( fd_zip.szRemoteFile, ld_zip.pszSearchFile);
lstrcpy( fd_zip.szLocalFile, g_szMHpatchFile);
// Download MHFile
iR = g_pFtp->DownloadFile( g_hSession, &fd_zip);
_ASSERTE( iR == 0);
#ifndef _FOR_CHINA_
SetStatusText( "Downloading Files" );
#else
SetStatusText( "正在下载文件" );
#endif
}
void CMHAutoPatchDlg::OnConfirm( LPVOID pvdata )
{
File_data* pfd = (File_data*)pvdata;
if( pfd->CompletionError == CE_DOWNLOAD_PROGRESS )
{
return;
}
if( pfd->CompletionError != CE_SUCCEED )
return;
FILE* fpnew = fopen( newverFilename, "r" );
FILE* fpown = fopen( MH_VERSION_INFO_FILE, "r" );
if(fpnew == NULL || fpown == NULL)
{
MessageBox( "Failed to Check New Version", g_szMBErrCap, MB_OK );
g_pFtp->Shutdown(g_hSession);
QuitPatchDialog( TRUE );
if(fpnew)
fclose(fpnew);
if(fpown)
fclose(fpown);
return;
}
char temp1[256], temp2[256];
fscanf( fpnew, "%s", temp1 );
fscanf( fpown, "%s", temp2 );
fclose( fpnew );
fclose( fpown );
DeleteFile( newverFilename );
m_bVersionChecking = FALSE;
if( strcmp( temp1, temp2 ) == 0 ) // 弥脚滚怜牢啊?
{
g_pFtp->Shutdown(g_hSession);
SetReadyToStart();
}
else
{ // 备滚怜, 啊厘 烤朝 滚怜阑 罐绰促.
///////////////////////////////////////////////////// SC_DOWNLOAD_ZIP
/* //00
memcpy( szOldestFile, temp2, VERSION_HEADER_TEXT_LENGTH);
sprintf( &szOldestFile[VERSION_HEADER_TEXT_LENGTH], "00000000.zip" );
///////////////////////////////////////////////////// FM_GETFILELIST
ld_zip.pvExcuteContext = (PVOID) FM_GETFILELIST;
ld_zip.dwFileMax = FIND_DATA_MAX;
ld_zip.pFile = pwfd;
ld_zip.pszSearchFile = szOldestFile;
iR = g_pFtp->GetList( g_hSession, &ld_zip);
_ASSERTE( iR == 0);
*/
//泅犁 滚怜捞 乐绰瘤 犬牢
//---
// FM_GETFILELIST
ld_zip.pvExcuteContext = (PVOID) FM_GETFILELIST;
ld_zip.dwFileMax = FIND_DATA_MAX;
ld_zip.pFile = pwfd;
ld_zip.pszSearchFile = MHFile;
iR = g_pFtp->GetList( g_hSession, &ld_zip);
_ASSERTE( iR == 0);
//---
}
}
void CMHAutoPatchDlg::OnDownLoad( LPVOID pvdata )
{
File_data* pfd = (File_data*)pvdata;
if( pfd->CompletionError == CE_DOWNLOAD_PROGRESS ) // ZIP 颇老 傈价 柳青惑炔篮 包缴 乐促.
{
DWORD dwCurrentSize = pfd->dwTransferBytes;
DWORD dwProLv = DWORD(PRO_RANGE_DN * ((float)(dwCurrentSize) / (float)(dwFileSizeMax)) );
SetProgressBar( dwProLv );
}
if( pfd->CompletionError == CE_SUCCEED )
{
g_pFtp->Shutdown(g_hSession);
// 拘绵阑 钱磊.
#ifndef _FOR_CHINA_
SetStatusText( "Extracting Files" );
#else
SetStatusText( "正在解压文件" );
#endif
SetProgressBar( 0 );
BOOL bReturn = Extract_DownloadFile( g_szMHpatchFile );
DeleteFile( g_szMHpatchFile );
if( !bReturn )
{
// 拘绵 钱扁 角菩.
MessageBox( "Failed To Extract", g_szMBErrCap, MB_OK );
QuitPatchDialog( TRUE );
return;
}
// yh
// 颇老阑 菩虐隆茄促.
if(g_bUsingEnginePack)
{
StartPack3DData();
}
else
{
bReturn = UpdateVersionInfoFile( MH_VERSION_INFO_FILE, newverFilename);
// jsd // resource 弃歹狼 filelist历厘
((CMHAutoPatchApp*)AfxGetApp())->SaveFileList();
SetReadyToStart();
}
}
}
BOOL CMHAutoPatchDlg::RunMH()
{
/*
{
FILE* fp = fopen("MHAutoPatch.new","rb");
if(fp != NULL)
{
fclose(fp);
_execl("MHExecuter.exe","a",NULL);
}
}
{
FILE* fp = fopen("SS3DGFunc.new","rb");
if(fp != NULL)
{
fclose(fp);
_execl("MHExecuter.exe","a",NULL);
}
}
*/
SelectGFunc();
BOOL bReturn;
STARTUPINFO sp;
memset( &sp, 0, sizeof(STARTUPINFO));
sp.cb = sizeof(STARTUPINFO);
sp.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE | STARTF_USESTDHANDLES; //STARTF_USESHOWWINDOW
sp.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
if(strlen(g_ExecutableFileName) == 0)
return TRUE;
else
{
bReturn = CreateProcess( g_ExecutableFileName, // name of executable module
//#ifdef _MANUAL_PATCH_
// " anrgiddlatl", // command line string
//#else
" anrgideoqkr", // command line string
//#endif
NULL, // SD
NULL, // SD
FALSE, // handle inheritance option
CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, // creation flags
NULL, // new environment block
NULL, // current directory name
&sp, // startup information
&pi // process information
);
}
if( !bReturn )
return FALSE;
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return TRUE;
}
BOOL CMHAutoPatchDlg::Extract_DownloadFile( char* lpFileName )
{
DWORD dwi;
int iMax;
bool bReturn;
g_pZip->Open( g_szMHpatchFile, CZipArchive::zipOpen);
iMax = g_pZip->GetCount();
bReturn = TRUE;
CZipFileHeader head;
for ( dwi = 0; (int)dwi < iMax; dwi++)
{
if( g_pZip->GetFileInfo( head, dwi) == false )
{
bReturn = FALSE;
break;
}
CZipString filename = head.GetFileName();
SetFileAttributes(filename,FILE_ATTRIBUTE_NORMAL);
if( g_pZip->ExtractFile( dwi, NULL ) == false )
{
bReturn = FALSE;
break;
}
//
// 柳青惑炔 焊咯林扁.
DWORD dwProLv = (DWORD)(PRO_RANGE_EX * ((float)(dwi + 1) / (float)iMax));
SetProgressBar( dwProLv );
#ifdef _FOR_CLIENT_
MSG msg;
if( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#endif
}
g_pZip->Close();
return bReturn;
}
void CMHAutoPatchDlg::StartPack3DData()
{
SetProgressBar( 0 );
#ifndef _FOR_CHINA_
SetStatusText( "Packing Files" );
#else
SetStatusText( "正在打包文件" );
#endif
_beginthread( Pack3DData, 0, m_hWnd );
}
BOOL CMHAutoPatchDlg::UpdateVersionInfoFile( char* lpszOldVerInfoFile, char* lpszNewVerInfoFile )
{
HANDLE hFind;
WIN32_FIND_DATA wfd;
BOOL bReturn;
hFind = FindFirstFile( lpszNewVerInfoFile, &wfd);
if( hFind == INVALID_HANDLE_VALUE )
return FALSE;
bReturn = DeleteFile( lpszOldVerInfoFile);
if( !bReturn )
{
MessageBox( "Failed To Delete VersionFile", g_szMBErrCap, MB_OK );
return FALSE;
}
bReturn = MoveFile( lpszNewVerInfoFile, lpszOldVerInfoFile); // for win2000 later ==> , MOVEFILE_REPLACE_EXISTING);
if( !bReturn )
{
MessageBox( "Failed To Rename VersionFile", g_szMBErrCap, MB_OK );
return FALSE;
}
return TRUE;
}
BOOL IsSupportSSE()
{
BOOL bResult = TRUE;
__try
{
// xorps xmm0,xmm0
__asm _emit 0x0f
__asm _emit 0x57
__asm _emit 0xc0
}
__except ( EXCEPTION_EXECUTE_HANDLER)
{
bResult = FALSE;
}
return bResult;
}
BOOL CMHAutoPatchDlg::SelectGFunc()
{
if (IsSupportSSE())
CopyFile("SS3DGFuncSSE.dll","SS3DGFunc.dll",FALSE);
else
CopyFile("SS3DGFuncN.dll","SS3DGFunc.dll",FALSE);
return TRUE;
}
BOOL CMHAutoPatchDlg::InitEngine()
{
SelectGFunc();
HRESULT hr;
g_hExecutiveHandle = LoadLibrary("SS3DExecutiveForMuk.dll");
if( g_hExecutiveHandle == NULL )
return FALSE;
CREATE_INSTANCE_FUNC pFunc;
pFunc = (CREATE_INSTANCE_FUNC)GetProcAddress(g_hExecutiveHandle,"DllCreateInstance");
hr = pFunc((void**)&g_pExecutive);
if (hr != S_OK)
{
::MessageBox( m_sHWnd, "Failed To Create Executive", g_szMBErrCap, MB_OK );
return FALSE;
}
// geometry DLL狼 捞抚, renderer DLL狼 捞抚阑 持绢林搁 executive啊 舅酒辑 积己,檬扁拳秦霖促.
if(g_pExecutive->InitializeFileStorageWithoutRegistry("SS3DFileStorage.dll",
12000,4096,128,FILE_ACCESS_METHOD_ONLY_FILE,NULL,0) == FALSE)
return FALSE;
return TRUE;
}
BOOL AddDataToPackFile( CStrClass pakname, CStrClass dir )
{
I4DyuchiFileStorage* pFS;
g_pExecutive->GetFileStorage(&pFS);
void* pPakFile = pFS->MapPackFile((char*)(LPCTSTR)pakname);
if(pPakFile == NULL)
return FALSE;
BOOL rt = pFS->LockPackFile(pPakFile,0);
if(rt == FALSE)
return FALSE;
char CurDir[MAX_PATH];
GetCurrentDirectory(MAX_PATH,CurDir);
BOOL bSD = SetCurrentDirectory(dir);
CDirectoryName dirname(NULL,NULL);
dirname.LoadChild();
SetCurrentDirectory(CurDir);
dirname.SetPositionHead();
DWORD kind;
CStrClass filename;
CStrClass tname;
while((kind=dirname.GetNextFileName(&filename)) != GETNEXTFILENAME_END)
{
if(kind != GETNEXTFILENAME_FILE)
continue;
if(filename == "")
continue;
tname = dir + "\\" + filename;
if(pFS->InsertFileToPackFile(pPakFile,(char*)(LPCTSTR)tname) == FALSE)
return FALSE;
}
BOOL unlock = pFS->UnlockPackFile(pPakFile,PackingCallBackFunc);
if(unlock == FALSE)
return FALSE;
pFS->UnmapPackFile(pPakFile);
pFS->Release();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -