alder_lake_bios/Insyde/InsydeSetupPkg/Drivers/H2OFormBrowserDxe/Option.c

116 lines
3.8 KiB
C

/** @file
Define function of option.
;******************************************************************************
;* Copyright (c) 2013, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include "InternalH2OFormBrowser.h"
/**
Copy option.
@param[in] Form Form of option
@param[in, out] Statement Option statement
**/
VOID
InitH2OOption (
IN FORM_BROWSER_FORM *Form,
IN OUT FORM_BROWSER_STATEMENT *Statement
)
{
EFI_IMAGE_INPUT *ImageIn;
QUESTION_OPTION *Option;
H2O_FORM_BROWSER_O *H2OOption;
H2O_FORM_BROWSER_S *H2OStatement;
LIST_ENTRY *LinkOption;
EFI_STATUS Status;
H2OStatement = &Statement->Statement;
H2OStatement->NumberOfOptions = 0;
H2OStatement->Options = (Statement->NumberOfOptions == 0) ? NULL : AllocateZeroPool (sizeof (H2O_FORM_BROWSER_O) * Statement->NumberOfOptions);
if (H2OStatement->Options == NULL) {
return;
}
H2OOption = H2OStatement->Options;
LinkOption = GetFirstNode (&Statement->OptionListHead);
while (!IsNull (&Statement->OptionListHead, LinkOption)) {
Option = QUESTION_OPTION_FROM_LINK (LinkOption);
LinkOption = GetNextNode (&Statement->OptionListHead, LinkOption);
if ((Option->SuppressExpression == NULL) ||
(EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse)) {
H2OOption->Signature = H2O_FORM_BROWSER_OPTION_SIGNATURE;
H2OOption->Size = sizeof (H2O_FORM_BROWSER_O);
if (Option->Text == 0) {
H2OOption->Text = AllocateZeroPool (sizeof (CHAR16));
} else {
H2OOption->Text = GetString (Option->Text, Form->FormSet->HiiHandle);
}
H2OOption->Image = NULL;
if (Option->ImageId != 0) {
ImageIn = AllocateZeroPool (sizeof (EFI_IMAGE_INPUT));
Status = gHiiImage->GetImage (
gHiiImage,
Form->FormSet->HiiHandle,
(EFI_IMAGE_ID) Option->ImageId,
ImageIn
);
ASSERT_EFI_ERROR (Status);
if (!EFI_ERROR (Status)) {
H2OOption->Image = ImageIn;
} else {
FreePool (ImageIn);
}
}
//H2OOption->Animation = 0;
CopyMem (&H2OOption->HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));
H2OOption->Default = (Option->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT? TRUE: FALSE;
H2OOption->ManufactureDefault = (Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG? TRUE: FALSE;
H2OOption->Visibility = TRUE;
H2OOption++;
H2OStatement->NumberOfOptions++;
}
}
}
VOID
DestroyH2OOption (
IN OUT FORM_BROWSER_STATEMENT *Statement
)
{
H2O_FORM_BROWSER_S *H2OStatement;
H2O_FORM_BROWSER_O *H2OOptions;
UINTN Index;
if (Statement == NULL || Statement->Statement.Options == NULL) {
return;
}
H2OStatement = &Statement->Statement;
H2OOptions = H2OStatement->Options;
for (Index = 0; Index < H2OStatement->NumberOfOptions; Index++) {
FBFreePool ((VOID **) &(H2OOptions[Index].Text));
if (H2OOptions[Index].Image != NULL) {
FBFreePool ((VOID **) &(H2OOptions[Index].Image->Bitmap));
FBFreePool ((VOID **) &(H2OOptions[Index].Image));
}
}
FBFreePool ((VOID **) &H2OStatement->Options);
}