]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
MdeModulePkg/NullMemoryTest: Handle more reliable memory
[mirror_edk2.git] / MdeModulePkg / Library / CustomizedDisplayLib / CustomizedDisplayLibInternal.c
index b6b4055b6d260ca2e584cf81454e4f10a627c890..bc14a9dd769c067bc0e05e52bc30032dac263d9b 100644 (file)
@@ -2,7 +2,7 @@
 \r
   This library class defines a set of interfaces to customize Display module\r
 \r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013-2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under \r
 the terms and conditions of the BSD License that accompanies this distribution.  \r
 The full text of the license may be found at\r
@@ -144,6 +144,7 @@ PrintFramework (
   CHAR16                 *Buffer;\r
   UINTN                  Row;\r
   CHAR16                 *TitleStr;\r
+  UINTN                  TitleColumn;\r
 \r
   if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
     //\r
@@ -190,20 +191,15 @@ PrintFramework (
   //\r
   // Print Form Title\r
   //\r
-  ClearLines (\r
-    gScreenDimensions.LeftColumn + 1,\r
-    gScreenDimensions.RightColumn - 1,\r
-    gScreenDimensions.TopRow + 1,\r
-    gScreenDimensions.TopRow + 1,\r
-    TITLE_TEXT | TITLE_BACKGROUND\r
-    );\r
-\r
   TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
   ASSERT (TitleStr != NULL);\r
-  PrintStringAt (\r
-    (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\r
+  TitleColumn = (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2;\r
+  PrintStringAtWithWidth (gScreenDimensions.LeftColumn + 1, gScreenDimensions.TopRow + 1, gLibEmptyString, TitleColumn - gScreenDimensions.LeftColumn - 1);\r
+  PrintStringAtWithWidth (\r
+    TitleColumn,\r
     gScreenDimensions.TopRow + 1,\r
-    TitleStr\r
+    TitleStr,\r
+    gScreenDimensions.RightColumn - 1 - TitleColumn\r
     );\r
   FreePool (TitleStr);\r
 \r
@@ -260,7 +256,32 @@ ProcessUserOpcode(
   IN  EFI_IFR_OP_HEADER         *OpCodeData\r
   )\r
 {\r
+  EFI_GUID *   ClassGuid;\r
+  UINT8        ClassGuidNum;\r
+\r
+  ClassGuid    = NULL;\r
+  ClassGuidNum = 0;\r
+\r
   switch (OpCodeData->OpCode) {\r
+    case EFI_IFR_FORM_SET_OP:\r
+      //\r
+      // process the statement outside of form,if it is formset op, get its formsetguid or classguid and compared with gFrontPageFormSetGuid\r
+      //\r
+      if (CompareMem (PcdGetPtr (PcdFrontPageFormSetGuid), &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) == 0){\r
+        gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+      } else{\r
+        ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)OpCodeData)->Flags & 0x3);\r
+        ClassGuid    = (EFI_GUID *)(VOID *)((UINT8 *)OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+        while (ClassGuidNum-- > 0){\r
+          if (CompareGuid((EFI_GUID*)PcdGetPtr (PcdFrontPageFormSetGuid),ClassGuid)){\r
+            gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+            break;\r
+          }\r
+          ClassGuid ++;\r
+        }\r
+      }\r
+      break;\r
+\r
     case EFI_IFR_GUID_OP:     \r
       if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)((CHAR8*) OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
         //\r
@@ -326,7 +347,9 @@ ProcessExternedOpcode (
   )\r
 {\r
   LIST_ENTRY                    *Link;\r
+  LIST_ENTRY                    *NestLink;\r
   FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+  FORM_DISPLAY_ENGINE_STATEMENT *NestStatement;\r
 \r
   Link = GetFirstNode (&FormData->StatementListOSF);\r
   while (!IsNull (&FormData->StatementListOSF, Link)) {\r
@@ -342,6 +365,15 @@ ProcessExternedOpcode (
     Link = GetNextNode (&FormData->StatementListHead, Link);\r
 \r
     ProcessUserOpcode(Statement->OpCode);\r
+\r
+    NestLink = GetFirstNode (&Statement->NestStatementList);\r
+    while (!IsNull (&Statement->NestStatementList, NestLink)) {\r
+      NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);\r
+      NestLink = GetNextNode (&Statement->NestStatementList, NestLink);\r
+\r
+      ProcessUserOpcode(NestStatement->OpCode);\r
+    }\r
+\r
   }\r
 }\r
 \r
@@ -524,29 +556,32 @@ LibGetStringWidth (
   Show all registered HotKey help strings on bottom Rows.\r
 \r
   @param FormData          The curent input form data info.\r
+  @param SetState          Set HotKey or Clear HotKey\r
 \r
 **/\r
 VOID\r
 PrintHotKeyHelpString (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
+  IN FORM_DISPLAY_ENGINE_FORM      *FormData,\r
+  IN BOOLEAN                       SetState\r
   )\r
 {\r
   UINTN                  CurrentCol;\r
   UINTN                  CurrentRow;\r
   UINTN                  BottomRowOfHotKeyHelp;\r
+  UINTN                  ColumnIndexWidth;\r
   UINTN                  ColumnWidth;\r
+  UINTN                  ColumnIndex;\r
   UINTN                  Index;\r
   EFI_SCREEN_DESCRIPTOR  LocalScreen;\r
   LIST_ENTRY             *Link;\r
   BROWSER_HOT_KEY        *HotKey;\r
-\r
-  if (IsListEmpty (&FormData->HotKeyListHead)) {\r
-    return;\r
-  }\r
+  CHAR16                 BakChar;\r
+  CHAR16                 *ColumnStr;\r
 \r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
   ColumnWidth            = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
   BottomRowOfHotKeyHelp  = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
+  ColumnStr              = gLibEmptyString;\r
 \r
   //\r
   // Calculate total number of Register HotKeys. \r
@@ -556,25 +591,41 @@ PrintHotKeyHelpString (
   while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
     HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
     //\r
-    // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
-    //\r
-    if (StrLen (HotKey->HelpString) > ColumnWidth) {\r
-      HotKey->HelpString[ColumnWidth] = L'\0';\r
-    }\r
-    //\r
     // Calculate help information Column and Row.\r
     //\r
-    if ((Index % 3) != 2) {\r
-      CurrentCol = LocalScreen.LeftColumn + (2 - Index % 3) * ColumnWidth;\r
+    ColumnIndex = Index % 3;\r
+    if (ColumnIndex == 0) {\r
+      CurrentCol       = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth - 1;\r
+    } else if (ColumnIndex == 1) {\r
+      CurrentCol       = LocalScreen.LeftColumn + ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth;\r
     } else {\r
-      CurrentCol = LocalScreen.LeftColumn + 2;\r
+      CurrentCol       = LocalScreen.LeftColumn + 2;\r
+      ColumnIndexWidth = ColumnWidth - 2;\r
     }\r
     CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
+\r
+    //\r
+    // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
+    //\r
+    BakChar = L'\0';\r
+    if (StrLen (HotKey->HelpString) > ColumnIndexWidth) {\r
+      BakChar = HotKey->HelpString[ColumnIndexWidth];\r
+      HotKey->HelpString[ColumnIndexWidth] = L'\0';\r
+    }\r
+\r
     //\r
     // Print HotKey help string on bottom Row.\r
     //\r
-    PrintStringAt (CurrentCol, CurrentRow, HotKey->HelpString);\r
+    if (SetState) {\r
+      ColumnStr = HotKey->HelpString;\r
+    }\r
+    PrintStringAtWithWidth (CurrentCol, CurrentRow, ColumnStr, ColumnIndexWidth);\r
 \r
+    if (BakChar != L'\0') {\r
+      HotKey->HelpString[ColumnIndexWidth] = BakChar;\r
+    }\r
     //\r
     // Get Next Hot Key.\r
     //\r
@@ -582,6 +633,25 @@ PrintHotKeyHelpString (
     Index ++;\r
   }\r
   \r
+  if (SetState) {\r
+    //\r
+    // Clear KeyHelp\r
+    //\r
+    CurrentRow  = BottomRowOfHotKeyHelp - Index / 3;\r
+    ColumnIndex = Index % 3;\r
+    if (ColumnIndex == 0) {\r
+      CurrentCol       = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth - 1;\r
+      ColumnIndex ++;\r
+      PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+    }\r
+    if (ColumnIndex == 1) {\r
+      CurrentCol       = LocalScreen.LeftColumn + ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth;\r
+      PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+    }\r
+  }\r
+  \r
   return;\r
 }\r
 \r
@@ -788,6 +858,7 @@ PrintInternal (
   UINTN   Index;\r
   UINTN   PreviousIndex;\r
   UINTN   Count;\r
+  UINTN   TotalCount;\r
   UINTN   PrintWidth;\r
   UINTN   CharWidth;\r
 \r
@@ -812,6 +883,7 @@ PrintInternal (
   Index         = 0;\r
   PreviousIndex = 0;\r
   Count         = 0;\r
+  TotalCount    = 0;\r
   PrintWidth    = 0;\r
   CharWidth     = 1;\r
 \r
@@ -823,17 +895,14 @@ PrintInternal (
     if (Buffer[Index] == 0) {\r
       break;\r
     }\r
-    //\r
-    // Null-terminate the temporary string\r
-    //\r
-    BackupBuffer[Index] = 0;\r
 \r
     //\r
     // Print this out, we are about to switch widths\r
     //\r
     Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-    Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+    Count = StrLen (&BackupBuffer[PreviousIndex]);\r
     PrintWidth += Count * CharWidth;\r
+    TotalCount += Count;\r
 \r
     //\r
     // Preserve the current index + 1, since this is where we will start printing from next\r
@@ -867,8 +936,9 @@ PrintInternal (
   // We hit the end of the string - print it\r
   //\r
   Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-  Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+  Count = StrLen (&BackupBuffer[PreviousIndex]);\r
   PrintWidth += Count * CharWidth;\r
+  TotalCount += Count;\r
   if (PrintWidth < Width) {\r
     Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
     Out->SetAttribute (Out, Out->Mode->Attribute);\r
@@ -877,7 +947,7 @@ PrintInternal (
 \r
   FreePool (Buffer);\r
   FreePool (BackupBuffer);\r
-  return Count;\r
+  return TotalCount;\r
 }\r
 \r
 /**\r