#include ".\launcherupdate.h" #include #include #include "MyFolder.h" CLauncherUpdate::CLauncherUpdate(void) { SetUpdateType( UPDATE_TYPE_LAUNCHER ); } CLauncherUpdate::~CLauncherUpdate(void) { } //Áß°£¿¡ Á¾·áµÇ¾î¾ß ÇÒ »óȲÀ̸é, FALSE //¸ðµç°ÍÀÌ ¿Ï·á µÇ¾úÀ» ¶§´Â TRUE¸¦ ¸®ÅÏÇÑ´Ù. BOOL CLauncherUpdate::StartUpdate() { // ±âº» ´Ù¿î·Îµå µð·ºÅ丮 ¼³Á¤ PROCESS_INFO_MAP_ITER iter; BYTE byUpdateSeq = 0; for( iter = m_mapProcessInfo.begin(); iter != m_mapProcessInfo.end(); ++iter ) { PROCESS_INFO* pInfo = iter->second; if( !pInfo ) continue; pInfo->m_byUpdateSequence = byUpdateSeq; byUpdateSeq++; if( m_byUpdateNumber != 0 ) //ÀÏÁ¤ÇÑ ¼­¹ö¸¸ ¾÷µ¥ÀÌÆ® ¸é.. { if( pInfo->m_byUpdateNumber != m_byUpdateNumber ) continue; } if( GetStartType() != START_TYPE_LAUNCHER ) //·±Ã³°¡ ½ÇÇàÇßÀ» °æ¿ì¿¡´Â ÇÁ·Î¼¼¼­ üũ¸¦ ÇÏÁö ¾Ê´Â´Ù. { if( !CheckLiveProcess( pInfo->m_szCheckProcess ) ) { AddMessage( WM_UPDATE_LIVE_PROCESS, pInfo ); return FALSE; } } //1. ±âº»Á¤º¸ ¼¼ÆÃ. m_UpdateModule.SetUpdateNumber( pInfo->m_byUpdateNumber ); m_UpdateModule.SetCurVerInfo( pInfo->m_szProcessVer ); m_UpdateModule.SetProcessName( pInfo->m_szProcessName ); m_UpdateModule.SetUpdateSequence( pInfo->m_byUpdateSequence ); //1. ´Ù¿î¹ÞÀ» ÇÁ·Î¼¼¼­ÀÇ ·ÎÄà µð·ºÅ丮¸¦ »ý¼ºÇÑ´Ù. m_UpdateModule.CreateLocalProcessDownDir(); //2. ¹öÀüÀ» üũÇÑ´Ù. eRC_VERSION RcVersion = m_UpdateModule.CheckVersionFiles( m_UpdateModule.GetCurVersion() ); if( RcVersion == RC_VERSION_FILE_NOTEXIST || RcVersion == RC_VERSION_PARSING_FAIL ) { AddMessage( WM_UPDATE_VERSION_CHECK_FAIL, pInfo ); return FALSE; } else if( RcVersion == RC_VERSION_LASTEST ) //ÃֽŹöÀüÀ̸é. ³Ñ¾î°£´Ù. { AddMessage( WM_UPDATE_LASTEST_VERSION, pInfo ); continue; } //3. ÇöÀç ½ÇÇà »óŸ¦ Ã¼Å©ÇØ¼­, ·±Ã³°¡ ½ÇÇà ½ÃŲ°Ô ¾Æ´Ñµ¥ ¾÷µ¥ÀÌÆ®¸¦ ÇØ¾ßÇÏ´Â »óȲÀ̸é.. if( GetStartType() != START_TYPE_LAUNCHER ) { //¾Æ·¡ ¸í·ÉÀÌ ½ÇÆÐµç ¼º°øÀ̵ç, ¹«Á¶°Ç ÇÁ·Î¼¼½º´Â Á¾·áµÇ¾î¾ß ÇÑ´Ù. CopyAndExcute(); return FALSE; } // ÇѰ³ÀÇ ÇÁ·Î¼¼¼­¸¦ ¾÷µ¥ÀÌÆ® ÇÑ´Ù. if( m_UpdateModule.UpdateOneProcess() ) //ÇÊ¿äÁ¤º¸, ÇÁ·Î¼¼¼­À̸§°ú ÃÖÁ¾¹öÀü { m_UpdateModule.GetCurVersion().GetStringVersion( pInfo->m_szProcessVer, MAX_PATH ); AddMessage( WM_UPDATE_END_SUCCESS, pInfo ); } else { AddMessage( WM_UPDATE_END_FAIL, pInfo ); DeleteFile( DEFAULT_FILELIST_FILE ); //·ÎÄÿ¡ ´Ù¿î¹Þ¾Æ ³ù´ø ÆÄÀϸ®½ºÆ®¸¦ »èÁ¦ÇÑ´Ù. DeleteFile( DEFAULT_VERSION_FILE ); //·ÎÄÿ¡ ´Ù¿î¹Þ¾Æ ³ù´ø ¹öÀüÆÄÀÏÀ» »èÁ¦ÇÑ´Ù. return FALSE; } if( GetStartType() == START_TYPE_LAUNCHER ) OnLauncherDownloadComplete( ); } return TRUE; } //±âº» ´Ù¿î·Îµå µð·ºÅ丮¿¡ CopyÇÏ°í ½ÇÇàÇÑ´Ù. BOOL CLauncherUpdate::CopyAndExcute() { DisconnectFTP(); //·±Ã³ ¾÷µ¥ÀÌÆ®¿¡¼­´Â ÇÁ·Î¼¼¼­ üũ¸¦ Çϱâ Àü¿¡ //¸ÕÀú ÇöÀçÀÇ ½ÇÇà Æú´õ¸¦ ÅÛÇÁ Æú´õ¿¡ º¹»ç ÀÛ¾÷À» ¸ÕÀúÇØ¾ß ÇÑ´Ù. TCHAR szFromDir[MAX_PATH]; m_UpdateModule.GetModuleDirectory( szFromDir, MAX_PATH ); BYTE byCount = GetProcessInfoCount(); for( int i = 0; i < byCount ; i++ ) { PROCESS_INFO* pInfo = GetProcessInfo( i+ 1 ); if( !pInfo ) return FALSE; // TempFolder¸¦ ÃʱâÈ­ ÇÑ´Ù. if( !InitTempFolder( pInfo ) ) return FALSE; TCHAR szToPath[MAX_PATH]; if( !GetCopyFolderPath( pInfo, szToPath, MAX_PATH, FALSE ) ) return FALSE; DeleteLastPathSep( szFromDir, MAX_PATH ); // ³¡¿¡ "\\" °¡ ÀÖÀ¸¸é »èÁ¦ÇÑ´Ù. DeleteLastPathSep( szToPath, MAX_PATH ); // ³¡¿¡ "\\" °¡ ÀÖÀ¸¸é »èÁ¦ÇÑ´Ù. //ÇöÀç ·±Ã³ µð·ºÅ丮ÀÇ ³»¿ëÀ» CopyÆú´õ·Î º¹»çÇÑ´Ù. if( !MyFolder::CopyFoler( szFromDir, szToPath ) ) { m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, "ÅÛÇÁ Ä«ÇÇ Æú´õ·Î ·±Ã³Æú´õ º¹»ç ½ÇÆÐ"); return FALSE; } //º¹»ç°¡ ´Ù µÇ¾úÀ¸¸é.. ÇØ´ç ÇÁ·Î¼¼¼­¸¦ ½ÇÇàÇÑ´Ù. string strFile = szToPath; strFile += "\\"; strFile += pInfo->m_szProcessName; strFile += "\\"; strFile += pInfo->m_szCheckProcess; if( _access( strFile.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé.. { strFile += " "; strFile += m_szExecuteParameter; if( !ExcuteProcess( (TCHAR*)strFile.c_str() ) ) return FALSE; } static TCHAR szLog[MAX_PATH]; _snprintf( szLog, MAX_PATH, "[Copy Folder Success] From : %s, To : %s", szFromDir, szToPath ); m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, szLog ); } return TRUE; } //·±Ã³ ¾÷µ¥ÀÌÆ®°¡ ¿Ï·á½Ã ½ÇÇàµÇ´Â ÇÔ¼ö BOOL CLauncherUpdate::OnLauncherDownloadComplete() { // ÇöÀç ·±Ã³ÀÇ ¾÷µ¥ÀÌÆ®°¡ ¾Æ´Ï¸é ¸®ÅÏÇÑ´Ù. if( GetUpdateType() != UPDATE_TYPE_LAUNCHER ) return FALSE; //·±Ã³ ¾÷µ¥ÀÌÆ® ¿Ï·á½Ã //1. Down Æú´õ¿¡¼­ ¿øº»Æú´õ·Î º¹»çÇϰí, //2. ¿øº»¿¡ ¹öÀüÀ» ¿Ã¸°´Ù. //3. ¾÷µ¥ÀÌÆ®µÈ ·±Ã³¸¦ ½ÇÇàÇϰí //4. ÇöÀç ÇÁ·Î¼¼¼­¸¦ Á¾·áÇÑ´Ù. for( int i = 0; i < GetProcessInfoCount(); i++ ) { PROCESS_INFO* pInfo = GetProcessInfo( i + 1 ); TCHAR szBasicDownDir[MAX_PATH]; GetLocalBasicDownDir( szBasicDownDir, MAX_PATH ); //1. ·±Ã³°¡ ´Ù¿î·ÎµåµÈ °÷¿¡¼­ ·±Ã³°¡ ½ÇÇàµÇ´Â°÷À¸·Î º¹»ç( TempDown¿¡¼­ ½ÇÇàÀ§Ä¡·Î º¹»ç ) TCHAR szDownPath[MAX_PATH]; if( !GetDownFolderPath( pInfo, szDownPath, MAX_PATH ) ) return FALSE; TCHAR szExecuteDir[MAX_PATH]; GetLocalBasicExecuteDir( szExecuteDir, MAX_PATH ); if( !MyFolder::CopyFoler( szDownPath, szExecuteDir ) ) m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, "Æú´õ º¹»ç ½ÇÆÐ" ); else { static char szCopyFolder[MAX_PATH]; _snprintf( szCopyFolder, MAX_PATH, "[Copy Folder Success] From : %s, To : %s", szDownPath, szExecuteDir ); m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, szCopyFolder ); } //2. INI ÆÄÀÏ º¹»ç( Copy¿¡¼­ ½ÇÇà¹öÀüÀ¸·Î.. ) string strFromFile; strFromFile = szBasicDownDir; strFromFile += "\\Copy\\"; strFromFile += pInfo->m_szProcessName; strFromFile += "\\"; strFromFile += DEFAULT_UPDEATEINFO_FILE; string strToFile = szExecuteDir; strToFile += "\\"; strToFile += pInfo->m_szProcessName; strToFile += "\\"; strToFile += DEFAULT_UPDEATEINFO_FILE; if( !CopyFile( strFromFile.c_str(), strToFile.c_str(), FALSE ) ) { TCHAR szMsg[MAX_PATH]; wsprintf( szMsg, "From = %s, To = %s, ErrorCode = %d", strFromFile.c_str(), strToFile.c_str(), GetLastError() ); AddMessage( WM_COMMAND_MESSAGE, szMsg ); } else { static char szCopyFile[MAX_PATH]; _snprintf( szCopyFile, MAX_PATH, "[Copy File Success] From : %s, To : %s", strFromFile.c_str(), strToFile.c_str() ); m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, szCopyFile ); } //3. ¾÷µ¥ÀÌÆ®µÈ ·±Ã³ ½ÇÇà string strFile = szExecuteDir; strFile += "\\"; strFile += pInfo->m_szProcessName; strFile += "\\"; strFile += pInfo->m_szCheckProcess; if( _access( strFile.c_str(), 0 ) != -1 ) //ÆÄÀÏÀÌ Á¸ÀçÇϸé.. { strFile += " "; strFile += m_szExecuteParameter; if( !ExcuteProcess( (TCHAR*)strFile.c_str() ) ) return FALSE; } } return TRUE; } BOOL CLauncherUpdate::ExcuteProcess( TCHAR* pszPath ) { if( pszPath == NULL ) return FALSE; if( WinExec( pszPath, SW_SHOW ) > 31 ) //¼º°øÀ̸é.. m_UpdateModule.SendTerminateProcessMsg(); else { m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, "½ÇÇà½ÇÆÐ" ); return FALSE; //½ÇÆÐÇßÀ¸¸é, ½ÇÆÐ ó¸®.. } return TRUE; } BOOL CLauncherUpdate::InitTempFolder( PROCESS_INFO* pInfo ) { if( !pInfo ) return FALSE; string strCopyPath, strDownPath, strTempPath; //1. ±âÁ¸ÀÇ Copy Æú´õ°¡ ÀÖÀ¸¸é CopyÆú´õ »èÁ¦ TCHAR szCopyFolderPath[MAX_PATH]; if( !GetCopyFolderPath( pInfo, szCopyFolderPath, MAX_PATH ) ) return FALSE; if( _access( szCopyFolderPath, 0 ) != -1 ) //ÆÄÀÏÀ̳ª Æú´õ°¡ Á¸ÀçÇϸé.. { if( !DeleteFolder( szCopyFolderPath ) ) { m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, "Temp Copy Æú´õ »èÁ¦ ½ÇÆÐ"); return FALSE; } } //2. ±âº»ÀÇ Down µð·ºÅ丮°¡ ÀÖÀ¸¸é DownÆú´õ »èÁ¦. TCHAR szDownFolderPath[MAX_PATH]; if( !GetDownFolderPath( pInfo, szDownFolderPath, MAX_PATH ) ) return FALSE; if( _access( szDownFolderPath, 0 ) != -1 ) //ÆÄÀÏÀ̳ª Æú´õ°¡ Á¸ÀçÇϸé.. { if( !DeleteFolder( szDownFolderPath ) ) { m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, "Temp Down Æú´õ »èÁ¦ ½ÇÆÐ"); return FALSE; } } //3. Temp Copy µð·ºÅ丮¸¦ ¸¸µç´Ù. if( !CreateDirectory( szCopyFolderPath, NULL ) ) { m_UpdateModule.AddMessage( WM_COMMAND_MESSAGE, "Temp Copy Æú´õ »ý¼º ½ÇÆÐ"); return FALSE; } return TRUE; } BOOL CLauncherUpdate::GetCopyFolderPath( PROCESS_INFO* pInfo, OUT TCHAR* pszPath, int nSize, BOOL bIncludeProcessName ) { if( !pInfo || !pszPath ) return FALSE; TCHAR szBasicDownDir[MAX_PATH]; m_UpdateModule.GetLocalBasicDownDir( szBasicDownDir, MAX_PATH ); string strTempPath = szBasicDownDir; int nPos = (int)strTempPath.find( "Down" ); if( nPos == std::string::npos ) { AddMessage( WM_COMMAND_MESSAGE, "Down ã±â ½ÇÆÐ" ); return FALSE; } strTempPath.erase( nPos, strTempPath.length() - nPos ); strTempPath += "Copy"; if( bIncludeProcessName == TRUE ) { strTempPath += "\\"; strTempPath += pInfo->m_szProcessName; } strncpy( pszPath, strTempPath.c_str(), nSize ); return TRUE; } BOOL CLauncherUpdate::GetDownFolderPath( PROCESS_INFO* pInfo, OUT TCHAR* pszPath, int nSize, BOOL bIncludeProcessName ) { if( !pInfo ) return FALSE; TCHAR szBasicDownDir[MAX_PATH]; m_UpdateModule.GetLocalBasicDownDir( szBasicDownDir, MAX_PATH ); if( bIncludeProcessName == TRUE ) _snprintf( pszPath, nSize, "%s\\%s", szBasicDownDir, pInfo->m_szProcessName ); else strncpy( pszPath, szBasicDownDir, nSize ); return TRUE; } VOID CLauncherUpdate::DeleteLastPathSep( IN OUT TCHAR* pszPath, int nSize ) { string strPath = pszPath; int nPathSize = (int)strPath.size(); if( nPathSize > 0 ) { string strEnd = strPath.substr( nPathSize - 1, 1 ); if( strEnd.compare("\\") == 0 ) strPath.erase( nPathSize - 1, 1 ); } strncpy( pszPath, strPath.c_str(), nSize ); }