From 59930165974abb11d38570e1ef580e9f480ef499 Mon Sep 17 00:00:00 2001 From: qwang12 Date: Thu, 21 Aug 2008 02:33:00 +0000 Subject: [PATCH] 1) Add GetAttributesOfFirstFormSet to scan form package to read formset title, class info. 2) Clean up function related to package registration code. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5702 6f19259b-4bc3-4df7-8a09-765794883524 --- .../FrameworkHiiToUefiHiiThunk/Package.c | 177 +++++------------- .../FrameworkHiiToUefiHiiThunk/Utility.c | 119 +++++++++--- .../FrameworkHiiToUefiHiiThunk/Utility.h | 19 +- 3 files changed, 149 insertions(+), 166 deletions(-) diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c index 49cde52080..37d2f57931 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c @@ -76,29 +76,8 @@ GetPackageCount ( return EFI_SUCCESS; } -/** - Removes a node from a doubly linked list, and returns the node that follows - the removed node. - - Removes the node Entry from a doubly linked list. It is up to the caller of - this function to release the memory used by this node if that is required. On - exit, the node following Entry in the doubly linked list is returned. If - Entry is the only node in the linked list, then the head node of the linked - list is returned. - - If Entry is NULL, then ASSERT(). - If Entry is the head node of an empty list, then ASSERT(). - If PcdMaximumLinkedListLength is not zero, and the number of nodes in the - linked list containing Entry, including the Entry node, is greater than - or equal to PcdMaximumLinkedListLength, then ASSERT(). - - @param Entry A pointer to a node in a linked list - - @return Entry - -**/ -EFI_STATUS -FindPackListWithOnlyIfrPackAndAddStringPack ( +VOID +UpdatePackListWithOnlyIfrPack ( IN HII_THUNK_PRIVATE_DATA *Private, IN HII_THUNK_CONTEXT *StringPackageThunkContext, IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader @@ -129,19 +108,14 @@ FindPackListWithOnlyIfrPackAndAddStringPack ( ThunkContext->UefiHiiHandle, StringPackageListHeader ); - ASSERT (Status != EFI_NOT_FOUND); + ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - return Status; - } } } Link = GetNextNode (&Private->ThunkContextListHead, Link); } - - return EFI_NOT_FOUND; } @@ -206,24 +180,27 @@ PrepareUefiPackageListFromFrameworkHiiPackages ( } VOID -GenerateGuidId ( - IN CONST EFI_GUID * InGuid, - OUT EFI_GUID * OutGuid +GenerateRandomGuid ( + OUT EFI_GUID * Guid ) { - UINT64 MonotonicCount; + EFI_STATUS Status; + static EFI_GUID GuidBase = { 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e }}; + UINT64 MonotonicCount; - CopyMem (OutGuid, InGuid, sizeof (EFI_GUID)); + CopyGuid (Guid, &GuidBase); + + Status = gBS->GetNextMonotonicCount (&MonotonicCount); + ASSERT_EFI_ERROR (Status); - gBS->GetNextMonotonicCount (&MonotonicCount); // // Use Monotonic Count as a psedo random number generator. // - *((UINT64 *) OutGuid) = *((UINT64 *) OutGuid) + MonotonicCount; + *((UINT64 *) Guid) = *((UINT64 *) Guid) + MonotonicCount; } EFI_STATUS -FindStringPackAndAddToPackListWithOnlyIfrPack( +FindStringPackAndUpdatePackListWithOnlyIfrPack ( IN HII_THUNK_PRIVATE_DATA *Private, IN HII_THUNK_CONTEXT *IfrThunkContext ) @@ -259,21 +236,22 @@ FindStringPackAndAddToPackListWithOnlyIfrPack( FreePool (StringPackageListHeader); return EFI_SUCCESS; + } } Link = GetNextNode (&Private->ThunkContextListHead, Link); } + ASSERT (FALSE); return EFI_NOT_FOUND; - + } - -CONST EFI_GUID mAGuid = - { 0x14f95e01, 0xd562, 0x432e, { 0x84, 0x4a, 0x95, 0xa4, 0x39, 0x5, 0x10, 0x7e } }; - +// +// +// EFI_STATUS UefiRegisterPackageList( IN HII_THUNK_PRIVATE_DATA *Private, @@ -285,7 +263,7 @@ UefiRegisterPackageList( UINTN StringPackageCount; UINTN IfrPackageCount; EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; - HII_THUNK_CONTEXT *ThunkContext; + HII_THUNK_CONTEXT *ThunkContext; EFI_GUID GuidId; PackageListHeader = NULL; @@ -297,6 +275,7 @@ UefiRegisterPackageList( // // HII Thunk only handle package with 0 or 1 IFR package. // + ASSERT (FALSE); return EFI_UNSUPPORTED; } @@ -316,18 +295,15 @@ UefiRegisterPackageList( // GUID. // ASSERT (StringPackageCount >=1 && IfrPackageCount == 1); - Packages->GuidId = &GuidId; - GenerateGuidId (&mAGuid, Packages->GuidId); + GenerateRandomGuid (&GuidId); } else { - //BugBug We need fix this. - //ASSERT (StringPackageCount == 0 || IfrPackageCount == 0); CopyGuid (&GuidId, Packages->GuidId); } // // Record the Package List GUID, it is used as a name for the package list by Framework HII. // - CopyGuid (&ThunkContext->TagGuid, Packages->GuidId); + CopyGuid (&ThunkContext->TagGuid, &GuidId); if ((StringPackageCount == 0) && (IfrPackageCount != 0)) { // @@ -335,7 +311,7 @@ UefiRegisterPackageList( // In Framework HII implementation, Packages->GuidId is used as an identifier to associate // a PackageList with only IFR to a Package list the with String package. // - GenerateGuidId (Packages->GuidId, &GuidId); + GenerateRandomGuid (&GuidId); } // @@ -364,18 +340,14 @@ UefiRegisterPackageList( if (IfrPackageCount == 0) { if (StringPackageCount != 0) { // - // Find if there is Package List with only IFR Package in the databasee with the same - // tag. If found, add the String Package to this Package List. + // Look for a Package List with only IFR Package with the same GUID name. + // If found one, add the String Packages to it. // - Status = FindPackListWithOnlyIfrPackAndAddStringPack ( - Private, - ThunkContext, - PackageListHeader - ); - - if (Status == EFI_NOT_FOUND) { - Status = EFI_SUCCESS; - } + UpdatePackListWithOnlyIfrPack ( + Private, + ThunkContext, + PackageListHeader + ); } } else { CreateQuestionIdMap (ThunkContext); @@ -384,11 +356,14 @@ UefiRegisterPackageList( // // Register the Package List to UEFI HII first. // - Status = FindStringPackAndAddToPackListWithOnlyIfrPack ( + Status = FindStringPackAndUpdatePackListWithOnlyIfrPack ( Private, ThunkContext ); - ASSERT_EFI_ERROR (Status); + + if (EFI_ERROR (Status)) { + goto Done; + } } } @@ -511,14 +486,12 @@ Returns: } RemoveEntryList (&ThunkContext->Link); - DestroyThunkContext (ThunkContext); }else { Status = EFI_NOT_FOUND; } mInFrameworkHiiRemovePack = FALSE; - gBS->RestoreTPL (OldTpl); return Status; @@ -560,71 +533,14 @@ NewOrAddPackNotify ( InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link); } - if (PackageType == EFI_HII_PACKAGE_FORM) { - Status = CreateQuestionIdMap (ThunkContext); + GetAttributesOfFirstFormSet (ThunkContext); } return Status; } - -BOOLEAN -IsRemovingLastStringPack ( - IN EFI_HII_HANDLE Handle - ) -{ - EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; - UINTN BufferSize; - EFI_STATUS Status; - EFI_HII_PACKAGE_HEADER *PackageHeader; - UINTN StringPackageCount; - - HiiPackageList = NULL; - BufferSize = 0; - StringPackageCount = 0; - - Status = HiiLibExportPackageLists (Handle, &HiiPackageList, &BufferSize); - ASSERT_EFI_ERROR (Status); - - PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER)); - - while (PackageHeader->Type != EFI_HII_PACKAGE_END) { - switch (PackageHeader->Type) { - case EFI_HII_PACKAGE_STRINGS: - StringPackageCount++; - - if (StringPackageCount > 1) { - // - // More than one String Pack in the package list - // - FreePool (HiiPackageList); - return FALSE; - } - break; - - default: - break; - } - // - // goto header of next package - // - PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length); - } - - - // - // We will always be notified for the removal of String Pack from a package list. - // So StringPackageCount must be one at this point. - // - ASSERT (StringPackageCount == 1); - - FreePool (HiiPackageList); - return TRUE; -} - - - +// // Framework HII module may cache a GUID as the name of the package list. // Then search for the Framework HII handle database for the handle matching // this GUID @@ -639,9 +555,11 @@ RemovePackNotify ( IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType ) { - EFI_STATUS Status; - HII_THUNK_PRIVATE_DATA *Private; - HII_THUNK_CONTEXT * ThunkContext; + EFI_STATUS Status; + HII_THUNK_PRIVATE_DATA *Private; + HII_THUNK_CONTEXT *ThunkContext; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + UINTN BufferSize; Status = EFI_SUCCESS; @@ -657,7 +575,10 @@ RemovePackNotify ( ThunkContext = UefiHiiHandleToThunkContext (Private, Handle); if (!ThunkContext->ByFrameworkHiiNewPack) { - if (IsRemovingLastStringPack (Handle)) { + Status = HiiLibExportPackageLists (Handle, &HiiPackageList, &BufferSize); + ASSERT_EFI_ERROR (Status); + + if (GetPackageCountByType (HiiPackageList, EFI_HII_PACKAGE_STRINGS) == 1) { // // If the string package will be removed is the last string package // in the package list, we will remove the HII Thunk entry from the @@ -665,6 +586,8 @@ RemovePackNotify ( // DestroyThunkContextForUefiHiiHandle (Private, Handle); } + + FreePool (HiiPackageList); } return Status; diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c index 9e41487778..8208b813c7 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c @@ -21,29 +21,6 @@ EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID; EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID; -EFI_GUID * -GetGuidOfFirstFormset ( - CONST EFI_HII_FORM_PACKAGE * FormPackage -) -{ - UINT8 *StartOfNextPackage; - EFI_IFR_OP_HEADER *OpCodeData; - - StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length; - OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1); - - while ((UINT8 *) OpCodeData < StartOfNextPackage) { - if (OpCodeData->OpCode == EFI_IFR_FORM_SET_OP) { - return AllocateCopyPool (sizeof(EFI_GUID), &(((EFI_IFR_FORM_SET *) OpCodeData)->Guid)); - } - OpCodeData = (EFI_IFR_OP_HEADER *) ((UINT8 *) OpCodeData + OpCodeData->Length); - } - - ASSERT (FALSE); - - return NULL; -} - EFI_HII_HANDLE FwHiiHandleToUefiHiiHandle ( IN CONST HII_THUNK_PRIVATE_DATA *Private, @@ -239,6 +216,94 @@ GetOneOfOptionMapEntryListHead ( return NULL; } +VOID +GetAttributesOfFirstFormSet ( + IN OUT HII_THUNK_CONTEXT *ThunkContext + ) +{ + EFI_STATUS Status; + EFI_HII_PACKAGE_LIST_HEADER *List; + EFI_HII_PACKAGE_HEADER *Package; + UINTN Size; + EFI_IFR_OP_HEADER *OpCode; + UINTN Offset; + EFI_IFR_GUID_CLASS *Class; + EFI_IFR_FORM_SET *FormSet; + EFI_IFR_GUID_SUBCLASS *SubClass; + + Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size); + ASSERT_EFI_ERROR (Status); + + // + // There must be at least one EFI_HII_PACKAGE_FORM in the package list. + // + ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1); + + // + // Skip the package list header. + // + Package = (EFI_HII_PACKAGE_HEADER *) (List + 1); + + while (Package->Type != EFI_HII_PACKAGE_END) { + + if (Package->Type == EFI_HII_PACKAGE_FORM) { + + // + // Skip the package header + // + Offset = sizeof (EFI_HII_PACKAGE_HEADER); + while (Offset < Package->Length) { + OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset); + + switch (OpCode->OpCode) { + case EFI_IFR_FORM_SET_OP: + FormSet = (EFI_IFR_FORM_SET *) OpCode; + ThunkContext->FormSetTitle = FormSet->FormSetTitle; + ThunkContext->FormSetHelp = FormSet->Help; + break; + + + case EFI_IFR_GUID_OP: + Class = (EFI_IFR_GUID_CLASS*) OpCode; + if (CompareGuid (&Class->Guid, &gTianoHiiIfrGuid)) { + Class = (EFI_IFR_GUID_CLASS *) OpCode; + + switch (Class->ExtendOpCode) { + case EFI_IFR_EXTEND_OP_CLASS: + ThunkContext->FormSetClass = Class->Class; + break; + case EFI_IFR_EXTEND_OP_SUBCLASS: + SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode; + ThunkContext->FormSetSubClass = SubClass->SubClass; + break; + + default: + break; + } + } + break; + + default: + break; + + } + + Offset += OpCode->Length; + } + // + // The attributes of first FormSet is ready now. + // + FreePool (List); + return; + + break; + } + + Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length; + } + +} + EFI_STATUS CreateQuestionIdMap ( @@ -262,6 +327,7 @@ CreateQuestionIdMap ( ONE_OF_OPTION_MAP *OneOfOptionMap; ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry; EFI_IFR_GUID_CLASS *Class; + EFI_IFR_GUID_SUBCLASS *SubClass; Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size); @@ -371,7 +437,8 @@ CreateQuestionIdMap ( ThunkContext->FormSetClass = Class->Class; break; case EFI_IFR_EXTEND_OP_SUBCLASS: - ThunkContext->FormSetSubClass = ((EFI_IFR_GUID_SUBCLASS *) Class)->SubClass; + SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode; + ThunkContext->FormSetSubClass = SubClass->SubClass; break; default: @@ -489,7 +556,7 @@ DestroyQuestionIdMap ( while (!IsListEmpty (&IdMap->MapEntryListHead)) { Link2 = GetFirstNode (&IdMap->MapEntryListHead); - IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link); + IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2); RemoveEntryList (Link2); @@ -519,7 +586,7 @@ DestoryOneOfOptionMap ( while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) { Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead); - MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link); + MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2); RemoveEntryList (Link2); diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h index d6b758d140..f2785a2438 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h @@ -16,11 +16,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #ifndef _HII_THUNK_UTILITY_H #define _HII_THUNK_UTILITY_H -EFI_GUID * -GetGuidOfFirstFormset ( - CONST EFI_HII_FORM_PACKAGE * FormPackage -); - /** Find the UefiHiiHandle based on a Framework HII Handle returned by the HII Thunk to Framework HII code. @@ -60,14 +55,6 @@ TagGuidToUefiHiiHandle ( ) ; -EFI_STATUS -AssignFrameworkHiiHandle ( - IN OUT HII_THUNK_PRIVATE_DATA *Private, - IN BOOLEAN FromFwHiiNewPack, - OUT FRAMEWORK_EFI_HII_HANDLE *Handle - ) -; - HII_THUNK_CONTEXT * CreateThunkContextForUefiHiiHandle ( IN EFI_HII_HANDLE UefiHiiHandle @@ -94,6 +81,12 @@ CreateQuestionIdMap ( ) ; +VOID +GetAttributesOfFirstFormSet ( + IN OUT HII_THUNK_CONTEXT *ThunkContext + ) +; + LIST_ENTRY * GetMapEntryListHead ( IN CONST HII_THUNK_CONTEXT *ThunkContext, -- 2.39.2