}\r
\r
/**\r
- Get the EFI_IFR_VARSTORE where the Question's value is stored.\r
+ Get the FORM_BROWSER_STATEMENT that matches the Question's value.\r
\r
@param FormSet The Form Set.\r
+ @param QuestionId QuestionId\r
\r
- @retval FORMSET_STORAGE * The EFI_IFR_VARSTORE where the Question's value is stored.\r
- @retval NULL If the Form Set does not have EFI_IFR_VARSTORE.\r
+ @retval FORM_BROWSER_STATEMENT* FORM_BROWSER_STATEMENT that match Question's value.\r
+ @retval NULL If the Form Set does not have EFI_IFR_VARSTORE.\r
**/\r
-FORMSET_STORAGE *\r
+FORM_BROWSER_STATEMENT *\r
GetStorageFromQuestionId (\r
IN CONST FORM_BROWSER_FORMSET * FormSet,\r
IN EFI_QUESTION_ID QuestionId\r
// UEFI Question ID is unique in a FormSet.\r
//\r
ASSERT (Statement->Storage->Type == EFI_HII_VARSTORE_BUFFER);\r
- return Statement->Storage;\r
+ return Statement;\r
}\r
StatementList = GetNextNode (&Form->StatementListHead, StatementList);\r
}\r
Name = Storage->Name;\r
}\r
\r
- if (IsConfigHdrMatch (ConfigString, &Storage->Guid, Name)) {\r
+ if (HiiIsConfigHdrMatch (ConfigString, &Storage->Guid, Name)) {\r
return Storage;\r
}\r
\r
}\r
\r
*Data = AllocateZeroPool (*DataSize);\r
- if (Data == NULL) {\r
+ if (*Data == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- FwFormCallBack->NvRead (\r
+ Status = FwFormCallBack->NvRead (\r
FwFormCallBack, \r
BufferStorage->Name,\r
&BufferStorage->Guid,\r
}\r
\r
*Data = AllocateZeroPool (*DataSize);\r
- if (Data == NULL) {\r
+ if (*Data == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
-\r
+ \r
if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {\r
if (ConfigAccess->FormCallbackProtocol == NULL ||\r
ConfigAccess->FormCallbackProtocol->NvWrite == NULL) {\r
}\r
\r
/**\r
- Build the FRAMEWORK_EFI_IFR_DATA_ARRAY which will be used to pass to \r
- EFI_FORM_CALLBACK_PROTOCOL.Callback. Check definition of FRAMEWORK_EFI_IFR_DATA_ARRAY\r
+ Build the EFI_IFR_DATA_ARRAY which will be used to pass to \r
+ EFI_FORM_CALLBACK_PROTOCOL.Callback. Check definition of EFI_IFR_DATA_ARRAY\r
for details.\r
\r
ASSERT if the Question Type is not EFI_IFR_TYPE_NUM_SIZE_* or EFI_IFR_TYPE_STRING.\r
@param Value The Question Value.\r
@param NvMapAllocated On output indicates if a buffer is allocated for NvMap.\r
\r
- @return A pointer to FRAMEWORK_EFI_IFR_DATA_ARRAY. The caller must free this buffer allocated.\r
+ @return A pointer to EFI_IFR_DATA_ARRAY. The caller must free this buffer allocated.\r
**/ \r
-FRAMEWORK_EFI_IFR_DATA_ARRAY *\r
+EFI_IFR_DATA_ARRAY *\r
CreateIfrDataArray (\r
IN CONFIG_ACCESS_PRIVATE *ConfigAccess,\r
IN EFI_QUESTION_ID QuestionId,\r
OUT BOOLEAN *NvMapAllocated\r
)\r
{\r
- FRAMEWORK_EFI_IFR_DATA_ARRAY *IfrDataArray;\r
- FRAMEWORK_EFI_IFR_DATA_ENTRY *IfrDataEntry;\r
+ EFI_IFR_DATA_ARRAY *IfrDataArray;\r
+ EFI_IFR_DATA_ENTRY *IfrDataEntry;\r
UINTN BrowserDataSize;\r
- FORMSET_STORAGE *BufferStorage;\r
- EFI_STATUS Status;\r
+ FORMSET_STORAGE *BufferStorage;\r
UINTN Size;\r
- UINTN StringSize;\r
EFI_STRING String;\r
+ FORM_BROWSER_STATEMENT *Statement;\r
\r
*NvMapAllocated = FALSE;\r
\r
break;\r
\r
case EFI_IFR_TYPE_STRING:\r
- StringSize = 0;\r
- Status = HiiLibGetString (ConfigAccess->ThunkContext->UefiHiiHandle, Value->string, String, &StringSize);\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
-\r
- String = AllocateZeroPool (StringSize);\r
- ASSERT (String != NULL);\r
-\r
- Status = HiiLibGetString (ConfigAccess->ThunkContext->UefiHiiHandle, Value->string, String, &StringSize);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (Value->string == 0) {\r
+ Size = 0;\r
+ } else {\r
+ String = HiiGetString (ConfigAccess->ThunkContext->UefiHiiHandle, Value->string, NULL);\r
+ ASSERT (String != NULL);\r
\r
- Size = StringSize;\r
+ Size = StrSize (String);\r
+ }\r
break;\r
\r
default:\r
break;\r
}\r
\r
- IfrDataArray = AllocateZeroPool (sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY) + sizeof (FRAMEWORK_EFI_IFR_DATA_ENTRY) + Size);\r
+ IfrDataArray = AllocateZeroPool (sizeof (EFI_IFR_DATA_ARRAY) + sizeof (EFI_IFR_DATA_ENTRY) + Size);\r
ASSERT (IfrDataArray != NULL);\r
+ IfrDataArray->EntryCount = 1;\r
+ IfrDataEntry = (EFI_IFR_DATA_ENTRY *) (IfrDataArray + 1);\r
\r
- BufferStorage = GetStorageFromQuestionId (ConfigAccess->ThunkContext->FormSet, QuestionId);\r
+ Statement = GetStorageFromQuestionId (ConfigAccess->ThunkContext->FormSet, QuestionId);\r
\r
- if (BufferStorage == NULL) {\r
+ if (Statement == NULL || Statement->Storage == NULL) {\r
//\r
// The QuestionId is not associated with a Buffer Storage.\r
// Try to get the first Buffer Storage then.\r
//\r
BufferStorage = GetFirstStorageOfFormSet (ConfigAccess->ThunkContext->FormSet);\r
+ } else {\r
+ BufferStorage = Statement->Storage;\r
+ IfrDataEntry->OpCode = Statement->Operand;\r
}\r
\r
if (BufferStorage != NULL) {\r
- BrowserDataSize = BufferStorage->Size;\r
+ BrowserDataSize = BufferStorage->Size;\r
+ IfrDataEntry->Length = (UINT8) (sizeof (EFI_IFR_DATA_ENTRY) + Size);\r
\r
if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {\r
*NvMapAllocated = TRUE;\r
IfrDataArray->NvRamMap = ConfigAccess->ThunkContext->NvMapOverride;\r
}\r
\r
- Status = GetBrowserData (&BufferStorage->Guid, BufferStorage->Name, &BrowserDataSize, IfrDataArray->NvRamMap);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- IfrDataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) (IfrDataArray + 1);\r
+ ASSERT (HiiGetBrowserData (&BufferStorage->Guid, BufferStorage->Name, BrowserDataSize, (UINT8 *) IfrDataArray->NvRamMap));\r
\r
switch (Type) {\r
case EFI_IFR_TYPE_NUM_SIZE_8:\r
break;\r
\r
case EFI_IFR_TYPE_STRING:\r
- ASSERT (String != NULL);\r
- StrCpy ((CHAR16 *) &IfrDataEntry->Data, String);\r
- FreePool (String);\r
+ if (Size != 0) {\r
+ ASSERT (String != NULL);\r
+ StrCpy ((CHAR16 *) &IfrDataEntry->Data, String);\r
+ FreePool (String);\r
+ }\r
break;\r
default:\r
ASSERT (FALSE);\r
}\r
\r
//\r
- // Need to fiil in the information for the rest of field for FRAMEWORK_EFI_IFR_DATA_ENTRY.\r
+ // Need to fiil in the information for the rest of field for EFI_IFR_DATA_ENTRY.\r
// It seems that no implementation is found to use other fields. Leave them uninitialized for now.\r
//\r
//UINT8 OpCode; // Likely a string, numeric, or one-of\r
- //UINT8 Length; // Length of the FRAMEWORK_EFI_IFR_DATA_ENTRY packet\r
+ //UINT8 Length; // Length of the EFI_IFR_DATA_ENTRY packet\r
//UINT16 Flags; // Flags settings to determine what behavior is desired from the browser after the callback\r
//VOID *Data; // The data in the form based on the op-code type - this is not a pointer to the data, the data follows immediately\r
// If the OpCode is a OneOf or Numeric type - Data is a UINT16 value\r
IN EFI_QUESTION_ID QuestionId\r
)\r
{\r
- FORMSET_STORAGE *BufferStorage;\r
- EFI_STATUS Status;\r
- UINTN BrowserDataSize;\r
+ FORMSET_STORAGE *BufferStorage;\r
+ BOOLEAN CheckFlag;\r
+ UINTN BrowserDataSize;\r
+ FORM_BROWSER_STATEMENT *Statement;\r
\r
if (ConfigAccess->ThunkContext->NvMapOverride != NULL) {\r
\r
- BufferStorage = GetStorageFromQuestionId (ConfigAccess->ThunkContext->FormSet, QuestionId);\r
+ Statement = GetStorageFromQuestionId (ConfigAccess->ThunkContext->FormSet, QuestionId);\r
\r
- if (BufferStorage == NULL) {\r
+ if (Statement == NULL || Statement->Storage == NULL) {\r
//\r
// QuestionId is a statement without Storage.\r
// 1) It is a Goto. \r
// \r
//\r
BufferStorage = GetFirstStorageOfFormSet (ConfigAccess->ThunkContext->FormSet);\r
+ } else {\r
+ BufferStorage = Statement->Storage;\r
}\r
\r
//\r
\r
BrowserDataSize = BufferStorage->Size;\r
\r
- Status = SetBrowserData (&BufferStorage->Guid, BufferStorage->Name, BrowserDataSize, ConfigAccess->ThunkContext->NvMapOverride, NULL);\r
- ASSERT_EFI_ERROR (Status);\r
+ CheckFlag = HiiSetBrowserData (&BufferStorage->Guid, BufferStorage->Name, BrowserDataSize, ConfigAccess->ThunkContext->NvMapOverride, NULL);\r
+ ASSERT (CheckFlag);\r
}\r
\r
}\r
\r
/**\r
- Free up resource allocated for a FRAMEWORK_EFI_IFR_DATA_ARRAY by CreateIfrDataArray ().\r
+ Free up resource allocated for a EFI_IFR_DATA_ARRAY by CreateIfrDataArray ().\r
\r
- @param Array The FRAMEWORK_EFI_IFR_DATA_ARRAY allocated.\r
- @param NvMapAllocated If the NvRamMap is allocated for FRAMEWORK_EFI_IFR_DATA_ARRAY.\r
+ @param Array The EFI_IFR_DATA_ARRAY allocated.\r
+ @param NvMapAllocated If the NvRamMap is allocated for EFI_IFR_DATA_ARRAY.\r
\r
**/\r
VOID\r
DestroyIfrDataArray (\r
- IN FRAMEWORK_EFI_IFR_DATA_ARRAY *Array,\r
+ IN EFI_IFR_DATA_ARRAY *Array,\r
IN BOOLEAN NvMapAllocated\r
)\r
{\r
CONFIG_ACCESS_PRIVATE *ConfigAccess;\r
EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;\r
EFI_HII_CALLBACK_PACKET *Packet;\r
- FRAMEWORK_EFI_IFR_DATA_ARRAY *Data;\r
- FRAMEWORK_EFI_IFR_DATA_ENTRY *DataEntry;\r
+ EFI_IFR_DATA_ARRAY *Data;\r
+ EFI_IFR_DATA_ENTRY *DataEntry;\r
UINT16 KeyValue;\r
ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
EFI_HANDLE NotifyHandle;\r
}\r
\r
//\r
- // Build the FRAMEWORK_EFI_IFR_DATA_ARRAY\r
+ // Build the EFI_IFR_DATA_ARRAY\r
//\r
Data = CreateIfrDataArray (ConfigAccess, QuestionId, Type, Value, &NvMapAllocated);\r
\r
if (EFI_ERROR (Status)) {\r
if (Packet != NULL) {\r
do {\r
- IfrLibCreatePopUp (1, &Key, Packet->String);\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, Packet->String, NULL);\r
} while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
}\r
//\r
} else {\r
if (Packet != NULL) {\r
if (Packet->DataArray.EntryCount == 1 && Packet->DataArray.NvRamMap == NULL) {\r
- DataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY));\r
+ DataEntry = (EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (EFI_IFR_DATA_ARRAY));\r
if ((DataEntry->Flags & EXIT_REQUIRED) == EXIT_REQUIRED) {\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
}\r