From 7248790ee958c41b4ba2284f3b6835f1c3e505be Mon Sep 17 00:00:00 2001 From: Eric Dong Date: Wed, 27 Nov 2013 02:29:01 +0000 Subject: Update the logic in browser core, use config routine protocol instead of config access protocol to get/set data with hii drivers. Signed-off-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14902 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/HiiDatabaseDxe/ConfigRouting.c | 179 ++++++++++++++++++--- 1 file changed, 161 insertions(+), 18 deletions(-) (limited to 'MdeModulePkg/Universal/HiiDatabaseDxe') diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 2ed02cdaa4..1fb16817b7 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -355,6 +355,9 @@ OutputConfigBody ( } Length = TmpPtr - String; + if (Length == 0) { + return EFI_NOT_FOUND; + } Result = AllocateCopyPool (Length * sizeof (CHAR16), String); if (Result == NULL) { return EFI_OUT_OF_RESOURCES; @@ -1281,6 +1284,13 @@ IsThisVarstore ( GuidStr = NULL; TempStr = NULL; + // + // If ConfigHdr has name field and varstore not has name, return FALSE. + // + if (Name == NULL && StrStr (ConfigHdr, L"NAME=&") == NULL) { + return FALSE; + } + GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *)VarstoreGuid, 1, &GuidStr); if (Name != NULL) { GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr); @@ -1317,6 +1327,130 @@ Done: return RetVal; } +/** + This function parses Form Package to get the efi varstore info according to the request ConfigHdr. + + @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package. + @param ConfigHdr Request string ConfigHdr. If it is NULL, + the first found varstore will be as ConfigHdr. + @retval TRUE This hii package is the reqeust one. + @retval FALSE This hii package is not the reqeust one. +**/ +BOOLEAN +IsThisPackageList ( + IN HII_DATABASE_RECORD *DataBaseRecord, + IN EFI_STRING ConfigHdr + ) +{ + EFI_STATUS Status; + UINTN IfrOffset; + UINTN PackageOffset; + EFI_IFR_OP_HEADER *IfrOpHdr; + CHAR16 *VarStoreName; + UINT8 *HiiFormPackage; + UINTN PackageSize; + EFI_IFR_VARSTORE_EFI *IfrEfiVarStore; + EFI_HII_PACKAGE_HEADER *PackageHeader; + EFI_IFR_VARSTORE *IfrVarStore; + EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore; + BOOLEAN FindVarstore; + + HiiFormPackage = NULL; + VarStoreName = NULL; + Status = EFI_SUCCESS; + FindVarstore = FALSE; + + Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize); + if (EFI_ERROR (Status)) { + return FALSE; + } + + IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER); + PackageOffset = IfrOffset; + PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage; + + while (IfrOffset < PackageSize) { + // + // More than one form packages exist. + // + if (PackageOffset >= PackageHeader->Length) { + // + // Process the new form package. + // + PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER); + IfrOffset += PackageOffset; + PackageHeader = (EFI_HII_PACKAGE_HEADER *) (HiiFormPackage + IfrOffset); + } + + IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset); + IfrOffset += IfrOpHdr->Length; + PackageOffset += IfrOpHdr->Length; + + switch (IfrOpHdr->OpCode) { + + case EFI_IFR_VARSTORE_OP: + IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr; + + VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrVarStore->Name) * sizeof (CHAR16)); + if (VarStoreName == NULL) { + goto Done; + } + AsciiStrToUnicodeStr ((CHAR8 *)IfrVarStore->Name, VarStoreName); + + if (IsThisVarstore((VOID *)&IfrVarStore->Guid, VarStoreName, ConfigHdr)) { + FindVarstore = TRUE; + goto Done; + } + break; + + case EFI_IFR_VARSTORE_EFI_OP: + IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr; + VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16)); + if (VarStoreName == NULL) { + goto Done; + } + AsciiStrToUnicodeStr ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName); + + if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) { + FindVarstore = TRUE; + goto Done; + } + break; + + case EFI_IFR_VARSTORE_NAME_VALUE_OP: + IfrNameValueVarStore = (EFI_IFR_VARSTORE_NAME_VALUE *) IfrOpHdr; + + if (IsThisVarstore (&IfrNameValueVarStore->Guid, NULL, ConfigHdr)) { + FindVarstore = TRUE; + goto Done; + } + break; + + case EFI_IFR_FORM_OP: + case EFI_IFR_FORM_MAP_OP: + // + // No matched varstore is found and directly return. + // + goto Done; + break; + + default: + break; + } + } + +Done: + if (HiiFormPackage != NULL) { + FreePool (HiiFormPackage); + } + + if (VarStoreName != NULL) { + FreePool (VarStoreName); + } + + return FindVarstore; +} + /** Check whether the this op code is required. @@ -2128,14 +2262,26 @@ ParseIfrData ( // // End Opcode is for Var question. // - if (BlockData != NULL && BlockData->Scope > 0) { - BlockData->Scope--; + if (BlockData != NULL) { + if (BlockData->Scope > 0) { + BlockData->Scope--; + } + if (BlockData->Scope == 0) { + BlockData = NULL; + } } + break; default: - if (BlockData != NULL && BlockData->Scope > 0) { - BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope); + if (BlockData != NULL) { + if (BlockData->Scope > 0) { + BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope); + } + + if (BlockData->Scope == 0) { + BlockData = NULL; + } } break; } @@ -3200,10 +3346,11 @@ GetConfigRespFromEfiVarStore ( UINT8 *VarStore; UINTN BufferSize; - Status = EFI_SUCCESS; - BufferSize = 0; - VarStore = NULL; - VarStoreName = NULL; + Status = EFI_SUCCESS; + BufferSize = 0; + VarStore = NULL; + VarStoreName = NULL; + *AccessProgress = Request; VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16)); if (VarStoreName == NULL) { @@ -3537,6 +3684,7 @@ HiiConfigRoutingExtractConfig ( BOOLEAN IsEfiVarStore; EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo; EFI_STRING ErrorPtr; + UINTN DevicePathSize; if (This == NULL || Progress == NULL || Results == NULL) { return EFI_INVALID_PARAMETER; @@ -3622,11 +3770,8 @@ HiiConfigRoutingExtractConfig ( Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE); if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) { CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER); - if (CompareMem ( - DevicePath, - CurrentDevicePath, - GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath) - ) == 0) { + DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath); + if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Request)) { DriverHandle = Database->DriverHandle; HiiHandle = Database->Handle; break; @@ -4060,6 +4205,7 @@ HiiConfigRoutingRouteConfig ( EFI_STRING AccessProgress; EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo; BOOLEAN IsEfiVarstore; + UINTN DevicePathSize; if (This == NULL || Progress == NULL) { return EFI_INVALID_PARAMETER; @@ -4131,11 +4277,8 @@ HiiConfigRoutingRouteConfig ( if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) { CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER); - if (CompareMem ( - DevicePath, - CurrentDevicePath, - GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath) - ) == 0) { + DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath); + if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Configuration)) { DriverHandle = Database->DriverHandle; break; } -- cgit v1.2.3