1) Add in fix to handle the case when a form is not related to a buffer storage.

2) Allocate Hii Handle from a bitfield array so Framework Hii Handle can be recycled.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5700 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qwang12
2008-08-20 14:17:24 +00:00
parent 1a8802f763
commit d4775f2a4c
9 changed files with 285 additions and 202 deletions

View File

@@ -15,6 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include "HiiDatabase.h"
#include "HiiHandle.h"
EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;
EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;
@@ -137,47 +138,8 @@ TagGuidToUefiHiiHandle (
}
BOOLEAN
IsFrameworkHiiDatabaseHandleDepleted (
IN CONST HII_THUNK_PRIVATE_DATA *Private
)
{
return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);
}
EFI_STATUS
AssignFrameworkHiiHandle (
IN OUT HII_THUNK_PRIVATE_DATA *Private,
IN BOOLEAN FromFwHiiNewPack,
OUT FRAMEWORK_EFI_HII_HANDLE *Handle
)
{
ASSERT (Handle != NULL);
if (FromFwHiiNewPack) {
*Handle = Private->StaticHiiHandle;
Private->StaticHiiHandle += 1;
if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {
return EFI_OUT_OF_RESOURCES;
}
} else {
*Handle = Private->StaticPureUefiHiiHandle;
Private->StaticPureUefiHiiHandle -= 1;
if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {
return EFI_OUT_OF_RESOURCES;
}
}
return EFI_SUCCESS;
}
EFI_STATUS
VOID
DestroyThunkContextForUefiHiiHandle (
IN HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_HANDLE UefiHiiHandle
@@ -188,14 +150,7 @@ DestroyThunkContextForUefiHiiHandle (
ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);
ASSERT (ThunkContext != NULL);
ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));
ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));
RemoveEntryList (&ThunkContext->Link);
FreePool (ThunkContext);
return EFI_SUCCESS;
DestroyThunkContext (ThunkContext);
}
@@ -208,7 +163,6 @@ DestroyThunkContextForUefiHiiHandle (
**/
HII_THUNK_CONTEXT *
CreateThunkContextForUefiHiiHandle (
IN HII_THUNK_PRIVATE_DATA *Private,
IN EFI_HII_HANDLE UefiHiiHandle
)
{
@@ -221,7 +175,7 @@ CreateThunkContextForUefiHiiHandle (
ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;
Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);
Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);
if (EFI_ERROR (Status)) {
return NULL;
}
@@ -236,8 +190,6 @@ CreateThunkContextForUefiHiiHandle (
InitializeListHead (&ThunkContext->QuestionIdMapListHead);
InitializeListHead (&ThunkContext->OneOfOptionMapListHead);
InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);
return ThunkContext;
}
@@ -471,3 +423,114 @@ GetMapEntryListHead (
}
HII_THUNK_CONTEXT *
CreateThunkContext (
IN HII_THUNK_PRIVATE_DATA *Private,
IN UINTN StringPackageCount,
IN UINTN IfrPackageCount
)
{
EFI_STATUS Status;
HII_THUNK_CONTEXT *ThunkContext;
ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));
ASSERT (ThunkContext != NULL);
ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;
ThunkContext->IfrPackageCount = IfrPackageCount;
ThunkContext->StringPackageCount = StringPackageCount;
Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);
if (EFI_ERROR (Status)) {
return NULL;
}
InitializeListHead (&ThunkContext->QuestionIdMapListHead);
InitializeListHead (&ThunkContext->OneOfOptionMapListHead);
return ThunkContext;
}
VOID
DestroyThunkContext (
IN HII_THUNK_CONTEXT *ThunkContext
)
{
ASSERT (ThunkContext != NULL);
FreeHiiHandle (ThunkContext->FwHiiHandle);
DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);
DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);
RemoveEntryList (&ThunkContext->Link);
FreePool (ThunkContext);
}
VOID
DestroyQuestionIdMap (
IN LIST_ENTRY *QuestionIdMapListHead
)
{
QUESTION_ID_MAP *IdMap;
QUESTION_ID_MAP_ENTRY *IdMapEntry;
LIST_ENTRY *Link;
LIST_ENTRY *Link2;
while (!IsListEmpty (QuestionIdMapListHead)) {
Link = GetFirstNode (QuestionIdMapListHead);
IdMap = QUESTION_ID_MAP_FROM_LINK (Link);
while (!IsListEmpty (&IdMap->MapEntryListHead)) {
Link2 = GetFirstNode (&IdMap->MapEntryListHead);
IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);
RemoveEntryList (Link2);
FreePool (IdMapEntry);
}
RemoveEntryList (Link);
FreePool (IdMap);
}
}
VOID
DestoryOneOfOptionMap (
IN LIST_ENTRY *OneOfOptionMapListHead
)
{
ONE_OF_OPTION_MAP *Map;
ONE_OF_OPTION_MAP_ENTRY *MapEntry;
LIST_ENTRY *Link;
LIST_ENTRY *Link2;
while (!IsListEmpty (OneOfOptionMapListHead)) {
Link = GetFirstNode (OneOfOptionMapListHead);
Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);
while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {
Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);
MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);
RemoveEntryList (Link2);
FreePool (MapEntry);
}
RemoveEntryList (Link);
FreePool (Map);
}
}