DragonNest/Client/DnLauncher/DnPatchThread.h

287 lines
9.7 KiB
C
Raw Normal View History

2024-12-19 09:48:26 +08:00
#pragma once
#include "EtFileSystem.h"
#include "HTTPClient.h"
// DnLauncher Download Patch Thread
#ifdef _USE_RTPATCH
#define MAX_MESSAGES 10
#endif // _USE_RTPATCH
// CThread Class
class CThread
{
public:
CThread();
virtual ~CThread();
BOOL Start();
BOOL Terminate( DWORD nExitCode );
void SetThreadName( DWORD dwThreadID, const char* szThreadName );
BOOL WaitForTerminate( DWORD nTimeout = INFINITE );
HANDLE const GetThreadHandle() { return m_hHandleThread; }
protected:
virtual void Run() = 0;
HANDLE m_hHandleThread;
DWORD m_nThreadID;
BOOL m_bThreadLoop;
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // must be 0x1000
LPCSTR szName; // pointer to name (in user addr space)
DWORD dwThreadID; // thread ID (-1=caller thread)
DWORD dwFlags; // reserved for future use, must be zero
} THREADNAME_INFO;
private:
static DWORD WINAPI _Runner( LPVOID pParam );
};
// CDnPatchDownloadThread Class
enum PatchReturn
{
PR_FAIL = 0,
PR_OK,
PR_LAUNCHER_PATCH,
PR_FULLPATCH,
PR_TERMINATE,
};
enum FirstPatchReturn
{
FPR_FAIL = 0 ,
FPR_OK ,
FPR_LAUNCHER_PATCH,
FPR_NEED_FULLPATCH,
FPR_MAX
};
#define WM_STATUS_MSG WM_APP+101 // <20><>ġ <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD>
enum DownloadPatchState
{
PATCH_NONE = 0,
PATCH_CHECK_VERSION, // <20><><EFBFBD><EFBFBD> üũ
PATCH_CHECK_VERSION_FAILED, // <20><><EFBFBD><EFBFBD> üũ <20><><EFBFBD><EFBFBD>
PATCH_DOWNLOAD_DATA, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD>
PATCH_DOWNLOAD_DATA_FAILED, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD><EFBFBD>
PATCH_MD5_CHECK, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD>
PATCH_MD5_CHECK_FAILED, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD>
PATCH_APPLY_PAK_FILE, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ
PATCH_APPLY_PAK_FILE_FAILED, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>
PATCH_APPLY_PAK_FILE_END, // <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20>Ϸ<EFBFBD>
PATCH_COMPLETE, // <20><>ġ <20>Ϸ<EFBFBD>
PATCH_LAUNCHER, // <20><>ó <20><>ġ
PATCH_FAILED, // <20><>ġ <20><><EFBFBD><EFBFBD>
PATCH_TERMINATE // <20><>ġ <20><><EFBFBD><EFBFBD>
};
struct stDownloadInfoUpdateData
{
CString m_strFileName;
__int64 m_nFileSize;
__int64 m_nDownloadProgressMin;
__int64 m_nDownloadProgressMax;
int m_nCurrentFileCount;
int m_nTotalFileCount;
float m_fDownloadRate;
stDownloadInfoUpdateData() : m_nFileSize( 0 ), m_nDownloadProgressMin( 0 ), m_nDownloadProgressMax( 0 ),
m_nCurrentFileCount( 0 ), m_nTotalFileCount( 0 ), m_fDownloadRate( 0.0f ) {}
};
enum FileCheck{ FILE_FALSE = 0, FIlE_OK, FIlE_EXIST };
#ifdef _USE_SPLIT_COMPRESS_FILE
struct RARHeaderData
{
char ArcName[260];
char FileName[260];
unsigned int Flags;
unsigned int PackSize;
unsigned int UnpSize;
unsigned int HostOS;
unsigned int FileCRC;
unsigned int FileTime;
unsigned int UnpVer;
unsigned int Method;
unsigned int FileAttr;
char *CmtBuf;
unsigned int CmtBufSize;
unsigned int CmtSize;
unsigned int CmtState;
};
struct RAROpenArchiveDataEx
{
char *ArcName;
wchar_t *ArcNameW;
unsigned int OpenMode;
unsigned int OpenResult;
char *CmtBuf;
unsigned int CmtBufSize;
unsigned int CmtSize;
unsigned int CmtState;
unsigned int Flags;
unsigned int Reserved[32];
};
#endif // _USE_SPLIT_COMPRESS_FILE
class CDnFistPatchDownloadThread : public CPatchCallback, public CThread
{
public:
CDnFistPatchDownloadThread();
virtual ~CDnFistPatchDownloadThread();
virtual void Run();
void SetWindowHandle( HWND hWnd ){ m_hWnd = hWnd; }
void TerminateThread() { m_bTerminateThread = true; }
BOOL IsThreadEnd() { return m_bTerminateThread; }
FirstPatchReturn BegineModulePatch(); // FirstPatch( <20><><EFBFBD><EFBFBD> & <20><>ó <20><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD>.
int ParsingModuleList(); // <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ľ<EFBFBD>.
int ChangeModuleFiles(int nVer); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
BOOL DownLoadModulePatch( int nVersion ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD>.
BOOL PatchLauncherFiles( int nVersion ); // <20><>ó <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> & <20><><EFBFBD><EFBFBD>.
BOOL ProcessFullVersionPatch(); // Ǯ <20><><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
void ProcessRebootLauncher(); // <20><>ó <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>.
BOOL SaveModuleVersionToPak( int nVersion ); // Pak<61><6B><EFBFBD>Ͽ<EFBFBD> Version.cfg <20><><EFBFBD><EFBFBD>.
BOOL SaveModuleVersionFile( CString& szFilePath, int nVersion ); // Version.cfg <20><><EFBFBD><EFBFBD>.
BOOL SaveModuleVersionFileWithOutPakSave( CString& szFilePath, int nVersion );
void CloseThread();
private:
HWND m_hWnd; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
BOOL m_bTerminateThread; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
CString m_strFirstPatchURLPath; // PatchURL/FirstPatch/ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
CString m_strPatchListFile; // Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><>ġ <20><><EFBFBD><EFBFBD>
std::vector<std::string> m_vecCopyList; // ī<><C4AB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
std::vector<std::string> m_vecDeleteList; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
};
class CDnPatchDownloadThread : public CPatchCallback, public CThread
{
public:
CDnPatchDownloadThread();
virtual ~CDnPatchDownloadThread();
void SetWindowHandle( HWND hWnd ) { m_hWnd = hWnd; }
virtual void Run();
void TerminateThread() { m_bTerminateThread = true; }
private:
PatchReturn BeginPatch(); // <20><>ġ <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
// Download
BOOL DownLoadPatch( int nVersion ); // <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
#ifdef _USE_SPLIT_COMPRESS_FILE
HRESULT URLDownload( LPCTSTR strPatchFileUrl, LPCTSTR strFilePath, LPCTSTR strFileName,
BOOL bSplitDownload = FALSE, DWORD dwAlreadyDownloadSize = 0, DWORD dwRemainDownloadFileSize = 0 ); // <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD><CCBE>ޱ<EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
FileCheck CheckPatchFile( HINTERNET hInternetSession, LPCTSTR strFileName,
CFile& file, DWORD& dwDownloadFileSize, BOOL bSplitDownload = FALSE ); // <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
#else // _USE_SPLIT_COMPRESS_FILE
HRESULT URLDownload( LPCTSTR strPatchFileUrl, LPCTSTR strFilePath, LPCTSTR strFileName ); // <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD><CCBE>ޱ<EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
FileCheck CheckPatchFile( HINTERNET hInternetSession, LPCTSTR strFileName,
CFile& file, DWORD& dwDownloadFileSize ); // <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
#endif // _USE_SPLIT_COMPRESS_FILE
DWORD GetDownloadFileSize( HINTERNET hInternetSession, CString strHttpPath ); // <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD> <20>Լ<EFBFBD>
BOOL GetMD5Checksum(); // <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD> (MD5)
// Apply Packing File
PatchReturn PreApplyPakPatch(); // Pak<61><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>غ<EFBFBD><D8BA>۾<EFBFBD> (<28><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>, <20><>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
PatchReturn ApplyPakPatch(); // Pak<61><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
PatchReturn ApplyDeleteList( CEtPackingFile& PatchSource ); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Pak<61><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
PatchReturn ApplyPatchList( CEtPackingFile& PatchSource ); // <20><>ġ <20><><EFBFBD><EFBFBD>Ʈ Pak<61><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
PatchReturn ApplyCopyList( CEtPackingFile& PatchSource ); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Pak<61><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
PatchReturn GetPackingFile(); // <20><><EFBFBD>ҽ<EFBFBD> <20><>ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL LoadPatchList(); // <20><>ġ <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>о<EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
PatchReturn PatchFileExist( int nPatchFileCount, CEtPackingFile& PatchSource, SPackingFileInfo* pFileInfo, BOOL& bPatch );
PatchReturn PatchFileSuitableSpace( CEtPackingFile& PatchSource, SPackingFileInfo* pFileInfo, BOOL& bPatch );
void PatchFileReserve( int nPatchFileCount, SPackingFileInfo* pFileInfo );
void SendStatusMsg( DownloadPatchState nID ); // <20><><EFBFBD>̾<EFBFBD><CCBE>α׷<CEB1> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
BOOL ProcessFullVersionPatch(); // Ǯ <20><><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
BOOL SaveVersionFile( CString& szFilePath, int nVersion ); // <20><>ġ <20>Ϸ<EFBFBD> <20><> Version.cfg <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
BOOL SaveNewVersionToPak( int nVersion ); // Version.cfg<66><67><EFBFBD><EFBFBD> Pak<61><6B><EFBFBD><EFBFBD> <20>ȿ<EFBFBD> <20>ֱ<EFBFBD>
void RecordFileExceptionLog( CFileException& e );
#ifdef _USE_RTPATCH
BOOL ExportFile( CEtPackingFile& PakFile, const char* pExportFileName, const char* pCreateFilePath ); // pak<61><6B><EFBFBD>ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϱ<EFBFBD>
PatchReturn ApplyRTPatch( CEtPackingFile& PatchSource, CEtPackingFile& RTPatchSource ); // <20><><EFBFBD><EFBFBD> pak<61><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTPatch<63><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pak<61><6B><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static LPVOID CALLBACK EXPORT RTPatchCALLBACK( UINT Id, LPVOID Param );
#endif // _USE_RTPATCH
#ifdef _FIRST_PATCH
BOOL CheckExistFirstPatch( int nVersion );
#endif // _FIRST_PATCH
#ifdef _USE_SPLIT_COMPRESS_FILE
HRESULT DownLoadSplitFile( CString strUrl, int nVersion );
DWORD GetSplitFileSizeList( CString strUrl, int nVersion, int nSplitCount, int nSplitCountCipher, std::vector<DWORD>& vecSplitFileSizeList );
int LoadSplitCount( CString& szFilePath );
HRESULT UnRARArchive( CString strPath, CString strRARFile );
#endif // _USE_SPLIT_COMPRESS_FILE
private:
HINTERNET m_hHttpConnection; // Http Connection Handle
DWORD m_dwTempFileLength; // <20>ٿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
DWORD m_dwDownloadFileLength; // <20>ٿ<EFBFBD> <20>޾ƾ<DEBE><C6BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
DWORD m_dwTotalFileLength; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
DWORD m_dwTotalBytes; // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
CString m_strPatchFileUrl; // Http <20><>ġ <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD>
CString m_strPatchFileLocal; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ (<28>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> .tmp -> .pak)
CString m_strPatchFile; // <20><>ġ <20><><EFBFBD><EFBFBD> (pak<61><6B><EFBFBD><EFBFBD>)
CString m_strPatchListFile; // <20><>ġ <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
float m_fRate; // Download Rate
float m_fPercent; // Download Percent
DownloadPatchState m_emDownPatchState; // <20><><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HWND m_hWnd; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
BOOL m_bTerminateThread; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
std::vector<CEtPackingFile*> m_vecPackingFile; // <20><>ŷ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
std::vector<std::string> m_vecDeleteList; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
std::vector<std::string> m_vecPatchList; // <20><>ġ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
std::vector<std::string> m_vecCopyList; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
struct stFileIndexSet
{
DWORD m_dwPakFileNum;
DWORD m_dwPatchFileIndex;
DWORD m_dwReserveFileIndex;
};
std::vector<stFileIndexSet> m_vecReserveIndex; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
int m_nCurPatchCount; // <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> (<28><><EFBFBD><EFBFBD> <20><>ŷ <20><> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
int m_nTotalPatchCount; // <20><> <20><>ġ<EFBFBD><C4A1> (<28><><EFBFBD><EFBFBD> <20><>ŷ <20><> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
#ifdef _USE_RTPATCH
std::string m_strRTPatchTempFolder; // RTPatch <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>
#endif // _USE_RTPATCH
#ifdef _USE_SPLIT_COMPRESS_FILE
HINSTANCE hUnrarDLL; // UnrarDLL <20><><EFBFBD><EFBFBD>
HANDLE (WINAPI *OpenArchiveEx)( RAROpenArchiveDataEx* pArchiveData );
int (WINAPI *CloseArchive)( HANDLE hArcData );
int (WINAPI *ReadRARHeader)( HANDLE hArcData, RARHeaderData *pHeaderData );
int (WINAPI *ProcessRARFile)( HANDLE hArcData, int iOperation, char* strDestFolder, char* strDestName );
#endif // _USE_SPLIT_COMPRESS_FILE
};