mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 15:44:04 +02:00
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:
parent
d0bf562330
commit
33efdf51b0
@ -1766,6 +1766,44 @@ DriverCallback (
|
|||||||
return Status;
|
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.
|
Main entry for this driver.
|
||||||
|
|
||||||
@ -1802,6 +1840,8 @@ DriverSampleInit (
|
|||||||
// Initialize the local variables.
|
// Initialize the local variables.
|
||||||
//
|
//
|
||||||
ConfigRequestHdr = NULL;
|
ConfigRequestHdr = NULL;
|
||||||
|
NewString = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize screen dimensions for SendForm().
|
// Initialize screen dimensions for SendForm().
|
||||||
// Remove 3 characters from top and bottom
|
// Remove 3 characters from top and bottom
|
||||||
@ -1921,11 +1961,15 @@ DriverSampleInit (
|
|||||||
//
|
//
|
||||||
// Update the device path string.
|
// 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);
|
DriverSampleUnload (ImageHandle);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
if (NewString != NULL) {
|
||||||
|
FreePool (NewString);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Very simple example of how one would update a string that is already
|
// Very simple example of how one would update a string that is already
|
||||||
// in the HII database
|
// in the HII database
|
||||||
|
@ -2210,6 +2210,7 @@ EvaluateExpression (
|
|||||||
UINT8 *TempBuffer;
|
UINT8 *TempBuffer;
|
||||||
EFI_TIME EfiTime;
|
EFI_TIME EfiTime;
|
||||||
EFI_HII_VALUE QuestionVal;
|
EFI_HII_VALUE QuestionVal;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Save current stack offset.
|
// Save current stack offset.
|
||||||
@ -2475,11 +2476,17 @@ EvaluateExpression (
|
|||||||
break;
|
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;
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
break;
|
} else {
|
||||||
|
Value = &QuestionVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DevicePath != NULL) {
|
||||||
|
FreePool (DevicePath);
|
||||||
}
|
}
|
||||||
Value = &QuestionVal;
|
|
||||||
} else if (CompareGuid (&OpCode->Guid, &gZeroGuid) != 0) {
|
} else if (CompareGuid (&OpCode->Guid, &gZeroGuid) != 0) {
|
||||||
if (!GetQuestionValueFromForm(NULL, FormSet->HiiHandle, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
|
if (!GetQuestionValueFromForm(NULL, FormSet->HiiHandle, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
|
||||||
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
|
@ -1948,6 +1948,55 @@ FormSetGuidToHiiHandle (
|
|||||||
return HiiHandle;
|
return HiiHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN BufferSize;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
|
CHAR16 TemStr[2];
|
||||||
|
UINT8 *DevicePathBuffer;
|
||||||
|
UINTN Index;
|
||||||
|
UINT8 DigitUint8;
|
||||||
|
|
||||||
|
ASSERT (StringPtr != NULL);
|
||||||
|
|
||||||
|
BufferSize = StrLen (StringPtr) / 2;
|
||||||
|
DevicePath = AllocatePool (BufferSize);
|
||||||
|
ASSERT (DevicePath != NULL);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert from Device Path String to DevicePath Buffer in the reverse order.
|
||||||
|
//
|
||||||
|
DevicePathBuffer = (UINT8 *) DevicePath;
|
||||||
|
for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {
|
||||||
|
TemStr[0] = StringPtr[Index];
|
||||||
|
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||||
|
if (DigitUint8 == 0 && TemStr[0] != L'0') {
|
||||||
|
//
|
||||||
|
// Invalid Hex Char as the tail.
|
||||||
|
//
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((Index & 1) == 0) {
|
||||||
|
DevicePathBuffer [Index/2] = DigitUint8;
|
||||||
|
} else {
|
||||||
|
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return DevicePath;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Process the goto op code, update the info in the selection structure.
|
Process the goto op code, update the info in the selection structure.
|
||||||
|
|
||||||
@ -1968,13 +2017,7 @@ ProcessGotoOpCode (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *StringPtr;
|
CHAR16 *StringPtr;
|
||||||
UINTN StringLen;
|
|
||||||
UINTN BufferSize;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
CHAR16 TemStr[2];
|
|
||||||
UINT8 *DevicePathBuffer;
|
|
||||||
UINTN Index;
|
|
||||||
UINT8 DigitUint8;
|
|
||||||
FORM_BROWSER_FORM *RefForm;
|
FORM_BROWSER_FORM *RefForm;
|
||||||
EFI_INPUT_KEY Key;
|
EFI_INPUT_KEY Key;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -1984,22 +2027,18 @@ ProcessGotoOpCode (
|
|||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
UpdateFormInfo = TRUE;
|
UpdateFormInfo = TRUE;
|
||||||
StringPtr = NULL;
|
StringPtr = NULL;
|
||||||
StringLen = 0;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Prepare the device path check, get the device path info first.
|
// Prepare the device path check, get the device path info first.
|
||||||
//
|
//
|
||||||
if (Statement->HiiValue.Value.ref.DevicePath != 0) {
|
if (Statement->HiiValue.Value.ref.DevicePath != 0) {
|
||||||
StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);
|
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.
|
// Check whether the device path string is a valid string.
|
||||||
//
|
//
|
||||||
if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL && StringLen != 0) {
|
if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL) {
|
||||||
if (Selection->Form->ModalForm) {
|
if (Selection->Form->ModalForm) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -2007,33 +2046,11 @@ ProcessGotoOpCode (
|
|||||||
// Goto another Hii Package list
|
// Goto another Hii Package list
|
||||||
//
|
//
|
||||||
Selection->Action = UI_ACTION_REFRESH_FORMSET;
|
Selection->Action = UI_ACTION_REFRESH_FORMSET;
|
||||||
BufferSize = StrLen (StringPtr) / 2;
|
DevicePath = ConvertDevicePathFromText (StringPtr);
|
||||||
DevicePath = AllocatePool (BufferSize);
|
|
||||||
ASSERT (DevicePath != NULL);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Convert from Device Path String to DevicePath Buffer in the reverse order.
|
|
||||||
//
|
|
||||||
DevicePathBuffer = (UINT8 *) DevicePath;
|
|
||||||
for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {
|
|
||||||
TemStr[0] = StringPtr[Index];
|
|
||||||
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
|
||||||
if (DigitUint8 == 0 && TemStr[0] != L'0') {
|
|
||||||
//
|
|
||||||
// Invalid Hex Char as the tail.
|
|
||||||
//
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((Index & 1) == 0) {
|
|
||||||
DevicePathBuffer [Index/2] = DigitUint8;
|
|
||||||
} else {
|
|
||||||
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FreePool (StringPtr);
|
|
||||||
|
|
||||||
Selection->Handle = DevicePathToHiiHandle (DevicePath);
|
Selection->Handle = DevicePathToHiiHandle (DevicePath);
|
||||||
FreePool (DevicePath);
|
FreePool (DevicePath);
|
||||||
|
FreePool (StringPtr);
|
||||||
|
|
||||||
if (Selection->Handle == NULL) {
|
if (Selection->Handle == NULL) {
|
||||||
//
|
//
|
||||||
|
@ -1028,4 +1028,17 @@ EvaluateExpressionList (
|
|||||||
IN FORM_BROWSER_FORM *Form OPTIONAL
|
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
|
#endif // _UI_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user