]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/UiApp/FrontPage.c
MdeModulePkg UiApp: change code for easy customization.
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / FrontPage.c
index d6207b6fa3b2ef1e105ab599e4601ef9fc9d55b7..8efe4d137b070af5e66162a98d8c1a3ad3cd5e86 100644 (file)
@@ -13,8 +13,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "FrontPage.h"\r
-#include "Language.h"\r
-#define MAX_STRING_LEN        200\r
+#include "FrontPageCustomizedUi.h"\r
+\r
+#define MAX_STRING_LEN            200\r
 \r
 EFI_GUID   mFrontPageGuid      = FRONT_PAGE_FORMSET_GUID;\r
 \r
@@ -82,7 +83,7 @@ HII_VENDOR_DEVICE_PATH  mFrontPageHiiVendorDevicePath = {
 \r
 **/\r
 VOID\r
-UpdateFrontPageStrings (\r
+UpdateFrontPageBannerStrings (\r
   VOID\r
   );\r
 \r
@@ -155,190 +156,6 @@ FakeRouteConfig (
   return EFI_NOT_FOUND;\r
 }\r
 \r
-/**\r
-  Create oneof options for language.\r
-\r
-**/\r
-VOID\r
-InitializeLanguage (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  CHAR8                       *LangCode;\r
-  CHAR8                       *Lang;\r
-  CHAR8                       *CurrentLang;\r
-  UINTN                       OptionCount;\r
-  CHAR16                      *StringBuffer;\r
-  EFI_HII_HANDLE              HiiHandle;\r
-  VOID                        *OptionsOpCodeHandle;\r
-  VOID                        *StartOpCodeHandle;\r
-  VOID                        *EndOpCodeHandle;\r
-  EFI_IFR_GUID_LABEL          *StartLabel;\r
-  EFI_IFR_GUID_LABEL          *EndLabel;    \r
-  EFI_HII_STRING_PROTOCOL     *HiiString;\r
-  UINTN                       StringSize;\r
-\r
-  Lang         = NULL;\r
-  StringBuffer = NULL;\r
-\r
-  //\r
-  // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
-  //\r
-  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (StartOpCodeHandle != NULL);\r
-\r
-  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (EndOpCodeHandle != NULL);\r
-\r
-  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-  ASSERT (OptionsOpCodeHandle != NULL);\r
-  //\r
-  // Create Hii Extend Label OpCode as the start opcode\r
-  //\r
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  StartLabel->Number       = LABEL_SELECT_LANGUAGE;\r
-\r
-  //\r
-  // Create Hii Extend Label OpCode as the end opcode\r
-  //\r
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  EndLabel->Number       = LABEL_END;\r
-  //\r
-  // Collect the languages from what our current Language support is based on our VFR\r
-  //\r
-  HiiHandle = gFrontPagePrivate.HiiHandle;\r
-\r
-  GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);\r
-\r
-  if (mLanguageString == NULL) {\r
-    //\r
-    // Get Support language list from variable.\r
-    //\r
-    GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&mLanguageString, NULL);\r
-    if (mLanguageString == NULL) {\r
-      mLanguageString = AllocateCopyPool (\r
-                                 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
-                                 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
-                                 );\r
-      ASSERT (mLanguageString != NULL);\r
-    }\r
-  }\r
-\r
-  if (gFrontPagePrivate.LanguageToken == NULL) {\r
-    //\r
-    // Count the language list number.\r
-    //  \r
-    LangCode      = mLanguageString;\r
-    Lang          = AllocatePool (AsciiStrSize (mLanguageString));\r
-    ASSERT (Lang != NULL);\r
-    OptionCount = 0;\r
-    while (*LangCode != 0) {\r
-      GetNextLanguage (&LangCode, Lang);\r
-      OptionCount ++;\r
-    }\r
-\r
-    //\r
-    // Allocate extra 1 as the end tag.\r
-    //\r
-    gFrontPagePrivate.LanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));\r
-    ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
-\r
-    Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
-    LangCode     = mLanguageString;\r
-    OptionCount  = 0;\r
-    while (*LangCode != 0) {\r
-      GetNextLanguage (&LangCode, Lang);\r
-\r
-      StringSize = 0;\r
-      Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
-      if (Status == EFI_BUFFER_TOO_SMALL) {\r
-        StringBuffer = AllocateZeroPool (StringSize);\r
-        ASSERT (StringBuffer != NULL);\r
-        Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
-        ASSERT_EFI_ERROR (Status);\r
-      }\r
-\r
-      if (EFI_ERROR (Status)) {\r
-        StringBuffer = AllocatePool (AsciiStrSize (Lang) * sizeof (CHAR16));\r
-        ASSERT (StringBuffer != NULL);\r
-        AsciiStrToUnicodeStr (Lang, StringBuffer);\r
-      }\r
-\r
-      ASSERT (StringBuffer != NULL);\r
-      gFrontPagePrivate.LanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
-      FreePool (StringBuffer);\r
-\r
-      OptionCount++;\r
-    }\r
-  }\r
-\r
-  ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
-  LangCode     = mLanguageString;\r
-  OptionCount  = 0;\r
-  if (Lang == NULL) {\r
-    Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
-    ASSERT (Lang != NULL);\r
-  }\r
-  while (*LangCode != 0) {\r
-    GetNextLanguage (&LangCode, Lang);\r
-\r
-    if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        gFrontPagePrivate.LanguageToken[OptionCount],\r
-        EFI_IFR_OPTION_DEFAULT,\r
-        EFI_IFR_NUMERIC_SIZE_1,\r
-        (UINT8) OptionCount\r
-        );\r
-    } else {\r
-      HiiCreateOneOfOptionOpCode (\r
-        OptionsOpCodeHandle,\r
-        gFrontPagePrivate.LanguageToken[OptionCount],\r
-        0,\r
-        EFI_IFR_NUMERIC_SIZE_1,\r
-        (UINT8) OptionCount\r
-        );\r
-    }\r
-\r
-    OptionCount++;\r
-  }\r
-\r
-  if (CurrentLang != NULL) {\r
-    FreePool (CurrentLang);\r
-  }\r
-  FreePool (Lang);\r
-\r
-  HiiCreateOneOfOpCode (\r
-    StartOpCodeHandle,\r
-    FRONT_PAGE_KEY_LANGUAGE,\r
-    0,\r
-    0,\r
-    STRING_TOKEN (STR_LANGUAGE_SELECT),\r
-    STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
-    EFI_IFR_FLAG_CALLBACK,\r
-    EFI_IFR_NUMERIC_SIZE_1,\r
-    OptionsOpCodeHandle,\r
-    NULL\r
-    );\r
-\r
-  Status = HiiUpdateForm (\r
-             HiiHandle,\r
-             &mFrontPageGuid,\r
-             FRONT_PAGE_FORM_ID,\r
-             StartOpCodeHandle, // LABEL_SELECT_LANGUAGE\r
-             EndOpCodeHandle    // LABEL_END\r
-             );\r
-\r
-  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
-  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-}\r
-\r
 /**\r
   This function processes the results of changes in configuration.\r
 \r
@@ -368,82 +185,12 @@ FrontPageCallback (
   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
   )\r
 {\r
-  CHAR8                         *LangCode;\r
-  CHAR8                         *Lang;\r
-  UINTN                         Index;\r
-  EFI_STATUS                    Status;\r
-\r
-  if (Action != EFI_BROWSER_ACTION_CHANGED) {\r
-    //\r
-    // Do nothing for other UEFI Action. Only do call back when data is changed.\r
-    //\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
-    if ((Value == NULL) || (ActionRequest == NULL)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    switch (QuestionId) {\r
-    case FRONT_PAGE_KEY_CONTINUE:\r
-      //\r
-      // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
-      //\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-      break;\r
-\r
-    case FRONT_PAGE_KEY_LANGUAGE:\r
-      //\r
-      // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
-      //\r
-      Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
-      ASSERT (Lang != NULL);  \r
-\r
-      Index = 0;\r
-      LangCode = mLanguageString;\r
-      while (*LangCode != 0) {\r
-        GetNextLanguage (&LangCode, Lang);\r
-\r
-        if (Index == Value->u8) {\r
-          break;\r
-        }\r
-\r
-        Index++;\r
-      }\r
-\r
-      if (Index == Value->u8) {\r
-        Status = gRT->SetVariable (\r
-                        L"PlatformLang",\r
-                        &gEfiGlobalVariableGuid,\r
-                        EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                        AsciiStrSize (Lang),\r
-                        Lang\r
-                        );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (Lang);\r
-          return EFI_DEVICE_ERROR;\r
-        }\r
-      } else {\r
-        ASSERT (FALSE);\r
-      }\r
-      FreePool (Lang);\r
-      //\r
-      //Current language of platform is changed,recreate oneof options for language.\r
-      //\r
-      InitializeLanguage();\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
+  return UiFrontPageCallbackHandler (gFrontPagePrivate.HiiHandle, Action, QuestionId, Type, Value, ActionRequest);\r
 }\r
 \r
 /**\r
-Update front page form base on the ClassGuid in the formset in other modules.\r
+\r
+  Update the menus in the front page.\r
 \r
 **/\r
 VOID\r
@@ -451,32 +198,10 @@ UpdateFrontPageForm (
   VOID\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_HII_HANDLE              HiiHandle;\r
   VOID                        *StartOpCodeHandle;\r
   VOID                        *EndOpCodeHandle;\r
-  EFI_IFR_GUID_LABEL          *StartLabel;\r
-  EFI_IFR_GUID_LABEL          *EndLabel;\r
-  UINTN                       Index;\r
-  EFI_STRING                  String;\r
-  EFI_STRING_ID               Token;\r
-  EFI_STRING_ID               TokenHelp;\r
-  EFI_HII_HANDLE              *HiiHandles;\r
-  EFI_GUID                    FormSetGuid;\r
-  CHAR16                      *DevicePathStr;\r
-  EFI_STRING_ID               DevicePathId;\r
-  EFI_IFR_FORM_SET            *Buffer;\r
-  UINTN                       BufferSize;\r
-  UINT8                       ClassGuidNum;\r
-  EFI_GUID                    *ClassGuid;\r
-  UINTN                       TempSize;\r
-  UINT8                       *Ptr;\r
-\r
-  TempSize =0;\r
-  BufferSize = 0;\r
-  Buffer = NULL;\r
-\r
-  HiiHandle = gFrontPagePrivate.HiiHandle;\r
+  EFI_IFR_GUID_LABEL          *StartGuidLabel;\r
+  EFI_IFR_GUID_LABEL          *EndGuidLabel;\r
 \r
   //\r
   // Allocate space for creation of UpdateData Buffer\r
@@ -489,99 +214,26 @@ UpdateFrontPageForm (
   //\r
   // Create Hii Extend Label OpCode as the start opcode\r
   //\r
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  StartLabel->Number       = LABEL_PLATFORM_INFORMATION;\r
+  StartGuidLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartGuidLabel->Number       = LABEL_FRANTPAGE_INFORMATION;\r
   //\r
   // Create Hii Extend Label OpCode as the end opcode\r
   //\r
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
-  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-  EndLabel->Number       = LABEL_END;\r
+  EndGuidLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndGuidLabel->Number       = LABEL_END;\r
 \r
   //\r
-  // Get all the Hii handles\r
-  //\r
-  HiiHandles = HiiGetHiiHandles (NULL);\r
-  ASSERT (HiiHandles != NULL);\r
-  //\r
-  // Search for formset of each class type\r
+  //Updata Front Page form\r
   //\r
-  for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
-    Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-\r
-    Ptr = (UINT8 *)Buffer;\r
-    while(TempSize < BufferSize)  {\r
-      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-\r
-      if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
-        Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-        continue;\r
-      }\r
-\r
-      //\r
-      // Find Class Guid\r
-      //\r
-      ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
-      ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
-      while (ClassGuidNum-- > 0) {\r
-        if (CompareGuid (&gEfiIfrFrontPageGuid, ClassGuid) == 0){\r
-          ClassGuid ++;\r
-          continue;\r
-        }\r
-\r
-        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
-        if (String == NULL) {\r
-          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
-          ASSERT (String != NULL);\r
-        }\r
-        Token = HiiSetString (HiiHandle, 0, String, NULL);\r
-        FreePool (String);\r
-\r
-        String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
-\r
-        if (String == NULL) {\r
-          String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
-          ASSERT (String != NULL);\r
-        }\r
-        TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
-        FreePool (String);\r
-\r
-        FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
-\r
-        DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
-        DevicePathId  = 0;\r
-        if (DevicePathStr != NULL){\r
-          DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
-          FreePool (DevicePathStr);\r
-        }\r
-        HiiCreateGotoExOpCode (\r
-          StartOpCodeHandle,\r
-          0,\r
-          Token,\r
-          TokenHelp,\r
-          0,\r
-          (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
-          0,\r
-          &FormSetGuid,\r
-          DevicePathId\r
-        );\r
-        break;\r
-      }\r
-      Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-    }\r
-\r
-    FreePool(Buffer);\r
-    Buffer = NULL;\r
-    TempSize = 0;\r
-    BufferSize = 0;\r
-  }\r
+  UiCustomizeFrontPage (\r
+    gFrontPagePrivate.HiiHandle,\r
+    StartOpCodeHandle\r
+    );\r
 \r
   HiiUpdateForm (\r
-    HiiHandle,\r
+    gFrontPagePrivate.HiiHandle,\r
     &mFrontPageGuid,\r
     FRONT_PAGE_FORM_ID,\r
     StartOpCodeHandle,\r
@@ -590,7 +242,6 @@ UpdateFrontPageForm (
 \r
   HiiFreeOpCodeHandle (StartOpCodeHandle);\r
   HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-  FreePool (HiiHandles);\r
 }\r
 \r
 /**\r
@@ -642,17 +293,12 @@ InitializeFrontPage (
   ASSERT (gFrontPagePrivate.HiiHandle != NULL);\r
 \r
   //\r
-  //Updata Front Page strings\r
-  //\r
-  UpdateFrontPageStrings ();\r
-\r
-  //\r
-  // Initialize laguage options\r
+  //Updata Front Page banner strings\r
   //\r
-  InitializeLanguage ();\r
+  UpdateFrontPageBannerStrings ();\r
 \r
   //\r
-  //Updata Front Page form\r
+  // Update front page menus.\r
   //\r
   UpdateFrontPageForm();\r
 \r
@@ -846,10 +492,12 @@ GetOptionalStringByIndex (
 \r
 \r
 /**\r
+\r
   Update the banner information for the Front Page based on Smbios information.\r
+\r
 **/\r
 VOID\r
-UpdateFrontPageStrings (\r
+UpdateFrontPageBannerStrings (\r
   VOID\r
   )\r
 {\r
@@ -857,7 +505,6 @@ UpdateFrontPageStrings (
   CHAR16                            *NewString;\r
   CHAR16                            *FirmwareVersionString;\r
   EFI_STATUS                        Status;\r
-  EFI_STRING_ID                     TokenToUpdate;\r
   EFI_SMBIOS_HANDLE                 SmbiosHandle;\r
   EFI_SMBIOS_PROTOCOL               *Smbios;\r
   SMBIOS_TABLE_TYPE0                *Type0Record;\r
@@ -872,92 +519,143 @@ UpdateFrontPageStrings (
   FoundCpu = 0;\r
 \r
   //\r
-  // Update Front Page strings\r
+  // Update default banner string.\r
   //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiSmbiosProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &Smbios\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-    SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
-    Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
-    while (!EFI_ERROR(Status)) {\r
-      if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
-        Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
-        StrIndex = Type0Record->BiosVersion;\r
-        GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);\r
-        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
-        FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
-        if (*FirmwareVersionString != 0x0000 ) {\r
-          FreePool (NewString);\r
-          NewString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
-          HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-        } else {\r
-          HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-          FreePool (NewString);\r
-        }\r
-      }\r
+  NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_LEFT), NULL);\r
+  UiCustomizeFrontPageBanner (4, TRUE, &NewString);\r
+  HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_LEFT), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_RIGHT), NULL);\r
+  UiCustomizeFrontPageBanner (4, FALSE, &NewString);\r
+  HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_RIGHT), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_LEFT), NULL);\r
+  UiCustomizeFrontPageBanner (5, TRUE, &NewString);\r
+  HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_LEFT), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_RIGHT), NULL);\r
+  UiCustomizeFrontPageBanner (5, FALSE, &NewString);\r
+  HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_RIGHT), NewString, NULL);\r
+  FreePool (NewString);\r
 \r
-      if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
-        Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
-        StrIndex = Type1Record->ProductName;\r
-        GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);\r
-        TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
-        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+  //\r
+  // Update Front Page banner strings base on SmBios Table.\r
+  //\r
+  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) &Smbios);\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // Smbios protocol not found, get the default value.\r
+    //\r
+    NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NULL);\r
+    UiCustomizeFrontPageBanner (1, TRUE, &NewString);\r
+    HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);\r
+    FreePool (NewString);\r
+\r
+    NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NULL);\r
+    UiCustomizeFrontPageBanner (2, TRUE, &NewString);\r
+    HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL);\r
+    FreePool (NewString);\r
+\r
+    NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NULL);\r
+    UiCustomizeFrontPageBanner (2, FALSE, &NewString);\r
+    HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL);\r
+    FreePool (NewString);\r
+\r
+    NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NULL);\r
+    UiCustomizeFrontPageBanner (3, TRUE, &NewString);\r
+    HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);\r
+    FreePool (NewString);\r
+\r
+    NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NULL);\r
+    UiCustomizeFrontPageBanner (3, FALSE, &NewString);\r
+    HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL);\r
+    FreePool (NewString);\r
+\r
+    return;\r
+  }\r
+\r
+  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+  Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
+  while (!EFI_ERROR(Status)) {\r
+    if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
+      Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
+      StrIndex = Type0Record->BiosVersion;\r
+      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);\r
+\r
+      FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
+      if (*FirmwareVersionString != 0x0000 ) {\r
+        FreePool (NewString);\r
+        NewString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
+        UiCustomizeFrontPageBanner (3, TRUE, &NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);\r
+      } else {\r
+        UiCustomizeFrontPageBanner (3, TRUE, &NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);\r
         FreePool (NewString);\r
       }\r
+    }\r
 \r
-      if ((Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) && !FoundCpu) {\r
-        Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
-        //\r
-        // The information in the record should be only valid when the CPU Socket is populated.\r
-        //\r
-        if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {\r
-          StrIndex = Type4Record->ProcessorVersion;\r
-          GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);\r
-          TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
-          HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-          FreePool (NewString);\r
-\r
-          ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
-          TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
-          HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-          FreePool (NewString);\r
-\r
-          FoundCpu = TRUE;\r
-        }\r
-      }\r
+    if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
+      Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
+      StrIndex = Type1Record->ProductName;\r
+      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);\r
+      UiCustomizeFrontPageBanner (1, TRUE, &NewString);\r
+      HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);\r
+      FreePool (NewString);\r
+    }\r
 \r
-      if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
-        Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
-        if (Type19Record->StartingAddress != 0xFFFFFFFF ) {\r
-          InstalledMemory += RShiftU64(Type19Record->EndingAddress -\r
-                                       Type19Record->StartingAddress + 1, 10);\r
-        } else {\r
-          InstalledMemory += RShiftU64(Type19Record->ExtendedEndingAddress -\r
-                                       Type19Record->ExtendedStartingAddress + 1, 20);\r
-        }\r
+    if ((Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) && !FoundCpu) {\r
+      Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
+      //\r
+      // The information in the record should be only valid when the CPU Socket is populated.\r
+      //\r
+      if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {\r
+        StrIndex = Type4Record->ProcessorVersion;\r
+        GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);\r
+        UiCustomizeFrontPageBanner (2, TRUE, &NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL);\r
+        FreePool (NewString);\r
+\r
+        ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
+        UiCustomizeFrontPageBanner (2, FALSE, &NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL);\r
+        FreePool (NewString);\r
+\r
+        FoundCpu = TRUE;\r
       }\r
+    }\r
 \r
-      Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
+    if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
+      Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
+      if (Type19Record->StartingAddress != 0xFFFFFFFF ) {\r
+        InstalledMemory += RShiftU64(Type19Record->EndingAddress -\r
+                                     Type19Record->StartingAddress + 1, 10);\r
+      } else {\r
+        InstalledMemory += RShiftU64(Type19Record->ExtendedEndingAddress -\r
+                                     Type19Record->ExtendedStartingAddress + 1, 20);\r
+      }\r
     }\r
 \r
-    // now update the total installed RAM size\r
-    ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString );\r
-    TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
-    HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
-    FreePool (NewString);\r
+    Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
   }\r
 \r
-  return ;\r
+  //\r
+  // Now update the total installed RAM size\r
+  //\r
+  ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString );\r
+  UiCustomizeFrontPageBanner (3, FALSE, &NewString);\r
+  HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL);\r
+  FreePool (NewString);\r
 }\r
 \r
 /**\r
   This function will change video resolution and text mode\r
-  according to defined setup mode or defined boot mode  \r
+  according to defined setup mode or defined boot mode\r
 \r
-  @param  IsSetupMode   Indicate mode is changed to setup mode or boot mode. \r
+  @param  IsSetupMode   Indicate mode is changed to setup mode or boot mode.\r
 \r
   @retval  EFI_SUCCESS  Mode is changed successfully.\r
   @retval  Others             Mode failed to be changed.\r
@@ -985,13 +683,13 @@ BdsSetConsoleMode (
   EFI_STATUS                            Status;\r
   UINTN                                 Index;\r
   UINTN                                 CurrentColumn;\r
-  UINTN                                 CurrentRow;  \r
+  UINTN                                 CurrentRow;\r
 \r
   MaxGopMode  = 0;\r
   MaxTextMode = 0;\r
 \r
   //\r
-  // Get current video resolution and text mode \r
+  // Get current video resolution and text mode\r
   //\r
   Status = gBS->HandleProtocol (\r
                   gST->ConsoleOutHandle,\r
@@ -1009,7 +707,7 @@ BdsSetConsoleMode (
                   );\r
   if (EFI_ERROR (Status)) {\r
     SimpleTextOut = NULL;\r
-  }  \r
+  }\r
 \r
   if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
     return EFI_UNSUPPORTED;\r
@@ -1030,12 +728,12 @@ BdsSetConsoleMode (
     NewHorizontalResolution = mBootHorizontalResolution;\r
     NewVerticalResolution   = mBootVerticalResolution;\r
     NewColumns              = mBootTextModeColumn;\r
-    NewRows                 = mBootTextModeRow;   \r
+    NewRows                 = mBootTextModeRow;\r
   }\r
-  \r
+\r
   if (GraphicsOutput != NULL) {\r
     MaxGopMode  = GraphicsOutput->Mode->MaxMode;\r
-  } \r
+  }\r
 \r
   if (SimpleTextOut != NULL) {\r
     MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
@@ -1139,8 +837,7 @@ BdsSetConsoleMode (
   ASSERT_EFI_ERROR (Status);\r
   Status = PcdSet32S (PcdConOutRow, NewRows);\r
   ASSERT_EFI_ERROR (Status);\r
-  \r
-  \r
+\r
   //\r
   // Video mode is changed, so restart graphics console driver and higher level driver.\r
   // Reconnect graphics console driver and higher level driver.\r
@@ -1170,12 +867,12 @@ BdsSetConsoleMode (
 \r
 /**\r
   The user Entry Point for Application. The user code starts with this function\r
-  as the real entry point for the image goes into a library that calls this \r
+  as the real entry point for the image goes into a library that calls this\r
   function.\r
 \r
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
   @param[in] SystemTable    A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS       The entry point is executed successfully.\r
   @retval other             Some error occurs when executing this entry point.\r
 \r
@@ -1196,7 +893,7 @@ InitializeUserInterface (
 \r
   if (!mModeInitialized) {\r
     //\r
-    // After the console is ready, get current video resolution \r
+    // After the console is ready, get current video resolution\r
     // and text mode before launching setup at first time.\r
     //\r
     Status = gBS->HandleProtocol (\r
@@ -1207,7 +904,7 @@ InitializeUserInterface (
     if (EFI_ERROR (Status)) {\r
       GraphicsOutput = NULL;\r
     }\r
-    \r
+\r
     Status = gBS->HandleProtocol (\r
                     gST->ConsoleOutHandle,\r
                     &gEfiSimpleTextOutProtocolGuid,\r
@@ -1215,7 +912,7 @@ InitializeUserInterface (
                     );\r
     if (EFI_ERROR (Status)) {\r
       SimpleTextOut = NULL;\r
-    }  \r
+    }\r
 \r
     if (GraphicsOutput != NULL) {\r
       //\r
@@ -1238,9 +935,9 @@ InitializeUserInterface (
 \r
     //\r
     // Get user defined text mode for setup.\r
-    //  \r
+    //\r
     mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);\r
-    mSetupVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);      \r
+    mSetupVerticalResolution   = PcdGet32 (PcdSetupVideoVerticalResolution);\r
     mSetupTextModeColumn       = PcdGet32 (PcdSetupConOutColumn);\r
     mSetupTextModeRow          = PcdGet32 (PcdSetupConOutRow);\r
 \r
@@ -1249,11 +946,10 @@ InitializeUserInterface (
 \r
   gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
   gST->ConOut->ClearScreen (gST->ConOut);\r
-  \r
+\r
   //\r
   // Install customized fonts needed by Front Page\r
   //\r
-  \r
   HiiHandle = ExportFonts ();\r
   ASSERT (HiiHandle != NULL);\r
 \r
@@ -1322,38 +1018,6 @@ UiEntry (
   SetupResetReminder ();\r
 }\r
 \r
-/**\r
-  Extract device path for given HII handle and class guid.\r
-\r
-  @param Handle          The HII handle.\r
-\r
-  @retval  NULL          Fail to get the device path string.\r
-  @return  PathString    Get the device path string.\r
-\r
-**/\r
-CHAR16 *\r
-ExtractDevicePathFromHiiHandle (\r
-  IN      EFI_HII_HANDLE      Handle\r
-  )\r
-{\r
-  EFI_STATUS                       Status;\r
-  EFI_HANDLE                       DriverHandle;\r
-  \r
-  ASSERT (Handle != NULL);\r
-\r
-  if (Handle == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
-  }\r
-\r
- return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
-\r
-}\r
-\r
 //\r
 //  Following are BDS Lib functions which contain all the code about setup browser reset reminder feature.\r
 //  Setup Browser reset reminder feature is that an reset reminder will be given before user leaves the setup browser  if\r