It is the follow up of 3ab41b7a32
to replace UnicodeStrToAsciiStr/AsciiStrToUnicodeStr with
UnicodeStrToAsciiStrS/AsciiStrToUnicodeStrS.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
		
	
		
			
				
	
	
		
			674 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			674 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|   This library class defines a set of interfaces to customize Ui module
 | |
| 
 | |
| Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials are licensed and made available under
 | |
| the terms and conditions of the BSD License that accompanies this distribution.
 | |
| The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php.
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| #include <Uefi.h>
 | |
| 
 | |
| #include <Guid/MdeModuleHii.h>
 | |
| #include <Guid/GlobalVariable.h>
 | |
| 
 | |
| #include <Protocol/HiiConfigAccess.h>
 | |
| #include <Protocol/HiiString.h>
 | |
| 
 | |
| #include <Library/HiiLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| #include <Library/UefiRuntimeServicesTableLib.h>
 | |
| #include <Library/UefiHiiServicesLib.h>
 | |
| #include <Library/DevicePathLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include "FrontPageCustomizedUiSupport.h"
 | |
| 
 | |
| //
 | |
| // This is the VFR compiler generated header file which defines the
 | |
| // string identifiers.
 | |
| //
 | |
| #define PRINTABLE_LANGUAGE_NAME_STRING_ID     0x0001
 | |
| 
 | |
| #define UI_HII_DRIVER_LIST_SIZE               0x8
 | |
| 
 | |
| #define FRONT_PAGE_KEY_CONTINUE               0x1000
 | |
| #define FRONT_PAGE_KEY_RESET                  0x1001
 | |
| #define FRONT_PAGE_KEY_LANGUAGE               0x1002
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_STRING_ID   PromptId;
 | |
|   EFI_STRING_ID   HelpId;
 | |
|   EFI_STRING_ID   DevicePathId;
 | |
|   EFI_GUID        FormSetGuid;
 | |
|   BOOLEAN         EmptyLineAfter;
 | |
| } UI_HII_DRIVER_INSTANCE;
 | |
| 
 | |
| CHAR8                        *gLanguageString;
 | |
| EFI_STRING_ID                *gLanguageToken;
 | |
| UI_HII_DRIVER_INSTANCE       *gHiiDriverList;
 | |
| extern EFI_HII_HANDLE        gStringPackHandle;
 | |
| UINT8                        gCurrentLanguageIndex;
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Get next language from language code list (with separator ';').
 | |
| 
 | |
|   If LangCode is NULL, then ASSERT.
 | |
|   If Lang is NULL, then ASSERT.
 | |
| 
 | |
|   @param  LangCode    On input: point to first language in the list. On
 | |
|                                  output: point to next language in the list, or
 | |
|                                  NULL if no more language in the list.
 | |
|   @param  Lang           The first language in the list.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| GetNextLanguage (
 | |
|   IN OUT CHAR8      **LangCode,
 | |
|   OUT CHAR8         *Lang
 | |
|   )
 | |
| {
 | |
|   UINTN  Index;
 | |
|   CHAR8  *StringPtr;
 | |
| 
 | |
|   ASSERT (LangCode != NULL);
 | |
|   ASSERT (*LangCode != NULL);
 | |
|   ASSERT (Lang != NULL);
 | |
| 
 | |
|   Index = 0;
 | |
|   StringPtr = *LangCode;
 | |
|   while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {
 | |
|     Index++;
 | |
|   }
 | |
| 
 | |
|   CopyMem (Lang, StringPtr, Index);
 | |
|   Lang[Index] = 0;
 | |
| 
 | |
|   if (StringPtr[Index] == ';') {
 | |
|     Index++;
 | |
|   }
 | |
|   *LangCode = StringPtr + Index;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This function processes the language changes in configuration.
 | |
| 
 | |
|   @param Value           A pointer to the data being sent to the original exporting driver.
 | |
| 
 | |
| 
 | |
|   @retval  TRUE          The callback successfully handled the action.
 | |
|   @retval  FALSE         The callback not supported in this handler.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LanguageChangeHandler (
 | |
|   IN  EFI_IFR_TYPE_VALUE                     *Value
 | |
|   )
 | |
| {
 | |
|   CHAR8                         *LangCode;
 | |
|   CHAR8                         *Lang;
 | |
|   UINTN                         Index;
 | |
|   EFI_STATUS                    Status;
 | |
| 
 | |
|   //
 | |
|   // Allocate working buffer for RFC 4646 language in supported LanguageString.
 | |
|   //
 | |
|   Lang = AllocatePool (AsciiStrSize (gLanguageString));
 | |
|   ASSERT (Lang != NULL);
 | |
| 
 | |
|   Index = 0;
 | |
|   LangCode = gLanguageString;
 | |
|   while (*LangCode != 0) {
 | |
|     GetNextLanguage (&LangCode, Lang);
 | |
| 
 | |
|     if (Index == Value->u8) {
 | |
|       gCurrentLanguageIndex = Value->u8;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     Index++;
 | |
|   }
 | |
| 
 | |
|   if (Index == Value->u8) {
 | |
|     Status = gRT->SetVariable (
 | |
|                     L"PlatformLang",
 | |
|                     &gEfiGlobalVariableGuid,
 | |
|                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
 | |
|                     AsciiStrSize (Lang),
 | |
|                     Lang
 | |
|                     );
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       FreePool (Lang);
 | |
|       return EFI_DEVICE_ERROR;
 | |
|     }
 | |
|   } else {
 | |
|     ASSERT (FALSE);
 | |
|   }
 | |
|   FreePool (Lang);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This function processes the results of changes in configuration.
 | |
| 
 | |
| 
 | |
|   @param HiiHandle       Points to the hii handle for this formset.
 | |
|   @param Action          Specifies the type of action taken by the browser.
 | |
|   @param QuestionId      A unique value which is sent to the original exporting driver
 | |
|                          so that it can identify the type of data to expect.
 | |
|   @param Type            The type of value for the question.
 | |
|   @param Value           A pointer to the data being sent to the original exporting driver.
 | |
|   @param ActionRequest   On return, points to the action requested by the callback function.
 | |
|   @param Status          Return the handle status.
 | |
| 
 | |
|   @retval  TRUE          The callback successfully handled the action.
 | |
|   @retval  FALSE         The callback not supported in this handler.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| UiSupportLibCallbackHandler (
 | |
|   IN  EFI_HII_HANDLE                         HiiHandle,
 | |
|   IN  EFI_BROWSER_ACTION                     Action,
 | |
|   IN  EFI_QUESTION_ID                        QuestionId,
 | |
|   IN  UINT8                                  Type,
 | |
|   IN  EFI_IFR_TYPE_VALUE                     *Value,
 | |
|   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest,
 | |
|   OUT EFI_STATUS                             *Status
 | |
|   )
 | |
| {
 | |
|   if (QuestionId != FRONT_PAGE_KEY_CONTINUE &&
 | |
|       QuestionId != FRONT_PAGE_KEY_RESET &&
 | |
|       QuestionId != FRONT_PAGE_KEY_LANGUAGE) {
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   if (Action == EFI_BROWSER_ACTION_RETRIEVE) {
 | |
|     if (QuestionId == FRONT_PAGE_KEY_LANGUAGE) {
 | |
|       Value->u8 = gCurrentLanguageIndex;
 | |
|       *Status = EFI_SUCCESS;
 | |
|     } else {
 | |
|       *Status = EFI_UNSUPPORTED;
 | |
|     }
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if (Action != EFI_BROWSER_ACTION_CHANGED) {
 | |
|     //
 | |
|     // Do nothing for other UEFI Action. Only do call back when data is changed.
 | |
|     //
 | |
|     *Status = EFI_UNSUPPORTED;
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if (Action == EFI_BROWSER_ACTION_CHANGED) {
 | |
|     if ((Value == NULL) || (ActionRequest == NULL)) {
 | |
|       *Status = EFI_INVALID_PARAMETER;
 | |
|       return TRUE;
 | |
|     }
 | |
| 
 | |
|     *Status = EFI_SUCCESS;
 | |
|     switch (QuestionId) {
 | |
|     case FRONT_PAGE_KEY_CONTINUE:
 | |
|       //
 | |
|       // This is the continue - clear the screen and return an error to get out of FrontPage loop
 | |
|       //
 | |
|       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
 | |
|       break;
 | |
| 
 | |
|     case FRONT_PAGE_KEY_LANGUAGE:
 | |
|       *Status = LanguageChangeHandler(Value);
 | |
|       break;
 | |
| 
 | |
|     case FRONT_PAGE_KEY_RESET:
 | |
|       //
 | |
|       // Reset
 | |
|       //
 | |
|       gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
 | |
|       *Status = EFI_UNSUPPORTED;
 | |
| 
 | |
|     default:
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Create Select language menu in the front page with oneof opcode.
 | |
| 
 | |
|   @param[in]    HiiHandle           The hii handle for the Uiapp driver.
 | |
|   @param[in]    StartOpCodeHandle   The opcode handle to save the new opcode.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| UiCreateLanguageMenu (
 | |
|   IN EFI_HII_HANDLE              HiiHandle,
 | |
|   IN VOID                        *StartOpCodeHandle
 | |
|   )
 | |
| {
 | |
|   CHAR8                       *LangCode;
 | |
|   CHAR8                       *Lang;
 | |
|   UINTN                       LangSize;
 | |
|   CHAR8                       *CurrentLang;
 | |
|   UINTN                       OptionCount;
 | |
|   CHAR16                      *StringBuffer;
 | |
|   VOID                        *OptionsOpCodeHandle;
 | |
|   UINTN                       StringSize;
 | |
|   EFI_STATUS                  Status;
 | |
|   EFI_HII_STRING_PROTOCOL     *HiiString;
 | |
| 
 | |
|   Lang         = NULL;
 | |
|   StringBuffer = NULL;
 | |
| 
 | |
|   //
 | |
|   // Init OpCode Handle and Allocate space for creation of UpdateData Buffer
 | |
|   //
 | |
|   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
 | |
|   ASSERT (OptionsOpCodeHandle != NULL);
 | |
| 
 | |
|   GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);
 | |
| 
 | |
|   //
 | |
|   // Get Support language list from variable.
 | |
|   //
 | |
|   GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&gLanguageString, NULL);
 | |
|   if (gLanguageString == NULL) {
 | |
|     gLanguageString = AllocateCopyPool (
 | |
|                                AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),
 | |
|                                (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)
 | |
|                                );
 | |
|     ASSERT (gLanguageString != NULL);
 | |
|   }
 | |
| 
 | |
|   if (gLanguageToken == NULL) {
 | |
|     //
 | |
|     // Count the language list number.
 | |
|     //
 | |
|     LangCode = gLanguageString;
 | |
|     Lang = AllocatePool (AsciiStrSize (gLanguageString));
 | |
|     ASSERT (Lang != NULL);
 | |
| 
 | |
|     OptionCount = 0;
 | |
|     while (*LangCode != 0) {
 | |
|       GetNextLanguage (&LangCode, Lang);
 | |
|       OptionCount ++;
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Allocate extra 1 as the end tag.
 | |
|     //
 | |
|     gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));
 | |
|     ASSERT (gLanguageToken != NULL);
 | |
| 
 | |
|     Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);
 | |
|     ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|     LangCode     = gLanguageString;
 | |
|     OptionCount  = 0;
 | |
|     while (*LangCode != 0) {
 | |
|       GetNextLanguage (&LangCode, Lang);
 | |
| 
 | |
|       StringSize = 0;
 | |
|       Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);
 | |
|       if (Status == EFI_BUFFER_TOO_SMALL) {
 | |
|         StringBuffer = AllocateZeroPool (StringSize);
 | |
|         ASSERT (StringBuffer != NULL);
 | |
|         Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);
 | |
|         ASSERT_EFI_ERROR (Status);
 | |
|       }
 | |
| 
 | |
|       if (EFI_ERROR (Status)) {
 | |
|         LangSize = AsciiStrSize (Lang);
 | |
|         StringBuffer = AllocatePool (LangSize * sizeof (CHAR16));
 | |
|         ASSERT (StringBuffer != NULL);
 | |
|         AsciiStrToUnicodeStrS (Lang, StringBuffer, LangSize);
 | |
|       }
 | |
| 
 | |
|       ASSERT (StringBuffer != NULL);
 | |
|       gLanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);
 | |
|       FreePool (StringBuffer);
 | |
| 
 | |
|       OptionCount++;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   ASSERT (gLanguageToken != NULL);
 | |
|   LangCode = gLanguageString;
 | |
|   OptionCount = 0;
 | |
|   if (Lang == NULL) {
 | |
|     Lang = AllocatePool (AsciiStrSize (gLanguageString));
 | |
|     ASSERT (Lang != NULL);
 | |
|   }
 | |
|   while (*LangCode != 0) {
 | |
|     GetNextLanguage (&LangCode, Lang);
 | |
| 
 | |
|     if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {
 | |
|       HiiCreateOneOfOptionOpCode (
 | |
|         OptionsOpCodeHandle,
 | |
|         gLanguageToken[OptionCount],
 | |
|         EFI_IFR_OPTION_DEFAULT,
 | |
|         EFI_IFR_NUMERIC_SIZE_1,
 | |
|         (UINT8) OptionCount
 | |
|         );
 | |
|       gCurrentLanguageIndex = (UINT8) OptionCount;
 | |
|     } else {
 | |
|       HiiCreateOneOfOptionOpCode (
 | |
|         OptionsOpCodeHandle,
 | |
|         gLanguageToken[OptionCount],
 | |
|         0,
 | |
|         EFI_IFR_NUMERIC_SIZE_1,
 | |
|         (UINT8) OptionCount
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     OptionCount++;
 | |
|   }
 | |
| 
 | |
|   if (CurrentLang != NULL) {
 | |
|     FreePool (CurrentLang);
 | |
|   }
 | |
|   FreePool (Lang);
 | |
| 
 | |
|   HiiCreateOneOfOpCode (
 | |
|     StartOpCodeHandle,
 | |
|     FRONT_PAGE_KEY_LANGUAGE,
 | |
|     0,
 | |
|     0,
 | |
|     STRING_TOKEN (STR_LANGUAGE_SELECT),
 | |
|     STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),
 | |
|     EFI_IFR_FLAG_CALLBACK,
 | |
|     EFI_IFR_NUMERIC_SIZE_1,
 | |
|     OptionsOpCodeHandle,
 | |
|     NULL
 | |
|     );
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Create continue menu in the front page.
 | |
| 
 | |
|   @param[in]    HiiHandle           The hii handle for the Uiapp driver.
 | |
|   @param[in]    StartOpCodeHandle   The opcode handle to save the new opcode.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| UiCreateContinueMenu (
 | |
|   IN EFI_HII_HANDLE              HiiHandle,
 | |
|   IN VOID                        *StartOpCodeHandle
 | |
|   )
 | |
| {
 | |
|   HiiCreateActionOpCode (
 | |
|     StartOpCodeHandle,
 | |
|     FRONT_PAGE_KEY_CONTINUE,
 | |
|     STRING_TOKEN (STR_CONTINUE_PROMPT),
 | |
|     STRING_TOKEN (STR_CONTINUE_PROMPT),
 | |
|     EFI_IFR_FLAG_CALLBACK,
 | |
|     0
 | |
|     );
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Create empty line menu in the front page.
 | |
| 
 | |
|   @param    HiiHandle           The hii handle for the Uiapp driver.
 | |
|   @param    StartOpCodeHandle   The opcode handle to save the new opcode.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| UiCreateEmptyLine (
 | |
|   IN EFI_HII_HANDLE              HiiHandle,
 | |
|   IN VOID                        *StartOpCodeHandle
 | |
|   )
 | |
| {
 | |
|   HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Create Reset menu in the front page.
 | |
| 
 | |
|   @param[in]    HiiHandle           The hii handle for the Uiapp driver.
 | |
|   @param[in]    StartOpCodeHandle   The opcode handle to save the new opcode.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| UiCreateResetMenu (
 | |
|   IN EFI_HII_HANDLE              HiiHandle,
 | |
|   IN VOID                        *StartOpCodeHandle
 | |
|   )
 | |
| {
 | |
|   HiiCreateActionOpCode (
 | |
|     StartOpCodeHandle,
 | |
|     FRONT_PAGE_KEY_RESET,
 | |
|     STRING_TOKEN (STR_RESET_STRING),
 | |
|     STRING_TOKEN (STR_RESET_STRING),
 | |
|     EFI_IFR_FLAG_CALLBACK,
 | |
|     0
 | |
|     );
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Extract device path for given HII handle and class guid.
 | |
| 
 | |
|   @param Handle          The HII handle.
 | |
| 
 | |
|   @retval  NULL          Fail to get the device path string.
 | |
|   @return  PathString    Get the device path string.
 | |
| 
 | |
| **/
 | |
| CHAR16 *
 | |
| ExtractDevicePathFromHiiHandle (
 | |
|   IN      EFI_HII_HANDLE      Handle
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                       Status;
 | |
|   EFI_HANDLE                       DriverHandle;
 | |
| 
 | |
|   ASSERT (Handle != NULL);
 | |
| 
 | |
|   if (Handle == NULL) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Check whether this driver need to be shown in the front page.
 | |
| 
 | |
|   @param    HiiHandle           The hii handle for the driver.
 | |
|   @param    Guid                The special guid for the driver which is the target.
 | |
|   @param    PromptId            Return the prompt string id.
 | |
|   @param    HelpId              Return the help string id.
 | |
|   @param    FormsetGuid         Return the formset guid info.
 | |
| 
 | |
|   @retval   EFI_SUCCESS         Search the driver success
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| RequiredDriver (
 | |
|   IN  EFI_HII_HANDLE              HiiHandle,
 | |
|   IN  EFI_GUID                    *Guid,
 | |
|   OUT EFI_STRING_ID               *PromptId,
 | |
|   OUT EFI_STRING_ID               *HelpId,
 | |
|   OUT VOID                        *FormsetGuid
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
|   UINT8                       ClassGuidNum;
 | |
|   EFI_GUID                    *ClassGuid;
 | |
|   EFI_IFR_FORM_SET            *Buffer;
 | |
|   UINTN                       BufferSize;
 | |
|   UINT8                       *Ptr;
 | |
|   UINTN                       TempSize;
 | |
|   BOOLEAN                     RetVal;
 | |
| 
 | |
|   Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   RetVal = FALSE;
 | |
|   TempSize = 0;
 | |
|   Ptr = (UINT8 *) Buffer;
 | |
|   while(TempSize < BufferSize)  {
 | |
|     TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
 | |
| 
 | |
|     if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){
 | |
|       Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
 | |
|       continue;
 | |
|     }
 | |
| 
 | |
|     ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
 | |
|     ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
 | |
|     while (ClassGuidNum-- > 0) {
 | |
|       if (!CompareGuid (Guid, ClassGuid)){
 | |
|         ClassGuid ++;
 | |
|         continue;
 | |
|       }
 | |
| 
 | |
|       *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;
 | |
|       *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;
 | |
|       CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));
 | |
|       RetVal = TRUE;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   FreePool (Buffer);
 | |
| 
 | |
|   return RetVal;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Search the drivers in the system which need to show in the front page
 | |
|   and insert the menu to the front page.
 | |
| 
 | |
|   @param    HiiHandle           The hii handle for the Uiapp driver.
 | |
|   @param    ClassGuid           The class guid for the driver which is the target.
 | |
|   @param    SpecialHandlerFn    The pointer to the specail handler function, if any.
 | |
|   @param    StartOpCodeHandle   The opcode handle to save the new opcode.
 | |
| 
 | |
|   @retval   EFI_SUCCESS         Search the driver success
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UiListThirdPartyDrivers (
 | |
|   IN EFI_HII_HANDLE              HiiHandle,
 | |
|   IN EFI_GUID                    *ClassGuid,
 | |
|   IN DRIVER_SPECIAL_HANDLER      SpecialHandlerFn,
 | |
|   IN VOID                        *StartOpCodeHandle
 | |
|   )
 | |
| {
 | |
|   UINTN                       Index;
 | |
|   EFI_STRING                  String;
 | |
|   EFI_STRING_ID               Token;
 | |
|   EFI_STRING_ID               TokenHelp;
 | |
|   EFI_HII_HANDLE              *HiiHandles;
 | |
|   CHAR16                      *DevicePathStr;
 | |
|   UINTN                       Count;
 | |
|   UINTN                       CurrentSize;
 | |
|   UI_HII_DRIVER_INSTANCE      *DriverListPtr;
 | |
|   EFI_STRING                  NewName;
 | |
|   BOOLEAN                     EmptyLineAfter;
 | |
| 
 | |
|   if (gHiiDriverList != NULL) {
 | |
|     FreePool (gHiiDriverList);
 | |
|   }
 | |
| 
 | |
|   HiiHandles = HiiGetHiiHandles (NULL);
 | |
|   ASSERT (HiiHandles != NULL);
 | |
| 
 | |
|   gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));
 | |
|   ASSERT (gHiiDriverList != NULL);
 | |
|   DriverListPtr = gHiiDriverList;
 | |
|   CurrentSize = UI_HII_DRIVER_LIST_SIZE;
 | |
| 
 | |
|   for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {
 | |
|     if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {
 | |
|       continue;
 | |
|     }
 | |
| 
 | |
|     String = HiiGetString (HiiHandles[Index], Token, NULL);
 | |
|     if (String == NULL) {
 | |
|       String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
 | |
|       ASSERT (String != NULL);
 | |
|     } else if (SpecialHandlerFn != NULL) {
 | |
|       //
 | |
|       // Check whether need to rename the driver name.
 | |
|       //
 | |
|       EmptyLineAfter = FALSE;
 | |
|       if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {
 | |
|         FreePool (String);
 | |
|         String = NewName;
 | |
|         DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;
 | |
|       }
 | |
|     }
 | |
|     DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);
 | |
|     FreePool (String);
 | |
| 
 | |
|     String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);
 | |
|     if (String == NULL) {
 | |
|       String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
 | |
|       ASSERT (String != NULL);
 | |
|     }
 | |
|     DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);
 | |
|     FreePool (String);
 | |
| 
 | |
|     DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);
 | |
|     if (DevicePathStr != NULL){
 | |
|       DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
 | |
|       FreePool (DevicePathStr);
 | |
|     } else {
 | |
|       DriverListPtr[Count].DevicePathId = 0;
 | |
|     }
 | |
| 
 | |
|     Count++;
 | |
|     if (Count >= CurrentSize) {
 | |
|       DriverListPtr = AllocateCopyPool ((Count + UI_HII_DRIVER_LIST_SIZE) * sizeof (UI_HII_DRIVER_INSTANCE), gHiiDriverList);
 | |
|       ASSERT (DriverListPtr != NULL);
 | |
|       FreePool (gHiiDriverList);
 | |
|       gHiiDriverList = DriverListPtr;
 | |
|       CurrentSize += UI_HII_DRIVER_LIST_SIZE;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   FreePool (HiiHandles);
 | |
| 
 | |
|   Index = 0;
 | |
|   while (gHiiDriverList[Index].PromptId != 0) {
 | |
|     HiiCreateGotoExOpCode (
 | |
|       StartOpCodeHandle,
 | |
|       0,
 | |
|       gHiiDriverList[Index].PromptId,
 | |
|       gHiiDriverList[Index].HelpId,
 | |
|       0,
 | |
|       0,
 | |
|       0,
 | |
|       &gHiiDriverList[Index].FormSetGuid,
 | |
|       gHiiDriverList[Index].DevicePathId
 | |
|     );
 | |
| 
 | |
|     if (gHiiDriverList[Index].EmptyLineAfter) {
 | |
|       UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
 | |
|     }
 | |
| 
 | |
|     Index ++;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |