713 lines
21 KiB
C++
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);
|
|
}
|