116 lines
3.8 KiB
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);
|
|
}
|
|
|