]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
MdeModulePkg/DisplayEngineDxe: Refine the coding style
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / FormDisplay.c
index e198a5e9570f34c5f9974f1b454fcfdfac3f4a3b..8531d0ee06c6b6dd3e3ed33c91e15974b78a40ae 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Entry and initialization module for the browser.\r
 \r
-Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
 Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -604,7 +604,6 @@ UiAddMenuOption (
   UI_MENU_OPTION   *MenuOption;\r
   UINTN            Index;\r
   UINTN            Count;\r
-  CHAR16           *String;\r
   UINT16           NumberOfLines;\r
   UINT16           GlyphWidth;\r
   UINT16           Width;\r
@@ -621,9 +620,6 @@ UiAddMenuOption (
   PromptId = GetPrompt (Statement->OpCode);\r
   ASSERT (PromptId != 0);\r
 \r
-  String = GetToken (PromptId, gFormData->HiiHandle);\r
-  ASSERT (String != NULL);\r
-\r
   if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
     Count = 3;\r
   }\r
@@ -633,7 +629,7 @@ UiAddMenuOption (
     ASSERT (MenuOption);\r
 \r
     MenuOption->Signature   = UI_MENU_OPTION_SIGNATURE;\r
-    MenuOption->Description = String;\r
+    MenuOption->Description = GetToken (PromptId, gFormData->HiiHandle);\r
     MenuOption->Handle      = gFormData->HiiHandle;\r
     MenuOption->ThisTag     = Statement;\r
     MenuOption->NestInStatement = NestIn;\r
@@ -697,11 +693,11 @@ UiAddMenuOption (
       (Statement->OpCode->OpCode != EFI_IFR_DATE_OP) && \r
       (Statement->OpCode->OpCode != EFI_IFR_TIME_OP)) {\r
       Width  = GetWidth (MenuOption, NULL);\r
-      for (; GetLineByWidth (String, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) {\r
+      for (; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) {\r
         //\r
         // If there is more string to process print on the next row and increment the Skip value\r
         //\r
-        if (StrLen (&String[ArrayEntry]) != 0) {\r
+        if (StrLen (&MenuOption->Description[ArrayEntry]) != 0) {\r
           NumberOfLines++;\r
         }\r
         FreePool (OutputString);\r
@@ -1782,14 +1778,15 @@ FindTopMenu (
 \r
   TopRow    = gStatementDimensions.TopRow    + SCROLL_ARROW_HEIGHT;\r
   BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT;\r
-\r
-  if (gMisMatch) {\r
+  //\r
+  // When option mismatch happens,there exist two cases,one is reenter the form, just like the if case below,\r
+  // and the other is exit current form and enter last form, it can be covered by the else case.\r
+  //\r
+  if (gMisMatch && gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle && gFormData->FormId == gHighligthMenuInfo.FormId) {\r
     //\r
     // Reenter caused by option mismatch or auto exit caused by refresh form(refresh interval/guid), \r
     // base on the record highlight info to find the highlight menu.\r
     //\r
-    ASSERT (gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle &&\r
-            gFormData->FormId == gHighligthMenuInfo.FormId);\r
 \r
     *HighlightMenu = FindHighLightMenuOption(NULL);\r
     if (*HighlightMenu != NULL) {\r
@@ -1840,7 +1837,6 @@ FindTopMenu (
       *SkipValue = 0;\r
     }\r
 \r
-    gMisMatch = FALSE;\r
   } else if (FormData->HighLightedStatement != NULL) {\r
     if (IsSavedHighlightStatement (FormData->HighLightedStatement)) {\r
       //\r
@@ -1914,6 +1910,8 @@ FindTopMenu (
     *SkipValue     = 0;\r
   }\r
 \r
+  gMisMatch = FALSE;\r
+\r
   //\r
   // First enter to show the menu, update highlight info.\r
   //\r
@@ -2149,6 +2147,7 @@ FxConfirmPopup (
   UINT32                          CheckFlags;\r
   BOOLEAN                         RetVal;\r
   UINTN                           CatLen;\r
+  UINTN                           MaxLen;\r
 \r
   CfmStrLen = 0;\r
   CatLen    = StrLen (gConfirmMsgConnect);\r
@@ -2209,55 +2208,57 @@ FxConfirmPopup (
   // Allocate buffer to save the string.\r
   // String + "?" + "\0"\r
   //\r
-  CfmStr = AllocateZeroPool ((CfmStrLen + 1 + 1) * sizeof (CHAR16));\r
+  MaxLen = CfmStrLen + 1 + 1;\r
+  CfmStr = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
   ASSERT (CfmStr != NULL);\r
 \r
   if ((Action & BROWSER_ACTION_DISCARD) == BROWSER_ACTION_DISCARD) {\r
-    StrCpy (CfmStr, gConfirmDiscardMsg);\r
+    StrCpyS (CfmStr, MaxLen, gConfirmDiscardMsg);\r
   }\r
 \r
   if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {\r
     if (CfmStr[0] != 0) {\r
-      StrCat (CfmStr, gConfirmMsgConnect);\r
-      StrCat (CfmStr, gConfirmDefaultMsg2nd);\r
+      StrCatS (CfmStr, MaxLen, gConfirmMsgConnect);\r
+      StrCatS (CfmStr, MaxLen, gConfirmDefaultMsg2nd);\r
     } else {\r
-      StrCpy (CfmStr, gConfirmDefaultMsg);\r
+      StrCpyS (CfmStr, MaxLen, gConfirmDefaultMsg);\r
     }\r
   }\r
 \r
   if ((Action & BROWSER_ACTION_SUBMIT)  == BROWSER_ACTION_SUBMIT) {\r
     if (CfmStr[0] != 0) {\r
-      StrCat (CfmStr, gConfirmMsgConnect);\r
-      StrCat (CfmStr, gConfirmSubmitMsg2nd);\r
+      StrCatS (CfmStr, MaxLen, gConfirmMsgConnect);\r
+      StrCatS (CfmStr, MaxLen, gConfirmSubmitMsg2nd);\r
     } else {\r
-      StrCpy (CfmStr, gConfirmSubmitMsg);\r
+      StrCpyS (CfmStr, MaxLen, gConfirmSubmitMsg);\r
     }\r
   }\r
 \r
   if ((Action & BROWSER_ACTION_RESET)  == BROWSER_ACTION_RESET) {\r
     if (CfmStr[0] != 0) {\r
-      StrCat (CfmStr, gConfirmMsgConnect);\r
-      StrCat (CfmStr, gConfirmResetMsg2nd);\r
+      StrCatS (CfmStr, MaxLen, gConfirmMsgConnect);\r
+      StrCatS (CfmStr, MaxLen, gConfirmResetMsg2nd);\r
     } else {\r
-      StrCpy (CfmStr, gConfirmResetMsg);\r
+      StrCpyS (CfmStr, MaxLen, gConfirmResetMsg);\r
     }\r
   }\r
 \r
   if ((Action & BROWSER_ACTION_EXIT)  == BROWSER_ACTION_EXIT) {\r
     if (CfmStr[0] != 0) {\r
-      StrCat (CfmStr, gConfirmMsgConnect);\r
-      StrCat (CfmStr, gConfirmExitMsg2nd);\r
+      StrCatS (CfmStr, MaxLen, gConfirmMsgConnect);\r
+      StrCatS (CfmStr, MaxLen, gConfirmExitMsg2nd);\r
     } else {\r
-      StrCpy (CfmStr, gConfirmExitMsg);\r
+      StrCpyS (CfmStr, MaxLen, gConfirmExitMsg);\r
     }\r
   }\r
 \r
-  StrCat (CfmStr, gConfirmMsgEnd);\r
+  StrCatS (CfmStr, MaxLen, gConfirmMsgEnd);\r
 \r
   do {\r
     CreateDialog (&Key, gEmptyString, CfmStr, gConfirmOpt, gEmptyString, NULL);\r
   } while (((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (gConfirmOptYes[0] | UPPER_LOWER_CASE_OFFSET)) &&\r
-           ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (gConfirmOptNo[0] | UPPER_LOWER_CASE_OFFSET)));\r
+           ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (gConfirmOptNo[0] | UPPER_LOWER_CASE_OFFSET)) &&\r
+           (Key.ScanCode != SCAN_ESC));\r
 \r
   if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (gConfirmOptYes[0] | UPPER_LOWER_CASE_OFFSET)) {\r
     RetVal = TRUE;\r
@@ -2545,6 +2546,8 @@ UiDisplayMenu (
   UINTN                           BottomRow;\r
   UINTN                           Index;\r
   CHAR16                          *StringPtr;\r
+  CHAR16                          *StringRightPtr;\r
+  CHAR16                          *StringErrorPtr;\r
   CHAR16                          *OptionString;\r
   CHAR16                          *HelpString;\r
   CHAR16                          *HelpHeaderString;\r
@@ -2579,6 +2582,7 @@ UiDisplayMenu (
   EFI_STRING_ID                   HelpInfo;\r
   UI_EVENT_TYPE                   EventType;\r
   BOOLEAN                         SkipHighLight;\r
+  EFI_HII_VALUE                   *StatementValue;\r
 \r
   EventType           = UIEventNone;\r
   Status              = EFI_SUCCESS;\r
@@ -2885,10 +2889,26 @@ UiDisplayMenu (
           //\r
           ASSERT(MenuOption != NULL);\r
           HelpInfo = ((EFI_IFR_STATEMENT_HEADER *) ((CHAR8 *)MenuOption->ThisTag->OpCode + sizeof (EFI_IFR_OP_HEADER)))->Help;\r
+          Statement = MenuOption->ThisTag;\r
+          StatementValue = &Statement->CurrentValue;\r
           if (HelpInfo == 0 || !IsSelectable (MenuOption)) {\r
-            StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
+            if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP && StatementValue->Value.date.Month== 0xff)||(Statement->OpCode->OpCode == EFI_IFR_TIME_OP && StatementValue->Value.time.Hour == 0xff)){\r
+              StringPtr = GetToken (STRING_TOKEN (GET_TIME_FAIL), gHiiHandle);\r
+            } else {\r
+              StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
+            }\r
           } else {\r
-            StringPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
+            if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP && StatementValue->Value.date.Month== 0xff)||(Statement->OpCode->OpCode == EFI_IFR_TIME_OP && StatementValue->Value.time.Hour == 0xff)){\r
+              StringRightPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
+              StringErrorPtr = GetToken (STRING_TOKEN (GET_TIME_FAIL), gHiiHandle);\r
+              StringPtr = AllocateZeroPool ((StrLen (StringRightPtr) + StrLen (StringErrorPtr)+ 1 ) * sizeof (CHAR16));\r
+              StrCpyS (StringPtr, StrLen (StringRightPtr) + StrLen (StringErrorPtr) + 1, StringRightPtr);\r
+              StrCatS (StringPtr, StrLen (StringRightPtr) + StrLen (StringErrorPtr) + 1, StringErrorPtr);\r
+              FreePool (StringRightPtr);\r
+              FreePool (StringErrorPtr);\r
+            } else {\r
+              StringPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
+            }\r
           }\r
         }\r
 \r
@@ -2925,7 +2945,7 @@ UiDisplayMenu (
           //\r
           if (HelpLine > 2 * RowCount - 2) {\r
             HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1;\r
-            if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) {\r
+            if ((HelpLine - RowCount + 1) % (RowCount - 2) != 0) {\r
               HelpPageCount += 1;\r
             }\r
           } else {\r
@@ -3705,6 +3725,34 @@ UiDisplayMenu (
   }\r
 }\r
 \r
+/**\r
+  Free the UI Menu Option structure data.\r
+\r
+  @param   MenuOptionList         Point to the menu option list which need to be free.\r
+\r
+**/\r
+VOID\r
+FreeMenuOptionData(\r
+  LIST_ENTRY           *MenuOptionList\r
+  )\r
+{\r
+  LIST_ENTRY           *Link;\r
+  UI_MENU_OPTION       *Option;\r
+\r
+  //\r
+  // Free menu option list\r
+  //\r
+  while (!IsListEmpty (MenuOptionList)) {\r
+    Link = GetFirstNode (MenuOptionList);\r
+    Option = MENU_OPTION_FROM_LINK (Link);\r
+    if (Option->Description != NULL){\r
+      FreePool(Option->Description);\r
+    }\r
+    RemoveEntryList (&Option->Link);\r
+    FreePool (Option);\r
+  }\r
+}\r
+\r
 /**\r
 \r
   Base on the browser status info to show an pop up message.\r
@@ -3977,6 +4025,11 @@ FormDisplay (
   CopyGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid);\r
   gOldFormEntry.FormId    = FormData->FormId;\r
 \r
+  //\r
+  //Free the Ui menu option list.\r
+  //\r
+  FreeMenuOptionData(&gMenuOption);\r
+\r
   return Status;\r
 }\r
 \r