summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-08-18 05:56:23 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-08-18 05:56:23 +0000
commit0368663fd609e2e008031a2025693f190d19b0c7 (patch)
treec6bc48d410d8f397b9dc8749bf19aede404cc13f /EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
parent0514e9c3c9b46f74c232942759388c46ed89802a (diff)
downloadedk2-platforms-0368663fd609e2e008031a2025693f190d19b0c7.tar.xz
Bug fixes for FrameworkHiiToUefiHiiThunk;
1) Update variable name to better names. 2) Change List Entry in all data structure to "Link". 3) Update to use proper list manipulation functions in BaseLib. 4) Add in more comments and clean up HiiNewString. 5) Clean up for HiiNewPack, HiiRemovePack and the notify functions. 6) Create better name such as GetPackageCount and AssignFrameworkHiiHandle 7) Clean up the InitializeHiiDatabase entry point. 8) Remove the confusing data field in the HII_THUNK_ENTRY HiiDatabase.h. 9) Add in cleanup code for DestoryThunkContext 10) Add in code to handle the save of browser data after invoke callback 11) Map the UEFI One Of Option code to Framework One Of Option code before calling Framework Callback. 12) Add in CreatePopUp support. 13) Add in SendForm support. 14) HiiGetPrimaryLanguages and HiiGetSecondaryLanguages should support language code in RFC639 format from Caller. Then, they should conver them to 3066 format before calling UEFI HII interfaces. 15) Make ResetStrings a NOP. 16) Remove the unnecessary dependency. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5659 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c')
-rw-r--r--EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c610
1 files changed, 218 insertions, 392 deletions
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
index e33b2e2772..50b902a952 100644
--- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
+++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
@@ -15,16 +15,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include "HiiDatabase.h"
-EFI_HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;
-
-EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
- //Signature
- EFI_HII_THUNK_DRIVER_DATA_SIGNATURE
- ,
- //Handle
- (EFI_HANDLE) NULL
- ,
- { //Hii
+HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;
+
+HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
+ HII_THUNK_PRIVATE_DATA_SIGNATURE,
+ (EFI_HANDLE) NULL,
+ {
HiiNewPack,
HiiRemovePack,
HiiFindHandles,
@@ -46,18 +42,21 @@ EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
HiiGetKeyboardLayout
},
+
+ //
//StaticHiiHandle
//The FRAMEWORK_EFI_HII_HANDLE starts from 1
// and increase upwords untill reach the value of StaticPureUefiHiiHandle.
// The code will assert to prevent overflow.
- (FRAMEWORK_EFI_HII_HANDLE) 1
- ,
+ (FRAMEWORK_EFI_HII_HANDLE) 1,
+
+ //
//StaticPureUefiHiiHandle
//The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF
// and decrease downwords untill reach the value of StaticHiiHandle.
// The code will assert to prevent overflow.
- (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF
- ,
+ //
+ (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,
{
NULL, NULL //HiiHandleLinkList
},
@@ -66,6 +65,7 @@ EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {
EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,
(EFI_HANDLE) NULL,
+ (HII_THUNK_PRIVATE_DATA *) NULL,
{
ThunkSendForm,
ThunkCreatePopUp
@@ -74,276 +74,15 @@ EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {
CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;
-CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;
CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;
CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;
CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;
+CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;
-EFI_STATUS
-RegisterUefiHiiHandle (
- EFI_HII_THUNK_PRIVATE_DATA *Private,
- EFI_HII_HANDLE UefiHiiHandle
- )
-{
- EFI_STATUS Status;
- EFI_GUID PackageGuid;
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;
-
- HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));
- HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;
-
- Status = AssignPureUefiHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- HandleMappingEntry->UefiHiiHandle = UefiHiiHandle;
- Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);
- ASSERT_EFI_ERROR (Status);
-
- CopyGuid(&HandleMappingEntry->TagGuid, &PackageGuid);
-
- InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);
-
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-UnRegisterUefiHiiHandle (
- EFI_HII_THUNK_PRIVATE_DATA *Private,
- EFI_HII_HANDLE UefiHiiHandle
- )
-{
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry;
-
- MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, UefiHiiHandle);
- ASSERT (MapEntry != NULL);
-
- RemoveEntryList (&MapEntry->List);
- FreePool (MapEntry);
-
- return EFI_SUCCESS;
-}
-EFI_STATUS
-EFIAPI
-AddPackNotify (
- IN UINT8 PackageType,
- IN CONST EFI_GUID *PackageGuid,
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle,
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
- )
-{
- EFI_STATUS Status;
- EFI_HII_THUNK_PRIVATE_DATA *Private;
-
- ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);
- ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK);
-
- Status = EFI_SUCCESS;
- Private = mHiiThunkPrivateData;
- if (mInFrameworkHiiNewPack) {
- return EFI_SUCCESS;
- }
- //
- // We only create a MapEntry if the Uefi Hii Handle is only already registered
- // by the HII Thunk Layer.
- //
- if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {
- Status = RegisterUefiHiiHandle (Private, Handle);
- }
-
- return Status;
-}
-EFI_STATUS
-EFIAPI
-NewPackNotify (
- IN UINT8 PackageType,
- IN CONST EFI_GUID *PackageGuid,
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle,
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
- )
-{
- EFI_STATUS Status;
- EFI_HII_THUNK_PRIVATE_DATA *Private;
-
- ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);
- ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);
-
- if (mInFrameworkHiiNewPack) {
- return EFI_SUCCESS;
- }
-
- Status = EFI_SUCCESS;
- Private = mHiiThunkPrivateData;
-
- //
- // We only
- //
- if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {
- Status = RegisterUefiHiiHandle (Private, Handle);
- }
-
- return Status;
-}
-
-BOOLEAN
-IsLastStringPack (
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle
- )
-{
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
- UINTN BufferSize;
- EFI_STATUS Status;
- EFI_HII_PACKAGE_HEADER *PackageHdrPtr;
- EFI_HII_PACKAGE_HEADER PackageHeader;
- BOOLEAN Match;
-
- Match = FALSE;
- HiiPackageList = NULL;
- BufferSize = 0;
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
- ASSERT (Status != EFI_NOT_FOUND);
-
- if (Status == EFI_BUFFER_TOO_SMALL) {
- HiiPackageList = AllocateZeroPool (BufferSize);
- ASSERT (HiiPackageList != NULL);
-
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);
- }
-
-
- PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));
- CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));
-
- Status = EFI_SUCCESS;
-
- while (PackageHeader.Type != EFI_HII_PACKAGE_END) {
- switch (PackageHeader.Type) {
- case EFI_HII_PACKAGE_STRINGS:
- if (CompareMem (Package, PackageHdrPtr, Package->Length) != 0) {
- FreePool (HiiPackageList);
- return FALSE;
- }
- break;
- default:
- break;
- }
- //
- // goto header of next package
- //
- PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);
- CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));
- }
-
- FreePool (HiiPackageList);
- return TRUE;
-}
-
-EFI_STATUS
-EFIAPI
-RemovePackNotify (
- IN UINT8 PackageType,
- IN CONST EFI_GUID *PackageGuid,
- IN CONST EFI_HII_PACKAGE_HEADER *Package,
- IN EFI_HII_HANDLE Handle,
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
- )
-{
- EFI_STATUS Status;
- EFI_HII_THUNK_PRIVATE_DATA *Private;
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;
-
- Status = EFI_SUCCESS;
-
- ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);
- ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);
-
- if (mInFrameworkHiiRemovePack) {
- return EFI_SUCCESS;
- }
-
- Private = mHiiThunkPrivateData;
-
- MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle);
-
- if (MapEntry->FrameworkHiiHandle > Private->StaticHiiHandle) {
- //
- // This is a PackageList registered using UEFI HII Protocol Instance.
- // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID
- // to link StringPack with IfrPack.
- // RemovePackNotify is only used to remove PackageList when it is removed by
- // calling mHiiDatabase->RemovePackageList interface.
- if (IsLastStringPack (Package, Handle)) {
- Status = UnRegisterUefiHiiHandle (Private, Handle);
- }
- }
-
- return Status;
-}
-
-EFI_STATUS
-EFIAPI
-MapUefiHiiHandles (
- EFI_HII_THUNK_PRIVATE_DATA *Private
- )
-{
- UINTN HandleBufferLength;
- EFI_HII_HANDLE *HandleBuffer;
- EFI_STATUS Status;
- UINTN Index;
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;
-
- HandleBufferLength = 0;
- HandleBuffer = NULL;
- Status = mHiiDatabase->ListPackageLists (
- mHiiDatabase,
- EFI_HII_PACKAGE_TYPE_ALL,
- NULL,
- &HandleBufferLength,
- HandleBuffer
- );
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
- //
- // As no package is registered to UEFI HII Database, EFI_SUCCESS is returned.
- //
- //
- if (Status == EFI_NOT_FOUND) {
- return EFI_SUCCESS;
- } else {
- return Status;
- }
- }
-
- HandleBuffer = AllocateZeroPool (HandleBufferLength);
- Status = mHiiDatabase->ListPackageLists (
- mHiiDatabase,
- EFI_HII_PACKAGE_TYPE_ALL,
- NULL,
- &HandleBufferLength,
- HandleBuffer
- );
-
- for (Index = 0; Index < HandleBufferLength / sizeof (EFI_HII_HANDLE); Index++) {
- MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, HandleBuffer[Index]);
- //
- // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.
- //
- if (MapEntry == NULL) {
- Status = RegisterUefiHiiHandle (Private, HandleBuffer[Index]);
- ASSERT_EFI_ERROR (Status);
- }
- }
-
- return EFI_SUCCESS;
-}
EFI_STATUS
EFIAPI
@@ -365,17 +104,21 @@ Returns:
--*/
{
- EFI_HII_THUNK_PRIVATE_DATA *HiiData;
- EFI_HANDLE Handle;
- EFI_STATUS Status;
+ HII_THUNK_PRIVATE_DATA *Private;
+ EFI_HANDLE Handle;
+ EFI_STATUS Status;
+ UINTN BufferLength;
+ EFI_HII_HANDLE *Buffer;
+ UINTN Index;
+
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);
- HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);
- ASSERT (HiiData != NULL);
- InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);
+ Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);
+ ASSERT (Private != NULL);
+ InitializeListHead (&Private->ThunkContextListHead);
- mHiiThunkPrivateData = HiiData;
+ mHiiThunkPrivateData = Private;
Status = gBS->LocateProtocol (
&gEfiHiiDatabaseProtocolGuid,
@@ -385,55 +128,58 @@ Returns:
ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
- &gEfiHiiFontProtocolGuid,
+ &gEfiHiiStringProtocolGuid,
NULL,
- (VOID **) &mHiiFontProtocol
+ (VOID **) &mHiiStringProtocol
);
ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
- &gEfiHiiImageProtocolGuid,
+ &gEfiHiiConfigRoutingProtocolGuid,
NULL,
- (VOID **) &mHiiImageProtocol
+ (VOID **) &mHiiConfigRoutingProtocol
);
ASSERT_EFI_ERROR (Status);
- Status = gBS->LocateProtocol (
- &gEfiHiiStringProtocolGuid,
- NULL,
- (VOID **) &mHiiStringProtocol
- );
- ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
+ &gEfiFormBrowser2ProtocolGuid,
NULL,
- (VOID **) &mHiiConfigRoutingProtocol
+ (VOID **) &mFormBrowser2Protocol
);
ASSERT_EFI_ERROR (Status);
+
+
+
//
// Install protocol interface
//
- Handle = NULL;
Status = gBS->InstallProtocolInterface (
- &HiiData->Handle,
+ &Private->Handle,
&gEfiHiiProtocolGuid,
EFI_NATIVE_INTERFACE,
- (VOID *) &HiiData->Hii
+ (VOID *) &Private->Hii
);
ASSERT_EFI_ERROR (Status);
- Status = MapUefiHiiHandles (HiiData);
- ASSERT_EFI_ERROR (Status);
+ Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);
+ if (Status == EFI_SUCCESS) {
+ for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {
+ CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ FreePool (Buffer);
+ }
Status = mHiiDatabase->RegisterPackageNotify (
mHiiDatabase,
EFI_HII_PACKAGE_STRINGS,
NULL,
- NewPackNotify,
+ NewOrAddPackNotify,
EFI_HII_DATABASE_NOTIFY_NEW_PACK,
- &HiiData->NewPackNotifyHandle
+ &Handle
);
ASSERT_EFI_ERROR (Status);
@@ -441,9 +187,29 @@ Returns:
mHiiDatabase,
EFI_HII_PACKAGE_STRINGS,
NULL,
- AddPackNotify,
+ NewOrAddPackNotify,
+ EFI_HII_DATABASE_NOTIFY_ADD_PACK,
+ &Handle
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ Status = mHiiDatabase->RegisterPackageNotify (
+ mHiiDatabase,
+ EFI_HII_PACKAGE_FORM,
+ NULL,
+ NewOrAddPackNotify,
+ EFI_HII_DATABASE_NOTIFY_NEW_PACK,
+ &Handle
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ Status = mHiiDatabase->RegisterPackageNotify (
+ mHiiDatabase,
+ EFI_HII_PACKAGE_FORM,
+ NULL,
+ NewOrAddPackNotify,
EFI_HII_DATABASE_NOTIFY_ADD_PACK,
- &HiiData->AddPackNotifyHandle
+ &Handle
);
ASSERT_EFI_ERROR (Status);
@@ -453,10 +219,11 @@ Returns:
NULL,
RemovePackNotify,
EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,
- &HiiData->RemovePackNotifyHandle
+ &Handle
);
ASSERT_EFI_ERROR (Status);
+ mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;
Status = gBS->InstallProtocolInterface (
&mBrowserThunkPrivateDataTemplate.Handle,
&gEfiFormBrowserProtocolGuid,
@@ -487,22 +254,24 @@ Returns:
--*/
{
UINT16 Count;
- LIST_ENTRY *ListEntry;
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;
- EFI_HII_THUNK_PRIVATE_DATA *Private;
+ LIST_ENTRY *Link;
+ HII_THUNK_CONTEXT *ThunkContext;
+ HII_THUNK_PRIVATE_DATA *Private;
if (HandleBufferLength == NULL) {
return EFI_INVALID_PARAMETER;
}
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
+ //
+ // Count the number of handles.
+ //
Count = 0;
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;
- ListEntry = ListEntry->ForwardLink
- ) {
+ Link = GetFirstNode (&Private->ThunkContextListHead);
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {
Count++;
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);
}
if (Count > *HandleBufferLength) {
@@ -510,23 +279,72 @@ Returns:
return EFI_BUFFER_TOO_SMALL;
}
+ //
+ // Output the handles.
+ //
Count = 0;
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;
- ListEntry = ListEntry->ForwardLink
- ) {
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);
+ Link = GetFirstNode (&Private->ThunkContextListHead);
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {
+
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);
+ Handle[Count] = ThunkContext->FwHiiHandle;
- Handle[Count] = HandleMapEntry->FrameworkHiiHandle;
-
Count++;
- }
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);
+
+ }
*HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));
return EFI_SUCCESS;
}
EFI_STATUS
+LangCodes3066To639 (
+ IN CHAR8 *LangCodes3066,
+ IN CHAR8 **LangCodes639
+ )
+{
+ CHAR8 *AsciiLangCodes;
+ CHAR8 Lang[RFC_3066_ENTRY_SIZE];
+ UINTN Index;
+ UINTN Count;
+ EFI_STATUS Status;
+
+ ASSERT (LangCodes3066 != NULL);
+ ASSERT (LangCodes639 != NULL);
+
+ //
+ // Count the number of RFC 3066 language codes.
+ //
+ Index = 0;
+ AsciiLangCodes = LangCodes3066;
+ while (AsciiStrLen (AsciiLangCodes) != 0) {
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);
+ Index++;
+ }
+
+ Count = Index;
+
+ //
+ //
+ //
+ *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);
+ if (*LangCodes639 == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ AsciiLangCodes = LangCodes3066;
+
+ for (Index = 0; Index < Count; Index++) {
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);
+ Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
EFIAPI
HiiGetPrimaryLanguages (
IN EFI_HII_PROTOCOL *This,
@@ -545,46 +363,61 @@ Returns:
--*/
{
- EFI_HII_THUNK_PRIVATE_DATA *Private;
+ HII_THUNK_PRIVATE_DATA *Private;
EFI_HII_HANDLE UefiHiiHandle;
- CHAR8 *AsciiLanguageCodes;
- CHAR16 *UnicodeLanguageCodes;
+ CHAR8 *LangCodes3066;
+ CHAR16 *UnicodeLangCodes639;
+ CHAR8 *LangCodes639;
+ EFI_STATUS Status;
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
-
-
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);
if (UefiHiiHandle == NULL) {
return EFI_INVALID_PARAMETER;
}
- AsciiLanguageCodes = HiiLibGetSupportedLanguages (UefiHiiHandle);
+ LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);
- if (AsciiLanguageCodes == NULL) {
+ if (LangCodes3066 == NULL) {
return EFI_INVALID_PARAMETER;
}
- UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));
- if (UnicodeLanguageCodes == NULL) {
- return EFI_OUT_OF_RESOURCES;
+
+ LangCodes639 = NULL;
+ Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);
+ if (EFI_ERROR (Status)) {
+ goto Done;
+ }
+
+ UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));
+ if (UnicodeLangCodes639 == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Done;
}
//
- // The language returned is in RFC 3066 format.
+ // The language returned is in RFC 639-2 format.
//
- *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);
+ AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);
+ *LanguageString = UnicodeLangCodes639;
- return EFI_SUCCESS;
+Done:
+ FreePool (LangCodes3066);
+ SafeFreePool (LangCodes639);
+
+ return Status;
}
+
+
EFI_STATUS
EFIAPI
HiiGetSecondaryLanguages (
- IN EFI_HII_PROTOCOL *This,
- IN FRAMEWORK_EFI_HII_HANDLE Handle,
- IN CHAR16 *PrimaryLanguage,
- OUT EFI_STRING *LanguageString
+ IN EFI_HII_PROTOCOL *This,
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,
+ IN CHAR16 *PrimaryLanguage,
+ OUT EFI_STRING *LanguageString
)
/*++
@@ -599,75 +432,68 @@ Returns:
--*/
{
- EFI_HII_THUNK_PRIVATE_DATA *Private;
+ HII_THUNK_PRIVATE_DATA *Private;
EFI_HII_HANDLE UefiHiiHandle;
- CHAR8 *AsciiPrimaryLanguage;
- CHAR8 *AsciiLanguageCodes;
- CHAR16 *UnicodeLanguageCodes;
+ CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];
+ CHAR8 *PrimaryLang639;
+ CHAR8 *SecLangCodes3066;
+ CHAR8 *SecLangCodes639;
+ CHAR16 *UnicodeSecLangCodes639;
+ EFI_STATUS Status;
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);
-
-
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);
+ SecLangCodes639 = NULL;
+ SecLangCodes3066 = NULL;
+ UnicodeSecLangCodes639 = NULL;
+
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);
if (UefiHiiHandle == NULL) {
return EFI_INVALID_PARAMETER;
}
- AsciiPrimaryLanguage = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);
+ PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);
+ if (PrimaryLang639 == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Done;
+ }
- UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage);
+ UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);
- AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage);
+ Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);
+ ASSERT_EFI_ERROR (Status);
- if (AsciiLanguageCodes == NULL) {
- return EFI_INVALID_PARAMETER;
+ SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);
+
+ if (SecLangCodes3066 == NULL) {
+ Status = EFI_INVALID_PARAMETER;
+ goto Done;
}
- UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));
- if (UnicodeLanguageCodes == NULL) {
- return EFI_OUT_OF_RESOURCES;
+ Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);
+ if (EFI_ERROR (Status)) {
+ goto Done;
+ }
+
+ UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));
+ if (UnicodeSecLangCodes639 == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Done;
}
//
// The language returned is in RFC 3066 format.
//
- *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);
+ *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-ThunkSendForm (
- IN EFI_FORM_BROWSER_PROTOCOL *This,
- IN BOOLEAN UseDatabase,
- IN FRAMEWORK_EFI_HII_HANDLE *Handle,
- IN UINTN HandleCount,
- IN FRAMEWORK_EFI_IFR_PACKET *Packet, OPTIONAL
- IN EFI_HANDLE CallbackHandle, OPTIONAL
- IN UINT8 *NvMapOverride, OPTIONAL
- IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL
- OUT BOOLEAN *ResetRequired OPTIONAL
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-
-EFI_STATUS
-EFIAPI
-ThunkCreatePopUp (
- IN UINTN NumberOfLines,
- IN BOOLEAN HotKey,
- IN UINTN MaximumStringSize,
- OUT CHAR16 *StringBuffer,
- OUT EFI_INPUT_KEY *KeyValue,
- IN CHAR16 *String,
- ...
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
+Done:
+
+ SafeFreePool (PrimaryLang639);
+ SafeFreePool (SecLangCodes639);
+ SafeFreePool (SecLangCodes3066);
+ SafeFreePool (UnicodeSecLangCodes639);
+
+ return Status;
}
+