205 lines
5.6 KiB
C++
205 lines
5.6 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (C) 1997-1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
clsgenpg.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements CClassGeneralPage -- class general property page
|
||
|
|
||
|
Author:
|
||
|
|
||
|
William Hsieh (williamh) created
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
// clsgenpg.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "devmgr.h"
|
||
|
#include "clsgenpg.h"
|
||
|
|
||
|
// help topic ids
|
||
|
const DWORD g_a108HelpIDs[]=
|
||
|
{
|
||
|
IDC_CLSGEN_DESC, IDH_DISABLEHELP,
|
||
|
IDC_CLSGEN_ICON, IDH_DISABLEHELP,
|
||
|
IDC_CLSGEN_NAME, IDH_DISABLEHELP,
|
||
|
0, 0,
|
||
|
};
|
||
|
|
||
|
BOOL
|
||
|
CClassGeneralPage::OnInitDialog(
|
||
|
LPPROPSHEETPAGE ppsp
|
||
|
)
|
||
|
{
|
||
|
// notify CPropSheetData about the page creation
|
||
|
// the controls will be initialize in UpdateControls virtual function.
|
||
|
m_pClass->m_psd.PageCreateNotify(m_hDlg);
|
||
|
return CPropSheetPage::OnInitDialog(ppsp);
|
||
|
}
|
||
|
|
||
|
UINT
|
||
|
CClassGeneralPage::DestroyCallback()
|
||
|
{
|
||
|
// the property sheet is going away, consolidate the changes on the
|
||
|
// device.
|
||
|
// We do this because this is the page we are sure will be created --
|
||
|
// this page is ALWAYS the first page.
|
||
|
//
|
||
|
|
||
|
// The DevInfoList returned from GetDevInfoList() function
|
||
|
// is maintained by the class object during its lifetime.
|
||
|
// we must NOT release the object.
|
||
|
CDevInfoList* pClassDevInfo = m_pClass->GetDevInfoList();
|
||
|
|
||
|
if (pClassDevInfo)
|
||
|
{
|
||
|
if (pClassDevInfo->DiGetExFlags(NULL) & DI_FLAGSEX_PROPCHANGE_PENDING)
|
||
|
{
|
||
|
//
|
||
|
// property change pending, issue a DICS_PROPERTYCHANGE to the
|
||
|
// class installer. A DICS_PROPCHANGE would basically remove the
|
||
|
// device subtree and reenumerate it. If each property page issues
|
||
|
// its own DICS_PROPCHANGE command, the device subtree would
|
||
|
// be removed/reenumerate several times even though one is enough.
|
||
|
// A property page sets DI_FLAGEX_PROPCHANGE_PENDING when it needs
|
||
|
// a DICS_PROPCHANGE command to be issued.
|
||
|
//
|
||
|
SP_PROPCHANGE_PARAMS pcp;
|
||
|
pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
|
||
|
pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
|
||
|
|
||
|
pcp.Scope = DICS_FLAG_GLOBAL;
|
||
|
pcp.StateChange = DICS_PROPCHANGE;
|
||
|
pClassDevInfo->DiSetClassInstallParams(NULL,
|
||
|
&pcp.ClassInstallHeader,
|
||
|
sizeof(pcp)
|
||
|
);
|
||
|
|
||
|
pClassDevInfo->DiCallClassInstaller(DIF_PROPERTYCHANGE, NULL);
|
||
|
pClassDevInfo->DiTurnOnDiFlags(NULL, DI_PROPERTIES_CHANGE);
|
||
|
pClassDevInfo->DiTurnOffDiExFlags(NULL, DI_FLAGSEX_PROPCHANGE_PENDING);
|
||
|
}
|
||
|
|
||
|
DWORD RestartFlags = pClassDevInfo->DiGetFlags();
|
||
|
|
||
|
//
|
||
|
// Do not use our window handle(or its parent) as the parent
|
||
|
// to the newly create dialog because they are in "detroyed state".
|
||
|
// WM_CLOSE does not help either.
|
||
|
// NULL window handle(Desktop) should be okay here.
|
||
|
//
|
||
|
// We only want to prompt for a reboot if device manager is connected
|
||
|
// to the local machine.
|
||
|
//
|
||
|
if (RestartFlags && m_pClass->m_pMachine->IsLocal())
|
||
|
{
|
||
|
if (PromptForRestart(NULL, RestartFlags) == IDNO) {
|
||
|
|
||
|
if (m_pClass->m_pMachine->m_ParentMachine) {
|
||
|
|
||
|
m_pClass->m_pMachine->m_ParentMachine->ScheduleRefresh();
|
||
|
|
||
|
} else {
|
||
|
|
||
|
m_pClass->m_pMachine->ScheduleRefresh();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// notify CPropSheetData that the property sheet is going away
|
||
|
m_pClass->m_psd.PageDestroyNotify(m_hDlg);
|
||
|
if (RestartFlags & DI_PROPERTIES_CHANGE)
|
||
|
{
|
||
|
// Class properties changed. We need to refresh the machine.
|
||
|
// Since we are running in a separate thread, we can not
|
||
|
// call the refresh function, instead, we schedule it.
|
||
|
// This must be done before enabling refresh.
|
||
|
//
|
||
|
m_pClass->m_pMachine->ScheduleRefresh();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Destory the CMachine.
|
||
|
//
|
||
|
CMachine* pMachine;
|
||
|
pMachine = m_pClass->m_pMachine;
|
||
|
|
||
|
if (pMachine->ShouldPropertySheetDestroy()) {
|
||
|
|
||
|
delete pMachine;
|
||
|
}
|
||
|
|
||
|
return CPropSheetPage::DestroyCallback();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CClassGeneralPage::UpdateControls(
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
if (lParam)
|
||
|
m_pClass = (CClass*)lParam;
|
||
|
|
||
|
HICON hClassIcon = m_pClass->LoadIcon();
|
||
|
if (hClassIcon)
|
||
|
{
|
||
|
HICON hIconOld;
|
||
|
m_IDCicon = IDC_CLSGEN_ICON; // Save for cleanup in OnDestroy.
|
||
|
hIconOld = (HICON)SendDlgItemMessage(m_hDlg, IDC_CLSGEN_ICON, STM_SETICON,
|
||
|
(WPARAM)hClassIcon,
|
||
|
0
|
||
|
);
|
||
|
|
||
|
if (NULL != hIconOld)
|
||
|
DestroyIcon(hIconOld);
|
||
|
}
|
||
|
|
||
|
SetDlgItemText(m_hDlg, IDC_CLSGEN_NAME, m_pClass->GetDisplayName());
|
||
|
}
|
||
|
|
||
|
HPROPSHEETPAGE
|
||
|
CClassGeneralPage::Create(
|
||
|
CClass* pClass
|
||
|
)
|
||
|
{
|
||
|
m_pClass = pClass;
|
||
|
m_psp.lParam = (LPARAM) this;
|
||
|
|
||
|
return CreatePage();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
CClassGeneralPage::OnHelp(
|
||
|
LPHELPINFO pHelpInfo
|
||
|
)
|
||
|
{
|
||
|
WinHelp((HWND)pHelpInfo->hItemHandle, DEVMGR_HELP_FILE_NAME, HELP_WM_HELP,
|
||
|
(ULONG_PTR)g_a108HelpIDs);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
CClassGeneralPage::OnContextMenu(
|
||
|
HWND hWnd,
|
||
|
WORD xPos,
|
||
|
WORD yPos
|
||
|
)
|
||
|
{
|
||
|
WinHelp(hWnd, DEVMGR_HELP_FILE_NAME, HELP_CONTEXTMENU,
|
||
|
(ULONG_PTR)g_a108HelpIDs);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|