267 lines
6.1 KiB
C++
267 lines
6.1 KiB
C++
|
// Copyright (c) 1997-2001 Microsoft Corporation
|
||
|
//
|
||
|
// File: FinishPage.cpp
|
||
|
//
|
||
|
// Synopsis: Defines the Finish Page for the CYS
|
||
|
// wizard
|
||
|
//
|
||
|
// History: 02/03/2001 JeffJon Created
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
#include "InstallationUnitProvider.h"
|
||
|
#include "FinishPage.h"
|
||
|
#include "state.h"
|
||
|
#include "Dialogs.h"
|
||
|
|
||
|
FinishPage::FinishPage()
|
||
|
:
|
||
|
WizardPage(IDD_FINISH_PAGE, IDS_FINISH_TITLE, IDS_FINISH_SUBTITLE, false, true)
|
||
|
{
|
||
|
LOG_CTOR(FinishPage);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
FinishPage::~FinishPage()
|
||
|
{
|
||
|
LOG_DTOR(FinishPage);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
FinishPage::OnInit()
|
||
|
{
|
||
|
LOG_FUNCTION(FinishPage::OnInit);
|
||
|
|
||
|
SetLargeFont(hwnd, IDC_BIG_BOLD_TITLE);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
bool
|
||
|
FinishPage::OnSetActive()
|
||
|
{
|
||
|
LOG_FUNCTION(FinishPage::OnSetActive);
|
||
|
|
||
|
Win::PropSheet_SetWizButtons(
|
||
|
Win::GetParent(hwnd),
|
||
|
PSWIZB_FINISH | PSWIZB_BACK);
|
||
|
|
||
|
// Get the finish text from the installation unit and put it in the finish box
|
||
|
|
||
|
String message;
|
||
|
|
||
|
bool changes =
|
||
|
InstallationUnitProvider::GetInstance().GetCurrentInstallationUnit().GetFinishText(message);
|
||
|
|
||
|
Win::SetDlgItemText(hwnd, IDC_FINISH_MESSAGE, message);
|
||
|
|
||
|
// set the rerun check box state
|
||
|
|
||
|
if (InstallationUnitProvider::GetInstance().GetCurrentInstallationUnit().GetInstallationUnitType()
|
||
|
== DC_INSTALL ||
|
||
|
InstallationUnitProvider::GetInstance().GetCurrentInstallationUnit().GetInstallationUnitType()
|
||
|
== EXPRESS_INSTALL)
|
||
|
{
|
||
|
// the wizard must be rerun when we are installing a DC
|
||
|
|
||
|
Win::ShowWindow(
|
||
|
Win::GetDlgItem(hwnd, IDC_RERUN_CHECK),
|
||
|
SW_HIDE);
|
||
|
|
||
|
Win::Button_SetCheck(
|
||
|
Win::GetDlgItem(hwnd, IDC_RERUN_CHECK),
|
||
|
BST_CHECKED);
|
||
|
|
||
|
Win::EnableWindow(
|
||
|
Win::GetDlgItem(hwnd, IDC_RERUN_CHECK),
|
||
|
false);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Win::ShowWindow(
|
||
|
Win::GetDlgItem(hwnd, IDC_RERUN_CHECK),
|
||
|
SW_SHOW);
|
||
|
|
||
|
Win::Button_SetCheck(
|
||
|
Win::GetDlgItem(hwnd, IDC_RERUN_CHECK),
|
||
|
State::GetInstance().RerunWizard() ? BST_CHECKED : BST_UNCHECKED);
|
||
|
|
||
|
Win::EnableWindow(
|
||
|
Win::GetDlgItem(hwnd, IDC_RERUN_CHECK),
|
||
|
true);
|
||
|
}
|
||
|
|
||
|
if (!changes)
|
||
|
{
|
||
|
popup.MessageBox(
|
||
|
hwnd,
|
||
|
IDS_NO_CHANGES_MESSAGEBOX_TEXT,
|
||
|
MB_OK | MB_ICONWARNING);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
FinishPage::OnHelp()
|
||
|
{
|
||
|
LOG_FUNCTION(FinishPage::OnHelp);
|
||
|
|
||
|
// NOTE: I am not using Win::HtmlHelp here so that the help
|
||
|
// is actually running in a different process. This
|
||
|
// allows us to close down CYS without closing the help
|
||
|
// window.
|
||
|
|
||
|
String commandline =
|
||
|
L"hh.exe \"" +
|
||
|
InstallationUnitProvider::GetInstance().GetCurrentInstallationUnit().GetFinishHelp() +
|
||
|
L"\"";
|
||
|
|
||
|
HRESULT hr = MyCreateProcess(commandline);
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
LOG(String::format(
|
||
|
L"Failed to open help: hr = 0x%1!x!",
|
||
|
hr));
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
FinishPage::OnWizFinish()
|
||
|
{
|
||
|
LOG_FUNCTION(FinishPage::OnWizFinish);
|
||
|
|
||
|
Win::WaitCursor wait;
|
||
|
bool result = false;
|
||
|
|
||
|
// Get the rerun state
|
||
|
|
||
|
bool rerunWizard = Win::Button_GetCheck(Win::GetDlgItem(hwnd, IDC_RERUN_CHECK));
|
||
|
|
||
|
State::GetInstance().SetRerunWizard(rerunWizard);
|
||
|
|
||
|
|
||
|
// Open the log file and pass the handle to the installation unit
|
||
|
|
||
|
// Create the log file
|
||
|
|
||
|
String logName;
|
||
|
HANDLE logfileHandle = AppendLogFile(
|
||
|
CYS_LOGFILE_NAME,
|
||
|
logName);
|
||
|
if (logfileHandle)
|
||
|
{
|
||
|
LOG(String::format(L"New log file was created: %1", logName.c_str()));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"Unable to create the log file!!!");
|
||
|
}
|
||
|
|
||
|
// Install the current Installation Unit. This may be one or more services depending on the
|
||
|
// path that was taken through the wizard
|
||
|
|
||
|
InstallationUnit& installationUnit =
|
||
|
InstallationUnitProvider::GetInstance().GetCurrentInstallationUnit();
|
||
|
|
||
|
InstallationReturnType installResult =
|
||
|
installationUnit.InstallService(logfileHandle, hwnd);
|
||
|
|
||
|
FinishDialog dialog(logName, installationUnit.GetFinishHelp());
|
||
|
|
||
|
if (INSTALL_SUCCESS == installResult)
|
||
|
{
|
||
|
LOG(L"Service installed successfully");
|
||
|
|
||
|
// Bring up finish dialog that allows the user to select to
|
||
|
// show help and/or the log file
|
||
|
|
||
|
dialog.ModalExecute(hwnd);
|
||
|
}
|
||
|
else if (INSTALL_NO_CHANGES == installResult ||
|
||
|
INSTALL_SUCCESS_REBOOT == installResult)
|
||
|
{
|
||
|
LOG(L"Service installed successfully");
|
||
|
LOG(L"Not logging results because reboot was initiated");
|
||
|
}
|
||
|
else if (INSTALL_SUCCESS_PROMPT_REBOOT == installResult)
|
||
|
{
|
||
|
LOG(L"Service installed successfully");
|
||
|
LOG(L"Prompting user to reboot");
|
||
|
|
||
|
if (-1 == SetupPromptReboot(
|
||
|
0,
|
||
|
hwnd,
|
||
|
FALSE))
|
||
|
{
|
||
|
LOG(String::format(
|
||
|
L"Failed to reboot: hr = %1!x!",
|
||
|
GetLastError()));
|
||
|
}
|
||
|
|
||
|
// At this point the system should be shutting down
|
||
|
// so don't do anything else
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG(L"Service failed to install");
|
||
|
|
||
|
if (IDYES == popup.MessageBox(
|
||
|
hwnd,
|
||
|
String::load(IDS_FAILED_INSTALL),
|
||
|
MB_YESNO | MB_ICONWARNING))
|
||
|
{
|
||
|
dialog.OpenLogFile();
|
||
|
Win::SetForegroundWindow(hwnd);
|
||
|
}
|
||
|
|
||
|
result = true;
|
||
|
}
|
||
|
|
||
|
// Add an additional line at the end of the log file
|
||
|
// only if we are not rebooting. All the reboot
|
||
|
// scenarios require additional logging to the same
|
||
|
// entry.
|
||
|
|
||
|
if (installResult != INSTALL_SUCCESS_REBOOT)
|
||
|
{
|
||
|
CYS_APPEND_LOG(L"\r\n");
|
||
|
}
|
||
|
|
||
|
LOG_BOOL(result);
|
||
|
Win::SetWindowLongPtr(hwnd, DWLP_MSGRESULT, result ? TRUE : FALSE);
|
||
|
|
||
|
if (!result)
|
||
|
{
|
||
|
// clean up the InstallationUnits so that all the data must be re-read if
|
||
|
// if CYS automatically restarts
|
||
|
|
||
|
InstallationUnitProvider::GetInstance().Destroy();
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
FinishPage::OnQueryCancel()
|
||
|
{
|
||
|
LOG_FUNCTION(FinishPage::OnQueryCancel);
|
||
|
|
||
|
bool result = false;
|
||
|
|
||
|
// set the rerun state to false so the wizard doesn't
|
||
|
// just restart itself
|
||
|
|
||
|
State::GetInstance().SetRerunWizard(false);
|
||
|
|
||
|
Win::SetWindowLongPtr(
|
||
|
hwnd,
|
||
|
DWLP_MSGRESULT,
|
||
|
result ? TRUE : FALSE);
|
||
|
|
||
|
return true;
|
||
|
}
|