Update the logic, based on the device path and formset guid to find the HiiHandle.

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14828 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Eric Dong 2013-11-07 07:38:05 +00:00 committed by ydong10
parent 9da3888456
commit 07d7dbaeba
3 changed files with 125 additions and 133 deletions

View File

@ -2036,11 +2036,7 @@ GetQuestionValueFromForm (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE DriverHandle;
EFI_HANDLE Handle;
EFI_HII_HANDLE *HiiHandles;
EFI_HII_HANDLE HiiHandle; EFI_HII_HANDLE HiiHandle;
UINTN Index;
FORM_BROWSER_STATEMENT *Question; FORM_BROWSER_STATEMENT *Question;
FORM_BROWSER_FORMSET *FormSet; FORM_BROWSER_FORMSET *FormSet;
FORM_BROWSER_FORM *Form; FORM_BROWSER_FORM *Form;
@ -2054,7 +2050,6 @@ GetQuestionValueFromForm (
(DevicePath == NULL && InputHiiHandle != NULL) ); (DevicePath == NULL && InputHiiHandle != NULL) );
GetTheVal = TRUE; GetTheVal = TRUE;
DriverHandle = NULL;
HiiHandle = NULL; HiiHandle = NULL;
Question = NULL; Question = NULL;
Form = NULL; Form = NULL;
@ -2063,38 +2058,10 @@ GetQuestionValueFromForm (
// Get HiiHandle. // Get HiiHandle.
// //
if (DevicePath != NULL) { if (DevicePath != NULL) {
// HiiHandle = DevicePathToHiiHandle (DevicePath, FormSetGuid);
// 1. Get Driver handle. if (HiiHandle == NULL) {
//
Status = gBS->LocateDevicePath (
&gEfiDevicePathProtocolGuid,
&DevicePath,
&DriverHandle
);
if (EFI_ERROR (Status) || (DriverHandle == NULL)) {
return FALSE; return FALSE;
} }
//
// 2. Get Hii handle
//
HiiHandles = HiiGetHiiHandles (NULL);
if (HiiHandles == NULL) {
return FALSE;
}
for (Index = 0; HiiHandles[Index] != NULL; Index++) {
Status = mHiiDatabase->GetPackageListHandle (
mHiiDatabase,
HiiHandles[Index],
&Handle
);
if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {
HiiHandle = HiiHandles[Index];
break;
}
}
FreePool (HiiHandles);
} else { } else {
HiiHandle = InputHiiHandle; HiiHandle = InputHiiHandle;
} }

View File

@ -1040,6 +1040,87 @@ ProcessAction (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Check whether the formset guid is in this Hii package list.
@param HiiHandle The HiiHandle for this HII package list.
@param FormsetGuid The formset guid for the request formset.
@retval TRUE Find the formset guid.
@retval FALSE Not found the formset guid.
**/
BOOLEAN
GetFormsetGuidFromHiiHandle (
IN EFI_HII_HANDLE HiiHandle,
IN EFI_GUID *FormSetGuid
)
{
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
UINTN BufferSize;
UINT32 Offset;
UINT32 Offset2;
UINT32 PackageListLength;
EFI_HII_PACKAGE_HEADER PackageHeader;
UINT8 *Package;
UINT8 *OpCodeData;
EFI_STATUS Status;
BOOLEAN FindGuid;
BufferSize = 0;
HiiPackageList = NULL;
FindGuid = FALSE;
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandle, &BufferSize, HiiPackageList);
if (Status == EFI_BUFFER_TOO_SMALL) {
HiiPackageList = AllocatePool (BufferSize);
ASSERT (HiiPackageList != NULL);
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandle, &BufferSize, HiiPackageList);
}
if (EFI_ERROR (Status) || HiiPackageList == NULL) {
return FALSE;
}
//
// Get Form package from this HII package List
//
Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
Offset2 = 0;
CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
while (Offset < PackageListLength) {
Package = ((UINT8 *) HiiPackageList) + Offset;
CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
Offset += PackageHeader.Length;
if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
//
// Search FormSet in this Form Package
//
Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
while (Offset2 < PackageHeader.Length) {
OpCodeData = Package + Offset2;
if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))){
FindGuid = TRUE;
break;
}
}
Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
}
}
if (FindGuid) {
break;
}
}
FreePool (HiiPackageList);
return FindGuid;
}
/** /**
Find HII Handle in the HII database associated with given Device Path. Find HII Handle in the HII database associated with given Device Path.
@ -1048,6 +1129,7 @@ ProcessAction (
@param DevicePath Device Path associated with the HII package list @param DevicePath Device Path associated with the HII package list
handle. handle.
@param FormsetGuid The formset guid for this formset.
@retval Handle HII package list Handle associated with the Device @retval Handle HII package list Handle associated with the Device
Path. Path.
@ -1055,15 +1137,13 @@ ProcessAction (
**/ **/
EFI_HII_HANDLE EFI_HII_HANDLE
EFIAPI
DevicePathToHiiHandle ( DevicePathToHiiHandle (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN EFI_GUID *FormsetGuid
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath; EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
UINTN BufferSize;
UINTN HandleCount;
UINTN Index; UINTN Index;
EFI_HANDLE Handle; EFI_HANDLE Handle;
EFI_HANDLE DriverHandle; EFI_HANDLE DriverHandle;
@ -1088,32 +1168,8 @@ DevicePathToHiiHandle (
// //
// Retrieve all HII Handles from HII database // Retrieve all HII Handles from HII database
// //
BufferSize = 0x1000; HiiHandles = HiiGetHiiHandles (NULL);
HiiHandles = AllocatePool (BufferSize); if (HiiHandles == NULL) {
ASSERT (HiiHandles != NULL);
Status = mHiiDatabase->ListPackageLists (
mHiiDatabase,
EFI_HII_PACKAGE_TYPE_ALL,
NULL,
&BufferSize,
HiiHandles
);
if (Status == EFI_BUFFER_TOO_SMALL) {
FreePool (HiiHandles);
HiiHandles = AllocatePool (BufferSize);
ASSERT (HiiHandles != NULL);
Status = mHiiDatabase->ListPackageLists (
mHiiDatabase,
EFI_HII_PACKAGE_TYPE_ALL,
NULL,
&BufferSize,
HiiHandles
);
}
if (EFI_ERROR (Status)) {
FreePool (HiiHandles);
return NULL; return NULL;
} }
@ -1121,16 +1177,21 @@ DevicePathToHiiHandle (
// Search Hii Handle by Driver Handle // Search Hii Handle by Driver Handle
// //
HiiHandle = NULL; HiiHandle = NULL;
HandleCount = BufferSize / sizeof (EFI_HII_HANDLE); for (Index = 0; HiiHandles[Index] != NULL; Index++) {
for (Index = 0; Index < HandleCount; Index++) {
Status = mHiiDatabase->GetPackageListHandle ( Status = mHiiDatabase->GetPackageListHandle (
mHiiDatabase, mHiiDatabase,
HiiHandles[Index], HiiHandles[Index],
&Handle &Handle
); );
if (!EFI_ERROR (Status) && (Handle == DriverHandle)) { if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {
HiiHandle = HiiHandles[Index]; if (GetFormsetGuidFromHiiHandle(HiiHandles[Index], FormsetGuid)) {
break; HiiHandle = HiiHandles[Index];
break;
}
if (HiiHandle != NULL) {
break;
}
} }
} }
@ -1157,17 +1218,8 @@ FormSetGuidToHiiHandle (
) )
{ {
EFI_HII_HANDLE *HiiHandles; EFI_HII_HANDLE *HiiHandles;
UINTN Index;
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
UINTN BufferSize;
UINT32 Offset;
UINT32 Offset2;
UINT32 PackageListLength;
EFI_HII_PACKAGE_HEADER PackageHeader;
UINT8 *Package;
UINT8 *OpCodeData;
EFI_STATUS Status;
EFI_HII_HANDLE HiiHandle; EFI_HII_HANDLE HiiHandle;
UINTN Index;
ASSERT (ComparingGuid != NULL); ASSERT (ComparingGuid != NULL);
@ -1182,61 +1234,14 @@ FormSetGuidToHiiHandle (
// Search for formset of each class type // Search for formset of each class type
// //
for (Index = 0; HiiHandles[Index] != NULL; Index++) { for (Index = 0; HiiHandles[Index] != NULL; Index++) {
BufferSize = 0; if (GetFormsetGuidFromHiiHandle(HiiHandles[Index], ComparingGuid)) {
HiiPackageList = NULL; HiiHandle = HiiHandles[Index];
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandles[Index], &BufferSize, HiiPackageList); break;
if (Status == EFI_BUFFER_TOO_SMALL) {
HiiPackageList = AllocatePool (BufferSize);
ASSERT (HiiPackageList != NULL);
Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandles[Index], &BufferSize, HiiPackageList);
}
if (EFI_ERROR (Status) || HiiPackageList == NULL) {
return NULL;
} }
// if (HiiHandle != NULL) {
// Get Form package from this HII package List break;
//
Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
Offset2 = 0;
CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
while (Offset < PackageListLength) {
Package = ((UINT8 *) HiiPackageList) + Offset;
CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
//
// Search FormSet in this Form Package
//
Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
while (Offset2 < PackageHeader.Length) {
OpCodeData = Package + Offset2;
if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
//
// Try to compare against formset GUID
//
if (CompareGuid (ComparingGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {
HiiHandle = HiiHandles[Index];
break;
}
}
Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
}
}
if (HiiHandle != NULL) {
break;
}
Offset += PackageHeader.Length;
} }
FreePool (HiiPackageList);
if (HiiHandle != NULL) {
break;
}
} }
FreePool (HiiHandles); FreePool (HiiHandles);
@ -1375,7 +1380,7 @@ ProcessGotoOpCode (
if (mPathFromText != NULL) { if (mPathFromText != NULL) {
DevicePath = mPathFromText->ConvertTextToDevicePath(StringPtr); DevicePath = mPathFromText->ConvertTextToDevicePath(StringPtr);
if (DevicePath != NULL) { if (DevicePath != NULL) {
HiiHandle = DevicePathToHiiHandle (DevicePath); HiiHandle = DevicePathToHiiHandle (DevicePath, &Statement->HiiValue.Value.ref.FormSetGuid);
FreePool (DevicePath); FreePool (DevicePath);
} }
FreePool (StringPtr); FreePool (StringPtr);

View File

@ -1613,5 +1613,25 @@ VOID
CleanBrowserStorage ( CleanBrowserStorage (
IN OUT FORM_BROWSER_FORMSET *FormSet IN OUT FORM_BROWSER_FORMSET *FormSet
); );
/**
Find HII Handle in the HII database associated with given Device Path.
If DevicePath is NULL, then ASSERT.
@param DevicePath Device Path associated with the HII package list
handle.
@param FormsetGuid The formset guid for this formset.
@retval Handle HII package list Handle associated with the Device
Path.
@retval NULL Hii Package list handle is not found.
**/
EFI_HII_HANDLE
DevicePathToHiiHandle (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN EFI_GUID *FormsetGuid
);
#endif #endif