/** Determine the current language that will be used based on language related EFI Variables. @param LangCodesSettingRequired - If required to set LangCodes variable **/ VOID InitializeLanguage ( BOOLEAN LangCodesSettingRequired ) { EFI_STATUS Status; CHAR8 *LangCodes; CHAR8 *PlatformLangCodes; ExportFonts (); LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes); PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes); if (LangCodesSettingRequired) { if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { // // UEFI 2.0 depricated this variable so we support turning it off // Status = gRT->SetVariable ( L"LangCodes", &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, AsciiStrSize (LangCodes), LangCodes ); // // Platform needs to make sure setting volatile variable before calling 3rd party code shouldn't fail. // ASSERT_EFI_ERROR (Status); } Status = gRT->SetVariable ( L"PlatformLangCodes", &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, AsciiStrSize (PlatformLangCodes), PlatformLangCodes ); // // Platform needs to make sure setting volatile variable before calling 3rd party code shouldn't fail. // ASSERT_EFI_ERROR (Status); } if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { // // UEFI 2.0 depricated this variable so we support turning it off // InitializeLangVariable (L"Lang", LangCodes, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultLang), TRUE); } InitializeLangVariable (L"PlatformLang", PlatformLangCodes, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang), FALSE); }
VOID InitializeLanguage ( BOOLEAN LangCodesSettingRequired ) /*++ Routine Description: Determine the current language that will be used based on language related EFI Variables Arguments: LangCodesSettingRequired - If required to set LangCode variable Returns: --*/ { EFI_STATUS Status; UINTN Size; CHAR8 Lang[RFC_3066_ENTRY_SIZE]; CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE]; CHAR8 *LangCodes; CHAR8 *LangStrings; #ifdef LANG_SUPPORT CHAR8 *OldLangCodes; CHAR8 OldLang[ISO_639_2_ENTRY_SIZE]; #endif ExportFonts (); // // Collect the languages from what our current Language support is based on our VFR // LangCodes = GetSupportedLanguages (gStringPackHandle); ASSERT (LangCodes != NULL); if (LangCodesSettingRequired) { Status = gRT->SetVariable ( L"PlatformLangCodes", &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EfiAsciiStrSize (LangCodes), LangCodes ); #ifdef LANG_SUPPORT // // Set UEFI deprecated variable "LangCodes" for backwards compatibility // OldLangCodes = Rfc3066ToIso639 (LangCodes); Status = gRT->SetVariable ( L"LangCodes", &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EfiAsciiStrLen (OldLangCodes), OldLangCodes ); gBS->FreePool (OldLangCodes); #endif } // // Find current LangCode from Lang NV Variable // Size = RFC_3066_ENTRY_SIZE; Status = gRT->GetVariable ( L"PlatformLang", &gEfiGlobalVariableGuid, NULL, &Size, CurrentLang ); if (!EFI_ERROR (Status)) { Status = EFI_NOT_FOUND; LangStrings = LangCodes; while (*LangStrings != 0) { GetNextLanguage (&LangStrings, Lang); if (EfiAsciiStrCmp (Lang, CurrentLang) == 0) { Status = EFI_SUCCESS; break; } } } // // If we cannot get language code from variable, // or LangCode cannot be found from language table, // set the first language in language table to variable. // if (EFI_ERROR (Status)) { LangStrings = LangCodes; GetNextLanguage (&LangStrings, Lang); Status = gRT->SetVariable ( L"PlatformLang", &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EfiAsciiStrSize (mDefaultLangCode), Lang ); #ifdef LANG_SUPPORT // // Set UEFI deprecated variable "Lang" for backwards compatibility // Status = ConvertRfc3066LanguageToIso639Language (mDefaultLangCode, OldLang); if (!EFI_ERROR (Status)) { Status = gRT->SetVariable ( L"Lang", &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, ISO_639_2_ENTRY_SIZE, OldLang ); } #endif } if (LangCodes != NULL) { gBS->FreePool (LangCodes); } }
/** The user Entry Point for Application. The user code starts with this function as the real entry point for the image goes into a library that calls this function. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The entry point is executed successfully. @retval other Some error occurs when executing this entry point. **/ EFI_STATUS EFIAPI InitializeUserInterface ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_HII_HANDLE HiiHandle; EFI_STATUS Status; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; UINTN BootTextColumn; UINTN BootTextRow; if (!mModeInitialized) { // // After the console is ready, get current video resolution // and text mode before launching setup at first time. // Status = gBS->HandleProtocol ( gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID**)&GraphicsOutput ); if (EFI_ERROR (Status)) { GraphicsOutput = NULL; } Status = gBS->HandleProtocol ( gST->ConsoleOutHandle, &gEfiSimpleTextOutProtocolGuid, (VOID**)&SimpleTextOut ); if (EFI_ERROR (Status)) { SimpleTextOut = NULL; } if (GraphicsOutput != NULL) { // // Get current video resolution and text mode. // mBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution; mBootVerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution; } if (SimpleTextOut != NULL) { Status = SimpleTextOut->QueryMode ( SimpleTextOut, SimpleTextOut->Mode->Mode, &BootTextColumn, &BootTextRow ); mBootTextModeColumn = (UINT32)BootTextColumn; mBootTextModeRow = (UINT32)BootTextRow; } // // Get user defined text mode for setup. // mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution); mSetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn); mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow); mModeInitialized = TRUE; } gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL); gST->ConOut->ClearScreen (gST->ConOut); // // Install customized fonts needed by Front Page // HiiHandle = ExportFonts (); ASSERT (HiiHandle != NULL); InitializeStringSupport (); UiSetConsoleMode (TRUE); UiEntry (FALSE); UiSetConsoleMode (FALSE); UninitializeStringSupport (); HiiRemovePackages (HiiHandle); return EFI_SUCCESS; }
/** Determine the current language that will be used based on language related EFI Variables. @param LangCodesSettingRequired - If required to set LangCode variable **/ VOID InitializeLanguage ( BOOLEAN LangCodesSettingRequired ) { EFI_STATUS Status; UINTN Size; CHAR8 *Lang; CHAR8 LangCode[ISO_639_2_ENTRY_SIZE + 1]; CHAR8 *LangCodes; CHAR8 *PlatformLang; CHAR8 *PlatformLangCodes; UINTN Index; BOOLEAN Invalid; ExportFonts (); LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes); if (LangCodesSettingRequired) { if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { // // UEFI 2.1 depricated this variable so we support turning it off // Status = gRT->SetVariable ( L"LangCodes", &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, AsciiStrSize (LangCodes), LangCodes ); } PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes); Status = gRT->SetVariable ( L"PlatformLangCodes", &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, AsciiStrSize (PlatformLangCodes), PlatformLangCodes ); } if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { // // UEFI 2.1 depricated this variable so we support turning it off // // // Find current LangCode from Lang NV Variable // Size = ISO_639_2_ENTRY_SIZE + 1; Status = gRT->GetVariable ( L"Lang", &gEfiGlobalVariableGuid, NULL, &Size, &LangCode ); if (!EFI_ERROR (Status)) { Status = EFI_NOT_FOUND; for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) { if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) { Status = EFI_SUCCESS; break; } } } // // If we cannot get language code from Lang variable, // or LangCode cannot be found from language table, // set the mDefaultLangCode to Lang variable. // if (EFI_ERROR (Status)) { Lang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang); Status = gRT->SetVariable ( L"Lang", &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, ISO_639_2_ENTRY_SIZE + 1, Lang ); } } Invalid = FALSE; PlatformLang = BdsLibGetVariableAndSize (L"PlatformLang", &gEfiGlobalVariableGuid, &Size); if (PlatformLang != NULL) { // // Check Current PlatformLang value against PlatformLangCode. Need a library that is TBD // Set Invalid based on state of PlatformLang. // FreePool (PlatformLang); } else { // No valid variable is set Invalid = TRUE; } if (Invalid) { PlatformLang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang); Status = gRT->SetVariable ( L"PlatformLang", &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, AsciiStrSize (PlatformLang), PlatformLang ); } }