#pragma once #include "EtFileSystem.h" #include "HTTPClient.h" #ifdef _USE_BITTORRENT #include "WLibTorrent.h" #endif // _USE_BITTORRENT // 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 // ÆÐÄ¡ »óÅ ¸Þ¼¼Áö enum DownloadPatchState { PATCH_NONE = 0, PATCH_CHECK_VERSION, // ¹öÀü üũ PATCH_CHECK_VERSION_FAILED, // ¹öÀü üũ ½ÇÆÐ PATCH_DOWNLOAD_DATA, // ÆÐÄ¡ µ¥ÀÌÅÍ ´Ù¿î·Îµå PATCH_DOWNLOAD_DATA_FAILED, // ÆÐÄ¡ µ¥ÀÌÅÍ ´Ù¿î·Îµå ½ÇÆÐ PATCH_MD5_CHECK, // ÆÐÄ¡ µ¥ÀÌÅÍ À¯È¿¼º °Ë»ç PATCH_MD5_CHECK_FAILED, // ÆÐÄ¡ µ¥ÀÌÅÍ À¯È¿¼º °Ë»ç ½ÇÆÐ PATCH_APPLY_PAK_FILE, // ÆÐÄ¡ µ¥ÀÌÅÍ ¼³Ä¡ PATCH_APPLY_PAK_FILE_FAILED, // ÆÐÄ¡ µ¥ÀÌÅÍ ¼³Ä¡ ½ÇÆÐ PATCH_APPLY_PAK_FILE_END, // ÆÐÄ¡ µ¥ÀÌÅÍ ¼³Ä¡ ¿Ï·á PATCH_COMPLETE, // ÆÐÄ¡ ¿Ï·á PATCH_LAUNCHER, // ·±Ã³ ÆÐÄ¡ PATCH_FAILED, // ÆÐÄ¡ ½ÇÆÐ PATCH_TERMINATE // ÆÐÄ¡ Ãë¼Ò }; struct stDownloadInfoUpdateData { CString m_strFileName; __int64 m_nFileSize; __int64 m_nDownloadProgressMin; __int64 m_nDownloadProgressMax; int m_nCurrentFileCount; int m_nTotalFileCount; float m_fDownloadRate; #ifdef _USE_BITTORRENT libtorrent::torrent_handle* m_pTorrentHandle; #endif // _USE_BITTORRENT stDownloadInfoUpdateData() : m_nFileSize( 0 ) , m_nDownloadProgressMin( 0 ) , m_nDownloadProgressMax( 0 ) , m_nCurrentFileCount( 0 ) , m_nTotalFileCount( 0 ) , m_fDownloadRate( 0.0f ) #ifdef _USE_BITTORRENT , m_pTorrentHandle( NULL ) #endif // _USE_BITTORRENT {} }; 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( ¸ðµâ & ·±Ã³ ÆÄÀÏ) ½ÃÀÛ. int ParsingModuleList(); // ¸ðµâ ÆÐÄ¡¿¡ ÇÊ¿äÇÑ Á¤º¸ ÆÄ½Ì. int ChangeModuleFiles(int nVer); // ¸ðµâ ÆÄÀÏ Àû¿ë. BOOL DownLoadModulePatch( int nVersion ); // ¸ðµâÆÄÀÏ ´Ù¿î·Îµå. BOOL PatchLauncherFiles( int nVersion ); // ·±Ã³ ´Ù¿î·Îµå & Àû¿ë. BOOL ProcessFullVersionPatch(); // Ç® ¹öÀü ÆÐÄ¡ ÇÁ·Î¼¼½º void ProcessRebootLauncher(); // ·±Ã³ ´Ù½Ã ½ÇÇà. BOOL SaveModuleVersionToPak( int nVersion ); // PakÆÄÀÏ¿¡ Version.cfg ÀúÀå. BOOL SaveModuleVersionFile( CString& szFilePath, int nVersion ); // Version.cfg ÀúÀå. BOOL SaveModuleVersionFileWithOutPakSave( CString& szFilePath, int nVersion ); void CloseThread(); private: HWND m_hWnd; // À©µµ¿ì ÇÚµé BOOL m_bTerminateThread; // ¾²·¹µå Á¾·á Ç÷¡±× CString m_strFirstPatchURLPath; // PatchURL/FirstPatch/ °æ·Î ÀúÀå. CString m_strPatchListFile; // Ŭ¶óÀÌ¾ðÆ® ÆÐÄ¡ °æ·Î std::vector m_vecCopyList; // Ä«ÇÇ ÆÄÀÏ ¸®½ºÆ® std::vector m_vecDeleteList; // »èÁ¦ ÆÄÀÏ ¸®½ºÆ® }; 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(); // ÆÐÄ¡ ÁøÇà ÇÔ¼ö // Download BOOL DownLoadPatch( int nVersion ); // ´Ù¿î·Îµå ÇÁ·Î¼¼½º #ifdef _USE_SPLIT_COMPRESS_FILE HRESULT URLDownload( LPCTSTR strPatchFileUrl, LPCTSTR strFilePath, LPCTSTR strFileName, BOOL bSplitDownload = FALSE, DWORD dwAlreadyDownloadSize = 0, DWORD dwRemainDownloadFileSize = 0 ); // ½ÇÁ¦ À̾î¹Þ±â ´Ù¿î·Îµå ÇÁ·Î¼¼½º FileCheck CheckPatchFile( HINTERNET hInternetSession, LPCTSTR strFileName, CFile& file, DWORD& dwDownloadFileSize, BOOL bSplitDownload = FALSE ); // ´Ù¿î·Îµå Àü¿¡ ÆÄÀÏ Ã¼Å© #else // _USE_SPLIT_COMPRESS_FILE HRESULT URLDownload( LPCTSTR strPatchFileUrl, LPCTSTR strFilePath, LPCTSTR strFileName ); // ½ÇÁ¦ À̾î¹Þ±â ´Ù¿î·Îµå ÇÁ·Î¼¼½º FileCheck CheckPatchFile( HINTERNET hInternetSession, LPCTSTR strFileName, CFile& file, DWORD& dwDownloadFileSize ); // ´Ù¿î·Îµå Àü¿¡ ÆÄÀÏ Ã¼Å© #endif // _USE_SPLIT_COMPRESS_FILE #ifdef _USE_BITTORRENT #ifdef _USE_SPLIT_COMPRESS_FILE HRESULT BitTorrentDownload( LPCTSTR strPatchFileUrl, LPCTSTR strFilePath, LPCTSTR strFileName, LPCTSTR strUrl, int nVersion ); void ExtractSplitCompressFile( int nSplitCount, LPCTSTR strUrl, int nVersion ); #else // _USE_SPLIT_COMPRESS_FILE HRESULT BitTorrentDownload( LPCTSTR strPatchFileUrl, LPCTSTR strFilePath, LPCTSTR strFileName ); #endif // _USE_SPLIT_COMPRESS_FILE #endif // _USE_BITTORRENT DWORD GetDownloadFileSize( HINTERNET hInternetSession, CString strHttpPath ); // ´Ù¿î¹ÞÀ» ÆÄÀÏÀÇ »çÀÌÁî ±¸ÇØ¿À´Â ÇÔ¼ö BOOL GetMD5Checksum(); // ´Ù¿î¹ÞÀº ÆÄÀÏÀÇ À¯È¿¼º °Ë»ç (MD5) // Apply Packing File PatchReturn PreApplyPakPatch(); // PakÆÄÀÏ Àû¿ë ÀÌÀü ÁغñÀÛ¾÷ (ÆÐÄ¡¸®½ºÆ® ¼ÂÆÃ, ÆÐÅ·ÆÄÀÏ ¾ò¾î¿À±â) PatchReturn ApplyPakPatch(); // PakÆÄÀÏ Àû¿ë ÇÁ·Î¼¼½º PatchReturn ApplyDeleteList( CEtPackingFile& PatchSource ); // »èÁ¦ ¸®½ºÆ® PakÆÄÀÏ Àû¿ë PatchReturn ApplyPatchList( CEtPackingFile& PatchSource ); // ÆÐÄ¡ ¸®½ºÆ® PakÆÄÀÏ Àû¿ë PatchReturn ApplyCopyList( CEtPackingFile& PatchSource ); // º¹»ç ¸®½ºÆ® PakÆÄÀÏ Àû¿ë PatchReturn GetPackingFile(); // ¸®¼Ò½º ÆÐÅ· ÆÄÀÏÀ» ã°í Á¤º¸¸¦ °¡Á®¿È BOOL LoadPatchList(); // ÆÐÄ¡ ¸®½ºÆ®¸¦ ÀÐ¾î ÆÐÄ¡ Á¤º¸¸¦ ¼ÂÆÃ 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 ); // ´ÙÀ̾ó·Î±×·Î ´Ù¿î·Îµå»óÅ °ª Àü´Þ BOOL ProcessFullVersionPatch(); // Ç® ¹öÀü ÆÐÄ¡ ÇÁ·Î¼¼½º BOOL SaveVersionFile( CString& szFilePath, int nVersion ); // ÆÐÄ¡ ¿Ï·á ÈÄ Version.cfg ÆÄÀÏ °»½Å BOOL SaveNewVersionToPak( int nVersion ); // Version.cfgÆÄÀÏ PakÆÄÀÏ ¾È¿¡ ³Ö±â void RecordFileExceptionLog( CFileException& e ); #ifdef _USE_RTPATCH BOOL ExportFile( CEtPackingFile& PakFile, const char* pExportFileName, const char* pCreateFilePath ); // pakÆÄÀϳ» ÆÄÀÏ ÃßÃâ Çϱâ PatchReturn ApplyRTPatch( CEtPackingFile& PatchSource, CEtPackingFile& RTPatchSource ); // ±âÁ¸ pakÆÄÀÏÀ» RTPatchÀû¿ëµÈ pakÆÄÀÏ·Î ¸¸µç´Ù 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& 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; // ´Ù¿î ¹ÞÀº ÆÄÀÏÀÇ ¾ç DWORD m_dwDownloadFileLength; // ´Ù¿î ¹Þ¾Æ¾ßÇÒ ÆÄÀÏÀÇ ¾ç DWORD m_dwTotalFileLength; // ÃÑ ÆÄÀÏÀÇ ¾ç DWORD m_dwTotalBytes; // ÃÑ ¹ÞÀº ÆÄÀÏÀÇ ¾ç CString m_strPatchFileUrl; // Http ÆÐÄ¡ ÆÄÀÏ ÁÖ¼Ò CString m_strPatchFileLocal; // ·ÎÄÃÀÇ ÆÄÀÏ À§Ä¡ (´Ù¿î·Îµå ¿Ï·á½Ã .tmp -> .pak) CString m_strPatchFile; // ÆÐÄ¡ ÆÄÀÏ (pakÆÄÀÏ) CString m_strPatchListFile; // ÆÐÄ¡ ¸®½ºÆ® ÆÄÀÏ float m_fRate; // Download Rate float m_fPercent; // Download Percent DownloadPatchState m_emDownPatchState; // ÇöÀç ´Ù¿î·Îµå ÁøÇà »óÅ HWND m_hWnd; // À©µµ¿ì ÇÚµé BOOL m_bTerminateThread; // ¾²·¹µå Á¾·á Ç÷¡±× std::vector m_vecPackingFile; // ÆÐÅ· ÆÄÀÏ ¸®½ºÆ® std::vector m_vecDeleteList; // »èÁ¦ ÆÄÀÏ ¸®½ºÆ® std::vector m_vecPatchList; // ÆÐÄ¡ ÆÄÀÏ ¸®½ºÆ® std::vector m_vecCopyList; // º¹»ç ÆÄÀÏ ¸®½ºÆ® struct stFileIndexSet { DWORD m_dwPakFileNum; DWORD m_dwPatchFileIndex; DWORD m_dwReserveFileIndex; }; std::vector m_vecReserveIndex; // ¿¹¾àµÈ ÆÐÄ¡ ÆÄÀÏ À妽º int m_nCurPatchCount; // ÇöÀç ÆÐÄ¡¼ö (ÆÄÀÏ ÆÐÅ· ½Ã ÇÁ·Î±×·¡½º¹Ù Á¤º¸¿¡ »ç¿ë) int m_nTotalPatchCount; // ÃÑ ÆÐÄ¡¼ö (ÆÄÀÏ ÆÐÅ· ½Ã ÇÁ·Î±×·¡½º¹Ù Á¤º¸¿¡ »ç¿ë) #ifdef _USE_RTPATCH std::string m_strRTPatchTempFolder; // RTPatch Àӽà Æú´õ #endif // _USE_RTPATCH #ifdef _USE_SPLIT_COMPRESS_FILE HINSTANCE hUnrarDLL; // UnrarDLL Çîµé 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 };