333 lines
6.1 KiB
C++
333 lines
6.1 KiB
C++
|
//=======================================================================
|
||
|
//
|
||
|
// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// File: progress.cpp
|
||
|
//
|
||
|
// Purpose: Progress dialog and connection speed
|
||
|
//
|
||
|
// History: 12-dec-98 YAsmi Created
|
||
|
//
|
||
|
//=======================================================================
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "progress.h"
|
||
|
#include "locstr.h"
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// CWUProgress class
|
||
|
//
|
||
|
CWUProgress::CWUProgress(HINSTANCE hInst)
|
||
|
:m_hInst(hInst),
|
||
|
m_hDlg(NULL),
|
||
|
m_dwDownloadTotal(0),
|
||
|
m_dwDownloadVal(0),
|
||
|
m_dwInstallVal(0),
|
||
|
m_dwInstallTotal(0),
|
||
|
m_style(ProgStyle::NORMAL)
|
||
|
{
|
||
|
m_hCancelEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||
|
}
|
||
|
|
||
|
CWUProgress::~CWUProgress()
|
||
|
{
|
||
|
Destroy();
|
||
|
if (m_hCancelEvent != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
CloseHandle(m_hCancelEvent);
|
||
|
m_hCancelEvent = INVALID_HANDLE_VALUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::SetStyle(ProgStyle style)
|
||
|
{
|
||
|
m_style = style;
|
||
|
if (m_style == ProgStyle::OFF)
|
||
|
{
|
||
|
Destroy();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
HANDLE CWUProgress::GetCancelEvent()
|
||
|
{
|
||
|
return m_hCancelEvent;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::Destroy()
|
||
|
{
|
||
|
if (m_hDlg != NULL)
|
||
|
{
|
||
|
::DestroyWindow(m_hDlg);
|
||
|
m_hDlg = NULL;
|
||
|
}
|
||
|
m_style = ProgStyle::OFF;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::StartDisplay()
|
||
|
{
|
||
|
if (m_style == ProgStyle::OFF)
|
||
|
return;
|
||
|
|
||
|
if (m_hDlg == NULL)
|
||
|
{
|
||
|
// create the dialog window
|
||
|
m_hDlg = CreateDialogParam(m_hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0,
|
||
|
CWUProgress::DlgProc, (LPARAM)this);
|
||
|
}
|
||
|
ShowWindow(m_hDlg, SW_SHOWNORMAL);
|
||
|
|
||
|
if (m_style == ProgStyle::DOWNLOADONLY)
|
||
|
{
|
||
|
ShowWindow(GetDlgItem(m_hDlg, IDC_PROG_INSTALL), SW_HIDE);
|
||
|
ShowWindow(GetDlgItem(m_hDlg, IDC_INSTALLCAP), SW_HIDE);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// update localized strings
|
||
|
//
|
||
|
UpdateLocStr(IDC_DOWNLOADCAP, IDS_PROG_DOWNLOADCAP);
|
||
|
UpdateLocStr(IDC_TIMELEFTCAP, IDS_PROG_TIMELEFTCAP);
|
||
|
UpdateLocStr(IDC_INSTALLCAP, IDS_PROG_INSTALLCAP);
|
||
|
UpdateLocStr(IDCANCEL, IDS_PROG_CANCEL);
|
||
|
|
||
|
SetWindowText(m_hDlg, GetLocStr(IDS_APP_TITLE));
|
||
|
|
||
|
ResetAll();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::ResetAll()
|
||
|
{
|
||
|
SetInstall(0);
|
||
|
SetDownload(0);
|
||
|
ResetEvent(m_hCancelEvent);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::UpdateLocStr(int iDlg, int iStr)
|
||
|
{
|
||
|
LPCTSTR pszStr = GetLocStr(iStr);
|
||
|
|
||
|
if (NULL != pszStr && pszStr[0] != _T('\0'))
|
||
|
{
|
||
|
//update the control with loc string only if its not an empty string
|
||
|
if (m_style != ProgStyle::OFF)
|
||
|
{
|
||
|
SetDlgItemText(m_hDlg, iDlg, pszStr);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::SetDownloadTotal(DWORD dwTotal)
|
||
|
{
|
||
|
m_dwDownloadTotal = dwTotal;
|
||
|
m_dwDownloadLast = 0;
|
||
|
m_dwDownloadVal = 0;
|
||
|
|
||
|
if (m_style != ProgStyle::OFF)
|
||
|
{
|
||
|
UpdateBytes(0);
|
||
|
UpdateTime(m_dwDownloadTotal);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CWUProgress::SetInstallTotal(DWORD dwTotal)
|
||
|
{
|
||
|
m_dwInstallTotal = dwTotal;
|
||
|
m_dwInstallLast = 0;
|
||
|
m_dwInstallVal = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::SetDownload(DWORD dwDone)
|
||
|
{
|
||
|
if (m_dwDownloadTotal == 0 || m_style == ProgStyle::OFF)
|
||
|
return;
|
||
|
|
||
|
if (dwDone > m_dwDownloadTotal)
|
||
|
dwDone = m_dwDownloadTotal;
|
||
|
|
||
|
m_dwDownloadVal = dwDone;
|
||
|
|
||
|
// update bytes display
|
||
|
UpdateBytes(dwDone);
|
||
|
|
||
|
// update progress bar and time
|
||
|
DWORD dwProgress = (int)((double)dwDone / m_dwDownloadTotal * 100);
|
||
|
if (dwProgress != m_dwDownloadLast || dwDone == m_dwDownloadTotal)
|
||
|
{
|
||
|
m_dwDownloadLast = dwProgress;
|
||
|
|
||
|
SendMessage(GetDlgItem(m_hDlg, IDC_PROG_DOWNLOAD), PBM_SETPOS, dwProgress, 0);
|
||
|
|
||
|
if (dwDone == m_dwDownloadTotal)
|
||
|
{
|
||
|
ShowWindow(GetDlgItem(m_hDlg, IDC_TIMELEFTCAP), SW_HIDE);
|
||
|
ShowWindow(GetDlgItem(m_hDlg, IDC_TIMELEFT), SW_HIDE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UpdateTime(m_dwDownloadTotal - dwDone);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::SetDownloadAdd(DWORD dwAddSize, DWORD dwTime)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// add size and time to the connection speed tracker
|
||
|
//
|
||
|
CConnSpeed::Learn(dwAddSize, dwTime);
|
||
|
|
||
|
SetDownload(m_dwDownloadVal + dwAddSize);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::SetInstallAdd(DWORD dwAdd)
|
||
|
{
|
||
|
SetInstall(m_dwInstallVal + dwAdd);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::SetInstall(DWORD dwDone)
|
||
|
{
|
||
|
if (m_hDlg == NULL || m_dwInstallTotal == 0 || m_style == ProgStyle::OFF)
|
||
|
return;
|
||
|
|
||
|
if (dwDone > m_dwInstallTotal)
|
||
|
dwDone = m_dwInstallTotal;
|
||
|
|
||
|
m_dwInstallVal = dwDone;
|
||
|
|
||
|
DWORD dwProgress = (int)((double)dwDone / m_dwInstallTotal * 100);
|
||
|
if (dwProgress != m_dwInstallLast || dwDone == m_dwInstallTotal)
|
||
|
{
|
||
|
m_dwInstallLast = dwProgress;
|
||
|
SendMessage(GetDlgItem(m_hDlg, IDC_PROG_INSTALL), PBM_SETPOS, dwProgress, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CWUProgress::SetStatusText(LPCTSTR pszStatus)
|
||
|
{
|
||
|
if (m_hDlg == NULL || m_style == ProgStyle::OFF)
|
||
|
return;
|
||
|
|
||
|
SetDlgItemText(m_hDlg, IDC_STATUS, pszStatus);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::EndDisplay()
|
||
|
{
|
||
|
if (m_hDlg == NULL || m_style == ProgStyle::OFF)
|
||
|
return;
|
||
|
ShowWindow(m_hDlg, SW_HIDE);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::UpdateBytes(DWORD dwDone)
|
||
|
{
|
||
|
TCHAR szBuf[128];
|
||
|
|
||
|
wsprintf(szBuf, _T("%d KB/%d KB"), dwDone / 1024, m_dwDownloadTotal / 1024);
|
||
|
SetDlgItemText(m_hDlg, IDC_BYTES, szBuf);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CWUProgress::UpdateTime(DWORD dwBytesLeft)
|
||
|
{
|
||
|
DWORD dwBPS = CConnSpeed::BytesPerSecond();
|
||
|
TCHAR szBuf[128];
|
||
|
|
||
|
if (dwBPS != 0)
|
||
|
{
|
||
|
DWORD dwSecs;
|
||
|
DWORD dwMinutes;
|
||
|
DWORD dwHours;
|
||
|
DWORD dwSecsLeft = 0;
|
||
|
|
||
|
dwSecsLeft = (dwBytesLeft / dwBPS) + 1;
|
||
|
|
||
|
// convert secs to hours, minutes, and secs
|
||
|
dwSecs = dwSecsLeft % 60;
|
||
|
dwMinutes = (dwSecsLeft % 3600) / 60;
|
||
|
dwHours = dwSecsLeft / 3600;
|
||
|
|
||
|
if (dwHours == 0)
|
||
|
{
|
||
|
if (dwMinutes == 0)
|
||
|
wsprintf(szBuf, GetLocStr(IDS_PROG_TIME_SEC), dwSecs);
|
||
|
else
|
||
|
wsprintf(szBuf, GetLocStr(IDS_PROG_TIME_MIN), dwMinutes);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
wsprintf(szBuf, GetLocStr(IDS_PROG_TIME_HRMIN), dwHours, dwMinutes);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
szBuf[0] = _T('\0');
|
||
|
} //bps is zero
|
||
|
|
||
|
SetDlgItemText(m_hDlg, IDC_TIMELEFT, szBuf);
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR CALLBACK CWUProgress::DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
SetWindowLongPtr(hwnd, DWLP_USER, lParam);
|
||
|
|
||
|
Animate_Open(GetDlgItem(hwnd, IDC_ANIM), MAKEINTRESOURCE(IDA_FILECOPY));
|
||
|
Animate_Play(GetDlgItem(hwnd, IDC_ANIM), 0, -1, -1);
|
||
|
return FALSE;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
{
|
||
|
switch (wParam)
|
||
|
{
|
||
|
case IDCANCEL:
|
||
|
{
|
||
|
CWUProgress* pProgress = (CWUProgress*)GetWindowLongPtr(hwnd, DWLP_USER);
|
||
|
pProgress->Destroy();
|
||
|
SetEvent(pProgress->GetCancelEvent());
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return(FALSE);
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|