#include ".\updatemodule.h" #include #include //PROCESSENTRY32 #include //PathIsDirectory #include "ScriptParser.h" CUpdateModule::CUpdateModule(void) { ZeroMemory( &m_UpdateInfo, sizeof(m_UpdateInfo) ); ZeroMemory( m_szBasicDownDir, MAX_PATH ); //·ÎÄÿ¡ ´Ù¿î·ÎµåÇÒ ±âº» °æ·Î. m_bUpdateStart = TRUE; m_fnMsgCallback = NULL; } CUpdateModule::~CUpdateModule(void) { } BOOL CUpdateModule::ConnectFTP( TCHAR* pszIP, int nPort, TCHAR* pszID, TCHAR* pszPass ) { DWORD ErrorCode = 0; return m_FtpNetwork.Connect( pszIP, nPort, pszID, pszPass, ErrorCode ); } VOID CUpdateModule::DisconnectFTP() { if( m_FtpNetwork.IsConnectFTP() == TRUE ) m_FtpNetwork.DisConnect(); } BOOL CUpdateModule::GetFtpIP( TCHAR* pszIP, int nSize ) { if( pszIP == NULL || (strcmp( pszIP, "" ) == 0) ) return FALSE; m_FtpNetwork.GetIP( pszIP, nSize ); return TRUE; } int CUpdateModule::GetFtpPort() { return m_FtpNetwork.GetPort(); } HANDLE CUpdateModule::MakeLocalFile( const TCHAR* pszLocalFilePath) { HANDLE hLocalFile = CreateFile(pszLocalFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if( hLocalFile == INVALID_HANDLE_VALUE ) { //1. Àбâ Àü¿ë¼Ó¼ºÀÎÁö üũÇÑ´Ù. if( GetFileAttributes( pszLocalFilePath ) && FILE_ATTRIBUTE_READONLY ) { if( SetFileAttributes( pszLocalFilePath, FILE_ATTRIBUTE_NORMAL ) ) { hLocalFile = CreateFile(pszLocalFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if( hLocalFile ) return hLocalFile; } return NULL; } return NULL; } return hLocalFile; } //pszRemoteFilePath : ÆÄÀÏÀ̸§ÀÌ Æ÷ÇÔµÈ ¿ø°ÝÁö °æ·Î, ·çÆ®ºÎÅÍ ½ÃÀÛµÈ °æ·Î¿©¾ß ÇÑ´Ù. //pszLocalPath : ÆÄÀÏÀ̸§ÀÌ Æ÷ÇÔµÇÁö ¾ÊÀº ¼ø¼öÇÑ ·ÎÄà °æ·Î BOOL CUpdateModule::DownloadFile( const TCHAR* pszRemoteFilePath, TCHAR* pszLocalPath) { HANDLE hLocalFile = INVALID_HANDLE_VALUE; HINTERNET hFtpFile = NULL; //1. ¿ø°Ý¼­¹ö °æ·Î¸¦ ºÐ¼®ÇÑ´Ù. TCHAR szRemoteDir[MAX_PATH]; TCHAR szRemoteFileName[MAX_PATH]; GetSplitFilePath( pszRemoteFilePath, szRemoteDir, szRemoteFileName ); CHAR szRealLocalFilePath[MAX_PATH]; GetLocalFileName( pszLocalPath, szRemoteFileName, szRealLocalFilePath ); __try { hLocalFile = MakeLocalFile( szRealLocalFilePath ); if(hLocalFile == NULL) { AddMessage( WM_COMMAND_MESSAGE, "·ÎÄà ÆÄÀÏ »ý¼º ½ÇÆÐ" ); return FALSE; } ////////////////////////////////////////////////////////////////////////// // ¿ø°ÝÁö ÀÛ¾÷ Æú´õ ¼³Á¤ if( !SetRemoteDirectory( szRemoteDir ) ) { strncpy( m_UpdateInfo.m_szFileName, szRemoteDir, MAX_PATH ); AddMessage( WM_FTP_DIRECTORY_NOTFOUND, &m_UpdateInfo ); return FALSE; //¿ø°ÝÁö¿¡ ÇØ´ç µð·ºÅ丮°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. } ////////////////////////////////////////////////////////////////////////// // ¿ø°ÝÁö ÆÄÀÏÁ¤º¸ ¾ò±â WIN32_FIND_DATA info; if( !m_FtpNetwork.GetFileInfo( szRemoteFileName, info ) ) //ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é.. { strncpy( m_UpdateInfo.m_szFileName, szRemoteFileName, MAX_PATH ); AddMessage( WM_FTP_FILE_NOTFOUND, &m_UpdateInfo ); return FALSE; //Çϳª¶óµµ ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é ¾÷µ¥ÀÌÆ®¸¦ Ãë¼ÒÇÑ´Ù. } ////////////////////////////////////////////////////////////////////////// // 3 . ¿ø°ÝÁö ÆÄÀÏ ¿­±â hFtpFile = m_FtpNetwork.OpenFtpFile( szRemoteFileName ); if( hFtpFile == NULL ) { strncpy( m_UpdateInfo.m_szFileName, szRemoteFileName, MAX_PATH ); AddMessage( WM_FTP_FILE_OPEN_FAIL, &m_UpdateInfo ); DeleteFile( szRealLocalFilePath ); return FALSE; // ÆÄÀÏ Çϳª¸¸ ½ÇÆÐÇØµµ ´Ù¿î·Îµå¸¦ ¸ØÃã´Ù. } ////////////////////////////////////////////////////////////////////////// // 4. ¿ø°ÝÁö ÆÄÀÏ ´Ù¿î·Îµå strncpy( m_UpdateInfo.m_szFileName, info.cFileName, MAX_PATH ); AddMessage( WM_FILE_DOWNLOAD_START, &m_UpdateInfo ); if( !m_FtpNetwork.DownloadFile( hFtpFile, info, hLocalFile ) ) { // ÆÄÀÏ ¾ò±â¿¡ ½ÇÆÐÇϸé, ÇöÀç ¸¸µé¾îÁø ·ÎÄà ÆÄÀϵµ »èÁ¦ÇÑ´Ù. DeleteFile( szRealLocalFilePath ); AddMessage( WM_FILE_DOWNLOAD_FAIL, &m_UpdateInfo ); return FALSE; } //ÆÄÀÏ ´Ù¿î·Îµå ¼º°ø AddMessage( WM_FILE_DOWNLOAD_END, &m_UpdateInfo ); } __finally { if ( hFtpFile ) InternetCloseHandle( hFtpFile ); if ( hLocalFile != INVALID_HANDLE_VALUE ) CloseHandle(hLocalFile); } return TRUE; } BOOL CUpdateModule::GetSplitFilePath(const TCHAR* pszFilePath, TCHAR* pszDir, TCHAR* pszFile) { char pszFileName[MAX_PATH]; char pszFileExt[MAX_PATH]; //¿©±â¼­ ¼­¹öÆú´õ Á¶°ÇÀÌ µû¸¥´Ù. //¼­¹öÀÇ Æú´õ´Â ·çÆ®¿¡¼­ ÇÏÀ§ 1´Ü°è ±îÁö¸¸ Á¸ÀçÇÑ´Ù. _splitpath(pszFilePath, NULL, pszDir, pszFileName, pszFileExt ); if(pszDir == NULL || (strcmp(pszDir, "") == 0) ) wsprintf(pszDir, "\\"); wsprintf( pszFile, "%s%s", pszFileName, pszFileExt); return TRUE; } //¿ø°ÝÁöÀÇ ÆÄÀϸ®½ºÆ® ÆÄÀÏÀÇ °æ·Î¸¦ ±¸ÇÑ´Ù. void CUpdateModule::GetRemoteFileListPath( char* pszFilePath, int nSize, const char* pszVerFolder ) { TCHAR szCurServer[MAX_PATH]; GetProcessName( szCurServer, MAX_PATH ); if( szCurServer == NULL || strcmp( szCurServer, "" ) == 0 ) _snprintf( pszFilePath, nSize, "%s\\%s", pszVerFolder, DEFAULT_FILELIST_FILE ); else _snprintf( pszFilePath, nSize, "%s\\%s\\%s", szCurServer, pszVerFolder, DEFAULT_FILELIST_FILE ); } BOOL CUpdateModule::GetLocalFileName(const TCHAR* pszLocalPath, const TCHAR* pszRemoteFileName, TCHAR* pszLocalFilePath) { // ¿©±â¼­ ·ÎÄà ÆÄÀÏÀ̸§ÀÌ ¾ø´Ù¸é ¿ø°ÝÆÄÀÏÀ̸§°ú µ¿ÀÏÇÏ°Ô ¸¸µç´Ù. if ( (!pszLocalPath) || ( strcmp(pszLocalPath, "") == 0 ) ) wsprintf( pszLocalFilePath, ".\\%s", pszRemoteFileName ); else { // ³¡¿¡ \ ÀÌ ÀÖ´ÂÁö ¾ø´ÂÁö °Ë»çÇØ¼­ Àû¿ëÇÑ´Ù. if (pszLocalPath[strlen(pszLocalPath)-1] != '\\') wsprintf(pszLocalFilePath, "%s\\%s", pszLocalPath, pszRemoteFileName ); else wsprintf(pszLocalFilePath, "%s%s", pszLocalPath, pszRemoteFileName); } return TRUE; } //pszRemoteDirÀº ·çÆ®¿¡ .\ ÀÌ·± °ÍÀÌ ¾ÈºÙ´Â´Ù. //pszRemoteDirÀº ·çÆ®¿¡¼­ ºÎÅÍÀÇ °æ·ÎÀÌ´Ù. //·çÆ®´Â ¾Æ¹«°Íµµ ¾È ºÙ´Â´Ù. //¸¸ÀÏ .\AgentServer\\sss °æ·Î¿¡ ÀÖ´Â sss Æú´õ¸¦ ¼¼ÆÃÇÏ°í ½ÍÀ¸¸é.. //pszRemoteDirÀº AgentServer\\sss ÀÌ µÇ¾î¾ß ÇÑ´Ù. BOOL CUpdateModule::SetRemoteDirectory(const TCHAR* pszRemoteDir) { BOOL bSuccess = FALSE; //1. ·çÆ®·Î ¼³Á¤ bSuccess = m_FtpNetwork.SetDirectory( "/" ); //2. ·çÆ®·Î ºÎÅÍ µð·ºÅ丮 ¼³Á¤ bSuccess = m_FtpNetwork.SetDirectory( pszRemoteDir ); return bSuccess; } //·ÎÄà ÆÄÀϰú ¼­¹öÆÄÀÏÀ» ºñ±³ÇÏ¿© ´Ù¿î ¹ÞÀ»Áö ¾È ¹ÞÀ»Áö¸¦ °áÁ¤ÇÑ´Ù. //TRUE : ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù. //FALSE : ÆÄÀÏÀ» ´Ù¿î ¹ÞÁö ¾Ê´Â´Ù. BOOL CUpdateModule::CanFileDownload( const TCHAR* pszLocalFilePath, const WIN32_FIND_DATA& remoteFileInfo ) { ////////////////////////////////////////////////////////////////////////// // ÇöÀç ÀÌ ÆÄÀÏÀ» ´Ù¿î ¹ÞÀºÀûÀÌ ÀÖ´ÂÁö üũ.. // 1. ¼­¹öÆÄÀϰú ¶È°°Àº ·ÎÄÃÆÄÀÏÀÌ ÀÖ´ÂÁö üũ HANDLE hFile = CreateFile( pszLocalFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( hFile != INVALID_HANDLE_VALUE ) //ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù. { //1. ·ÎÄÃÆÄÀÏ Á¤º¸ Àоî¿À±â FILETIME localFileTime, remoteFileTime; GetFileTime( hFile, NULL, NULL, &localFileTime ); //2. ¿ø°ÝÁö ÆÄÀÏ ½Ã°£Á¤º¸ remoteFileTime = remoteFileInfo.ftLastWriteTime; // Á¤º¸¸¦ ´Ù ÀоúÀ¸´Ï, ÇÚµéÀ» ´Ý´Â´Ù. CloseHandle( hFile ); // µÎ ÆÄÀÏÀÇ ½Ã°£ÀÌ µ¿ÀÏÇÏÁö ¾Ê´Ù. if( ( remoteFileTime.dwHighDateTime != localFileTime.dwHighDateTime ) || ( remoteFileTime.dwLowDateTime != localFileTime.dwLowDateTime ) ) { return TRUE; } else //½Ã°£¸¶Á® µ¿ÀÏÇÏ´Ù¸é... ÆÄÀÏÀÇ Å©±â ºñ±³ { FILE* pFile = fopen( pszLocalFilePath, "r"); long nLen = _filelength( _fileno(pFile) ); fclose(pFile); return FALSE; if( nLen == remoteFileInfo.nFileSizeLow ) //ÆÄÀÏÀÇ Å©±â°¡ °°´Ù¸é.. return FALSE; //ÆÄÀÏÀ» ´Ù¿î ¹ÞÁö ¾Ê´Â´Ù. else return TRUE; } } else //ÆÄÀÏÀÌ Á¸Àç ÇÏÁö ¾ÊÀ¸¸é.. return TRUE; } //ÆÄÀÏ ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀϵéÀ» ´Ù¿î ¹Þ´Â´Ù. BOOL CUpdateModule::DownloadFilesOnFileList( TCHAR* pszRemoteDirPath ) { // ·ÎÄÿ¡ ¸®½ºÆ® ÆÄÀÏÀ» ´Ù¿î ¹Þ¾ÒÀ¸¸é, ¹Ýµå½Ã ½ÇÇàÆÄÀÏ °æ·Î¿¡ ÀÖ´Ù. µû¶ó¼­ À̸§¸¸ ½áÁØ´Ù. CScriptParser parser; TCHAR szPath[MAX_PATH]; GetModuleDirectory( szPath, MAX_PATH ); SetCurrentDirectory( szPath ); if( !parser.SetFile( DEFAULT_FILELIST_FILE ) ) { AddMessage( WM_UPDATE_ERROR ); //ÆÄÀÏ ¸®½ºÆ® ÆÄÀÏ ¿­±â ½ÇÆÐ..... return FALSE; } string strLocalRelativeDirPath; //·ÎÄà ÀúÀå µð·ºÅ丮 »ó´ë°æ·Î // ÆÄÀÏ ¸®½ºÆ®¸¦ ºÐ¼®Çؼ­, ÆÄÀÏ ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀϵéÀ» ´Ù¿î ¹Þ´Â ±¸¹®.. while( m_bUpdateStart ) { UDTToken Token = parser.GetToken(); if( Token == END ) break; if( Token == NAME ) // ÆÄÀÏÀ̸§ÀÎ °æ¿ì { // ¿ø°ÝÁö È£½ºÆ®ÀÇ Àüü°æ·ÎÀ̸§ CHAR szCurrentRemoteFilePath[MAX_PATH]; ZeroMemory( szCurrentRemoteFilePath, MAX_PATH ); _snprintf( szCurrentRemoteFilePath, MAX_PATH, "%s\\%s", pszRemoteDirPath, parser.GetTokenString() ); string strAbsoluteDirPath; GetAbsolteLocalDownDir( strLocalRelativeDirPath, strAbsoluteDirPath ); ////////////////////////////////////////////////////////////////////////// // ÇöÀç ÀÌ ÆÄÀÏÀ» ´Ù¿î ¹ÞÀºÀûÀÌ ÀÖ´ÂÁö üũ.. // 1. ¼­¹öÆÄÀϰú ¶È°°Àº ·ÎÄÃÆÄÀÏÀÌ ÀÖ´ÂÁö üũ string strLocalFilePath; strLocalFilePath = strAbsoluteDirPath; strLocalFilePath += "\\"; strLocalFilePath += parser.GetTokenString(); if ( !DownloadFile( szCurrentRemoteFilePath, const_cast(strAbsoluteDirPath.c_str()) ) ) return FALSE; } if( Token == NUMBER ) // Æú´õÀ̸§ÀÎ °æ¿ì { // 0ÀÌ¸é Æú´õ¸¦ »ý¼ºÇ϶ó´Â ¸í·ÉÀ̹ǷÎ, 0 ´ÙÀ½¿¡ ³ª¿À´Â °ªÀ» Àоî¾ß ÇÑ´Ù. // ±× °ªÀÌ Æú´õ ¸íÀÌ´Ù. Token = parser.GetToken(); //1. ±âº» ·ÎÄà °æ·Î Æú´õ°¡ ÀÖ´ÂÁö üũ. ¾øÀ¸¸é »ý¼º strLocalRelativeDirPath = "\\"; strLocalRelativeDirPath += parser.GetTokenString(); string strAbsoluteDirPath; GetAbsolteLocalDownDir( strLocalRelativeDirPath, strAbsoluteDirPath ); strAbsoluteDirPath += "\\"; MakeDirectory( (TCHAR*)strAbsoluteDirPath.c_str() ); } } if( m_bUpdateStart == FALSE ) return FALSE; return TRUE; } //»ó´ë°æ·Î·Î ºÎÅÍ ·ÎÄÃÀÇ ´Ù¿î·Îµå Àý´ë °æ·Î¸¦ ¾ò´Â´Ù. void CUpdateModule::GetAbsolteLocalDownDir( string strRelativeDir, string& strAbsolteDir ) { if( strRelativeDir.length() == 0 ) strRelativeDir = "\\"; //¸¸ÀÏ m_szBasicDownDir °¡ null ÀÌ µé¾î ÀÖÀ»¼ö ÀÖ´Ù.. µû¶ó¼­ ±×¶§´Â.. //ÇöÀç ½ÇÇàÁßÀÎ µð·ºÅ丮·Î ¼³Á¤ÇÑ´Ù. // ´Ù¿î·Îµå µð·ºÅ丮¿¡ strRelativeDir(»ó´ë°æ·Î)¸¦ µ¡ºÙ¿©¼­ ÀúÀå½Ãų ÇöÀç ·ÎÄÃÀÇ Àý´ë°æ·Î¸¦ ¾ò´Â´Ù. if( GetLocalBasicDownDir() == NULL || ( strcmp( GetLocalBasicDownDir(), "" ) == 0 ) ) { char szDir[MAX_PATH]; GetModuleDirectory( szDir, MAX_PATH ); strAbsolteDir = szDir; strAbsolteDir += strRelativeDir; } else { strAbsolteDir = GetLocalBasicDownDir(); strAbsolteDir += "\\"; strAbsolteDir += GetProcessName(); strAbsolteDir += strRelativeDir; } } //ÇöÀç ÀÌ ¸ðµâÀÌ À§Ä¡Çϰí ÀÖ´Â °÷ÀÇ Àý´ë°æ·Î¸¦ ¸®ÅÏÇÑ´Ù. void CUpdateModule::GetModuleDirectory( TCHAR* pszDirPath, int nSize ) { ZeroMemory( pszDirPath, nSize ); TCHAR szPath[MAX_PATH]; TCHAR szDrive[MAX_PATH], szDir[MAX_PATH]; GetModuleFileName( NULL, szPath, MAX_PATH); _splitpath( szPath, szDrive, szDir, NULL, NULL ); _snprintf( pszDirPath, nSize, "%s%s", szDrive, szDir); } // 01.02.03 °ú °°Àº ¹®ÀÚ¿­¿¡¼­ °¢°¢ÀÇ ¹öÀüÀ» »Ì¾Æ³»´Â ÇÔ¼ö. void CUpdateModule::GetVersionFromString( char* pszVersion, byte* byVer, int nMaxVerCount ) { // char* szTok; string strVersion = pszVersion; int nCnt = 0; while( strVersion.size() != 0) { if( nCnt >= nMaxVerCount ) break; int nIdx = (int)strVersion.find('.'); if( nIdx == string::npos ) { if( !strVersion.empty() ) { byVer[nCnt] = atoi( strVersion.c_str() ); } strVersion.clear(); } else { string strVer = strVersion.substr( 0, nIdx ); byVer[nCnt] = atoi( strVer.c_str() ); strVersion.erase( 0, nIdx + 1); nCnt++; } } } //ÇöÀç ÄÄÇ»ÅÍ¿¡ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàÁßÀÎÁö üũ. //½ÇÇàÁßÀÎ ÇÁ·Î±×·¥ÀÌ Çϳª¶óµµ ÀÖÀ¸¸é TRUE¸®ÅÏ //¾Æ´Ï¸é FASLE¸¦ ¸®ÅÏ.. BOOL CUpdateModule::CheckLiveProcess( TCHAR* pszProcess, BOOL bKillProcess ) { if( !pszProcess || strcmp( pszProcess, "" ) == 0 ) return FALSE; // ÇÁ·Î¼¼½º üũ ·±Ãijª °ÔÀÓ Å¬¶óÀÌ¾ðÆ®°¡ ½ÇÇàÁßÀÎÁö üũÇÑ´Ù HANDLE hSnapShot; //Get the snapshot of the system hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, NULL ); PROCESSENTRY32 pEntry; pEntry.dwSize = sizeof(pEntry); //Get first process Process32First (hSnapShot,&pEntry); //Iterate thru all processes DWORD dwPID = GetCurrentProcessId(); while(TRUE) { BOOL bRet = Process32Next (hSnapShot,&pEntry); if( bRet == FALSE ) break; //ÀÚ±â ÀÚ½ÅÀº ³Ñ¾î°£´Ù. if(dwPID == pEntry.th32ProcessID) continue; // ½ÇÇà ÁßÀÎÁö üũÇϵµ·Ï ÇÑ´Ù. if( strcmp(pEntry.szExeFile, pszProcess ) == 0 ) //ÇöÀç °°Àº ÇÁ·Î±×·¥ÀÌ ½ÇÇàÁßÀ̶ó¸é.. { if( bKillProcess ) { KillProcess(pEntry.th32ProcessID); return FALSE; } else return TRUE; } }// End While return FALSE; } // ÀÌ ÇÔ¼ö´Â ¼­¹öÀÇ ¹öÀüÆÄÀÏÀ» ´Ù¿î ¹Þ¾Æ¼­, ÇöÀç Ŭ¶óÀ̾ðÆ®ÀÇ ¹öÀü°ú ºñ±³ÇÏ¿©, // ¾÷µ¥ÀÌÆ®¸¦ ÇÒÁö ¾È ÇÒÁö¸¦ °áÁ¤ÇÏ´Â ÇÔ¼ö´Ù. // ¹öÀüüũ ½ÇÆÐ¸é, FALSE // ¾÷µ¥ÀÌÆ® ÆÄÀÏÀÌ ¾øÀ¸¸é, FALSE // ¼º°øÀ̸é, TRUE eRC_VERSION CUpdateModule::CheckVersionFiles( CVersionInfo& rVerInfo ) { // 1 . ¼­¹ö¿¡ ÀÖ´Â ¹öÀü ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù. // ÇöÀç ´Ù¿î¹ÞÀ»·Á´Â ¼­¹öÀÇ Æú´õ¿¡ ÀÖ´Â ¹öÀü ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù. ¹ÞÀº ÆÄÀÏÀº ·ÎÄÿ¡ ´Ù¿î¹Þ´Â´Ù. TCHAR szVerFilePath[MAX_PATH]; GetRemoteVersionFilePath( szVerFilePath, MAX_PATH ); //ÇöÀç µð·ºÅ丮 ¼³Á¤.. TCHAR szPath[MAX_PATH]; GetModuleDirectory( szPath, MAX_PATH ); SetCurrentDirectory( szPath ); //´Ù¿î¹ÞÀº ¹öÀüÆÄÀÏÀº ¾ðÁ¦ »èÁ¦ÇÒ °ÍÀΰ¡? if( !DownloadFile( szVerFilePath ) ) return RC_VERSION_FILE_NOTEXIST; // 2 . ´Ù¿î ¹ÞÀº ¹öÀü ÆÄÀÏ¿¡¼­ ÇöÀç Ŭ¶óÀ̾ðÆ®ÀÇ ¹öÀü°ú ºñ±³ÇÏ¿© ¹ÞÀ» ÆÄÀÏÀÌ ÀÖÀ¸¸é ÇØ´ç Æú´õ¿¡¼­ ¸ñ·ÏÆÄÀÏÀ» ¹Þ´Â´Ù. if( !GetUpdateFolderCount( rVerInfo, m_byUpdateFolderCount ) ) { return RC_VERSION_PARSING_FAIL; } DeleteFile( DEFAULT_VERSION_FILE ); if( m_byUpdateFolderCount == 0 ) //¾÷µ¥ÀÌÆ® ÇÒ ÆÄÀÏÀÌ ¾ø´Ù. ÇöÀç ÃֽŹöÀü ÀÌ´Ù. return RC_VERSION_LASTEST; return RC_VERSION_NEED_UPDATE; } //¿ø°ÝÁöÀÇ ¹öÀüÆú´õÀÇ °æ·Î¸¦ ¹ÝȯÇÑ´Ù. void CUpdateModule::GetRemoteVersionFolderPath( TCHAR* pszFolderPath, int nSize, const TCHAR* pszVerFolder ) { TCHAR szCurServer[MAX_PATH]; GetProcessName( szCurServer, MAX_PATH ); if( szCurServer == NULL || strcmp( szCurServer, "" ) == 0 ) _snprintf( pszFolderPath, nSize, "%s", pszVerFolder ); else _snprintf( pszFolderPath, nSize, "%s\\%s", szCurServer, pszVerFolder ); } BOOL CUpdateModule::Init() { m_bUpdateStart = TRUE; m_FtpNetwork.m_fnMsgCallBack = m_fnMsgCallback; AddMessage( WM_UPDATE_MODULE_INIT ); return TRUE; } //±âº» µð·ºÅ丮 °æ·Î¸¦ Æ÷ÇÔÇÏ´Â FTP¼­¹ö»óÀÇ ¹öÀüÆÄÀÏ °æ·Î¸¦ ±¸ÇÑ´Ù. void CUpdateModule::GetRemoteVersionFilePath( TCHAR* pszVerFilePath, int nSize ) { TCHAR szAppName[MAX_PATH]; ZeroMemory( szAppName, MAX_PATH ); GetProcessName( szAppName, MAX_PATH ); if( szAppName == NULL || (strcmp( szAppName, "" ) == 0 ) ) strncpy( pszVerFilePath, DEFAULT_VERSION_FILE, nSize ); //¸¸ÀÏ µðÆúÆ® µð·ºÅ丮°¡ ¾øÀ¸¸é ·çÆ®¿¡¼­ ã´Â´Ù. else _snprintf( pszVerFilePath, nSize, "%s\\%s", szAppName, DEFAULT_VERSION_FILE ); } //ÇѰ³ÀÇ ÇÁ·Î¼¼¼­³»¿¡´Â ¿©·¯°³ÀÇ ÆÐÄ¡ ¹öÀüÀÌ Á¸ÀçÇÑ´Ù. //¼­¹ö¿¡¼­ ´Ù¿î¹ÞÀº ÇöÀç ÇÁ·Î¼¼¼­ÀÇ(FTP¿¡ Á¸ÀçÇÏ´Â NAMEÆú´õ³»ÀÇ ) wz_version.dat ÆÄÀÏ¿¡¼­ //ÇöÀçÀÇ ·ÎÄà ¹öÀü°ú ºñ±³ÇÏ¿©, ¸î°³ÀÇ ¹öÀüÀ» ÆÐÄ¡ÇÏ¿©¾ß ÇÏ´ÂÁö ÆÐÄ¡(Æú´õ)ÀÇ °³¼ö¸¦ //±¸ÇÏ´Â ÇÔ¼öÀÌ´Ù. BOOL CUpdateModule::GetUpdateFolderCount( CVersionInfo CurVersion, OUT BYTE& byUpdateFolderCount ) { UDTToken Token; CScriptParser parser; CVersionInfo NewVersion; byUpdateFolderCount = 0; //¾÷µ¥ÀÌÆ® Æú´õ °³¼ö ÃʱâÈ­.. TCHAR szPath[MAX_PATH]; GetModuleDirectory( szPath, MAX_PATH ); SetCurrentDirectory( szPath ); if( !parser.SetFile( DEFAULT_VERSION_FILE ) ) return FALSE; while(TRUE) { Token = parser.GetToken(); if( Token == END ) break; if( Token == NAME ) { NewVersion.Init(); NewVersion.SetVersionFromString( parser.GetTokenString() ); //»õ·Î¿î ¹öÀüÀÌ ÇöÀç ·ÎÄÃÀÇ ¹öÀüº¸´Ù Å©´Ù¸é.. //¾÷µ¥ÀÌÆ®ÇÒ Æú´õÀÇ Á¤º¸¿Í °³¼ö¸¦ Áõ°¡½ÃŲ´Ù. if( NewVersion.GetTotalVersion() > CurVersion.GetTotalVersion() ) { strncpy( m_UpdateFolderInfo[byUpdateFolderCount].m_szFolderName, parser.GetTokenString(), MAX_FOLDER_NAME ); m_UpdateFolderInfo[byUpdateFolderCount].m_Version = NewVersion; byUpdateFolderCount++; } if( byUpdateFolderCount >= MAX_UPDATE_FOLDER_COUNT ) return FALSE; } } return TRUE; } //ÇѰ³ÀÇ ÇÁ·Î¼¼½º´ÜÀ§¸¦ ¾÷µ¥ÀÌÆ® ÇÑ´Ù. BOOL CUpdateModule::UpdateOneProcess() { TCHAR szCurLocalDirectory[MAX_PATH]; // ÇöÀç ·ÎÄà ȣ½ºÆ®ÀÇ µð·ºÅ丮 °æ·Î // ÇöÀç ½ÇÇàÆÄÀÏÀÇ µð·ºÅ丮¸¦ ±¸ÇÑ´Ù. GetModuleDirectory( szCurLocalDirectory, MAX_PATH ); //1. ÇöÀçÀÇ ÇÁ·Î¼¼¼­¿¡ ¾÷µ¥ÀÌÆ®ÇÒ Æú´õÀÇ °³¼ö¸¸Å­ ·çÇÁ¸¦ µ·´Ù. //for (int i = 0; i < m_byUpdateFolderCount; i++ ) //{ int i = m_byUpdateFolderCount-1; //¿ø°ÝÁöÀÇ ÆÄÀϸ®½ºÆ® ÆÄÀÏÀÇ °æ·Î¸¦ ¾ò¾î¿Â´Ù. TCHAR szFileListFilePath[MAX_PATH]; GetRemoteFileListPath( szFileListFilePath, MAX_PATH, m_UpdateFolderInfo[i].m_szFolderName ); TCHAR szLocalListPath[MAX_PATH]; GetModuleDirectory( szLocalListPath, MAX_PATH ); //¸®½ºÆ® ÆÄÀÏ ´Ù¿î·Îµå(½ÇÇàÆÄÀÏ À§Ä¡¿¡ ´Ù¿î ¹Þ´Â´Ù.) if ( !DownloadFile(szFileListFilePath, szLocalListPath) ) return FALSE; //´Ù¿î¹ÞÀ» ¹öÀüÀÇ Æú´õ°æ·Î¸¦ °¡Á®¿Â´Ù. TCHAR szVerFolerPath[MAX_PATH]; GetRemoteVersionFolderPath( szVerFolerPath, MAX_PATH, m_UpdateFolderInfo[i].m_szFolderName ); //ÇØ´ç ¹öÀü Æú´õ¿¡ ÀÖ´Â ÆÄÀÏ ¸®½ºÆ®ÀÇ ÆÄÀϵéÀ» ´Ù¿î¹Þ´Â´Ù. if( !DownloadFilesOnFileList( szVerFolerPath ) ) { DeleteFile( DEFAULT_FILELIST_FILE ); //·ÎÄÿ¡ ´Ù¿î¹Þ¾Æ ³ù´ø ÆÄÀϸ®½ºÆ®¸¦ »èÁ¦ÇÑ´Ù. DeleteFile( DEFAULT_VERSION_FILE ); //·ÎÄÿ¡ ´Ù¿î¹Þ¾Æ ³ù´ø ¹öÀüÆÄÀÏÀ» »èÁ¦ÇÑ´Ù. return FALSE; //Çϳª¸¸ Àß ¸øµÇµµ, ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. } // ¿©±â±îÁö ¿ÔÀ¸¸é À­ ¹öÀüÀ¸·ÎÀÇ ¾÷µ¥ÀÌÆ®°¡ ¼º°øÇÑ °ÍÀ̹ǷΠ¾÷µÈ ¹öÀü ÀúÀå m_CurVersion = m_UpdateFolderInfo[i].m_Version; m_CurVersion.GetStringVersion( m_UpdateInfo.m_szProcessVer, MAX_PATH ); // ¾÷µ¥ÀÌÆ® Áß ÇÁ·Î±×·¥ ¹öÀüÀ» ¾Ë¸°´Ù. AddMessage( WM_UPDATE_VERSION_ALARM, &m_UpdateInfo ); DeleteFile( DEFAULT_FILELIST_FILE ); //·ÎÄÿ¡ ´Ù¿î¹Þ¾Æ ³ù´ø ÆÄÀϸ®½ºÆ®¸¦ »èÁ¦ÇÑ´Ù. DeleteFile( DEFAULT_VERSION_FILE ); //·ÎÄÿ¡ ´Ù¿î¹Þ¾Æ ³ù´ø ¹öÀüÆÄÀÏÀ» »èÁ¦ÇÑ´Ù. //} return TRUE; } //ÆÄÀϸ®½ºÆ® ÆÄÀÏÀº ¹Ýµå½Ã ´Ù¿î·Îµå ¹Þ´Â ¹öÀüÆú´õ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù. //¿¹ : AgentServer\00.00.01\filelist.dat void CUpdateModule::GetLocalFileListPath( char* pszFilePath, int nSize, const char* pszVerFolder ) { TCHAR szCurServer[MAX_PATH]; GetProcessName( szCurServer, MAX_PATH ); if( szCurServer == NULL || strcmp( szCurServer, "" ) == 0 ) _snprintf( pszFilePath, nSize, "%s\\%s", pszVerFolder, DEFAULT_FILELIST_FILE ); else _snprintf( pszFilePath, nSize, "%s\\%s\\%s", szCurServer, pszVerFolder, DEFAULT_FILELIST_FILE ); } //·ÎÄÃÀÇ ¹öÀüÆú´õÀÇ °æ·Î¸¦ ¹ÝȯÇÑ´Ù. void CUpdateModule::GetLocalVersionFolderPath( char* OUT pszFolderPath, int IN nSize, const char* IN pszVerFolder ) { if( GetLocalBasicDownDir() == NULL || (strcmp( GetLocalBasicDownDir(), "" ) == 0 ) ) strncpy( pszFolderPath, pszVerFolder, nSize ); else _snprintf( pszFolderPath, nSize, "%s\\%s", GetLocalBasicDownDir(), pszVerFolder ); } void CUpdateModule::SetProcessName( TCHAR* pszName ) { if( !pszName ) return; strncpy( m_UpdateInfo.m_szProcessName, pszName, MAX_PATH ); } void CUpdateModule::GetProcessName( TCHAR* pszName, int nSize ) { ZeroMemory( pszName, nSize ); strncpy( pszName, m_UpdateInfo.m_szProcessName, nSize ); } void CUpdateModule::AddMessage( UINT uMsg, VOID* pData ) { if( !m_fnMsgCallback ) return; m_fnMsgCallback( uMsg, pData ); } void CUpdateModule::SetLocalBasicDownDir( TCHAR* pszDir ) { if( pszDir == NULL || strcmp( pszDir, "" ) == 0 ) return; ZeroMemory( m_szBasicDownDir, MAX_PATH ); strncpy( m_szBasicDownDir, pszDir, MAX_PATH ); } void CUpdateModule::GetLocalBasicDownDir( TCHAR* pszDir, int nSize ) { strncpy( pszDir, m_szBasicDownDir, nSize ); } void CUpdateModule::MakeDirectory( const char* pszDir ) { if( pszDir == NULL || strcmp( pszDir, "" ) == 0 ) return; int nLen = (int)strlen( pszDir ) + 1; char* szBuf = new char[nLen]; strncpy( szBuf, pszDir, nLen ); for( int i = 0; i < nLen; i++ ) { if( szBuf[i] && szBuf[i] != '\\' ) continue; szBuf[i] = '\0'; if( PathIsDirectory(szBuf) == FALSE ) CreateDirectory( szBuf, NULL ); szBuf[i] = '\\'; } delete[] szBuf; } //ÇöÀç ´Ù¿î¹ÞÀ» ¾îÇø®ÄÉÀ̼ÇÀÇ ±âº» µð·ºÅ丮¸¦ »ý¼ºÇÑ´Ù. void CUpdateModule::CreateLocalProcessDownDir( ) { string strDir; if( GetLocalBasicDownDir() == NULL || strcmp( GetLocalBasicDownDir(), "") == 0 ) strDir = ""; else { strDir += GetLocalBasicDownDir(); strDir += '\\'; } TCHAR szAppName[MAX_PATH]; GetProcessName( szAppName, MAX_PATH ); strDir += szAppName; MakeDirectory( strDir.c_str() ); } void CUpdateModule::SendTerminateProcessMsg() { AddMessage( WM_TERMINATE_PROCESS ); } void CUpdateModule::SetCurVerInfo( TCHAR* pszVersion ) { strncpy( m_UpdateInfo.m_szProcessVer, pszVersion, MAX_PATH ); m_CurVersion.SetVersionFromString( pszVersion ); } VOID CUpdateModule::KillProcess(DWORD th32ProcessID) { UINT uExitCode = 0; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, th32ProcessID); if(TerminateProcess(hProcess, uExitCode)) AddMessage( WM_COMMAND_MESSAGE, "ÇÁ·Î¼¼½º »èÁ¦ ¼º°ø" ); else AddMessage( WM_COMMAND_MESSAGE, "ÇÁ·Î¼¼½º »èÁ¦ ½ÇÆÐ" ) ; CloseHandle(hProcess); } VOID CUpdateModule::StopUpdate() { m_bUpdateStart = FALSE; } VOID CUpdateModule::SetMsgCallBack( fnMsgCallBack CallBack ) { if( !CallBack ) return; m_fnMsgCallback = CallBack; m_FtpNetwork.SetMsgCallBack( m_fnMsgCallback ); }