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