\r
#include "HiiDatabase.h"\r
\r
+HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
\r
-EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {\r
- {//Signature\r
- EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
- },\r
- {//Handle\r
- (EFI_HANDLE) NULL\r
- },\r
- { //Hii\r
+HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
+ HII_THUNK_PRIVATE_DATA_SIGNATURE,\r
+ (EFI_HANDLE) NULL,\r
+ {\r
HiiNewPack,\r
HiiRemovePack,\r
HiiFindHandles,\r
\r
HiiGetKeyboardLayout\r
},\r
- { //StaticHiiHandle\r
- //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
- // and increase upwords untill reach 2^(sizeof (FRAMEWORK_EFI_HII_HANDLE)) - 1. \r
- // The code will assert to prevent overflow.\r
- (FRAMEWORK_EFI_HII_HANDLE) 1 \r
- },\r
+\r
+ //\r
+ //StaticHiiHandle\r
+ //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
+ // and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
+ // The code will assert to prevent overflow.\r
+ (FRAMEWORK_EFI_HII_HANDLE) 1,\r
+\r
+ //\r
+ //StaticPureUefiHiiHandle\r
+ //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
+ // and decrease downwords untill reach the value of StaticHiiHandle. \r
+ // The code will assert to prevent overflow.\r
+ //\r
+ (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,\r
{\r
NULL, NULL //HiiHandleLinkList\r
},\r
};\r
\r
-CONST EFI_HII_DATABASE_PROTOCOL *mUefiHiiDatabaseProtocol;\r
-CONST EFI_HII_FONT_PROTOCOL *mUefiHiiFontProtocol;\r
-CONST EFI_HII_IMAGE_PROTOCOL *mUefiHiiImageProtocol;\r
-CONST EFI_HII_STRING_PROTOCOL *mUefiStringProtocol;\r
-CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mUefiConfigRoutingProtocol;\r
+EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
+ EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
+ (EFI_HANDLE) NULL,\r
+ (HII_THUNK_PRIVATE_DATA *) NULL,\r
+ {\r
+ ThunkSendForm,\r
+ ThunkCreatePopUp\r
+ }\r
+};\r
+\r
+\r
+CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
+CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
+CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
+CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
+CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;\r
+\r
+\r
+\r
+\r
\r
\r
EFI_STATUS\r
\r
--*/\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *HiiData;\r
- EFI_HANDLE Handle;\r
- EFI_STATUS Status;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ EFI_HANDLE Handle;\r
+ EFI_STATUS Status;\r
+ UINTN BufferLength;\r
+ EFI_HII_HANDLE *Buffer;\r
+ UINTN Index;\r
+ \r
\r
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
\r
- HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &HiiThunkPrivateDataTempate);\r
- ASSERT (HiiData != NULL);\r
- InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
+ Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
+ ASSERT (Private != NULL);\r
+ InitializeListHead (&Private->ThunkContextListHead);\r
+\r
+ mHiiThunkPrivateData = Private;\r
\r
Status = gBS->LocateProtocol (\r
&gEfiHiiDatabaseProtocolGuid,\r
NULL,\r
- (VOID **) &mUefiHiiDatabaseProtocol\r
+ (VOID **) &mHiiDatabase\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiFontProtocolGuid,\r
+ &gEfiHiiStringProtocolGuid,\r
NULL,\r
- (VOID **) &mUefiHiiFontProtocol\r
+ (VOID **) &mHiiStringProtocol\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiImageProtocolGuid,\r
+ &gEfiHiiConfigRoutingProtocolGuid,\r
NULL,\r
- (VOID **) &mUefiHiiImageProtocol\r
+ (VOID **) &mHiiConfigRoutingProtocol\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiStringProtocolGuid,\r
- NULL,\r
- (VOID **) &mUefiStringProtocol\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiConfigRoutingProtocolGuid,\r
+ &gEfiFormBrowser2ProtocolGuid,\r
NULL,\r
- (VOID **) &mUefiConfigRoutingProtocol\r
+ (VOID **) &mFormBrowser2Protocol\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+\r
+ \r
+\r
//\r
// Install protocol interface\r
//\r
- Handle = NULL;\r
Status = gBS->InstallProtocolInterface (\r
- &HiiData->Handle,\r
+ &Private->Handle,\r
&gEfiHiiProtocolGuid,\r
EFI_NATIVE_INTERFACE,\r
- (VOID *) &HiiData->Hii\r
+ (VOID *) &Private->Hii\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
+ if (Status == EFI_SUCCESS) {\r
+ for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
+ CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ FreePool (Buffer);\r
+ }\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_STRINGS,\r
+ NULL,\r
+ NewOrAddPackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_STRINGS,\r
+ NULL,\r
+ NewOrAddPackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_FORM,\r
+ NULL,\r
+ NewOrAddPackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_FORM,\r
+ NULL,\r
+ NewOrAddPackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_STRINGS,\r
+ NULL,\r
+ RemovePackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
+ Status = gBS->InstallProtocolInterface (\r
+ &mBrowserThunkPrivateDataTemplate.Handle,\r
+ &gEfiFormBrowserProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
return Status;\r
}\r
\r
\r
--*/\r
{\r
- ASSERT (FALSE);\r
+ UINT16 Count;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+\r
+ if (HandleBufferLength == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
+\r
+ //\r
+ // Count the number of handles.\r
+ //\r
+ Count = 0;\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ Count++;\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+ }\r
+\r
+ if (Count > *HandleBufferLength) {\r
+ *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ //\r
+ // Output the handles.\r
+ //\r
+ Count = 0;\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+ Handle[Count] = ThunkContext->FwHiiHandle;\r
+\r
+ Count++;\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+\r
+ }\r
+\r
+ *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+LangCodes3066To639 (\r
+ IN CHAR8 *LangCodes3066,\r
+ IN CHAR8 **LangCodes639\r
+ )\r
+{\r
+ CHAR8 *AsciiLangCodes;\r
+ CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
+ UINTN Index;\r
+ UINTN Count;\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (LangCodes3066 != NULL);\r
+ ASSERT (LangCodes639 != NULL);\r
+ \r
+ //\r
+ // Count the number of RFC 3066 language codes.\r
+ //\r
+ Index = 0;\r
+ AsciiLangCodes = LangCodes3066;\r
+ while (AsciiStrLen (AsciiLangCodes) != 0) {\r
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+ Index++;\r
+ }\r
+\r
+ Count = Index;\r
+\r
+ //\r
+ // \r
+ //\r
+ *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
+ if (*LangCodes639 == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ AsciiLangCodes = LangCodes3066;\r
+\r
+ for (Index = 0; Index < Count; Index++) {\r
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+ Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
--*/\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
EFI_HII_HANDLE UefiHiiHandle;\r
- CHAR8 *AsciiLanguageCodes;\r
- CHAR16 *UnicodeLanguageCodes;\r
+ CHAR8 *LangCodes3066;\r
+ CHAR16 *UnicodeLangCodes639;\r
+ CHAR8 *LangCodes639;\r
+ EFI_STATUS Status;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- \r
- \r
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
if (UefiHiiHandle == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AsciiLanguageCodes = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
+ LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
\r
- if (AsciiLanguageCodes == NULL) {\r
+ if (LangCodes3066 == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
- if (UnicodeLanguageCodes == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+\r
+ LangCodes639 = NULL;\r
+ Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ \r
+ UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
+ if (UnicodeLangCodes639 == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
}\r
\r
//\r
- // The language returned is in RFC 3066 format.\r
+ // The language returned is in RFC 639-2 format.\r
//\r
- *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+ AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
+ *LanguageString = UnicodeLangCodes639;\r
\r
- return EFI_SUCCESS;\r
+Done:\r
+ FreePool (LangCodes3066);\r
+ SafeFreePool (LangCodes639);\r
+\r
+ return Status;\r
}\r
\r
+\r
+\r
EFI_STATUS\r
EFIAPI\r
HiiGetSecondaryLanguages (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN CHAR16 *PrimaryLanguage,\r
- OUT EFI_STRING *LanguageString\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN CHAR16 *PrimaryLanguage,\r
+ OUT EFI_STRING *LanguageString\r
)\r
/*++\r
\r
\r
--*/\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
EFI_HII_HANDLE UefiHiiHandle;\r
- CHAR8 *AsciiPrimaryLanguage;\r
- CHAR8 *AsciiLanguageCodes;\r
- CHAR16 *UnicodeLanguageCodes;\r
+ CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *PrimaryLang639;\r
+ CHAR8 *SecLangCodes3066;\r
+ CHAR8 *SecLangCodes639;\r
+ CHAR16 *UnicodeSecLangCodes639;\r
+ EFI_STATUS Status;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- \r
- \r
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+ SecLangCodes639 = NULL;\r
+ SecLangCodes3066 = NULL;\r
+ UnicodeSecLangCodes639 = NULL;\r
+\r
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
if (UefiHiiHandle == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AsciiPrimaryLanguage = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+ PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+ if (PrimaryLang639 == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+\r
+ UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
\r
- UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage);\r
+ Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage);\r
+ SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
\r
- if (AsciiLanguageCodes == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
+ if (SecLangCodes3066 == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
- UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
- if (UnicodeLanguageCodes == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
+ if (UnicodeSecLangCodes639 == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
}\r
\r
//\r
// The language returned is in RFC 3066 format.\r
//\r
- *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+ *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
\r
- return EFI_SUCCESS;\r
+Done:\r
+ \r
+ SafeFreePool (PrimaryLang639);\r
+ SafeFreePool (SecLangCodes639);\r
+ SafeFreePool (SecLangCodes3066);\r
+ SafeFreePool (UnicodeSecLangCodes639);\r
+ \r
+ return Status;\r
}\r
\r
-\r
+ \r