Files
Sun1602/Tools/SunAutoUpdateTool/SunAutoUpdateToolDlg.cpp
T
2022-10-26 12:25:11 +08:00

713 lines
21 KiB
C++

// SunAutoUpdateToolDlg.cpp : 구현 파일
//
#include "stdafx.h"
#include <io.h>
#include "SunAutoUpdateTool.h"
#include ".\sunautoupdatetooldlg.h"
#include <NetClient.h>
#include "BasicLog.h"
#include "ParameterPaser.h"
#include "UpdateScriptInfo.h"
#include <Version.h>
#include <Tlhelp32.h> //PROCESSENTRY32
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//#define _TEST
#define DEFAULT_LOGFILE "UpdateLog"
CNetClient g_NetClient;
BOOL g_bConnectAgent;
CBasicLog g_Log;
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 대화 상자 데이터
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CSunAutoUpdateToolDlg 대화 상자
CSunAutoUpdateToolDlg::CSunAutoUpdateToolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSunAutoUpdateToolDlg::IDD, pParent)
, m_strVersion(_T(""))
, m_strFileName(_T(""))
, m_strFileSize(_T(""))
, m_strDownFolder(_T(""))
, m_strServerName(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
g_bConnectAgent = FALSE;
m_nVer1 = 0;
m_nVer2 = 0;
m_nVer3 = 0;
m_nUpdateCount = 0;
}
void CSunAutoUpdateToolDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STATIC_VERSION, m_strVersion);
DDX_Text(pDX, IDC_STATIC_FILENAME, m_strFileName);
DDX_Text(pDX, IDC_STATIC_FILESIZE, m_strFileSize);
DDX_Text(pDX, IDC_STATIC_SERVER, m_strServerName);
DDX_Control(pDX, IDC_PROGRESS_FILEDOWN, m_progDownload);
DDX_Control(pDX, IDC_LIST_STATUS, m_listStatus);
}
BEGIN_MESSAGE_MAP(CSunAutoUpdateToolDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_WM_CLOSE()
//사용자 정의 메세지
ON_MESSAGE( WM_UPDATE_MODULE_INIT, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_END_SUCCESS, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_END_FAIL, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_VERSION_ALARM, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_LIVE_PROCESS, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_LASTEST_VERSION, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_ERROR, OnCommandMessage )
// ON_MESSAGE( WM_UPDATE_THREAD_FAIL, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_VERSION_CHECK_FAIL, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_NOT_SUPPORT_UPDATE_NUMBER, OnCommandMessage )
ON_MESSAGE( WM_UPDATE_INVALID_PROCESS, OnCommandMessage )
ON_MESSAGE( WM_FTP_CONNECT_SUCCESS, OnCommandMessage )
ON_MESSAGE( WM_FTP_CONNECT_FAIL, OnCommandMessage )
ON_MESSAGE( WM_FTP_DISCONNECT, OnCommandMessage )
ON_MESSAGE( WM_FTP_DIRECTORY_NOTFOUND, OnCommandMessage )
ON_MESSAGE( WM_FTP_FILE_NOTFOUND, OnCommandMessage )
ON_MESSAGE( WM_FTP_FILE_OPEN_FAIL, OnCommandMessage )
ON_MESSAGE( WM_FILE_DOWNLOAD_START, OnCommandMessage )
ON_MESSAGE( WM_FILE_DOWNLOAD_WORKING, OnCommandMessage )
ON_MESSAGE( WM_FILE_DOWNLOAD_END, OnCommandMessage )
ON_MESSAGE( WM_FILE_DOWNLOAD_FAIL, OnCommandMessage )
ON_MESSAGE( WM_FILE_DOWNLOAD_STOP, OnCommandMessage )
ON_MESSAGE( WM_TERMINATE_PROCESS, OnCommandMessage )
ON_MESSAGE( WM_COMMAND_MESSAGE, OnCommandMessage )
ON_WM_TIMER()
END_MESSAGE_MAP()
// CSunAutoUpdateToolDlg 메시지 처리기
BOOL CSunAutoUpdateToolDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
// 프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
m_StringParser.Load( "StringTable.xml" );
//1. 로그 초기화.
if( !InitLog() ) return FALSE;
AddMessage( "********* Start ************" );
//사용자의 윈도우를 업데이트 모듈에 설정한다.
if( !ParsingCommandLine() )
AddMessage( "Parameter Parsing Error!" );
//업데이트 시작
if( !StartUpdateEx() ) //실패하면..종료한다.
{
AddMessage( "Start Update Failed." );
}
return TRUE; // 컨트롤에 대한 포커스를 설정하지 않을 경우 TRUE를 반환합니다.
}
void CSunAutoUpdateToolDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
// 프레임워크에서 이 작업을 자동으로 수행합니다.
void CSunAutoUpdateToolDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
// 이 함수를 호출합니다.
HCURSOR CSunAutoUpdateToolDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//프로세서를 종료시키는 버튼..
void CSunAutoUpdateToolDlg::OnBnClickedOk()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
Release();
CDialog::OnOK();
}
BOOL CSunAutoUpdateToolDlg::InitNetwork( TCHAR* pszIP, WORD wPort )
{
BOOL bRet = FALSE;
DWORD dwErrorCode = 0;
bRet = g_NetClient.Init( dwErrorCode );
if( bRet == FALSE )
{
CString strError;
strError.Format("소켓생성에러 ERROR CODE = %u", dwErrorCode );
return FALSE;
}
bRet = g_NetClient.Connect( pszIP, wPort, dwErrorCode );
if( bRet == FALSE )
{
CString strError;
strError.Format("RTTA연결 에러 ERROR CODE = %u", dwErrorCode );
AddMessage( (LPSTR)strError.GetString() );
//수동모드로..
g_NetClient.DisConnect();
return FALSE;
}
return TRUE;
}
long CSunAutoUpdateToolDlg::OnFileDownloadFail( WPARAM wParam, LPARAM lParam )
{
//CUpdateFileInfo* pInfo = (CUpdateFileInfo*)wParam;
//if( !pInfo )
//{
// AddMessage("[메세지 에러] WM_FTP_FILE_DOWNLOAD_FAIL" );
// OnBnClickedOk();
//}
//TCHAR szFileName[MAX_PATH_SIZE];
//pInfo->GetFileName( szFileName, MAX_PATH_SIZE );
//AddMessage( "파일 받기 실패(연결에 문제가 있을수 있습니다.) FileName = %s ", szFileName );
//// 알티티 연결되어 있는 상태에서 파일 다운로드 실패면..
//// 런처든 어플리케이션이든 알티티에 메세지를 보낸다. 그리고 프로세서 종료한다.
//if( g_bConnectAgent == TRUE )
//{
// BOOL bRet = SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_DOWNLOAD_FAIL );
// OnBnClickedOk();
//}
return 0;
}
void CSunAutoUpdateToolDlg::SetTitle(void)
{
CString strTitle;
CString strLauncher;
if( m_StartManager.GetLauncherStartType() == START_TYPE_NORMAL )
strLauncher = ", NORMAL";
else if( m_StartManager.GetLauncherStartType() == START_TYPE_LAUNCHER )
strLauncher = ", LAUNCHER";
strTitle.Format( "SunAutoUpdateTool(Ver:%d-%d-%d) %s(%s)", HIGH_VERSION, MIDDLE_VERSION, LOW_VERSION, strLauncher, g_bConnectAgent ? "CONNECT-AGENT" : "DISCONNECT-AGENT" );
SetWindowText( strTitle );
}
BOOL CSunAutoUpdateToolDlg::InitLog()
{
// 로그 초기화.
TCHAR szDir[MAX_PATH];
m_StartManager.GetModuleDirectory( szDir, MAX_PATH );
if( !g_Log.Init( szDir, DEFAULT_LOGFILE ) )
{
AfxMessageBox("LOG 모듈 초기화 실패");
return FALSE;
}
return TRUE;
}
BOOL CSunAutoUpdateToolDlg::ConnectAgent( TCHAR* pszIP, WORD wPort )
{
if( InitNetwork( pszIP, wPort ) ) //자동모드
{
AddMessage( "RTTA 연결 성공" );
//RTTA와 연결되었으므로 RTTA를 가동시킨다.
g_NetClient.Run();
}
else
return FALSE;
return TRUE;
}
void CSunAutoUpdateToolDlg::SetWndHandle()
{
HWND hDlgWnd = GetSafeHwnd();
m_UpdateManager.SetWndHandle( hDlgWnd );
}
BOOL CSunAutoUpdateToolDlg::ParsingCommandLine()
{
TCHAR* pCmd = GetCommandLine();
AddMessage( pCmd );
return m_StartManager.Init( pCmd );
}
void CSunAutoUpdateToolDlg::AddMessage( char* pszMsg, ... )
{
int nSize = (int)strlen( pszMsg );
static char szBuffer[256];
szBuffer[0] = '0';
va_list args;
va_start(args, pszMsg);
_vsnprintf( szBuffer, 256, pszMsg, args );
va_end(args);
m_listStatus.AddString( szBuffer );
int nCount = m_listStatus.GetCount();
m_listStatus.SetCurSel( nCount );
g_Log.InsertMessage( szBuffer );
}
//byPatchNum은 패치 순서이다. 1개만 패치 했을때는 0이고.
//2개 이상 패치했을 경우에는, 완료되는 순서대로, 0, 1, 2.. 이런식으로 증가한다.
BOOL CSunAutoUpdateToolDlg::SendRTTAMessage( DWORD dwErrorCode, BYTE byServerType, BYTE byPatchNum, CVersionInfo& rVerInfo )
{
if( !g_bConnectAgent || byServerType == MAX_SERVER )
return FALSE;
MSG_MO_RTTG_PATCHRESULT_ANS msg;
msg.dwError = dwErrorCode;
msg.byNum = byPatchNum;
msg.byServerType = byServerType;
//Key값은 RTTA이면, 처음 RTTA가 준 값을 쓰면 되며,
//UpdateAgent면.. 유저키가 날라오므로, 그 값을 전하면 된다.
if( CUpdateScriptParser::GetInstance()->GetAgentInfo().m_byAgentMode == 0 ) //RTTA
msg.dwKey = g_NetClient.m_dwKey;
else if( CUpdateScriptParser::GetInstance()->GetAgentInfo().m_byAgentMode == 1 ) //UpdateAgent
msg.dwKey = m_StartManager.GetParamKey();
msg.byVer1 = rVerInfo.GetVersion( 0 );
msg.byVer2 = rVerInfo.GetVersion( 1 );
msg.byVer3 = rVerInfo.GetVersion( 2 );
int nErrorCode = 0;
int nSize = sizeof(msg);
int nRetSize = g_NetClient.SendData( (char*)&msg, nSize, nErrorCode );
BOOL bRet = (nRetSize != -1) ? TRUE : FALSE;
if( bRet )
{
AddMessage( "[AgentSend] ErrorCode = %s, Num = %d, ServerType = %d, ver=%d.%d.%d, key = %d, SendSize = %d, RetSize = %d",
GetRttaResultStr( msg.dwError ).GetString(), msg.byNum, msg.byServerType, msg.byVer1, msg.byVer2, msg.byVer3, msg.dwKey, nSize, nRetSize );
}
return bRet;
}
CString CSunAutoUpdateToolDlg::GetRttaResultStr( DWORD dwMsg )
{
CString strMsg;
switch( dwMsg )
{
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_PATCHSUCCESS :
strMsg = "패치성공";
break;
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_PROCESSRUN :
strMsg = "프로세서가 살아있음";
break;
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_FTPCONNECT_FAIL :
strMsg = "FTP연결실패";
break;
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_DOWNLOAD_FAIL :
strMsg = "다운로드 실패";
break;
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_FILENOTFOUND :
strMsg = "FILE NOT FOUND";
break;
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_INVALID_SERVERTYPE :
strMsg = "INVALID SERVER TYPE";
break;
case MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_LASTEST_VERSION :
strMsg = "최신버전임";
break;
default:
strMsg = "알수없는 결과";
break;
}
return strMsg;
}
long CSunAutoUpdateToolDlg::OnCommandMessage( WPARAM wParam, LPARAM lParam )
{
TCHAR szMsg[MAX_PATH];
ZeroMemory( szMsg, MAX_PATH );
CUpdateFolderInfo* pFolderInfo = NULL;
CUpdateFileInfo* pFileInfo = NULL;
CVersionInfo* pVersion = NULL;
PROCESS_INFO* pProcessInfo = NULL;
CVersionInfo VersionInfo;
UPDATE_INFO* pUpdateInfo = NULL;
UPDATE_FILE_INFO* pUpdateFileInfo = NULL;
double dResult = 0;
BYTE byUpdateNum = 0;
BYTE byServerType = 0;
std::string strMsg;
m_StringParser.GetMessage( (DWORD)(wParam - WM_USER), strMsg );
switch( wParam )
{
//UPDATE
case WM_UPDATE_MODULE_INIT :
AddMessage( "FTP Module Init" );
break;
case WM_UPDATE_END_SUCCESS:
pProcessInfo = (PROCESS_INFO*)lParam;
VersionInfo.SetVersionFromString( pProcessInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pProcessInfo->m_szProcessName );
AddMessage( "%s : %s = %s ", pProcessInfo->m_szProcessName, strMsg.c_str(), pProcessInfo->m_szProcessVer );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_PATCHSUCCESS, byServerType, pProcessInfo->m_byUpdateSequence, VersionInfo);
break;
case WM_UPDATE_END_FAIL:
pProcessInfo = (PROCESS_INFO*)lParam;
VersionInfo.SetVersionFromString( pProcessInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pProcessInfo->m_szProcessName );
AddMessage( "%s : %s = %s ", pProcessInfo->m_szProcessName, strMsg.c_str(), pProcessInfo->m_szProcessVer );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_PATCHFAIL, byServerType, pProcessInfo->m_byUpdateSequence, VersionInfo);
break;
case WM_UPDATE_VERSION_ALARM:
pUpdateInfo = (UPDATE_INFO*)lParam;
AddMessage( "%s : %s Ver = %s", pUpdateInfo->m_szProcessName, strMsg.c_str(), pUpdateInfo->m_szProcessVer );
break;
case WM_UPDATE_LIVE_PROCESS:
pProcessInfo = (PROCESS_INFO*)lParam;
VersionInfo.SetVersionFromString( pProcessInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pProcessInfo->m_szProcessName );
AddMessage( "%s : %s Ver = %s ", pProcessInfo->m_szProcessName, strMsg.c_str(), pProcessInfo->m_szProcessVer );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_PROCESSRUN, byServerType, pProcessInfo->m_byUpdateSequence, VersionInfo);
break;
case WM_UPDATE_LASTEST_VERSION:
pProcessInfo = (PROCESS_INFO*)lParam;
VersionInfo.SetVersionFromString( pProcessInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pProcessInfo->m_szProcessName );
AddMessage( "%s : %s Ver = %s ", pProcessInfo->m_szProcessName, strMsg.c_str(), pProcessInfo->m_szProcessVer );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_LASTEST_VERSION, byServerType, pProcessInfo->m_byUpdateSequence, VersionInfo);
break;
case WM_UPDATE_ERROR:
pProcessInfo = (PROCESS_INFO*)lParam;
AddMessage( "%s : %s Ver = %s ", pProcessInfo->m_szProcessName, strMsg.c_str(), pProcessInfo->m_szProcessVer );
break;
case WM_UPDATE_VERSION_CHECK_FAIL:
pProcessInfo = (PROCESS_INFO*)lParam;
VersionInfo.SetVersionFromString( pProcessInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pProcessInfo->m_szProcessName );
AddMessage( "%s : %s Ver = %s ", pProcessInfo->m_szProcessName, strMsg.c_str(), pProcessInfo->m_szProcessVer );
break;
case WM_UPDATE_NOT_SUPPORT_UPDATE_NUMBER:
byUpdateNum = (BYTE)lParam;
AddMessage( "%s UpdateNumber = %d ", strMsg.c_str(), byUpdateNum );
break;
case WM_UPDATE_INVALID_PROCESS:
byServerType = (BYTE)lParam;
AddMessage( "%s = %d", strMsg.c_str(), byServerType );
VersionInfo.SetVersionFromString( "0.0.0" );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_INVALID_SERVERTYPE, byServerType, 0, VersionInfo);
break;
//FTP
case WM_FTP_CONNECT_SUCCESS:
strncpy( szMsg, (TCHAR*)lParam, MAX_PATH );
AddMessage( "%s : %s", szMsg, strMsg.c_str() );
break;
case WM_FTP_CONNECT_FAIL:
strncpy( szMsg, (TCHAR*)lParam, MAX_PATH );
AddMessage( "%s : %s", szMsg, strMsg.c_str() );
VersionInfo.SetVersionFromString("0.0.0");
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_FTPCONNECT_FAIL, 1, 0, VersionInfo);
break;
case WM_FTP_DISCONNECT:
strncpy( szMsg, (TCHAR*)lParam, MAX_PATH );
AddMessage( "%s : %s", szMsg, strMsg.c_str() );
break;
case WM_FTP_DIRECTORY_NOTFOUND:
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
VersionInfo.SetVersionFromString( pUpdateFileInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pUpdateFileInfo->m_szProcessName );
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_DOWNLOAD_FAIL, byServerType, pUpdateFileInfo->m_byUpdateSequence, VersionInfo);
break;
case WM_FTP_FILE_NOTFOUND: //FTP에 파일이 존재하지 않는다.
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
VersionInfo.SetVersionFromString( pUpdateFileInfo->m_szProcessVer );
byServerType = m_StartManager.GetServerTypeFromServerName( pUpdateFileInfo->m_szProcessName );
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
SendRTTAMessage( MSG_MO_RTTG_PATCHRESULT_ANS::ERROR_FILENOTFOUND, byServerType, pUpdateFileInfo->m_byUpdateSequence, VersionInfo);
break;
case WM_FTP_FILE_OPEN_FAIL: //FTP에 파일은 존재하는데, 열기에 실패하였다.
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
break;
//FILE
case WM_FILE_DOWNLOAD_START:
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
break;
case WM_FILE_DOWNLOAD_END:
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
break;
case WM_FILE_DOWNLOAD_FAIL:
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
break;
case WM_FILE_DOWNLOAD_WORKING:
pFileInfo = (CUpdateFileInfo*)lParam;
m_strFileName = pFileInfo->GetFileName();
m_strFileSize.Format( "%d / %d Bytes", pFileInfo->GetWholeFileSize(), pFileInfo->GetNowFileSize() );
dResult = (double)(pFileInfo->GetNowFileSize()*100) / (double)pFileInfo->GetWholeFileSize();
m_progDownload.SetPos( (int)dResult );
UpdateData( FALSE );
break;
case WM_FILE_DOWNLOAD_STOP:
pUpdateFileInfo = (UPDATE_FILE_INFO*)lParam;
AddMessage( "%s : %s(%s)", pUpdateFileInfo->m_szProcessName, strMsg.c_str(), pUpdateFileInfo->m_szFileName );
break;
//ETC
case WM_TERMINATE_PROCESS:
AddMessage( "%s", strMsg.c_str() );
SetTimer( WM_TERMINATE_PROCESS, 100, NULL );
break;
case WM_COMMAND_MESSAGE:
strncpy( szMsg, (TCHAR*)lParam, MAX_PATH );
AddMessage( szMsg );
break;
default:
return 0;
}
return 0;
}
void CSunAutoUpdateToolDlg::Release()
{
AddMessage("업데이트툴을 종료합니다.");
m_UpdateManager.Release();
g_Log.CloseLog();
g_NetClient.Close();
m_StringParser.Release();
}
BOOL CSunAutoUpdateToolDlg::StartUpdateEx()
{
// 파서 파싱
if( !CUpdateScriptParser::GetInstance()->LoadData() )
return FALSE;
//윈도우 핸들 등록.
SetWndHandle();
//AGENT NETWORK 초기화
AGENT_INFO& rAgentInfo = CUpdateScriptParser::GetInstance()->GetAgentInfo();
g_bConnectAgent = ConnectAgent( rAgentInfo.m_szAgentIP, rAgentInfo.m_wAgentPort );
//업데이트 매니져 초기화
//LAUNCHER 로 시작되는 경우는 LAUNCHER를 업데이트 시킬 필요가 있는 경우이다. 런처를 업데이트 하고 바로 종료한다.
//Sub파라미터가 있다는 것은 스크립트를 적용하지 않고, 파라미터로 결정하겠다는 뜻이다.
BYTE bySubParamCnt = m_StartManager.GetSubParameterCount();
BOOL bApplyScript = FALSE;
BYTE byManualAppUpdateNumber = 0; //수동 어플리케이션 업데이트 넘버.
TCHAR szSubParam[MAX_PATH];
ZeroMemory( szSubParam, MAX_PATH );
//서브 파라미터가 없거나, 있어도 서버타입이 0 이여서 설정된 전체값 패치이면.
if ( bySubParamCnt == 0 || m_StartManager.GetParamServerType() == 0 )
{
bApplyScript = TRUE;
byManualAppUpdateNumber = 0; //bApplyScript가 TRUE이면, 이 인자는 적용되지 않는다.
}
else //서버 파라미터가 있고, 일부분 패치이다.
{
bApplyScript = FALSE;
TCHAR szServerName[MAX_PATH];
if( !m_StartManager.GetServerNameFromServerType( m_StartManager.GetParamServerType(), szServerName, MAX_PATH ) )
return FALSE;
#ifdef __20080402_ADD_SOLARSCUPDATE_
if( strcmp(szServerName, "SolarAuthServer") == 0 )
{
bApplyScript = TRUE;
byManualAppUpdateNumber = 0;
}
else
{
#endif
byManualAppUpdateNumber = CUpdateScriptParser::GetInstance()->GetUpdateNumFromProcName( UPDATE_TYPE_APPLICATION, szServerName );
if( byManualAppUpdateNumber == 0 )
{
//들어온 서버타입에 해당하는 값이, 툴에 설정되어 있지 않으면..
//잘못된 값이 들어온거다.
//여기에 들어오면 하나만 패치하는 것이므로, seq는 0으로 한다.
//당연히 서버타입이 없으므로, 버전도 존재하지 않는다.
PostMessage( WM_UPDATE_INVALID_PROCESS, WM_UPDATE_INVALID_PROCESS, m_StartManager.GetParamServerType() );
SetTimer( WM_UPDATE_INVALID_PROCESS, 100, NULL );
return FALSE;
}
#ifdef __20080402_ADD_SOLARSCUPDATE_
}
#endif
}
//여기서 생성 들어간다.
if( !m_UpdateManager.Init( m_StartManager.GetLauncherStartType(), bApplyScript, byManualAppUpdateNumber, m_StartManager.GetSubParameter() ) )
return FALSE;
SetTitle();
m_UpdateManager.StartUpdate();
return TRUE;
}
BOOL CSunAutoUpdateToolDlg::DeadMyself()
{
// 프로세스 체크 런쳐나 게임 클라이언트가 실행중인지 체크한다
UINT uExitCode = 0;
//Iterate thru all processes
DWORD dwMyID = GetCurrentProcessId();
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwMyID );
if( !TerminateProcess(hProcess, uExitCode) )
{
CloseHandle( hProcess );
return FALSE;
}
CloseHandle( hProcess );
return TRUE;
}
void CSunAutoUpdateToolDlg::OnTimer(UINT nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
switch( nIDEvent )
{
case WM_UPDATE_INVALID_PROCESS :
Release();
PostQuitMessage(0);
break;
case WM_TERMINATE_PROCESS :
Release();
PostQuitMessage(0);
break;
}
CDialog::OnTimer(nIDEvent);
}