// AutoUpdateDlg.cpp : implementation file // #include "stdafx.h" #include "DnAutoUpdate.h" #include "DnAutoUpdateDlg.h" #include "CHttpDownload.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CString g_strHttpPath; CString g_strLocalPath; vector g_vecUpdateVersion; CString g_strCurrentDownloadFileName; int g_nCurrentDownloadCount; CHttpDownload g_HttpDownload; CDnAutoUpdateDlg* g_pMainDialog; // Download Thread UINT threadDownloadProc( LPVOID pParam ) { HINTERNET hInternetSession; // ¼¼¼Ç ¿­±â hInternetSession = InternetOpen( NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); if( hInternetSession != NULL ) { int nRtn = CHttpDownload::HTTPDOWNLOAD_ERROR; int nVersionCount = static_cast( g_vecUpdateVersion.size() ); for( int i=0; iDownloadComplete( nRtn ); } return 0; } // CDnAutoUpdateDlg dialog CDnAutoUpdateDlg::CDnAutoUpdateDlg(CWnd* pParent /*=NULL*/) : CDialog(CDnAutoUpdateDlg::IDD, pParent), m_bShowWindow( FALSE ), m_bShowTrayTooltip( FALSE ), m_pThread( NULL ), m_bDownloadEnd( FALSE ), m_dwExitTick( 0 ) { m_hIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME ); g_pMainDialog = this; } void CDnAutoUpdateDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control( pDX, IDC_PROGRESS1, m_progressCtrl ); } BEGIN_MESSAGE_MAP(CDnAutoUpdateDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_SYSCOMMAND() ON_WM_DESTROY() ON_WM_TIMER() ON_WM_CLOSE() ON_WM_WINDOWPOSCHANGING() ON_MESSAGE( WM_NOTIFYICON_MSG, OnTrayNotifyMsg ) ON_COMMAND( ID_AUTOUPDATE_EXIT, OnExit ) ON_COMMAND( ID_AUTOUPDATE_PAUSE, &CDnAutoUpdateDlg::OnBnClickedButtonPause ) ON_COMMAND( ID_AUTOUPDATE_RESUME, &CDnAutoUpdateDlg::OnBnClickedButtonResume ) //}}AFX_MSG_MAP ON_BN_CLICKED( IDC_BUTTON_PAUSE, &CDnAutoUpdateDlg::OnBnClickedButtonPause ) ON_BN_CLICKED( IDC_BUTTON_RESUME, &CDnAutoUpdateDlg::OnBnClickedButtonResume ) ON_BN_CLICKED( IDC_BUTTON_EXIT, &CDnAutoUpdateDlg::OnBnClickedButtonExit ) END_MESSAGE_MAP() void CDnAutoUpdateDlg::OnDestroy() { // Thread Terminate if( m_pThread ) { g_HttpDownload.SetExit( TRUE ); ::WaitForSingleObject( m_pThread->m_hThread, INFINITE ); } Shell_NotifyIcon( NIM_DELETE, &m_stNID ); // Æ®·¹ÀÌ ÇØÁ¦ CDialog::OnDestroy(); } // CDnAutoUpdateDlg message handlers void CDnAutoUpdateDlg::OnClose() { ShowWindowEx( SW_HIDE ); } BOOL CDnAutoUpdateDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // Æ®·¹ÀÌ Ç³¼±¸» Ç¥½Ã m_stNID.cbSize = sizeof( NOTIFYICONDATA ); m_stNID.hWnd = this->GetSafeHwnd();; m_stNID.dwInfoFlags = NIIF_USER; //dz¼±¿¡ ¶ã ¾ÆÀÌÄÜÀ» »ç¿ëÀÚ ÁöÁ¤ ¾ÆÀÌÄÜÀ¸·Î m_stNID.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO; m_stNID.uID = IDR_MAINFRAME; m_stNID.uCallbackMessage = WM_NOTIFYICON_MSG; m_stNID.hIcon = LoadIcon( AfxGetInstanceHandle(), MAKEINTRESOURCE (IDR_MAINFRAME) ); m_stNID.uTimeout = 4000; CString strInfoTitle(_T("DragonNest")); CString strInfo(_T("AutoUpdate Start!")); lstrcpyn( m_stNID.szInfoTitle, (LPCTSTR)strInfoTitle, sizeof( m_stNID.szInfoTitle ) ); lstrcpyn( m_stNID.szInfo, (LPCTSTR)strInfo, sizeof( m_stNID.szTip ) ); Shell_NotifyIcon( NIM_ADD, &m_stNID ); m_TrayMenu.LoadMenu(IDR_MENU1); // ´Ù¿î·Îµå ¾²·¹µå »ý¼º m_pThread = AfxBeginThread( threadDownloadProc , this ); SetTimer( 1, 500, 0 ); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDnAutoUpdateDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Center icon in client rectangle 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; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDnAutoUpdateDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CDnAutoUpdateDlg::OnExit() { CDialog::OnOK(); } LRESULT CDnAutoUpdateDlg::OnTrayNotifyMsg( WPARAM wParam, LPARAM lParam ) { UINT uMsg = (UINT) lParam; switch( uMsg ) { case WM_LBUTTONDBLCLK: ShowWindowEx( SW_SHOW ); break; case WM_RBUTTONUP: { CPoint pt; GetCursorPos( &pt ); m_TrayMenu.GetSubMenu( 0 )->TrackPopupMenu( TPM_RIGHTALIGN | TPM_LEFTBUTTON ,pt.x, pt.y, this ); } break; case WM_MOUSEMOVE: { if( !m_bShowTrayTooltip ) { Shell_NotifyIcon( NIM_DELETE, &m_stNID ); m_stNID.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIcon( NIM_ADD, &m_stNID ); m_bShowTrayTooltip = TRUE; } } break; } return TRUE; } void CDnAutoUpdateDlg::OnWindowPosChanging( WINDOWPOS FAR* lpwndpos ) { CDialog::OnWindowPosChanging(lpwndpos); if( m_bShowWindow ) lpwndpos->flags |= SWP_SHOWWINDOW; else lpwndpos->flags &= ~SWP_SHOWWINDOW; } BOOL CDnAutoUpdateDlg::ShowWindowEx( int nCmdShow ) { m_bShowWindow = ( nCmdShow == SW_SHOW ); return (GetSafeHwnd()) ? ShowWindow( nCmdShow ) : TRUE; } void CDnAutoUpdateDlg::OnSysCommand( UINT nID, LPARAM lParam ) { if( (nID & 0xFFF0) == SC_MINIMIZE ) // ÃÖ¼ÒÈ­ ¹öưÀº °É·¯¼­ Hide 󸮸¸ ÇÑ´Ù. ShowWindowEx( SW_HIDE ); else CDialog::OnSysCommand( nID, lParam ); } void CDnAutoUpdateDlg::OnBnClickedButtonPause() { if( m_pThread ) SuspendThread( m_pThread->m_hThread ); } void CDnAutoUpdateDlg::OnBnClickedButtonResume() { if( m_pThread ) ResumeThread( m_pThread->m_hThread ); } void CDnAutoUpdateDlg::OnBnClickedButtonExit() { CDialog::OnOK(); } void CDnAutoUpdateDlg::OnTimer( UINT_PTR nIDEvent ) { CDialog::OnTimer(nIDEvent); m_progressCtrl.SetRange32( 0, g_HttpDownload.GetTotalFileSize() ); m_progressCtrl.SetPos( g_HttpDownload.GetTotalDownloadBytes() ); SetDownloadInfo( g_HttpDownload.GetDownloadRate(), g_HttpDownload.GetDownloadPercent() ); if( m_bDownloadEnd ) { if( GetTickCount() - m_dwExitTick > 5000 ) CDialog::OnOK(); } } void CDnAutoUpdateDlg::SetDownloadInfo( float fRate, float fPercent ) { CString strState; if( fPercent < 10.0f ) strState.Format( L"Download Patch : %1.0f%%\n[%4.2f KB/s]", fPercent, fRate ); else if( fPercent < 100.0f ) strState.Format( L"Download Patch : %2.0f%%\n[%4.2f KB/s]", fPercent, fRate ); else strState.Format( L"Download Patch : %3.0f%%\n[%4.2f KB/s]", fPercent, fRate ); GetDlgItem( IDC_STATIC_STATE )->SetWindowText( strState ); GetDlgItem( IDC_STATIC_FILENAME )->SetWindowText( g_strCurrentDownloadFileName ); strState.Format( L"%d / %d", g_nCurrentDownloadCount, g_vecUpdateVersion.size() ); GetDlgItem( IDC_STATIC_DOWNLOAD_COUNT )->SetWindowText( strState ); if( m_bShowTrayTooltip ) { m_stNID.dwInfoFlags = NIIF_NONE; m_stNID.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; m_stNID.uTimeout = 0; lstrcpyn( m_stNID.szTip, (LPCTSTR)strState, sizeof( m_stNID.szTip ) ); DWORD dwMessage = NIM_MODIFY; Shell_NotifyIcon( dwMessage, &m_stNID ); } } void CDnAutoUpdateDlg::DownloadComplete( int nRtn ) { Shell_NotifyIcon( NIM_DELETE, &m_stNID ); m_stNID.dwInfoFlags = NIIF_USER; //dz¼±¿¡ ¶ã ¾ÆÀÌÄÜÀ» »ç¿ëÀÚ ÁöÁ¤ ¾ÆÀÌÄÜÀ¸·Î m_stNID.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO; m_stNID.hIcon = LoadIcon( AfxGetInstanceHandle(), MAKEINTRESOURCE (IDR_MAINFRAME) ); m_stNID.uTimeout = 4000; CString strInfoTitle( _T("DragonNest") ); CString strInfo; if( nRtn == CHttpDownload::HTTPDOWNLOAD_SUCCESS || nRtn == CHttpDownload::HTTPDOWNLOAD_ALREADY_DOWNLOAD ) strInfo = _T("AutoUpdate Complete!"); else strInfo = _T("AutoUpdate Failed!"); lstrcpyn( m_stNID.szInfoTitle, (LPCTSTR)strInfoTitle, sizeof( m_stNID.szInfoTitle ) ); lstrcpyn( m_stNID.szInfo, (LPCTSTR)strInfo, sizeof( m_stNID.szTip ) ); Shell_NotifyIcon( NIM_ADD, &m_stNID ); m_bShowTrayTooltip = FALSE; m_bDownloadEnd = TRUE; m_dwExitTick = GetTickCount(); }