Index: src/ch/UpdaterDlg.cpp =================================================================== diff -u -rd5c3edd0d167db9b5d47d04248820fda49499a5e -r07a3be49b0c7e5599eb89c2f9da9a9272cc1558a --- src/ch/UpdaterDlg.cpp (.../UpdaterDlg.cpp) (revision d5c3edd0d167db9b5d47d04248820fda49499a5e) +++ src/ch/UpdaterDlg.cpp (.../UpdaterDlg.cpp) (revision 07a3be49b0c7e5599eb89c2f9da9a9272cc1558a) @@ -6,7 +6,6 @@ #include "UpdaterDlg.h" #include "UpdateChecker.h" #include "../common/version.h" -#include #define UPDATER_TIMER 639 @@ -20,13 +19,16 @@ IMPLEMENT_DYNAMIC(CUpdaterDlg, ictranslate::CLanguageDialog) -CUpdaterDlg::CUpdaterDlg(CWnd* pParent /*=NULL*/) -: ictranslate::CLanguageDialog(CUpdaterDlg::IDD, pParent) +CUpdaterDlg::CUpdaterDlg(bool bBackgroundMode, CWnd* pParent /*=NULL*/) : + ictranslate::CLanguageDialog(CUpdaterDlg::IDD, pParent), + m_eLastState(CUpdateChecker::eResult_Undefined), + m_bBackgroundMode(bBackgroundMode) { } CUpdaterDlg::~CUpdaterDlg() { + m_ucChecker.Cleanup(); } void CUpdaterDlg::DoDataExchange(CDataExchange* pDX) @@ -39,63 +41,142 @@ { ictranslate::CLanguageDialog::OnInitDialog(); - ictranslate::CFormat fmt(GetResManager()->LoadString(IDS_UPDATER_WAITING_STRING)); + ictranslate::CFormat fmt(GetResManager().LoadString(IDS_UPDATER_WAITING_STRING)); fmt.SetParam(_t("%site"), _T(PRODUCT_SITE)); m_ctlText.SetWindowText(fmt); + // disable button initially + CWnd* pWnd = GetDlgItem(IDC_OPEN_WEBPAGE_BUTTON); + if(pWnd) + pWnd->EnableWindow(FALSE); + + if(!m_bBackgroundMode) + ShowWindow(SW_SHOW); + + // start the updater + m_ucChecker.AsyncCheckForUpdates(_T(PRODUCT_SITE), GetConfig().get_bool(PP_PUPDATE_CHECK_FOR_BETA), m_bBackgroundMode); + + // start a timer to display progress SetTimer(UPDATER_TIMER, 10, NULL); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } -void CUpdaterDlg::StartChecking() +void CUpdaterDlg::OnBnClickedOpenWebpageButton() { - m_ucChecker.CheckForUpdates(_T(PRODUCT_SITE), false); + CString strDownloadAddr = m_ucChecker.GetDownloadAddress(); + if(!strDownloadAddr.IsEmpty()) + { + CString str; + str.Format(_T("Opening a browser with address %s..."), (PCTSTR)strDownloadAddr); + LOG_DEBUG(str); - ictranslate::CResourceManager* pResManager = GetResManager(); - BOOST_ASSERT(pResManager); - if(!pResManager) - return; + str.Format(_T("url.dll,FileProtocolHandler %s"), (PCTSTR)strDownloadAddr); + ulong_t ulRes = (ulong_t)ShellExecute(NULL, _T("open"), _T("rundll32.exe"), str, NULL, SW_SHOW); - ictranslate::CFormat fmt; + str.Format(_T("ShellExecute returned %lu"), ulRes); + LOG_DEBUG(str); - CString strFmt; - switch(m_ucChecker.GetResult()) - { - case CUpdateChecker::eResult_Error: - strFmt = pResManager->LoadString(IDS_UPDATER_ERROR_STRING); - break; - case CUpdateChecker::eResult_VersionNewer: - strFmt = pResManager->LoadString(IDS_UPDATER_NEW_VERSION_STRING); - break; - case CUpdateChecker::eResult_VersionCurrent: - strFmt = pResManager->LoadString(IDS_UPDATER_EQUAL_VERSION_STRING); - break; - case CUpdateChecker::eResult_VersionOlder: - strFmt = pResManager->LoadString(IDS_UPDATER_OLD_VERSION_STRING); - break; + // close the dialog if succeeded; 32 is some arbitrary value from ms docs + if(ulRes > 32) + CUpdaterDlg::OnOK(); } - - fmt.SetFormat(strFmt); - fmt.SetParam(_t("%errdesc"), m_ucChecker.GetLastError()); - fmt.SetParam(_t("%thisver"), _T(PRODUCT_VERSION)); - fmt.SetParam(_t("%officialver"), m_ucChecker.GetReadableVersion()); - - m_ctlText.SetWindowText(fmt); } -void CUpdaterDlg::OnBnClickedOpenWebpageButton() -{ - ShellExecute(NULL, _T("open"), m_ucChecker.GetDownloadAddress(), NULL, NULL, SW_SHOW); -} - void CUpdaterDlg::OnTimer(UINT_PTR nIDEvent) { if(nIDEvent == UPDATER_TIMER) { - KillTimer(UPDATER_TIMER); - StartChecking(); + ictranslate::CResourceManager& rResManager = GetResManager(); + ictranslate::CFormat fmt; + CUpdateChecker::ECheckResult eResult = m_ucChecker.GetResult(); + CString strFmt; + EBkModeResult eBkMode = eRes_None; + bool bEnableButton = false; + + if(eResult != m_eLastState) + { + switch(m_ucChecker.GetResult()) + { + case CUpdateChecker::eResult_Undefined: + TRACE(_T("CUpdateChecker::eResult_Undefined\n")); + eBkMode = eRes_Exit; + strFmt = rResManager.LoadString(IDS_UPDATER_WAITING_STRING); + break; + case CUpdateChecker::eResult_Pending: + TRACE(_T("CUpdateChecker::eResult_Pending\n")); + strFmt = rResManager.LoadString(IDS_UPDATER_WAITING_STRING); + break; + case CUpdateChecker::eResult_Killed: + TRACE(_T("CUpdateChecker::eResult_Killed\n")); + eBkMode = eRes_Exit; + strFmt = rResManager.LoadString(IDS_UPDATER_ERROR_STRING); + break; + case CUpdateChecker::eResult_Error: + TRACE(_T("CUpdateChecker::eResult_Error\n")); + eBkMode = eRes_Exit; + strFmt = rResManager.LoadString(IDS_UPDATER_ERROR_STRING); + break; + case CUpdateChecker::eResult_RemoteVersionOlder: + TRACE(_T("CUpdateChecker::eResult_RemoteVersionOlder\n")); + eBkMode = eRes_Exit; + bEnableButton = true; +// eBkMode = eRes_Show; // for debugging purposes only + strFmt = rResManager.LoadString(IDS_UPDATER_OLD_VERSION_STRING); + break; + case CUpdateChecker::eResult_VersionCurrent: + TRACE(_T("CUpdateChecker::eResult_VersionCurrent\n")); + eBkMode = eRes_Exit; + bEnableButton = true; + strFmt = rResManager.LoadString(IDS_UPDATER_EQUAL_VERSION_STRING); + break; + case CUpdateChecker::eResult_RemoteVersionNewer: + TRACE(_T("CUpdateChecker::eResult_RemoteVersionNewer\n")); + eBkMode = eRes_Show; + bEnableButton = true; + strFmt = rResManager.LoadString(IDS_UPDATER_NEW_VERSION_STRING); + break; + default: + _ASSERTE(FALSE); + eBkMode = eRes_Exit; + return; + } + + fmt.SetFormat(strFmt); + fmt.SetParam(_t("%site"), _t(PRODUCT_SITE)); + fmt.SetParam(_t("%errdesc"), m_ucChecker.GetLastError()); + fmt.SetParam(_t("%thisver"), _T(PRODUCT_VERSION)); + fmt.SetParam(_t("%officialver"), m_ucChecker.GetReadableVersion()); + + m_ctlText.SetWindowText(fmt); + + // Update button state + CWnd* pWnd = GetDlgItem(IDC_OPEN_WEBPAGE_BUTTON); + if(pWnd) + pWnd->EnableWindow(bEnableButton); + + m_eLastState = eResult; + + // handle background mode + if(m_bBackgroundMode) + { + switch(eBkMode) + { + case eRes_None: + break; + case eRes_Exit: + KillTimer(UPDATER_TIMER); + EndDialog(IDCANCEL); + return; + case eRes_Show: + ShowWindow(SW_SHOW); + break; + default: + BOOST_ASSERT(FALSE); + } + } + } } CLanguageDialog::OnTimer(nIDEvent);