/********************************************************************** *< FILE: patchmaker.h DESCRIPTION: CREATED BY: Kwak CJ HISTORY: Created 08/11/19 *> Copyright (c) 2008, All Rights Reserved. **********************************************************************/ #ifndef __PATCHMAKER_H__ #define __PATCHMAKER_H__ #ifndef WINVER #define WINVER 0x0500 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0500 #endif #pragma once #define WM_PATCH_MSG WM_USER+0x10 enum ePatchMaker_ERROR { ePM_COMPLETE, ePM_ERROR, ePM_ERROR_XCOPY, ePM_ERROR_STRLOWER, ePM_ERROR_MAKE_PATH, ePM_ERROR_WRITE_PATCHLIST, ePM_ERROR_NO_SOURCE, ePM_ERROR_NO_WORKER, ePM_ERROR_NO_TARGET, ePM_ERROR_NO_BACKUP, }; #include // À©µµ¿ìÁî Çì´õ #include #include "resource.h" #include #include #include #include #define SafeDelete(P) { if (P!=NULL) { delete(P); (P)=NULL; } } // ¸Þ¸ð¸®¸¦ ¾ÈÀüÇÏ°Ô ÇØÁ¦. const char* const ZIP_PASSWORD = "#7qlcRkfanwlrodldi#"; const char* const CHANGED_FILES_DIRECTORY_NAME = "changed files"; const char* const SKIP_MAKE_SUB_DIRECTORY[] = { "script" }; //const char* const PACK_DIRECTORY[] = { "script\\direct", "script\\interface", "script\\language", "script\\resource" }; const char* const PACK_DIRECTORY[] = { "script\\direct", "script\\interface", "script\\resource" }; const char* const LOG_DIRECTORY_NAME = "LOG-PatchMaker"; enum eSkipDirectory { eSKIP_FOLDER_SCRIPT = 0, eSKIP_FOLDER_MAX_COUNT, }; /// pack ÆÄÀÏ ÀÚü·Î ±¸¼ºµÇ¾î ÀÖ´Â °æ·Îµé enum ePackDirectory { eFOLDER_SCRIPT_DIRECT = 0, eFOLDER_SCRIPT_INTERFACE, // eFOLDER_SCRIPT_LANGUAGE, eFOLDER_SCRIPT_RESOURCE, ePACK_SCRIPT_FOLDER_MAX_COUNT = eFOLDER_SCRIPT_RESOURCE+1, }; struct Packfile { char directory[ 1024 ]; // µð·ºÅ丮 }; struct Patchfile { char fileName[ 1024 ]; // ÆÄÀÏÀ̸§ DWORD sizeHigh; // ÆÄÀÏÅ©±â DWORD sizeLow; // ÆÄÀÏÅ©±â FILETIME writeTime; // ÆÄÀϳ¯Â¥ }; struct sFileInfo { std::string fullPath; // Àý´ë °æ·Î std::string filename; // »ó´ë °æ·Î }; class Patchmaker { private: HWND m_wnd; TCHAR* m_windowName; bool m_endApp; char m_currentDirectory[ MAX_PATH ]; char m_sourceDirectory[ 1024 ]; char m_targetDirectory[ 1024 ]; char m_workerDirectory[ 1024 ]; char m_backupDirectory[ 1024 ]; // »õ·Î ÆÐÄ¡ µÇ¸é¼­ µ¤¾î¾º¿ì±â µÉ ±âÁ¸ÀÇ ÆÄÀÏÀ» ¹é¾÷½Ãų Æú´õ. tagetÆú´õ ¾È¿¡ »ý¼ºÇÑ´Ù. char m_sourceListDirectory[ 1024 ]; long m_VersionCount; bool m_isUseBackupDirectory; // checkbox option1 bool m_isUseSourceList; /// source file list °ü·Ã ¸Ê typedef std::pair Packfile_Pair; std::hash_map m_SourcePackList; typedef std::pair Patchfile_Pair; std::hash_map m_SourcePatchList; /// patch file list °ü·Ã ¼Â std::set m_PatchFolderList; std::set m_PatchFileList; /// ÆÄÀÏ °Ë»ö¿ë typedef std::vector< sFileInfo > CollectFile_Info; CollectFile_Info m_CollectFileInfo; HANDLE m_workerThread; void EventWrite ( LPCTSTR format, ... ); bool GetFileTimeUTC ( char* filename, SYSTEMTIME* utc ); bool SetFileTimeUTC ( char* filename, SYSTEMTIME* utc ); void FileTimeToUTC ( FILETIME* filetime ); void FileTimeToDOS ( FILETIME* filetime ); long FileTimeCompareToList( char* fileName, int* error ); bool Pack ( char* source, char* target, SYSTEMTIME* utc=NULL, bool bReverseWrite = true ); bool Unpack ( char* source, char* target, SYSTEMTIME* utc=NULL ); bool StartPatch ( ); int Xcopy ( char* sub ); int MakePatchList (); /// ÆÐÄ¡ÇÒ ÆÄÀÏµé ¸ñ·Ï int MakeSourceList (); /// ¼Ò½º µð·ºÅ丮 ¾È¿¡ ÀÖ´Â ÆÄÀÏµé ¸ñ·Ï bool CreateTodayBackupDirectory(); public: Patchmaker(void); int Run ( HWND wnd ); HWND GetHwnd ( ) { return m_wnd; } TCHAR* GetWindowName ( ) { return m_windowName; } bool SetDirectory ( char* worker, char* source, char* target, char* backup, char* sourceList ); BOOL SetStatus ( HWND wnd, char* msg ); DWORD Progress ( DWORD length, DWORD offset ); DWORD WorkerThread ( ); void ErrorPrint(char *msg); bool MakePath ( char* path ); /// ÇØ´ç °æ·Î¿¡ ÇØ´çÇÏ´Â Æú´õ¸¦ ¸ðµÎ ¸¸µç´Ù. LRESULT PatchMsg ( HWND wnd, WPARAM wParam, LPARAM lParam ); void Destroy ( ); bool ReadSourceList ( char* buffer ); int CollectListInfo ( char* root, char* sub ); void SetUseBackupDirectoryFlag( bool flag ){ m_isUseBackupDirectory = flag; } void SetUseSourceListFlag( bool flag ){ m_isUseSourceList = flag; } void ClearList (); bool DeleteSubFiles ( char* root, char* sub ); // ÇØ´ç °æ·Î ¾È¿¡ ÀÖ´Â ÆÄÀϰú ¼­ºê Æú´õµéÀ» Áö¿ò.(¡ØÁÖÀÇ: ÇØ´ç °æ·Î´Â Áö¿ìÁö ¾ÊÀ½) int CollectFileInfo ( char* root, const char* sub ); // ÇØ´ç °æ·Î ¾È¿¡ ÀÖ´Â ÆÄÀÏ Á¤º¸¸¦ m_searchFileInfo¿¡ »ðÀÔ. public: virtual ~Patchmaker(void); }; #endif // __PATCHMAKER_H__