]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/UiApp/FrontPage.c
MdeModulePkg:Refine the UiApp
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / FrontPage.c
index 245c3497c8023cc85708345b6d9a2412bcb9f2d7..5c67a3fa91ab7f89eb6edea8834e55e4a948a575 100644 (file)
@@ -16,12 +16,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "Language.h"\r
 #define MAX_STRING_LEN        200\r
 \r
-EFI_GUID  mFrontPageGuid      = FRONT_PAGE_FORMSET_GUID;\r
+EFI_GUID   mFrontPageGuid      = FRONT_PAGE_FORMSET_GUID;\r
 \r
 BOOLEAN   gConnectAllHappened = FALSE;\r
 BOOLEAN   mFeaturerSwitch = TRUE;\r
 BOOLEAN   mResetRequired  = FALSE;\r
-BOOLEAN   mEnterBmm       = FALSE;\r
 \r
 EFI_FORM_BROWSER2_PROTOCOL      *gFormBrowser2;\r
 CHAR8     *mLanguageString;\r
@@ -153,14 +152,7 @@ FakeRouteConfig (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  *Progress = Configuration;\r
-  if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)\r
-      && !HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  *Progress = Configuration + StrLen (Configuration);\r
-  return EFI_SUCCESS;\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 /**\r
@@ -381,17 +373,7 @@ FrontPageCallback (
   UINTN                         Index;\r
   EFI_STATUS                    Status;\r
 \r
-  //\r
-  //Chech whether exit from BMM and reenter frontpage,if yes,reclaim string depositories\r
-  //\r
-  if (Action == EFI_BROWSER_ACTION_FORM_OPEN){\r
-    if (mEnterBmm){\r
-      ReclaimStringDepository();\r
-      mEnterBmm = FALSE;\r
-    }\r
-  }\r
-\r
-  if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\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
@@ -452,45 +434,160 @@ FrontPageCallback (
     default:\r
       break;\r
     }\r
-  } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
-    if (Value == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+Update front page form base on the ClassGuid in the formset in other modules.\r
+\r
+**/\r
+VOID\r
+UpdateFrontPageForm (\r
+  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
+\r
+  //\r
+  // 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
+  // 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
+  //\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
+  //\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
+  //\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
-    //\r
-    // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
-    // describe to their customers in documentation how to find their setup information (namely\r
-    // under the device manager and specific buckets)\r
-    //\r
-    switch (QuestionId) {\r
-    case FRONT_PAGE_KEY_BOOT_MANAGER:\r
-      //\r
-      // Boot Manager\r
-      //\r
-      EnumerateBootOptions ();\r
-      break;\r
+    Ptr = (UINT8 *)Buffer;\r
+    while(TempSize < BufferSize)  {\r
+      TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
 \r
-    case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
-      //\r
-      // Device Manager\r
-      //\r
-      CreateDeviceManagerForm(DEVICE_MANAGER_FORM_ID);\r
-      break;\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
-    case FRONT_PAGE_KEY_BOOT_MAINTAIN:\r
       //\r
-      // Boot Maintenance Manager\r
+      // Find Class Guid\r
       //\r
-      InitializeBM ();\r
-      mEnterBmm  = TRUE;\r
-      break;\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
-    default:\r
-      break;\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
 \r
-  return EFI_SUCCESS;\r
+  HiiUpdateForm (\r
+    HiiHandle,\r
+    &mFrontPageGuid,\r
+    FRONT_PAGE_FORM_ID,\r
+    StartOpCodeHandle,\r
+    EndOpCodeHandle\r
+    );\r
+\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+  FreePool (HiiHandles);\r
 }\r
 \r
 /**\r
@@ -507,7 +604,6 @@ InitializeFrontPage (
   )\r
 {\r
   EFI_STATUS                  Status;\r
-\r
   //\r
   // Locate Hii relative protocols\r
   //\r
@@ -552,6 +648,11 @@ InitializeFrontPage (
   //\r
   InitializeLanguage ();\r
 \r
+  //\r
+  //Updata Front Page form\r
+  //\r
+  UpdateFrontPageForm();\r
+\r
   return Status;\r
 }\r
 \r
@@ -1208,15 +1309,9 @@ UiEntry (
   }\r
 \r
   InitializeFrontPage ();\r
-  InitializeDeviceManager ();\r
-  InitializeBootManager ();\r
-  InitBootMaintenance();\r
 \r
   CallFrontPage ();\r
 \r
-  FreeBMPackage ();\r
-  FreeBootManager ();\r
-  FreeDeviceManager ();\r
   FreeFrontPage ();\r
 \r
   if (mLanguageString != NULL) {\r
@@ -1246,10 +1341,7 @@ ExtractDevicePathFromHiiHandle (
 {\r
   EFI_STATUS                       Status;\r
   EFI_HANDLE                       DriverHandle;\r
-  EFI_DEVICE_PATH_PROTOCOL         *DevicePath;  \r
-  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *PathToText;\r
-  CHAR16                           *NewString;\r
-\r
+  \r
   ASSERT (Handle != NULL);\r
 \r
   if (Handle == NULL) {\r
@@ -1257,174 +1349,12 @@ ExtractDevicePathFromHiiHandle (
   }\r
 \r
   Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Get the device path by the got Driver handle .\r
-  //\r
-  Status = gBS->HandleProtocol (DriverHandle, &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath);\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
- }\r
-\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiDevicePathToTextProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &PathToText\r
-                  );\r
   if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
 \r
-  //\r
-  // Get device path string.\r
-  //\r
-  NewString = PathToText->ConvertDevicePathToText(DevicePath, FALSE, FALSE);\r
+ return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
 \r
-  return NewString;\r
-}\r
-\r
-/**\r
-  Extract the displayed formset for given HII handle and class guid.\r
-\r
-  @param Handle          The HII handle.\r
-  @param SetupClassGuid  The class guid specifies which form set will be displayed.\r
-  @param SkipCount       Skip some formsets which has processed before.\r
-  @param FormSetTitle    Formset title string.\r
-  @param FormSetHelp     Formset help string.\r
-  @param FormSetGuid     Formset Guid.\r
-\r
-  @retval  TRUE          The formset for given HII handle will be displayed.\r
-  @return  FALSE         The formset for given HII handle will not be displayed.\r
-\r
-**/\r
-BOOLEAN\r
-ExtractDisplayedHiiFormFromHiiHandle (\r
-  IN      EFI_HII_HANDLE      Handle,\r
-  IN      EFI_GUID            *SetupClassGuid,\r
-  IN      UINTN               SkipCount,\r
-  OUT     EFI_STRING_ID       *FormSetTitle,\r
-  OUT     EFI_STRING_ID       *FormSetHelp,\r
-  OUT     EFI_GUID            *FormSetGuid\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  UINTN                        BufferSize;\r
-  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
-  UINT8                        *Package;\r
-  UINT8                        *OpCodeData;\r
-  UINT32                       Offset;\r
-  UINT32                       Offset2;\r
-  UINT32                       PackageListLength;\r
-  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
-  EFI_GUID                     *ClassGuid;\r
-  UINT8                        ClassGuidNum;\r
-  BOOLEAN                      FoundAndSkip;\r
-\r
-  ASSERT (Handle != NULL);\r
-  ASSERT (SetupClassGuid != NULL && FormSetTitle != NULL && FormSetHelp != NULL && FormSetGuid != NULL);\r
-\r
-  *FormSetTitle = 0;\r
-  *FormSetHelp  = 0;\r
-  ClassGuidNum  = 0;\r
-  ClassGuid     = NULL;\r
-  FoundAndSkip  = FALSE;\r
-\r
-  //\r
-  // Get HII PackageList\r
-  //\r
-  BufferSize = 0;\r
-  HiiPackageList = NULL;\r
-  Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  //\r
-  // Handle is a invalid handle. Check if Handle is corrupted.\r
-  //\r
-  ASSERT (Status != EFI_NOT_FOUND);\r
-  //\r
-  // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
-  //\r
-  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
-  \r
-  HiiPackageList = AllocatePool (BufferSize);\r
-  ASSERT (HiiPackageList != NULL);\r
-\r
-  Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  if (EFI_ERROR (Status)) {\r
-    return FALSE;\r
-  }\r
-\r
-  //\r
-  // Get Form package from this HII package List\r
-  //\r
-  Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-  PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
-\r
-  while (Offset < PackageListLength) {\r
-    Package = ((UINT8 *) HiiPackageList) + Offset;\r
-    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
-    Offset += PackageHeader.Length;\r
-\r
-    if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
-      //\r
-      // Search FormSet Opcode in this Form Package\r
-      //\r
-      Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
-      while (Offset2 < PackageHeader.Length) {\r
-        OpCodeData = Package + Offset2;\r
-        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-\r
-        if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
-          if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
-            //\r
-            // Find FormSet OpCode\r
-            //\r
-            ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
-            ClassGuid = (EFI_GUID *) (VOID *)(OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
-            while (ClassGuidNum-- > 0) {\r
-              if (CompareGuid (SetupClassGuid, ClassGuid)) {\r
-                //\r
-                // Check whether need to skip the formset.\r
-                //\r
-                if (SkipCount != 0) {\r
-                  SkipCount--;\r
-                  FoundAndSkip = TRUE;\r
-                  break;\r
-                }\r
-                CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
-                CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
-                CopyGuid (FormSetGuid, (CONST EFI_GUID *)(&((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
-                FreePool (HiiPackageList);\r
-                return TRUE;\r
-              }\r
-              ClassGuid ++;\r
-            }\r
-            if (FoundAndSkip) {\r
-              break;\r
-            }\r
-           } else if (CompareGuid (SetupClassGuid, &gEfiHiiPlatformSetupFormsetGuid)) {\r
-             //\r
-             //  Check whether need to skip the formset.\r
-             //\r
-             if (SkipCount != 0) {\r
-               SkipCount--;\r
-               break;\r
-             }\r
-             CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
-             CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
-             CopyGuid (FormSetGuid, (CONST EFI_GUID *)(&((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
-             FreePool (HiiPackageList);\r
-             return TRUE;\r
-          }\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  FreePool (HiiPackageList);\r
-\r
-  return FALSE;\r
 }\r
 \r
 //\r
@@ -1566,39 +1496,3 @@ SetupResetReminder (
   }\r
 }\r
 \r
-\r
-/**\r
-  This function converts an input device structure to a Unicode string.\r
-\r
-  @param DevPath                  A pointer to the device path structure.\r
-\r
-  @return A new allocated Unicode string that represents the device path.\r
-\r
-**/\r
-CHAR16 *\r
-UiDevicePathToStr (\r
-  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
-  )\r
-{\r
-  EFI_STATUS                       Status;\r
-  CHAR16                           *ToText;\r
-  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
-\r
-  if (DevPath == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiDevicePathToTextProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &DevPathToText\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  ToText = DevPathToText->ConvertDevicePathToText (\r
-                            DevPath,\r
-                            FALSE,\r
-                            TRUE\r
-                            );\r
-  ASSERT (ToText != NULL);\r
-  return ToText;\r
-}\r