#include ".\updatemanager.h" #include "LauncherUpdate.h" #include "ApplicationUpdate.h" #include "UpdateScriptInfo.h" HWND CUpdateManager::m_hWnd = NULL; CUpdateManager::CUpdateManager(void) { m_pApplicationUpdate = NULL; m_pLauncherUpdate = NULL; m_hThread = NULL; } CUpdateManager::~CUpdateManager(void) { } VOID CUpdateManager::Release() { if( m_pLauncherUpdate ) m_pLauncherUpdate->StopUpdate(); if( m_pApplicationUpdate ) m_pApplicationUpdate->StopUpdate(); WaitForSingleObject( m_hThread, INFINITE ); if( m_hThread ) { CloseHandle( m_hThread ); m_hThread = NULL; } if( m_pLauncherUpdate ) { delete m_pLauncherUpdate; m_pLauncherUpdate = NULL; } if( m_pApplicationUpdate ) { delete m_pApplicationUpdate; m_pApplicationUpdate = NULL; } } // ¿©±â¼­´Â °¢°¢ÀÇ Update¸ðµâÀ» »ý¼ºÇϰí, ½ºÅ©¸³Æ®¸¦ ÆÄ½ÌÇÑ´Ù. // ÆÄ½ÌÇÑ ½ºÅ©¸³ÀÇ ³»¿ëÀ» °¢°¢ÀÇ Update¸ðµâ¿¡ ÀÔ·ÂÇÑ´Ù. // bApplyScript : ½ºÅ©¸³Æ®ÀÇ UpdateNumber¸¦ Àû¿ëÇÒÁö, ¾Æ´Ï¸é µÚ¿¡ ÀÔ·ÂÇÑ °ªÀ» Àû¿ëÇÒÁö ¼±ÅÃ. BOOL CUpdateManager::Init( eLAUNCHER_START_TYPE StartType, BOOL bApplyScript, BYTE byAppUpdateNumber, TCHAR* pszSubParam ) { //1. INIÆÄÀÏ ·Îµå if( !CUpdateScriptParser::GetInstance()->IsLoad() ) return FALSE; if( m_pLauncherUpdate ) delete m_pLauncherUpdate; m_pLauncherUpdate = new CLauncherUpdate; if( m_pApplicationUpdate ) delete m_pApplicationUpdate; m_pApplicationUpdate = new CApplicationUpdate; //Init /************************************************************************/ /* Launcher */ /************************************************************************/ //1. Launcher if( !m_pLauncherUpdate->Init() ) return FALSE; // ´Ù¿î·Îµå µð·ºÅ丮 ¼³Á¤ m_pLauncherUpdate->SetStartType( StartType ); std::string strLauncherBasicDownDir, strLauncherBasicExecuteDir; strLauncherBasicDownDir = CUpdateScriptParser::GetInstance()->m_LauncherInfo.m_szDownPath; strLauncherBasicDownDir += "\\Down"; m_pLauncherUpdate->SetLocalBasicDownDir( (TCHAR*)strLauncherBasicDownDir.c_str() ); m_pLauncherUpdate->SetLocalBasicExecuteDir( CUpdateScriptParser::GetInstance()->m_LauncherInfo.m_szExecutePath ); m_pLauncherUpdate->SetUpdateNumber( CUpdateScriptParser::GetInstance()->m_LauncherInfo.m_nUpdateNumber ); m_pLauncherUpdate->SetExecuteParameter( pszSubParam ); //2. ÇÁ·Î¼¼½º Á¤º¸ ¼³Á¤ int nLauncherCount = CUpdateScriptParser::GetInstance()->m_LauncherInfo.m_nTotalProcessCount; for( int i = 0; i < nLauncherCount; i++ ) { PROCESS_INFO* pProcessInfo = CUpdateScriptParser::GetInstance()->m_LauncherInfo.GetProcessInfo( i + 1 ); if( !pProcessInfo ) return FALSE; m_pLauncherUpdate->InsertProcessInfo( pProcessInfo ); } /************************************************************************/ /* Application */ /************************************************************************/ if( !m_pApplicationUpdate->Init() ) return FALSE; // ´Ù¿î·Îµå µð·ºÅ丮 ¼³Á¤ m_pApplicationUpdate->SetStartType( StartType ); m_pApplicationUpdate->SetLocalBasicDownDir( CUpdateScriptParser::GetInstance()->m_ApplicationInfo.m_szDownPath ); m_pApplicationUpdate->SetLocalBasicExecuteDir( CUpdateScriptParser::GetInstance()->m_ApplicationInfo.m_szExecutePath ); BYTE byUpdateNumber = 0; if( bApplyScript ) byUpdateNumber = CUpdateScriptParser::GetInstance()->m_ApplicationInfo.m_nUpdateNumber; else byUpdateNumber = byAppUpdateNumber; m_pApplicationUpdate->SetUpdateNumber( byUpdateNumber ); //2. ÇÁ·Î¼¼½º Á¤º¸ ¼³Á¤ int nApplicationCount = CUpdateScriptParser::GetInstance()->m_ApplicationInfo.m_nTotalProcessCount; for( int i = 0; i < nApplicationCount; i++ ) { PROCESS_INFO* pProcessInfo = CUpdateScriptParser::GetInstance()->m_ApplicationInfo.GetProcessInfo( i + 1 ); if( !pProcessInfo ) return FALSE; m_pApplicationUpdate->InsertProcessInfo( pProcessInfo ); } return TRUE; } //ÀÌÇÔ¼ö¿¡¼­ ¾²·¹µå°¡ »ý¼ºµÇ¸ç, ÀÌ ¾²·¹µå ¾È¿¡¼­ ÆÐÄ¡°¡ ÀÌ·ç¾î Áø´Ù. VOID CUpdateManager::StartUpdate() { //Update Thread °¡µ¿ m_unThreadID = 2; m_hThread = (HANDLE)_beginthreadex (NULL, NULL, UpdateThread, (void*)this, 0, &m_unThreadID); if( m_hThread == INVALID_HANDLE_VALUE ) { MessageBox( NULL, "¾÷µ¥ÀÌÆ® ¾²·¹µå »ý¼º ½ÇÆÐ", NULL, MB_OK ); return; } return; } BOOL CUpdateManager::ExecuteUpdate() { //0. CallBack Msg Á¤ÀÇ m_pLauncherUpdate->SetMsgCallBack( SendWndMessage ); m_pApplicationUpdate->SetMsgCallBack( SendWndMessage ); //1. ·±Ã³ FTP ¿¬°á CUpdateProcessInfo& rLauncherInfo = CUpdateScriptParser::GetInstance()->m_LauncherInfo; if( !m_pLauncherUpdate->ConnectFTP( rLauncherInfo.m_szFtpIP, rLauncherInfo.m_wFtpPort, rLauncherInfo.m_szID, rLauncherInfo.m_szPass ) ) return FALSE; //2. ·±Ã³ ¾÷µ¥ÀÌÆ®´Â ½ÇÆÐÇÏµç ¼º°øÇϵç, ´ÙÀ½À¸·Î ³Ñ¾î°£´Ù. m_pLauncherUpdate->StartUpdate(); //3. ·±Ã³ ¾÷µ¥ÀÌÆ® ¿Ï·á µÇ¾úÀ¸¹Ç·Î, DisconnectÇÑ´Ù. m_pLauncherUpdate->DisconnectFTP(); //4. ¾îÇø®ÄÉÀÌ¼Ç FTP ¿¬°á CUpdateProcessInfo& rAppInfo = CUpdateScriptParser::GetInstance()->m_ApplicationInfo; if( !m_pApplicationUpdate->ConnectFTP( rAppInfo.m_szFtpIP, rAppInfo.m_wFtpPort, rAppInfo.m_szID, rAppInfo.m_szPass ) ) return FALSE; //5. ¾îÇø® ÄÉÀ̼ÇÀº ¾÷µ¥ÀÌÆ®°¡ Çϳª¸¸ ½ÇÆÐÇØµµ, ½ÇÆÐÇϵµ·Ï ÇÑ´Ù. if( !m_pApplicationUpdate->StartUpdate() ) return FALSE; return TRUE; } BOOL CUpdateManager::SaveVersion( BYTE byUpdateType, BYTE byUpdateNumber, CVersionInfo& rInfo ) { return CUpdateScriptParser::GetInstance()->SaveVersion( byUpdateType, byUpdateNumber, rInfo ); } VOID SendWndMessage( UINT unMsgType, VOID* pData ) { if( !CUpdateManager::m_hWnd ) return; if( unMsgType == WM_UPDATE_VERSION_ALARM ) { UPDATE_INFO* pUpdateInfo = (UPDATE_INFO*)pData; if( !pUpdateInfo ) return; CVersionInfo verInfo; verInfo.SetVersionFromString( pUpdateInfo->m_szProcessVer ); eUPDATE_TYPE type = CUpdateScriptParser::GetInstance()->GetUpdateTypeFromProcName( pUpdateInfo->m_szProcessName ); CUpdateManager::SaveVersion( type, pUpdateInfo->m_byUpdateNumber, verInfo ); } PostMessage( CUpdateManager::m_hWnd, unMsgType, (WPARAM)unMsgType, (LPARAM)pData ); } unsigned __stdcall CUpdateManager::UpdateThread( void* pParam ) { CUpdateManager* pManager = (CUpdateManager*)pParam; pManager->ExecuteUpdate(); SendWndMessage( WM_TERMINATE_PROCESS, "" ); return 1; }