Initial commit: ROW Client source code

Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

View File

@@ -0,0 +1,768 @@
// ManualPatchPage.cpp : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
//
#include "stdafx.h"
#include "PatchMaker.h"
#include "ManualPatchPage.h"
#include "UtilityFunc.h"
#include "PMSetting.h"
#include "PMSettingConstant.h"
#include "atlenc.h"
#include <process.h>
#include <ZipArchive.h>
#include ".\manualpatchpage.h"
// CManualPatchPage <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
IMPLEMENT_DYNAMIC(CManualPatchPage, CPropertyPage)
CManualPatchPage::CManualPatchPage(CPMSetting& pmSetting, DWORD dwPatchVersion)
: CPropertyPage(CManualPatchPage::IDD)
, m_szMPFolder(_T(""))
, m_szMPSFXFile(_T(""))
, m_szMPFileName(_T(""))
, m_dwMPMinver(0)
, m_dwMPMaxver(dwPatchVersion)
, m_szPatchType(_T(""))
, m_szFileProgress(_T("0/0"))
, m_pmSettingOption(pmSetting)
, m_hManualPatchThread(0)
{
m_ProgressData.m_bStopWorkerThread = FALSE;
m_ProgressData.m_nTotalFiles = 0;
m_ProgressData.m_nAddedFiles = 0;
m_ProgressData.m_dwTotalFileSize = 0LL;
m_ProgressData.m_dwCurrentFileSize = 0LL;
}
CManualPatchPage::~CManualPatchPage()
{
}
void CManualPatchPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Text(pDX, IDC_ED_MP_MANUAL_PATCH_FILE, m_szMPFolder);
DDX_Text(pDX, IDC_ED_MP_MANUAL_SFX_FILE, m_szMPSFXFile);
DDX_Text(pDX, IDC_ED_MP_PATCH_FILE_NAME, m_szMPFileName);
DDX_Text(pDX, IDC_ED_MP_MIN_VER, m_dwMPMinver);
DDX_Text(pDX, IDC_ED_MP_CUR_VER, m_dwMPMaxver);
DDX_Text(pDX, IDC_ED_MP_PATCH_TYPE, m_szPatchType);
DDX_Control(pDX, IDC_ED_MP_CONSOLE, m_edProgressLog);
DDX_Control(pDX, IDC_PRG_MP, m_TotalProgressBar);
DDX_Control(pDX, IDC_ED_MP_ERR_CONSOLE, m_edErrLog);
DDX_Text(pDX, IDC_ST_MP_PRORGRESS, m_szFileProgress);
}
BEGIN_MESSAGE_MAP(CManualPatchPage, CPropertyPage)
ON_BN_CLICKED(ID_MP_CREATE, OnBnClickedMpCreate)
ON_BN_CLICKED(ID_MP_CANCEL, OnBnClickedMpCancel)
ON_BN_CLICKED(IDC_BTN_MP_SELECT_FILE, OnBnClickedBtnMpSelectFile)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_CLEAR_LOG, OnBnClickedClearLog)
END_MESSAGE_MAP()
// CManualPatchPage <20>޽<EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
struct MPWorkerData
{
CManualPatchPage* m_lpPage;
CString m_szMPFolder;
CString m_szMPSFXFile;
CString m_szMPFileName;
CString m_szPatchType;
DWORD m_dwMPMaxver;
DWORD m_dwMPMinver;
};
void CManualPatchPage::UpdateManualPatchStatus(MPProgressData& progressData)
{
//! MANUAL_PATCH_LOCK
m_ProgressLock.Lock();
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
progressData.m_bStopWorkerThread = m_ProgressData.m_bStopWorkerThread;
m_ProgressData.m_nTotalFiles = progressData.m_nTotalFiles;
m_ProgressData.m_nAddedFiles = progressData.m_nAddedFiles;
m_ProgressData.m_dwCurrentFileSize = progressData.m_dwCurrentFileSize;
m_ProgressData.m_dwTotalFileSize = progressData.m_dwTotalFileSize;
m_ProgressData.m_ProgressList.AddTail(&progressData.m_ProgressList);
m_ProgressData.m_ErrorList.AddTail(&progressData.m_ErrorList);
m_ProgressData.m_TotalProgressList.AddTail((&progressData.m_TotalProgressList));
//! MANUAL_PATCH_UNLOCK
m_ProgressLock.Unlock();
progressData.m_ProgressList.RemoveAll();
progressData.m_ErrorList.RemoveAll();
}
template<class FnProcess>
bool EnumerateAllLeafFiles(FnProcess fnProcess, LPCTSTR lpRootPath)
{
CString szTemp;
CList<CString> dirStack;
CFileFind fileFind;
szTemp.SetString(lpRootPath);
szTemp.Trim();
int nLength = szTemp.GetLength();
// <20>ڿ<EFBFBD> \\*.* Ȥ<><C8A4> *.*<2A><> <20>ٿ<EFBFBD> <20>ش<EFBFBD>.
szTemp.Append(
(1 < nLength && _T('\\') != szTemp.GetString()[nLength - 1])
? _T("\\*.*") : _T("*.*"));
dirStack.AddTail(szTemp);
BOOL bWorking = FALSE;
while(!dirStack.IsEmpty())
{
szTemp.SetString(dirStack.RemoveTail());
if (bWorking = fileFind.FindFile(szTemp))
{
while(bWorking)
{
bWorking = fileFind.FindNextFile();
if (!fileFind.IsDots())
{
szTemp.SetString(fileFind.GetFilePath());
if (fileFind.IsDirectory())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
szTemp.Append(_T("\\*.*"));
dirStack.AddTail(szTemp);
}
// vssver.scc<63><63> <20><><EFBFBD><EFBFBD> <20><> <20><>
else if(0 != szTemp.CompareNoCase(_T("vssver.scc")) && !fnProcess(fileFind))
{
// <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD>
return false;
}
}
}
}
else
{
return false;
}
}
return true;
}
class CGetTotalFileNumAndSize
{
public:
CGetTotalFileNumAndSize(ULONGLONG& dwTotalFileSize, int& nTotalFileNum)
: m_dwTotalFileSize(dwTotalFileSize)
, m_nTotalFileNum(nTotalFileNum)
{
}
bool operator () (const CFileFind& fileFind)
{
m_dwTotalFileSize += fileFind.GetLength();
++m_nTotalFileNum;
return true;
}
private:
ULONGLONG& m_dwTotalFileSize;
int& m_nTotalFileNum;
};
class CCompressFiles
{
public:
CCompressFiles(
CManualPatchPage& mpPage,
MPProgressData& progressData,
CZipArchive& zipArchive,
CString& szErrorString)
: m_MPPage(mpPage)
, m_ProgressData(progressData)
, m_ZipArchive(zipArchive)
, m_szErrorString(szErrorString)
{
}
bool operator () (const CFileFind& fileFind)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
m_szFileName = fileFind.GetFilePath();
// <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD>
SetFileAttributes(m_szFileName, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_ARCHIVE);
if (m_ZipArchive.AddNewFile(m_szFileName, Z_BEST_COMPRESSION, false))
{
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
ULONGLONG dwFileSize = fileFind.GetLength();
m_ProgressData.m_dwCurrentFileSize += dwFileSize;
++m_ProgressData.m_nAddedFiles;
PMUtil::SetCurrentTime(m_szErrorString);
m_szErrorString.AppendFormat(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> : %s"), m_szFileName);
m_ProgressData.m_ProgressList.AddTail(m_szErrorString);
}
else
{
// <20><><EFBFBD><EFBFBD> <20>α׸<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DWORD dwError = GetLastError();
PMUtil::SetCurrentTime(m_szErrorString);
m_szErrorString.AppendFormat(_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : %s : "), m_szFileName);
PMUtil::AppendErrorMessage(m_szErrorString, dwError);
m_ProgressData.m_ErrorList.AddTail(m_szErrorString);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
m_MPPage.UpdateManualPatchStatus(m_ProgressData);
return (FALSE == m_ProgressData.m_bStopWorkerThread);
}
private:
CManualPatchPage& m_MPPage;
MPProgressData& m_ProgressData;
CZipArchive& m_ZipArchive;
CString& m_szErrorString;
CString m_szFileName;
};
unsigned __stdcall CManualPatchPage::ManualPatchWorker(void* pArg)
{
MPWorkerData* lpWorkerData = reinterpret_cast<MPWorkerData*>(pArg);
CManualPatchPage* lpPage = lpWorkerData->m_lpPage;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CZipArchive zipArchive;
CString szSFXFileName;
CString szZipFileName;
CString szErrorString;
const int MAX_ERROR_LEN = 256;
TCHAR szErrorMsg[MAX_ERROR_LEN];
MPProgressData progressData;
progressData.m_bStopWorkerThread = FALSE;
progressData.m_dwTotalFileSize = 0LL;
progressData.m_dwCurrentFileSize = 0LL;
progressData.m_nTotalFiles = 0;
progressData.m_nAddedFiles = 0;
szSFXFileName.SetString(lpWorkerData->m_szMPFileName);
szZipFileName.SetString(lpWorkerData->m_szMPFileName);
int nPos = szZipFileName.ReverseFind(_T('.'));
if (0 < nPos) { szZipFileName.Truncate(nPos); szZipFileName.Append(_T(".zip"), nPos); }
// <20><>ü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><EFBFBD><EBB7AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (!EnumerateAllLeafFiles(CGetTotalFileNumAndSize(
progressData.m_dwTotalFileSize, progressData.m_nTotalFiles), lpWorkerData->m_szMPFolder))
{
DWORD dwError = GetLastError();
PMUtil::SetCurrentTime(szErrorString);
if (progressData.m_bStopWorkerThread)
{
szErrorString.AppendFormat(_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>"));
}
else
{
szErrorString.AppendFormat(_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> : "));
PMUtil::AppendErrorMessage(szErrorString, dwError);
}
progressData.m_ErrorList.AddTail(szErrorString);
progressData.m_TotalProgressList.AddTail(szErrorString);
}
else
{
TRY
{
bool bSucceededJob = false;
zipArchive.Open(szZipFileName, CZipArchive::zipCreate);
zipArchive.SetRootPath(lpWorkerData->m_szMPFolder);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20>α״<CEB1> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (!EnumerateAllLeafFiles(
CCompressFiles(*lpPage, progressData, zipArchive, szErrorString),
lpWorkerData->m_szMPFolder))
{
DWORD dwError = GetLastError();
PMUtil::SetCurrentTime(szErrorString);
if (progressData.m_bStopWorkerThread)
{
szErrorString.AppendFormat(_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>"));
}
else
{
szErrorString.AppendFormat(_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> : "));
PMUtil::AppendErrorMessage(szErrorString, dwError);
}
progressData.m_ErrorList.AddTail(szErrorString);
progressData.m_TotalProgressList.AddTail(szErrorString);
}
else
{
/*
TODO : <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD>, BASE64<36><34><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><> <20><> Comment<6E><74> <20><><EFBFBD><EFBFBD> <20>ڴ´<DAB4>.
<20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1. <20><><EFBFBD><EFBFBD> <20><> <20>뷮 : <20><><EFBFBD><EFBFBD>ũ <20>뷮 üũ
2. <20>ּҹ<D6BC><D2B9><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ִٸ<D6B4>, <20>ּҹ<D6BC><D2B9><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
3. <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ִٸ<D6B4>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
4. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ġ
*/
CMemFile srcData;
srcData.Write(&progressData.m_dwTotalFileSize, sizeof(progressData.m_dwTotalFileSize));
// <20><>ġ Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>.
PMConst::AdjustVersionInfoByPatchType(lpWorkerData->m_szPatchType,
lpWorkerData->m_dwMPMinver, lpWorkerData->m_dwMPMaxver);
srcData.Write(&lpWorkerData->m_dwMPMinver, sizeof(lpWorkerData->m_dwMPMinver));
srcData.Write(&lpWorkerData->m_dwMPMaxver, sizeof(lpWorkerData->m_dwMPMaxver));
int nInstalledPathLen = 0;
int nValueNameLen = 0;
CString szInstalledPath, szValueName;
if (PMConst::GetRYLInstalledRegKey(
lpWorkerData->m_szPatchType, szInstalledPath, szValueName))
{
nInstalledPathLen = szInstalledPath.GetLength();
nValueNameLen = szValueName.GetLength();
srcData.Write(&nInstalledPathLen, sizeof(nInstalledPathLen));
srcData.Write(&nValueNameLen, sizeof(nValueNameLen));
srcData.Write(szInstalledPath.GetString(), nInstalledPathLen * sizeof(TCHAR));
srcData.Write(szValueName.GetString(), nValueNameLen * sizeof(TCHAR));
}
else
{
srcData.Write(&nInstalledPathLen, sizeof(nInstalledPathLen));
srcData.Write(&nValueNameLen, sizeof(nValueNameLen));
}
int nSrcLen = static_cast<int>(srcData.GetLength());
int nDstLen = Base64EncodeGetRequiredLength(nSrcLen);
LPSTR lpEncodedData = (LPSTR)malloc(sizeof(CHAR) * (nDstLen + 1));
if (0 != lpEncodedData)
{
BYTE* lpSrcData = srcData.Detach();
if (Base64Encode(lpSrcData, nSrcLen, lpEncodedData, &nDstLen))
{
lpEncodedData[nDstLen] = (CHAR)0;
bSucceededJob =
zipArchive.SetGlobalComment(lpEncodedData);
}
free(lpSrcData);
free(lpEncodedData);
}
}
zipArchive.Close();
if (!progressData.m_bStopWorkerThread)
{
PMUtil::SetCurrentTime(szErrorString);
szErrorString.AppendFormat(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>۾<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. SFX<46><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>Դϴ<D4B4>.."));
progressData.m_ProgressList.AddTail(szErrorString);
lpPage->UpdateManualPatchStatus(progressData);
if (!bSucceededJob)
{
PMUtil::SetCurrentTime(szErrorString);
szErrorString.AppendFormat(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> Comment<6E><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>"));
progressData.m_ErrorList.AddTail(szErrorString);
}
else
{
// SFX<46><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CFile sfxFile, zipFile, resultFile;
PMUtil::SetCurrentTime(szErrorString);
if (!sfxFile.Open(lpWorkerData->m_szMPSFXFile,
CFile::modeRead | CFile::shareDenyWrite | CFile::typeBinary))
{
szErrorString.AppendFormat(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : SFX<46><58><EFBFBD><EFBFBD> %s<><73> <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>"),
lpWorkerData->m_szMPSFXFile);
}
else if(!zipFile.Open(szZipFileName,
CFile::modeRead | CFile::shareDenyWrite | CFile::typeBinary))
{
szErrorString.AppendFormat(
_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : ZIP<49><50><EFBFBD><EFBFBD> %s<><73> <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>"), szZipFileName);
}
else if(!resultFile.Open(szSFXFileName,
CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite | CFile::typeBinary))
{
szErrorString.AppendFormat(
_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD> %s<><73> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>"), szSFXFileName);
}
else
{
const int MAX_FILE_BUFFER = 8192;
char szTempBuffer[MAX_FILE_BUFFER];
UINT nReadBytes = 0;
UINT nCount = 0;
progressData.m_dwTotalFileSize =
sfxFile.GetLength() + zipFile.GetLength();
progressData.m_dwCurrentFileSize = 0;
lpPage->UpdateManualPatchStatus(progressData);
// <20><><EFBFBD>α׸<CEB1><D7B8><EFBFBD> <20>ٸ<EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20>ش<EFBFBD>.
Sleep(300);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD>Ͽ<EFBFBD> SFX<46><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
while(0 < (nReadBytes = sfxFile.Read(szTempBuffer, MAX_FILE_BUFFER)))
{
resultFile.Write(szTempBuffer, nReadBytes);
progressData.m_dwCurrentFileSize += nReadBytes;
if (0 == (++nCount % 10)) { lpPage->UpdateManualPatchStatus(progressData); }
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD>Ͽ<EFBFBD> ZIP<49><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
while(0 < (nReadBytes = zipFile.Read(szTempBuffer, MAX_FILE_BUFFER)))
{
resultFile.Write(szTempBuffer, nReadBytes);
progressData.m_dwCurrentFileSize += nReadBytes;
if (0 == (++nCount % 10)) { lpPage->UpdateManualPatchStatus(progressData); }
}
szErrorString.Empty();
}
if (!szErrorString.IsEmpty())
{
progressData.m_ErrorList.AddTail(szErrorString);
lpPage->UpdateManualPatchStatus(progressData);
}
}
PMUtil::SetCurrentTime(szErrorString);
szErrorString.AppendFormat(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>۾<EFBFBD> <20>Ϸ<EFBFBD> : %d <20><> <20><><EFBFBD><EFBFBD> <20><> %d<><64><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>۾<EFBFBD><DBBE><EFBFBD> %s<>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>"),
progressData.m_nTotalFiles, progressData.m_nAddedFiles,
bSucceededJob && progressData.m_nTotalFiles == progressData.m_nAddedFiles ? _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>") : _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
progressData.m_ProgressList.AddTail(szErrorString);
progressData.m_TotalProgressList.AddTail(szErrorString);
}
}
CATCH_ALL(e)
{
e->GetErrorMessage(szErrorMsg, MAX_ERROR_LEN - 1);
szErrorMsg[MAX_ERROR_LEN - 1] = 0;
PMUtil::SetCurrentTime(szErrorString);
if (e->IsKindOf(RUNTIME_CLASS(CZipException)))
{
szErrorString.AppendFormat(
_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : CZipArchive <20><><EFBFBD>̺귯<CCBA><EAB7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>߽<EFBFBD><DFBD>ϴ<EFBFBD>. %s"), szErrorMsg);
}
else if (e->IsKindOf(RUNTIME_CLASS(CFileException)))
{
szErrorString.AppendFormat(
_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>߽<EFBFBD><DFBD>ϴ<EFBFBD>. %s"), szErrorMsg);
}
else
{
szErrorString.AppendFormat(
_T("<EFBFBD>۾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><> <20><> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>߽<EFBFBD><DFBD>ϴ<EFBFBD>. %s"), szErrorMsg);
}
progressData.m_ErrorList.AddTail(szErrorString);
progressData.m_TotalProgressList.AddTail(szErrorString);
e->Delete();
}
END_CATCH_ALL
}
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
lpPage->UpdateManualPatchStatus(progressData);
delete lpWorkerData;
return 0;
}
void CManualPatchPage::OnBnClickedMpCreate()
{
// TODO: <20><><EFBFBD><20><>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
UpdateData(TRUE);
CFile file;
if (0 == m_szMPFileName.GetLength() ||
!file.Open(m_szMPFileName, CFile::modeCreate))
{
MessageBox(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>ų<EFBFBD>, <20>ùٸ<C3B9> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ƴմϴ<D5B4>. <20>ٽ<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>"),
_T("<EFBFBD>ùٸ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>"), MB_OK | MB_ICONERROR);
}
else
{
file.Close();
DeleteFile(m_szMPFileName);
if (!theApp.IsManualPatchOperate())
{
MPWorkerData* lpWorkerData = new MPWorkerData;
if (lpWorkerData)
{
lpWorkerData->m_lpPage = this;
lpWorkerData->m_szMPFolder.SetString(m_szMPFolder);
lpWorkerData->m_szMPSFXFile.SetString(m_szMPSFXFile);
lpWorkerData->m_szMPFileName.SetString(m_szMPFileName);
lpWorkerData->m_szPatchType.SetString(m_szPatchType);
lpWorkerData->m_dwMPMaxver = m_dwMPMaxver;
lpWorkerData->m_dwMPMinver = m_dwMPMinver;
InitMPWorkerData();
unsigned int nThreadID = 0;
m_hManualPatchThread = reinterpret_cast<HANDLE>(
_beginthreadex(0, 0, ManualPatchWorker, lpWorkerData, 0, &nThreadID));
if (0 == m_hManualPatchThread)
{
MessageBox(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"),
_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"), MB_OK | MB_ICONERROR);
}
else
{
static UINT nManualPatchDlgItems[] =
{
ID_MP_CREATE,
IDC_ED_MP_PATCH_FILE_NAME,
IDC_BTN_MP_SELECT_FILE
};
PMUtil::EnableDlgItems(*this, nManualPatchDlgItems,
sizeof(nManualPatchDlgItems)/sizeof(UINT), false);
CWnd* lpWnd = GetDlgItem(ID_MP_CANCEL);
if (lpWnd) { lpWnd->EnableWindow(TRUE); }
// <20><><EFBFBD>α׸<CEB1><D7B8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SetTimer(PMConst::MP_PROGRESS_TIMER_ID,
PMConst::PROGRESS_TIMER_UPDATE_TIME, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>ִٰ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
theApp.SetManualPatchOperate(true);
}
}
}
}
}
void CManualPatchPage::OnBnClickedMpCancel()
{
// TODO: <20><><EFBFBD><20><>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
if (theApp.IsManualPatchOperate())
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>۵<EFBFBD><DBB5>ϰ<EFBFBD> <20>ִٸ<D6B4>, <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
StopWorker();
}
}
void CManualPatchPage::OnBnClickedBtnMpSelectFile()
{
// TODO: <20><><EFBFBD><20><>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
PMUtil::BrowseForNewFile(GetSafeHwnd(),
_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>"),
_T("Manual Patch File\0*.exe"), _T("exe"), m_szMPFileName);
UpdateData(FALSE);
}
BOOL CManualPatchPage::OnSetActive()
{
// TODO: <20><><EFBFBD>⿡ Ư<><C6AF>ȭ<EFBFBD><C8AD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>ɴϴ<C9B4>.
if (!theApp.IsManualPatchOperate())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
m_pmSettingOption.GetSettingData(PMConst::PatchType, m_szPatchType);
m_pmSettingOption.GetSettingData(PMConst::MP_Folder, m_szMPFolder);
m_pmSettingOption.GetSettingData(PMConst::MP_SFXFile, m_szMPSFXFile);
CString szValue;
m_pmSettingOption.GetSettingData(PMConst::MP_MinVer, szValue);
m_dwMPMinver = atol(szValue);
UpdateData(FALSE);
}
return CPropertyPage::OnSetActive();
}
BOOL CManualPatchPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: <20><><EFBFBD><20>߰<EFBFBD> <20>ʱ<EFBFBD>ȭ <20>۾<EFBFBD><DBBE><EFBFBD> <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
// Cancel<65><6C>ư<EFBFBD><C6B0> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Disable<6C>Ѵ<EFBFBD>.
CWnd* lpWnd = GetDlgItem(ID_MP_CANCEL);
if (lpWnd) { lpWnd->EnableWindow(FALSE); }
m_edProgressLog.SetLimitText(UINT_MAX);
m_edErrLog.SetLimitText(UINT_MAX);
return TRUE; // return TRUE unless you set the focus to a control
// <20><><EFBFBD><EFBFBD>: OCX <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE<53><45> <20><>ȯ<EFBFBD>ؾ<EFBFBD> <20>մϴ<D5B4>.
}
afx_msg void CManualPatchPage::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == PMConst::MP_PROGRESS_TIMER_ID)
{
int nLowerRange = 0;
int nUpperRange = 0;
int nCurrentPos = m_TotalProgressBar.GetPos();
m_TotalProgressBar.GetRange(nLowerRange, nUpperRange);
//! MANUAL_PATCH_LOCK
m_ProgressLock.Lock();
if (m_ProgressData.m_dwTotalFileSize != nUpperRange)
{
// <20><>ü Range<67><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD> - 2.1<EFBFBD><20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>;;
m_TotalProgressBar.SetRange32(0,
static_cast<int>(m_ProgressData.m_dwTotalFileSize));
}
if (m_ProgressData.m_dwCurrentFileSize != nCurrentPos)
{
// <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_TotalProgressBar.SetPos(
static_cast<int>(m_ProgressData.m_dwCurrentFileSize));
}
m_szFileProgress.Format(_T("%d/%d"),
m_ProgressData.m_nAddedFiles, m_ProgressData.m_nTotalFiles);
// <20>α׸<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
POSITION pos = m_ProgressData.m_ProgressList.GetHeadPosition();
while(0 != pos) { m_edProgressLog.AddLine(m_ProgressData.m_ProgressList.GetNext(pos)); }
pos = m_ProgressData.m_TotalProgressList.GetHeadPosition();
while(0 != pos) { theApp.AddTotalProgressLog(m_ProgressData.m_TotalProgressList.GetNext(pos)); }
pos = m_ProgressData.m_ErrorList.GetHeadPosition();
while(0 != pos) { m_edErrLog.AddLine(m_ProgressData.m_ErrorList.GetNext(pos)); }
m_ProgressData.m_ProgressList.RemoveAll();
m_ProgressData.m_TotalProgressList.RemoveAll();
m_ProgressData.m_ErrorList.RemoveAll();
//! MANUAL_PATCH_UNLOCK
m_ProgressLock.Unlock();
UpdateData(FALSE);
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hManualPatchThread, 0))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>. Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>ɼ<EFBFBD><C9BC><EFBFBD> Enable<6C>Ѵ<EFBFBD>.
StopWorker();
}
}
}
void CManualPatchPage::InitMPWorkerData()
{
m_hManualPatchThread = 0;
m_ProgressData.m_bStopWorkerThread = FALSE;
m_ProgressData.m_nTotalFiles = 0;
m_ProgressData.m_nAddedFiles = 0;
m_ProgressData.m_ProgressList.RemoveAll();
m_ProgressData.m_ErrorList.RemoveAll();
}
void CManualPatchPage::StopWorker()
{
if (0 != m_hManualPatchThread)
{
m_ProgressLock.Lock(); //! MANUAL_PATCH_LOCK
m_ProgressData.m_bStopWorkerThread = TRUE;
m_ProgressLock.Unlock(); //! MANUAL_PATCH_UNLOCK
WaitForSingleObject(m_hManualPatchThread, INFINITE);
CloseHandle(m_hManualPatchThread);
KillTimer(PMConst::MP_PROGRESS_TIMER_ID);
InitMPWorkerData();
static UINT nManualPatchDlgItems[] =
{
ID_MP_CREATE,
IDC_ED_MP_PATCH_FILE_NAME,
IDC_BTN_MP_SELECT_FILE
};
PMUtil::EnableDlgItems(*this, nManualPatchDlgItems,
sizeof(nManualPatchDlgItems)/sizeof(UINT), true);
CWnd* lpWnd = GetDlgItem(ID_MP_CANCEL);
if (lpWnd) { lpWnd->EnableWindow(FALSE); }
theApp.SetManualPatchOperate(false);
}
}
void CManualPatchPage::OnClose()
{
// TODO: <20><><EFBFBD><20>޽<EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
StopWorker();
CPropertyPage::OnClose();
}
void CManualPatchPage::OnBnClickedClearLog()
{
// TODO: <20><><EFBFBD><20><>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
m_edProgressLog.SetWindowText(_T(""));
m_edErrLog.SetWindowText(_T(""));
}