You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
7.5 KiB
307 lines
7.5 KiB
#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);
|
|
}
|