X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=EdkCompatibilityPkg%2FCompatibility%2FFrameworkHiiToUefiHiiThunk%2FHiiDatabase.c;h=50b902a952cd08b01b8cb3eb79c2a36b06df983b;hb=0368663fd609e2e008031a2025693f190d19b0c7;hp=91410e8b69b7f4d044bc083d80c939980df29a7b;hpb=57cbd269f047934b48699a3c7ae2dc2bc30c0324;p=mirror_edk2.git diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c index 91410e8b69..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; +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 mHiiThunkPrivateDataTempate = { + HII_THUNK_PRIVATE_DATA_SIGNATURE, + (EFI_HANDLE) NULL, + { HiiNewPack, HiiRemovePack, HiiFindHandles, @@ -46,294 +42,47 @@ 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 - }, - { //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 - }, - { - NULL, NULL //HiiHandleLinkList - }, -}; - -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; - -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; + //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, // - // We only + //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. // - 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); + (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF, + { + NULL, NULL //HiiHandleLinkList + }, +}; - if (mInFrameworkHiiRemovePack) { - return EFI_SUCCESS; +EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = { + EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE, + (EFI_HANDLE) NULL, + (HII_THUNK_PRIVATE_DATA *) NULL, + { + ThunkSendForm, + ThunkCreatePopUp } +}; - Private = mHiiThunkPrivateData; - MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle); +CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase; +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; - 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 @@ -355,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, @@ -375,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); @@ -431,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); @@ -443,10 +219,19 @@ 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, + EFI_NATIVE_INTERFACE, + (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser + ); + ASSERT_EFI_ERROR (Status); + return Status; } @@ -469,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) { @@ -492,22 +279,71 @@ 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 ( @@ -527,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 ) /*++ @@ -581,42 +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, PrimaryLang639); - UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage); + Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066); + ASSERT_EFI_ERROR (Status); - AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage); + SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066); - if (AsciiLanguageCodes == NULL) { - return EFI_INVALID_PARAMETER; + 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; +Done: + + SafeFreePool (PrimaryLang639); + SafeFreePool (SecLangCodes639); + SafeFreePool (SecLangCodes3066); + SafeFreePool (UnicodeSecLangCodes639); + + return Status; } - +