mirror of https://github.com/acidanthera/audk.git
MdeModulePkg: Add match2 opcode support in SetupBrowserDxe and sample code in DriverSampleDxe
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@hp.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17340 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7cc80bfd7c
commit
9bd22b08d1
|
@ -68,6 +68,7 @@ typedef struct {
|
||||||
UINT8 GetDefaultValueFromAccess;
|
UINT8 GetDefaultValueFromAccess;
|
||||||
EFI_HII_TIME Time;
|
EFI_HII_TIME Time;
|
||||||
UINT8 RefreshGuidCount;
|
UINT8 RefreshGuidCount;
|
||||||
|
UINT8 Match2;
|
||||||
} DRIVER_SAMPLE_CONFIGURATION;
|
} DRIVER_SAMPLE_CONFIGURATION;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -46,6 +46,9 @@
|
||||||
#define EFI_USER_INFO_ACCESS_SETUP_ADMIN_GUID \
|
#define EFI_USER_INFO_ACCESS_SETUP_ADMIN_GUID \
|
||||||
{ 0x85b75607, 0xf7ce, 0x471e, { 0xb7, 0xe4, 0x2a, 0xea, 0x5f, 0x72, 0x32, 0xee } }
|
{ 0x85b75607, 0xf7ce, 0x471e, { 0xb7, 0xe4, 0x2a, 0xea, 0x5f, 0x72, 0x32, 0xee } }
|
||||||
|
|
||||||
|
#define PERL_GUID \
|
||||||
|
{ 0x63E60A51, 0x497D, 0xD427, {0xC4, 0xA5, 0xB8, 0xAB, 0xDC, 0x3A, 0xAE, 0xB6 }}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Labels definition
|
// Labels definition
|
||||||
//
|
//
|
||||||
|
@ -650,6 +653,16 @@ formset
|
||||||
refresh interval = 3 // Refresh interval in seconds
|
refresh interval = 3 // Refresh interval in seconds
|
||||||
endnumeric;
|
endnumeric;
|
||||||
|
|
||||||
|
grayoutif match2 (stringref(STRING_TOKEN(STR_STRING)), stringref(STRING_TOKEN(STR_PATTERN)), PERL_GUID);
|
||||||
|
numeric
|
||||||
|
varid = MyIfrNVData.Match2,
|
||||||
|
prompt = STRING_TOKEN(STR_MATCH2_PROMPT),
|
||||||
|
help = STRING_TOKEN(STR_MATCH2_HELP),
|
||||||
|
minimum = 0,
|
||||||
|
maximum = 243,
|
||||||
|
endnumeric;
|
||||||
|
endif;
|
||||||
|
|
||||||
label LABEL_UPDATE2;
|
label LABEL_UPDATE2;
|
||||||
label LABEL_END;
|
label LABEL_END;
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Utility functions for expression evaluation.
|
Utility functions for expression evaluation.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -1475,6 +1475,177 @@ Done:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Evaluate opcode EFI_IFR_MATCH2.
|
||||||
|
|
||||||
|
@param FormSet Formset which contains this opcode.
|
||||||
|
@param SyntaxType Syntax type for match2.
|
||||||
|
@param Result Evaluation result for this opcode.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Opcode evaluation success.
|
||||||
|
@retval Other Opcode evaluation failed.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
IfrMatch2 (
|
||||||
|
IN FORM_BROWSER_FORMSET *FormSet,
|
||||||
|
IN EFI_GUID *SyntaxType,
|
||||||
|
OUT EFI_HII_VALUE *Result
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_HII_VALUE Value[2];
|
||||||
|
CHAR16 *String[2];
|
||||||
|
UINTN Index;
|
||||||
|
UINTN GuidIndex;
|
||||||
|
EFI_HANDLE *HandleBuffer;
|
||||||
|
UINTN BufferSize;
|
||||||
|
EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol;
|
||||||
|
UINTN RegExSyntaxTypeListSize;
|
||||||
|
EFI_REGEX_SYNTAX_TYPE *RegExSyntaxTypeList;
|
||||||
|
UINTN CapturesCount;
|
||||||
|
|
||||||
|
//
|
||||||
|
// String[0] - The string to search
|
||||||
|
// String[1] - pattern
|
||||||
|
//
|
||||||
|
String[0] = NULL;
|
||||||
|
String[1] = NULL;
|
||||||
|
HandleBuffer = NULL;
|
||||||
|
RegExSyntaxTypeList = NULL;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
ZeroMem (Value, sizeof (Value));
|
||||||
|
|
||||||
|
Status = PopExpression (&Value[0]);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PopExpression (&Value[1]);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Index = 0; Index < 2; Index++) {
|
||||||
|
if (Value[Index].Type != EFI_IFR_TYPE_STRING) {
|
||||||
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[Index] = GetToken (Value[Index].Value.string, FormSet->HiiHandle);
|
||||||
|
if (String [Index] == NULL) {
|
||||||
|
Status = EFI_NOT_FOUND;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferSize = 0;
|
||||||
|
HandleBuffer = NULL;
|
||||||
|
Status = gBS->LocateHandle(
|
||||||
|
ByProtocol,
|
||||||
|
&gEfiRegularExpressionProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
&BufferSize,
|
||||||
|
HandleBuffer);
|
||||||
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
|
HandleBuffer = AllocateZeroPool(BufferSize);
|
||||||
|
if (HandleBuffer == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
Status = gBS->LocateHandle(
|
||||||
|
ByProtocol,
|
||||||
|
&gEfiRegularExpressionProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
&BufferSize,
|
||||||
|
HandleBuffer);
|
||||||
|
|
||||||
|
} else if (EFI_ERROR (Status)) {
|
||||||
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( Index = 0; Index < BufferSize / sizeof(EFI_HANDLE); Index ++) {
|
||||||
|
Status = gBS->HandleProtocol (
|
||||||
|
HandleBuffer[Index],
|
||||||
|
&gEfiRegularExpressionProtocolGuid,
|
||||||
|
(VOID**)&RegularExpressionProtocol
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegExSyntaxTypeListSize = 0;
|
||||||
|
RegExSyntaxTypeList = NULL;
|
||||||
|
|
||||||
|
Status = RegularExpressionProtocol->GetInfo (
|
||||||
|
RegularExpressionProtocol,
|
||||||
|
&RegExSyntaxTypeListSize,
|
||||||
|
RegExSyntaxTypeList
|
||||||
|
);
|
||||||
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
|
RegExSyntaxTypeList = AllocateZeroPool(RegExSyntaxTypeListSize);
|
||||||
|
if (RegExSyntaxTypeList == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
Status = RegularExpressionProtocol->GetInfo (
|
||||||
|
RegularExpressionProtocol,
|
||||||
|
&RegExSyntaxTypeListSize,
|
||||||
|
RegExSyntaxTypeList
|
||||||
|
);
|
||||||
|
} else if (EFI_ERROR (Status)) {
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (GuidIndex = 0; GuidIndex < RegExSyntaxTypeListSize / sizeof(EFI_GUID); GuidIndex++) {
|
||||||
|
if (CompareGuid (&RegExSyntaxTypeList[GuidIndex], SyntaxType)) {
|
||||||
|
//
|
||||||
|
// Find the match type, return the value.
|
||||||
|
//
|
||||||
|
Result->Type = EFI_IFR_TYPE_BOOLEAN;
|
||||||
|
Status = RegularExpressionProtocol->MatchString (
|
||||||
|
RegularExpressionProtocol,
|
||||||
|
String[0],
|
||||||
|
String[1],
|
||||||
|
SyntaxType,
|
||||||
|
&Result->Value.b,
|
||||||
|
NULL,
|
||||||
|
&CapturesCount
|
||||||
|
);
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegExSyntaxTypeList != NULL) {
|
||||||
|
FreePool (RegExSyntaxTypeList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Type specified by SyntaxType is not supported
|
||||||
|
// in any of the EFI_REGULAR_EXPRESSION_PROTOCOL instances.
|
||||||
|
//
|
||||||
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
Done:
|
||||||
|
if (String[0] != NULL) {
|
||||||
|
FreePool (String[0]);
|
||||||
|
}
|
||||||
|
if (String[1] != NULL) {
|
||||||
|
FreePool (String[1]);
|
||||||
|
}
|
||||||
|
if (RegExSyntaxTypeList != NULL) {
|
||||||
|
FreePool (RegExSyntaxTypeList);
|
||||||
|
}
|
||||||
|
if (HandleBuffer != NULL) {
|
||||||
|
FreePool (HandleBuffer);
|
||||||
|
}
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Evaluate opcode EFI_IFR_FIND.
|
Evaluate opcode EFI_IFR_FIND.
|
||||||
|
@ -3267,6 +3438,10 @@ EvaluateExpression (
|
||||||
Status = IfrMatch (FormSet, Value);
|
Status = IfrMatch (FormSet, Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EFI_IFR_MATCH2_OP:
|
||||||
|
Status = IfrMatch2 (FormSet, &OpCode->Guid, Value);
|
||||||
|
break;
|
||||||
|
|
||||||
case EFI_IFR_CATENATE_OP:
|
case EFI_IFR_CATENATE_OP:
|
||||||
Status = IfrCatenate (FormSet, Value);
|
Status = IfrCatenate (FormSet, Value);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1152,7 +1152,8 @@ IsExpressionOpCode (
|
||||||
(Operand == EFI_IFR_TO_UPPER_OP) ||
|
(Operand == EFI_IFR_TO_UPPER_OP) ||
|
||||||
(Operand == EFI_IFR_MAP_OP) ||
|
(Operand == EFI_IFR_MAP_OP) ||
|
||||||
(Operand == EFI_IFR_VERSION_OP) ||
|
(Operand == EFI_IFR_VERSION_OP) ||
|
||||||
(Operand == EFI_IFR_SECURITY_OP)) {
|
(Operand == EFI_IFR_SECURITY_OP) ||
|
||||||
|
(Operand == EFI_IFR_MATCH2_OP)) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else {
|
} else {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1207,7 +1208,7 @@ IsUnKnownOpCode (
|
||||||
IN UINT8 Operand
|
IN UINT8 Operand
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return Operand > EFI_IFR_WARNING_IF_OP ? TRUE : FALSE;
|
return Operand > EFI_IFR_MATCH2_OP ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1479,6 +1480,10 @@ ParseOpCodes (
|
||||||
CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));
|
CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EFI_IFR_MATCH2_OP:
|
||||||
|
CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_MATCH2 *) OpCodeData)->SyntaxType, sizeof (EFI_GUID));
|
||||||
|
break;
|
||||||
|
|
||||||
case EFI_IFR_GET_OP:
|
case EFI_IFR_GET_OP:
|
||||||
case EFI_IFR_SET_OP:
|
case EFI_IFR_SET_OP:
|
||||||
CopyMem (&TempVarstoreId, &((EFI_IFR_GET *) OpCodeData)->VarStoreId, sizeof (TempVarstoreId));
|
CopyMem (&TempVarstoreId, &((EFI_IFR_GET *) OpCodeData)->VarStoreId, sizeof (TempVarstoreId));
|
||||||
|
|
|
@ -32,6 +32,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#include <Protocol/HiiString.h>
|
#include <Protocol/HiiString.h>
|
||||||
#include <Protocol/UserManager.h>
|
#include <Protocol/UserManager.h>
|
||||||
#include <Protocol/DevicePathFromText.h>
|
#include <Protocol/DevicePathFromText.h>
|
||||||
|
#include <Protocol/RegularExpressionProtocol.h>
|
||||||
|
|
||||||
#include <Guid/MdeModuleHii.h>
|
#include <Guid/MdeModuleHii.h>
|
||||||
#include <Guid/HiiPlatformSetupFormset.h>
|
#include <Guid/HiiPlatformSetupFormset.h>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# It also produces FormBrowserEx(2) protocol to let user register the different Hot key service.
|
# It also produces FormBrowserEx(2) protocol to let user register the different Hot key service.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -75,6 +75,7 @@
|
||||||
## NOTIFY
|
## NOTIFY
|
||||||
gEdkiiFormDisplayEngineProtocolGuid
|
gEdkiiFormDisplayEngineProtocolGuid
|
||||||
gEfiFormBrowserExProtocolGuid ## PRODUCES
|
gEfiFormBrowserExProtocolGuid ## PRODUCES
|
||||||
|
gEfiRegularExpressionProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport ## CONSUMES
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport ## CONSUMES
|
||||||
|
|
Loading…
Reference in New Issue