}\r
\r
/**\r
- This function shares the same logic to parse ConfigAltResp string \r
- for setting default value and validating current setting.\r
-\r
- @param ConfigResp \r
- @param HiiPackageList \r
- @param PackageListLength \r
- @param VarGuid\r
- @param VarName\r
+ This internal function parses IFR data to validate current setting.\r
+\r
+ @param ConfigResp ConfigResp string contains the current setting.\r
+ @param HiiPackageList Point to Hii package list.\r
+ @param PackageListLength The length of the pacakge.\r
+ @param VarGuid Guid of the buffer storage.\r
+ @param VarName Name of the buffer storage.\r
\r
- @retval EFI_SUCCESS\r
+ @retval EFI_SUCCESS The current setting is valid.\r
+ @retval EFI_OUT_OF_RESOURCES The memory is not enough.\r
+ @retval EFI_INVALID_PARAMETER The config string or the Hii package is invalid.\r
**/\r
EFI_STATUS\r
EFIAPI\r
}\r
//\r
// Find the matched VarStoreId to the input VarGuid and VarName\r
- // \r
+ //\r
IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;\r
if (CompareGuid ((EFI_GUID *) (VOID *) &IfrVarStore->Guid, VarGuid)) {\r
VarStoreName = (CHAR8 *) IfrVarStore->Name;\r
break;\r
case EFI_IFR_ONE_OF_OP:\r
//\r
- // Check whether current value is the one of option. \r
+ // Check whether current value is the one of option.\r
//\r
\r
//\r
+ // OneOf question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (IfrVarStore == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ // \r
// Check whether this question is for the requested varstore.\r
//\r
IfrOneOf = (EFI_IFR_ONE_OF *) IfrOpHdr;\r
// Check the current value is in the numeric range.\r
//\r
\r
+ //\r
+ // Numeric question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (IfrVarStore == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
// Check value is BOOLEAN type, only 0 and 1 is valid.\r
//\r
\r
+ //\r
+ // CheckBox question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (IfrVarStore == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
// Check current string length is less than maxsize\r
//\r
\r
+ //\r
+ // CheckBox question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (IfrVarStore == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
}\r
\r
/**\r
- This function shares the same logic to parse ConfigAltResp string \r
- for setting default value and validating current setting.\r
- \r
+ This function parses the input ConfigRequest string and its matched IFR code\r
+ string for setting default value and validating current setting.\r
+\r
1. For setting default action, Reset the default value specified by DefaultId \r
to the driver configuration got by Request string.\r
2. For validating current setting, Validate the current configuration \r
SizeAltCfgResp + StrSize (StringPtrDefault),\r
(VOID *) (*AltCfgResp)\r
);\r
+ if (*AltCfgResp == NULL) {\r
+ FreePool (AltConfigHdr);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
StrCat (*AltCfgResp, StringPtrDefault);\r
break;\r
} else {\r
\r
//\r
// Find next AltCfg String\r
- // \r
+ //\r
*(AltConfigHdr + HeaderLength) = L'\0';\r
StringPtrDefault = StrStr (StringPtrDefault + 1, AltConfigHdr); \r
}\r
-\r
+ \r
+ FreePool (AltConfigHdr);\r
return EFI_SUCCESS; \r
}\r
\r
IN EFI_STRING ConfigHdr,\r
IN IFR_BLOCK_DATA *RequestBlockArray,\r
IN OUT IFR_VARSTORAGE_DATA *VarStorageData,\r
- OUT IFR_DEFAULT_DATA **PIfrDefaultIdArray\r
+ OUT IFR_DEFAULT_DATA *DefaultIdArray\r
)\r
{\r
EFI_STATUS Status;\r
EFI_IFR_CHECKBOX *IfrCheckBox;\r
EFI_IFR_PASSWORD *IfrPassword;\r
EFI_IFR_STRING *IfrString;\r
- IFR_DEFAULT_DATA *DefaultIdArray;\r
IFR_DEFAULT_DATA *DefaultData;\r
IFR_BLOCK_DATA *BlockData;\r
CHAR16 *VarStoreName;\r
EFI_STRING TempStr;\r
UINTN LengthString;\r
\r
- //\r
- // Initialize DefaultIdArray to store the map between DeaultId and DefaultName\r
- //\r
LengthString = 0;\r
Status = EFI_SUCCESS;\r
GuidStr = NULL;\r
TempStr = NULL;\r
BlockData = NULL;\r
DefaultData = NULL;\r
- DefaultIdArray = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultIdArray == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- InitializeListHead (&DefaultIdArray->Entry);\r
\r
//\r
// Go through the form package to parse OpCode one by one.\r
// Numeric and OneOf has the same opcode structure.\r
//\r
\r
+ //\r
+ // Numeric and OneOf question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
// width by EFI_IFR_ORDERED_LIST MaxContainers * OneofOption Type\r
// no default value and default id, how to define its default value?\r
//\r
- \r
+\r
+ //\r
+ // OrderedList question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
// default id by DeaultOption DefaultId can override CheckBox Flags and Default value.\r
// \r
\r
+ //\r
+ // CheckBox question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
// no default value, only block array\r
//\r
\r
+ //\r
+ // String question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
// no default value, only block array\r
//\r
\r
+ //\r
+ // Password question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
//\r
// Check whether this question is for the requested varstore.\r
//\r
break;\r
case EFI_IFR_END_OP:\r
//\r
- // End Opcode is for Var.\r
+ // End Opcode is for Var question.\r
//\r
if (BlockData != NULL && BlockData->Scope > 0) {\r
BlockData->Scope--;\r
}\r
\r
Done:\r
- //\r
- // Set the defualt ID array.\r
- //\r
- *PIfrDefaultIdArray = DefaultIdArray;\r
-\r
return Status; \r
}\r
\r
When Request points to NULL string, the request string and default value string \r
for each varstore in form package will return. \r
\r
- @param HiiHandle Hii Handle which Hii Packages are registered.\r
+ @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.\r
@param DevicePath Device Path which Hii Config Access Protocol is registered.\r
@param Request Pointer to a null-terminated Unicode string in\r
<ConfigRequest> format. When it doesn't contain\r
EFI_STATUS\r
EFIAPI\r
GetFullStringFromHiiFormPackages (\r
- IN EFI_HII_HANDLE HiiHandle,\r
+ IN HII_DATABASE_RECORD *DataBaseRecord,\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
IN OUT EFI_STRING *Request,\r
IN OUT EFI_STRING *AltCfgResp\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINT32 PackageListLength; \r
- UINTN BufferSize;\r
+ UINT8 *HiiFormPackage;\r
+ UINTN PackageSize;\r
+ UINTN ResultSize;\r
IFR_BLOCK_DATA *RequestBlockArray;\r
IFR_BLOCK_DATA *BlockData;\r
IFR_BLOCK_DATA *NextBlockData;\r
IFR_DEFAULT_DATA *DefaultValueData;\r
IFR_DEFAULT_DATA *DefaultId;\r
IFR_DEFAULT_DATA *DefaultIdArray;\r
- EFI_HII_PACKAGE_HEADER PacakgeHeader;\r
- UINT32 PackageOffset;\r
IFR_VARSTORAGE_DATA *VarStorageData;\r
EFI_STRING DefaultAltCfgResp;\r
EFI_STRING FullConfigRequest;\r
// Initialize the local variables.\r
//\r
RequestBlockArray = NULL;\r
+ DefaultIdArray = NULL;\r
VarStorageData = NULL;\r
DefaultAltCfgResp = NULL;\r
FullConfigRequest = NULL;\r
ConfigHdr = NULL;\r
- DefaultIdArray = NULL;\r
GuidStr = NULL;\r
NameStr = NULL;\r
PathStr = NULL;\r
-\r
- //\r
- // 1. Get HiiPackage by HiiHandle\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
- Status = HiiExportPackageLists (&mPrivate.HiiDatabase, HiiHandle, &BufferSize, HiiPackageList);\r
-\r
- //\r
- // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
+ HiiFormPackage = NULL;\r
+ ResultSize = 0;\r
+ PackageSize = 0;\r
+ \r
//\r
- if (Status != EFI_BUFFER_TOO_SMALL) {\r
+ // 0. Get Hii Form Package by HiiHandle\r
+ //\r
+ Status = ExportFormPackages (\r
+ &mPrivate, \r
+ DataBaseRecord->Handle, \r
+ DataBaseRecord->PackageList, \r
+ 0, \r
+ PackageSize, \r
+ HiiFormPackage,\r
+ &ResultSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
-\r
- HiiPackageList = AllocatePool (BufferSize);\r
- if (HiiPackageList == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ \r
+ HiiFormPackage = AllocatePool (ResultSize);\r
+ if (HiiFormPackage == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
}\r
\r
//\r
- // Get PackageList on HiiHandle\r
+ // Get HiiFormPackage by HiiHandle\r
//\r
- Status = HiiExportPackageLists (&mPrivate.HiiDatabase, HiiHandle, &BufferSize, HiiPackageList);\r
+ PackageSize = ResultSize;\r
+ ResultSize = 0;\r
+ Status = ExportFormPackages (\r
+ &mPrivate, \r
+ DataBaseRecord->Handle, \r
+ DataBaseRecord->PackageList, \r
+ 0,\r
+ PackageSize, \r
+ HiiFormPackage,\r
+ &ResultSize\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
\r
//\r
- // 2. Parse FormPackage to get BlockArray and DefaultId Array for the request BlockArray.\r
- // 1) Request is NULL.\r
- // 2) Request is not NULL. And it doesn't contain any BlockArray.\r
- // 3) Request is not NULL. And it containts BlockArray.\r
- //\r
-\r
- //\r
- // Initialize VarStorageData to store the var store Block and Default value information.\r
- //\r
- VarStorageData = (IFR_VARSTORAGE_DATA *) AllocateZeroPool (sizeof (IFR_VARSTORAGE_DATA));\r
- if (VarStorageData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
-\r
- InitializeListHead (&VarStorageData->Entry);\r
- InitializeListHead (&VarStorageData->BlockEntry);\r
-\r
- //\r
- // Gte the request block array by Request String \r
+ // 1. Get the request block array by Request String when Request string containts the block array.\r
//\r
StringPtr = NULL;\r
if (*Request != NULL) {\r
}\r
\r
//\r
- // Get the form package\r
+ // 2. Parse FormPackage to get BlockArray and DefaultId Array for the request BlockArray.\r
//\r
- PackageOffset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
- PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
- while (PackageOffset < PackageListLength) {\r
- CopyMem (&PacakgeHeader, (UINT8 *) HiiPackageList + PackageOffset, sizeof (PacakgeHeader));\r
-\r
- if (PacakgeHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
- //\r
- // Reset VarStorageData\r
- //\r
- VarStorageData->Size = 0;\r
- VarStorageData->VarStoreId = 0;\r
- if (VarStorageData->Name != NULL) {\r
- FreePool (VarStorageData->Name);\r
- VarStorageData->Name = NULL;\r
- }\r
\r
- //\r
- // Parse the opcode in form package \r
- //\r
- Status = ParseIfrData ((UINT8 *) HiiPackageList + PackageOffset, PacakgeHeader.Length, *Request, RequestBlockArray, VarStorageData, &DefaultIdArray);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
+ //\r
+ // Initialize DefaultIdArray to store the map between DeaultId and DefaultName\r
+ //\r
+ DefaultIdArray = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
+ if (DefaultIdArray == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ InitializeListHead (&DefaultIdArray->Entry);\r
\r
- //\r
- // Only one form is in a pacakge list.\r
- //\r
- break;\r
- }\r
+ //\r
+ // Initialize VarStorageData to store the var store Block and Default value information.\r
+ //\r
+ VarStorageData = (IFR_VARSTORAGE_DATA *) AllocateZeroPool (sizeof (IFR_VARSTORAGE_DATA));\r
+ if (VarStorageData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ InitializeListHead (&VarStorageData->Entry);\r
+ InitializeListHead (&VarStorageData->BlockEntry);\r
\r
- PackageOffset += PacakgeHeader.Length;\r
+ //\r
+ // Parse the opcode in form pacakge to get the default setting.\r
+ //\r
+ Status = ParseIfrData (HiiFormPackage, (UINT32) PackageSize, *Request, RequestBlockArray, VarStorageData, DefaultIdArray);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
}\r
\r
//\r
//\r
// Free Pacakge data\r
//\r
- if (HiiPackageList != NULL) {\r
- FreePool (HiiPackageList);\r
+ if (HiiFormPackage != NULL) {\r
+ FreePool (HiiFormPackage);\r
}\r
\r
return Status;\r
//\r
DriverHandle = NULL;\r
HiiHandle = NULL;\r
+ Database = NULL;\r
DevicePathLength = GetDevicePathSize (DevicePath);\r
for (Link = Private->DatabaseList.ForwardLink;\r
Link != &Private->DatabaseList;\r
//\r
// Get the full request string from IFR when HiiPackage is registered to HiiHandle \r
//\r
- Status = GetFullStringFromHiiFormPackages (HiiHandle, DevicePath, &ConfigRequest, &DefaultResults);\r
+ Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
//\r
if (HiiHandle != NULL) {\r
if (DefaultResults == NULL) {\r
- Status = GetFullStringFromHiiFormPackages (HiiHandle, DevicePath, &ConfigRequest, &AccessResults);\r
+ Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &AccessResults);\r
} else {\r
Status = MergeDefaultString (&AccessResults, DefaultResults);\r
}\r
HiiHandle = NULL;\r
ConfigRequest = NULL;\r
DefaultResults = NULL;\r
+ Database = NULL;\r
DevicePath = DevicePathFromHandle (ConfigAccessHandles[Index]);\r
DevicePathLength = GetDevicePathSize (DevicePath);\r
if (DevicePath != NULL) {\r
// Update AccessResults by getting default setting from IFR when HiiPackage is registered to HiiHandle \r
//\r
if (HiiHandle != NULL && DevicePath != NULL) {\r
- Status = GetFullStringFromHiiFormPackages (HiiHandle, DevicePath, &ConfigRequest, &DefaultResults);\r
+ Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults);\r
}\r
//\r
// Can't parse IFR data to get the request string and default string.\r
// Merge the default sting from IFR code into the got setting from driver.\r
//\r
if (DefaultResults != NULL) {\r
- MergeDefaultString (&AccessResults, DefaultResults);\r
+ Status = MergeDefaultString (&AccessResults, DefaultResults);\r
+ ASSERT_EFI_ERROR (Status);\r
FreePool (DefaultResults);\r
+ DefaultResults = NULL;\r
}\r
\r
//\r