Windows2003-3790/inetcore/setup/active/asctrls/progdlg.cpp
2020-09-30 16:53:55 +02:00

308 lines
7.5 KiB
C++

#include "asctlpch.h"
#include "asinsctl.h"
#include "resource.h"
#include "util2.h"
#define WM_LAUNCHCOMPLETE WM_USER+121
CProgressDlg::CProgressDlg(HINSTANCE hInst, HWND hParent, HWND hGrandParent, CInstallEngineCtl *ctl)
{
RECT r;
dwBigGoal = 0;
dwLittleGoal = 0;
dwOldMinutesLeft = 0xffffffff;
hProgText = NULL;
hBigProg = NULL;
hLittleProg = NULL;
dwOldBytes = 0;
LPSTR pszTitle = NULL;
hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), hGrandParent, ProgressDlgProc);
// Get the Display title from inseng
ctl->_pinseng->GetDisplayName(NULL, &pszTitle);
ctl->_pinseng->SetHWND(hDlg);
if(pszTitle)
{
SetWindowText(hDlg, pszTitle);
CoTaskMemFree(pszTitle);
}
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) this);
if(hGrandParent)
{
GetWindowRect(hGrandParent, &r);
SetWindowPos(hDlg, 0, r.left, r.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
pinsengctl = ctl;
pinsengctl->_pinseng->QueryInterface(IID_IInstallEngineTiming, (void **) &ptimer);
}
CProgressDlg::~CProgressDlg()
{
if(ptimer)
ptimer->Release();
pinsengctl->_pinseng->SetHWND(GetParent(hDlg));
DestroyWindow(hDlg);
}
void CProgressDlg::DisplayWindow(BOOL fShow)
{
if(fShow)
ShowWindow(hDlg, SW_SHOWNORMAL);
else
ShowWindow(hDlg, SW_HIDE);
}
INT_PTR CALLBACK ProgressDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
// Do some init stuff
SetFontForControl(hwnd, IDC_PROG_TEXT);
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:
{
char szBuf[256];
char szTitle[128];
HRESULT hr = S_FALSE;
int id;
CProgressDlg *p = (CProgressDlg *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
LoadSz(IDS_TITLE, szTitle, sizeof(szTitle));
if(p->pinsengctl)
hr = p->pinsengctl->_pinseng->Suspend();
if(hr == S_FALSE)
id = IDS_CONFIRMCANCEL_UNSAFE;
else
id = IDS_CONFIRMCANCEL;
LoadSz(id, szBuf, sizeof(szBuf));
if(MessageBox(hwnd, szBuf, szTitle, MB_YESNO | MB_ICONQUESTION) == IDYES)
{
if(p->pinsengctl)
p->pinsengctl->_FireCancel(ABORTINSTALL_NORMAL);
EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE);
}
if(p->pinsengctl)
p->pinsengctl->_pinseng->Resume();
}
break;
default:
return FALSE;
}
break;
default:
return(FALSE);
}
return TRUE;
}
void CProgressDlg::SetInsProgGoal(DWORD dwKBytes)
{
dwBigFactor = dwKBytes / 65000 + 1;
dwBigGoal = dwKBytes;
if(dwBigGoal == 0)
dwBigGoal = 1;
if(hBigProg == NULL)
hBigProg = GetDlgItem(hDlg, IDC_PROG_BIG);
SendMessage(hBigProg, PBM_SETRANGE, 0, MAKELPARAM(0, dwKBytes/dwBigFactor));
}
void CProgressDlg::SetDownloadProgGoal(DWORD dwKBytes)
{
dwLittleFactor = dwKBytes / 65000 + 1;
dwLittleGoal = dwKBytes;
if(dwLittleGoal == 0)
dwLittleGoal = 1;
if(hLittleProg == NULL)
hLittleProg = GetDlgItem(hDlg, IDC_PROG_LITTLE);
SendMessage(hLittleProg,PBM_SETRANGE,0,MAKELPARAM(0,dwKBytes/dwLittleFactor));
SetDlgItemText(hDlg, IDC_LITTLETIMELEFT, "");
dwOldMinutesLeft = 0xffffffff;
}
void CProgressDlg::SetInsProgress(DWORD dwKBytes)
{
INSTALLPROGRESS pinsprog;
DWORD progress;
DWORD bytessofar;
char szRes[256];
char szBuf[256];
DWORD remaining;
if( (dwOldBytes == 0) && (dwKBytes != 0) )
{
ShowWindow(GetDlgItem(hDlg, IDC_BYTESLEFT), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_LITTLETIMELEFT), SW_HIDE);
}
ptimer->GetInstallProgress(&pinsprog);
remaining = pinsprog.dwInstallKBRemaining;
progress = (dwBigGoal - remaining)/dwBigFactor;
// write out bytes remiaining
if(dwBigGoal >= remaining)
bytessofar = dwBigGoal - remaining;
else
bytessofar = 0;
if(dwOldBytes != bytessofar)
{
LoadSz(IDS_PERCENT, szRes, sizeof(szRes));
wsprintf(szBuf, szRes, 100*bytessofar/dwBigGoal);
SetDlgItemText(hDlg, IDC_PERCENT, szBuf);
dwOldBytes = bytessofar;
}
if(hBigProg == NULL)
hBigProg = GetDlgItem(hDlg, IDC_PROG_BIG);
SendMessage(hBigProg, PBM_SETPOS, progress, 0);
}
void CProgressDlg::SetDownloadProgress(DWORD dwKBytes)
{
char szBuf[128];
char szRes[128];
INSTALLPROGRESS pinsprog;
DWORD remaining;
DWORD progress;
DWORD bytessofar;
ptimer->GetInstallProgress(&pinsprog);
remaining = pinsprog.dwDownloadKBRemaining;
progress = (dwLittleGoal - remaining)/dwLittleFactor;
// write out bytes remiaining
if(dwLittleGoal >= remaining)
bytessofar = dwLittleGoal - remaining;
else
bytessofar = 0;
if(dwOldBytes != bytessofar)
{
LoadSz(IDS_KBYTES , szRes, sizeof(szRes));
wsprintf(szBuf, szRes, bytessofar, dwLittleGoal);
SetDlgItemText(hDlg, IDC_BYTESLEFT, szBuf);
dwOldBytes = bytessofar;
}
SendMessage(hLittleProg, PBM_SETPOS, progress, 0);
remaining = pinsprog.dwDownloadSecsRemaining;
if(remaining != 0xffffffff)
UpdateLittleTime(remaining);
}
void CProgressDlg::SetProgText(LPCSTR psz)
{
if(hProgText == NULL)
hProgText = GetDlgItem(hDlg, IDC_PROG_TEXT);
SetWindowText(hProgText, psz);
}
void CProgressDlg::UpdateLittleTime(DWORD dwSecsLeft)
{
char szBuf[128];
char szRes[128];
szBuf[0] = 0;
UINT id;
UINT numParams = 2;
DWORD dwHoursLeft = dwSecsLeft / 3600;
DWORD dwMinutesLeft = (dwSecsLeft % 3600) / 60;
if(dwMinutesLeft == 59)
{
dwHoursLeft++;
dwMinutesLeft = 0;
}
// no need to update ui
if(dwOldMinutesLeft == dwMinutesLeft)
return;
if(dwHoursLeft > 0)
{
if(dwHoursLeft > 1)
{
if(dwMinutesLeft == 0)
{
id = IDS_HOURSLEFT;
numParams = 1;
}
else if(dwMinutesLeft == 1)
{
id = IDS_HOURSMINUTELEFT;
}
else
id = IDS_HOURSMINUTESLEFT;
}
else
{
if(dwMinutesLeft == 0)
{
id = IDS_HOURLEFT;
numParams = 1;
}
else if(dwMinutesLeft == 1)
{
id = IDS_HOURMINUTELEFT;
}
else
id = IDS_HOURMINUTESLEFT;
}
LoadSz(id, szRes, sizeof(szRes));
if(numParams == 1)
wsprintf(szBuf, szRes, dwHoursLeft);
else
wsprintf(szBuf, szRes, dwHoursLeft, dwMinutesLeft);
}
else if(dwMinutesLeft > 0)
{
LoadSz(IDS_MINUTESLEFT , szRes, sizeof(szRes));
wsprintf(szBuf, szRes, dwMinutesLeft + 1);
}
else
LoadSz(IDS_SECONDSLEFT, szBuf, sizeof(szBuf));
dwOldMinutesLeft = dwMinutesLeft;
SetDlgItemText(hDlg, IDC_LITTLETIMELEFT, szBuf);
}