Refine the logic to handle the device path info get from string token.

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

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13632 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
ydong10 2012-08-14 09:52:25 +00:00
parent d0bf562330
commit 33efdf51b0
4 changed files with 121 additions and 40 deletions

View File

@ -1766,6 +1766,44 @@ DriverCallback (
return Status;
}
/**
Transfer the binary device path to string.
@param DevicePath The device path info.
@retval Device path string info.
**/
CHAR16 *
GenerateDevicePathString (
EFI_DEVICE_PATH_PROTOCOL *DevicePath
)
{
CHAR16 *String;
CHAR16 *TmpBuf;
UINTN Index;
UINT8 *Buffer;
UINTN DevicePathSize;
//
// Compute the size of the device path in bytes
//
DevicePathSize = GetDevicePathSize (DevicePath);
String = AllocateZeroPool ((DevicePathSize * 2 + 1) * sizeof (CHAR16));
if (String == NULL) {
return NULL;
}
TmpBuf = String;
for (Index = 0, Buffer = (UINT8 *)DevicePath; Index < DevicePathSize; Index++) {
TmpBuf += UnicodeValueToString (TmpBuf, PREFIX_ZERO | RADIX_HEX, *(Buffer++), 2);
}
return String;
}
/**
Main entry for this driver.
@ -1802,6 +1840,8 @@ DriverSampleInit (
// Initialize the local variables.
//
ConfigRequestHdr = NULL;
NewString = NULL;
//
// Initialize screen dimensions for SendForm().
// Remove 3 characters from top and bottom
@ -1921,10 +1961,14 @@ DriverSampleInit (
//
// Update the device path string.
//
if (HiiSetString (HiiHandle[0], STRING_TOKEN (STR_DEVICE_PATH), (EFI_STRING) &mHiiVendorDevicePath0, NULL) == 0) {
NewString = GenerateDevicePathString((EFI_DEVICE_PATH_PROTOCOL*)&mHiiVendorDevicePath0);
if (HiiSetString (HiiHandle[0], STRING_TOKEN (STR_DEVICE_PATH), NewString, NULL) == 0) {
DriverSampleUnload (ImageHandle);
return EFI_OUT_OF_RESOURCES;
}
if (NewString != NULL) {
FreePool (NewString);
}
//
// Very simple example of how one would update a string that is already

View File

@ -2210,6 +2210,7 @@ EvaluateExpression (
UINT8 *TempBuffer;
EFI_TIME EfiTime;
EFI_HII_VALUE QuestionVal;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
//
// Save current stack offset.
@ -2475,11 +2476,17 @@ EvaluateExpression (
break;
}
if (!GetQuestionValueFromForm((EFI_DEVICE_PATH_PROTOCOL*)StrPtr, NULL, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
DevicePath = ConvertDevicePathFromText(StrPtr);
if (!GetQuestionValueFromForm(DevicePath, NULL, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
Value->Type = EFI_IFR_TYPE_UNDEFINED;
break;
}
} else {
Value = &QuestionVal;
}
if (DevicePath != NULL) {
FreePool (DevicePath);
}
} else if (CompareGuid (&OpCode->Guid, &gZeroGuid) != 0) {
if (!GetQuestionValueFromForm(NULL, FormSet->HiiHandle, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
Value->Type = EFI_IFR_TYPE_UNDEFINED;

View File

@ -1949,64 +1949,27 @@ FormSetGuidToHiiHandle (
}
/**
Process the goto op code, update the info in the selection structure.
Transfer the device path string to binary format.
@param Statement The statement belong to goto op code.
@param Selection The selection info.
@param Repaint Whether need to repaint the menu.
@param NewLine Whether need to create new line.
@param StringPtr The device path string info.
@retval Device path binary info.
@retval EFI_SUCCESS The menu process successfully.
@return Other value if the process failed.
**/
EFI_STATUS
ProcessGotoOpCode (
IN OUT FORM_BROWSER_STATEMENT *Statement,
IN OUT UI_MENU_SELECTION *Selection,
OUT BOOLEAN *Repaint,
OUT BOOLEAN *NewLine
EFI_DEVICE_PATH_PROTOCOL *
ConvertDevicePathFromText (
IN CHAR16 *StringPtr
)
{
CHAR16 *StringPtr;
UINTN StringLen;
UINTN BufferSize;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
CHAR16 TemStr[2];
UINT8 *DevicePathBuffer;
UINTN Index;
UINT8 DigitUint8;
FORM_BROWSER_FORM *RefForm;
EFI_INPUT_KEY Key;
EFI_STATUS Status;
UI_MENU_LIST *MenuList;
BOOLEAN UpdateFormInfo;
Status = EFI_SUCCESS;
UpdateFormInfo = TRUE;
StringPtr = NULL;
StringLen = 0;
ASSERT (StringPtr != NULL);
//
// Prepare the device path check, get the device path info first.
//
if (Statement->HiiValue.Value.ref.DevicePath != 0) {
StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);
if (StringPtr != NULL) {
StringLen = StrLen (StringPtr);
}
}
//
// Check whether the device path string is a valid string.
//
if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL && StringLen != 0) {
if (Selection->Form->ModalForm) {
return Status;
}
//
// Goto another Hii Package list
//
Selection->Action = UI_ACTION_REFRESH_FORMSET;
BufferSize = StrLen (StringPtr) / 2;
DevicePath = AllocatePool (BufferSize);
ASSERT (DevicePath != NULL);
@ -2030,10 +1993,64 @@ ProcessGotoOpCode (
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
}
}
FreePool (StringPtr);
return DevicePath;
}
/**
Process the goto op code, update the info in the selection structure.
@param Statement The statement belong to goto op code.
@param Selection The selection info.
@param Repaint Whether need to repaint the menu.
@param NewLine Whether need to create new line.
@retval EFI_SUCCESS The menu process successfully.
@return Other value if the process failed.
**/
EFI_STATUS
ProcessGotoOpCode (
IN OUT FORM_BROWSER_STATEMENT *Statement,
IN OUT UI_MENU_SELECTION *Selection,
OUT BOOLEAN *Repaint,
OUT BOOLEAN *NewLine
)
{
CHAR16 *StringPtr;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
FORM_BROWSER_FORM *RefForm;
EFI_INPUT_KEY Key;
EFI_STATUS Status;
UI_MENU_LIST *MenuList;
BOOLEAN UpdateFormInfo;
Status = EFI_SUCCESS;
UpdateFormInfo = TRUE;
StringPtr = NULL;
//
// Prepare the device path check, get the device path info first.
//
if (Statement->HiiValue.Value.ref.DevicePath != 0) {
StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);
}
//
// Check whether the device path string is a valid string.
//
if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL) {
if (Selection->Form->ModalForm) {
return Status;
}
//
// Goto another Hii Package list
//
Selection->Action = UI_ACTION_REFRESH_FORMSET;
DevicePath = ConvertDevicePathFromText (StringPtr);
Selection->Handle = DevicePathToHiiHandle (DevicePath);
FreePool (DevicePath);
FreePool (StringPtr);
if (Selection->Handle == NULL) {
//

View File

@ -1028,4 +1028,17 @@ EvaluateExpressionList (
IN FORM_BROWSER_FORM *Form OPTIONAL
);
/**
Transfer the device path string to binary format.
@param StringPtr The device path string info.
@retval Device path binary info.
**/
EFI_DEVICE_PATH_PROTOCOL *
ConvertDevicePathFromText (
IN CHAR16 *StringPtr
);
#endif // _UI_H