Index: src/ch/UpdaterDlg.cpp
===================================================================
diff -u -r449a5b399ab21ca0d06050b47b264f2f704af966 -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0
--- src/ch/UpdaterDlg.cpp	(.../UpdaterDlg.cpp)	(revision 449a5b399ab21ca0d06050b47b264f2f704af966)
+++ src/ch/UpdaterDlg.cpp	(.../UpdaterDlg.cpp)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
@@ -19,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)
@@ -42,44 +45,19 @@
 	fmt.SetParam(_t("%site"), _T(PRODUCT_SITE));
 	m_ctlText.SetWindowText(fmt);
 
+	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()
-{
-	m_ucChecker.CheckForUpdates(_T(PRODUCT_SITE), false);
-
-	ictranslate::CResourceManager& rResManager = GetResManager();
-	ictranslate::CFormat fmt;
-
-	CString strFmt;
-	switch(m_ucChecker.GetResult())
-	{
-	case CUpdateChecker::eResult_Error:
-		strFmt = rResManager.LoadString(IDS_UPDATER_ERROR_STRING);
-		break;
-	case CUpdateChecker::eResult_VersionNewer:
-		strFmt = rResManager.LoadString(IDS_UPDATER_NEW_VERSION_STRING);
-		break;
-	case CUpdateChecker::eResult_VersionCurrent:
-		strFmt = rResManager.LoadString(IDS_UPDATER_EQUAL_VERSION_STRING);
-		break;
-	case CUpdateChecker::eResult_VersionOlder:
-		strFmt = rResManager.LoadString(IDS_UPDATER_OLD_VERSION_STRING);
-		break;
-	}
-
-	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);
@@ -89,8 +67,86 @@
 {
 	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;
+
+		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;
+				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;
+				strFmt = rResManager.LoadString(IDS_UPDATER_EQUAL_VERSION_STRING);
+				break;
+			case CUpdateChecker::eResult_RemoteVersionNewer:
+				TRACE(_T("CUpdateChecker::eResult_RemoteVersionNewer\n"));
+				eBkMode = eRes_Show;
+				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);
+
+			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);