windows-nt/Source/XPSP1/NT/base/ntsetup/ocmanage/common/ocwizard.c

164 lines
4.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
ocwizard.c
Abstract:
Routines to query wizard pages from OC DLLs and manage the results.
No wizard is actually displayed by this routine -- that is up to
whoever links to the OC Manager common library.
Author:
Ted Miller (tedm) 17-Sep-1996
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
UINT
OcGetWizardPages(
IN PVOID OcManagerContext,
OUT PSETUP_REQUEST_PAGES Pages[WizPagesTypeMax]
)
/*++
Routine Description:
Request wizard pages from OC DLL's, according to ordering and omission
rules specified in the master OC inf.
Pages are returned in the form of wizard page handles in SETUP_REQUEST_PAGES
data structures.
Arguments:
OcManagerContext - supplies OC Manager context structure, returned by
OcInitialize().
Pages - points to a block of memory that can hold WizPagesTypeMax pointers to
SETUP_REQUEST_PAGES structures. On successful completion, that array is
filled in with such pointers.
Return Value:
Win32 error code indicating outcome.
--*/
{
WizardPagesType PageType;
UINT n;
LONG Id;
UINT e,ErrorCode;
POC_MANAGER OcManager;
PSETUP_REQUEST_PAGES p,pages;
OPTIONAL_COMPONENT Component;
//
// The context actually points at the OC_MANAGER structure.
//
OcManager = OcManagerContext;
//
// The ordering arrays for each wizard page type are
// stored away for us in the OC_MANAGER data structure.
//
ErrorCode = NO_ERROR;
for(PageType=0; PageType<WizPagesTypeMax; PageType++) {
//
// Allocate an empty list of pages for this page type.
//
Pages[PageType] = pSetupMalloc(offsetof(SETUP_REQUEST_PAGES,Pages));
if(Pages[PageType]) {
Pages[PageType]->MaxPages = 0;
for(n=0;
(n < OcManager->TopLevelOcCount)
&& ((Id = OcManager->WizardPagesOrder[PageType][n]) != -1);
n++)
{
//
// Call the component and ask for its pages of the current type.
// If this succeeds, merge the pages of this type from the
// component into the master list for this component.
//
pSetupStringTableGetExtraData(
OcManager->ComponentStringTable,
Id,
&Component,
sizeof(OPTIONAL_COMPONENT)
);
if ((Component.InternalFlags & OCFLAG_NOWIZARDPAGES) == 0) {
e = OcInterfaceRequestPages(OcManager,Id,PageType,&pages);
if(e == NO_ERROR) {
p = pSetupRealloc(
Pages[PageType],
offsetof(SETUP_REQUEST_PAGES,Pages)
+ ((Pages[PageType]->MaxPages + pages->MaxPages) * sizeof(HPROPSHEETPAGE))
);
if(p) {
Pages[PageType] = p;
CopyMemory(
&p->Pages[p->MaxPages],
pages->Pages,
pages->MaxPages * sizeof(HPROPSHEETPAGE)
);
Pages[PageType]->MaxPages += pages->MaxPages;
pSetupFree(pages);
} else {
e = ERROR_NOT_ENOUGH_MEMORY;
}
}
} else {
e = NO_ERROR;
}
if (e == ERROR_CALL_COMPONENT) {
continue; // could be a dead component, just go on
}
if((e != NO_ERROR) && (ErrorCode == NO_ERROR)) {
ErrorCode = e;
}
}
} else {
if(ErrorCode == NO_ERROR) {
ErrorCode = ERROR_NOT_ENOUGH_MEMORY;
}
}
}
// set flag if there are no pages before the oc page
if (OcManager->SetupData.OperationFlags & SETUPOP_STANDALONE) {
if (!Pages[WizPagesWelcome]->MaxPages
&& !Pages[WizPagesMode]->MaxPages) {
OcManager->InternalFlags |= OCMFLAG_NOPREOCPAGES;
}
}
return(ErrorCode);
}