mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-03 22:54:50 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5015 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			330 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			330 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  HII Library implementation that uses DXE protocols and services.
 | 
						|
 | 
						|
  Copyright (c) 2006, Intel Corporation<BR>
 | 
						|
  All rights reserved. This program and the accompanying materials
 | 
						|
  are licensed and made available under the terms and conditions of the BSD License
 | 
						|
  which 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 <FrameworkDxe.h>
 | 
						|
 | 
						|
#include <Protocol/FrameworkHii.h>
 | 
						|
 | 
						|
#include <Library/FrameworkHiiLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
 | 
						|
 | 
						|
EFI_HII_PROTOCOL *mHii = NULL;
 | 
						|
 | 
						|
/**
 | 
						|
  Library constustor function for HiiLib library instance locate the
 | 
						|
  gEfiHiiProtocolGuid firstly, the other interface in this library
 | 
						|
  instance will dependent on the protocol of gEfiHiiProtocolGuid.
 | 
						|
  So the depex of gEfiHiiProtocolGuid is required for this library 
 | 
						|
  instance.
 | 
						|
  If protocol of gEfiHiiProtocolGuid is not installed, then ASSERT().
 | 
						|
  
 | 
						|
  @param ImageHandle  The image handle of driver module who use this library 
 | 
						|
                      instance.
 | 
						|
  @param SystemTable  Pointer to the EFI System Table.
 | 
						|
  @retval EFI_SUCCESS library constuctor always success.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FrameworkHiiLibConstructor (
 | 
						|
  IN EFI_HANDLE           ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE     *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS Status;
 | 
						|
  
 | 
						|
  Status = gBS->LocateProtocol (
 | 
						|
      &gEfiHiiProtocolGuid,
 | 
						|
      NULL,
 | 
						|
      (VOID **) &mHii
 | 
						|
    );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
  ASSERT (mHii != NULL);
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function is internal function that prepare and create
 | 
						|
  HII packages with given number and package's guid.
 | 
						|
  It is invoked by HiiAddPackages() and PreparePackages() interface.
 | 
						|
  If the parameter of package's number is 0, then ASSERT().
 | 
						|
  
 | 
						|
  @param NumberOfPackages  Given number of package item in a HII package list.
 | 
						|
  @param Guid              Given GUID of a HII package list.
 | 
						|
  @param Marker            Package's content list.
 | 
						|
  
 | 
						|
  @return pointer to new created HII package list.
 | 
						|
**/
 | 
						|
EFI_HII_PACKAGES *
 | 
						|
InternalPreparePackages (
 | 
						|
  IN UINTN           NumberOfPackages,
 | 
						|
  IN CONST EFI_GUID  *Guid OPTIONAL,
 | 
						|
  VA_LIST            Marker
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HII_PACKAGES  *HiiPackages;
 | 
						|
  VOID              **Package;
 | 
						|
  UINTN             Index;
 | 
						|
 | 
						|
  ASSERT (NumberOfPackages > 0);
 | 
						|
 | 
						|
  HiiPackages                   = AllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *));
 | 
						|
  ASSERT (HiiPackages != NULL);
 | 
						|
 | 
						|
  HiiPackages->GuidId           = (EFI_GUID *) Guid;
 | 
						|
  HiiPackages->NumberOfPackages = NumberOfPackages;
 | 
						|
  Package                       = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES));
 | 
						|
 | 
						|
  for (Index = 0; Index < NumberOfPackages; Index++) {
 | 
						|
    *Package = VA_ARG (Marker, VOID *);
 | 
						|
    Package++;
 | 
						|
  }
 | 
						|
 | 
						|
  return HiiPackages;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function allocates pool for an EFI_HII_PACKAGES structure
 | 
						|
  with enough space for the variable argument list of package pointers.
 | 
						|
  The allocated structure is initialized using NumberOfPackages, Guid,
 | 
						|
  and the variable length argument list of package pointers.
 | 
						|
 | 
						|
  @param  NumberOfPackages The number of HII packages to prepare.
 | 
						|
  @param  Guid Package GUID.
 | 
						|
 | 
						|
  @return The allocated and initialized packages.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_HII_PACKAGES *
 | 
						|
EFIAPI
 | 
						|
PreparePackages (
 | 
						|
  IN UINTN           NumberOfPackages,
 | 
						|
  IN CONST EFI_GUID  *Guid OPTIONAL,
 | 
						|
  ...
 | 
						|
  )
 | 
						|
{
 | 
						|
  VA_LIST           Args;
 | 
						|
 | 
						|
  VA_START (Args, Guid);
 | 
						|
 | 
						|
  return InternalPreparePackages (NumberOfPackages, Guid, Args);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function allocates pool for an EFI_HII_PACKAGE_LIST structure
 | 
						|
  with additional space that is big enough to host all packages described by the variable 
 | 
						|
  argument list of package pointers.  The allocated structure is initialized using NumberOfPackages, 
 | 
						|
  GuidId,  and the variable length argument list of package pointers.
 | 
						|
 | 
						|
  Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The
 | 
						|
  Handle to the newly registered Package List is returned throught HiiHandle.
 | 
						|
 | 
						|
  @param  NumberOfPackages  The number of HII packages to register.
 | 
						|
  @param  GuidId                    Package List GUID ID.
 | 
						|
  @param  HiiHandle                The ID used to retrieve the Package List later.
 | 
						|
  @param  ...                          The variable argument list describing all HII Package.
 | 
						|
 | 
						|
  @return
 | 
						|
  The allocated and initialized packages.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
HiiLibAddPackages (
 | 
						|
  IN       UINTN               NumberOfPackages,
 | 
						|
  IN CONST EFI_GUID            *GuidId,
 | 
						|
  IN       EFI_HANDLE          DriverHandle, OPTIONAL
 | 
						|
  OUT      EFI_HII_HANDLE      *HiiHandle, OPTIONAL
 | 
						|
  ...
 | 
						|
  )
 | 
						|
{
 | 
						|
  VA_LIST                   Args;
 | 
						|
  EFI_HII_PACKAGES          *FrameworkHiiPacages;
 | 
						|
  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;
 | 
						|
  EFI_STATUS                Status;
 | 
						|
 | 
						|
 | 
						|
  VA_START (Args, HiiHandle);
 | 
						|
  FrameworkHiiPacages = InternalPreparePackages (NumberOfPackages, GuidId, Args);
 | 
						|
 | 
						|
  Status      = mHii->NewPack (mHii, FrameworkHiiPacages, &FrameworkHiiHandle);
 | 
						|
  if (HiiHandle != NULL) {
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      *HiiHandle = NULL;
 | 
						|
    } else {
 | 
						|
      *HiiHandle = (EFI_HII_HANDLE) (UINTN) FrameworkHiiHandle;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  FreePool (FrameworkHiiPacages);
 | 
						|
  
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Removes a package list from the default HII database.
 | 
						|
 | 
						|
  If HiiHandle is NULL, then ASSERT.
 | 
						|
  If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT.
 | 
						|
 | 
						|
  @param  HiiHandle                The handle that was previously registered to the data base that is requested for removal.
 | 
						|
                                             List later.
 | 
						|
 | 
						|
  @return  VOID
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
HiiLibRemovePackages (
 | 
						|
  IN      EFI_HII_HANDLE      HiiHandle
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS Status;
 | 
						|
  
 | 
						|
  Status = mHii->RemovePack (mHii, (FRAMEWORK_EFI_HII_HANDLE) (UINTN) HiiHandle);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  This function adds the string into String Package of each language.
 | 
						|
 | 
						|
  @param  PackageList            Handle of the package list where this string will
 | 
						|
                                 be added.
 | 
						|
  @param  StringId               On return, contains the new strings id, which is
 | 
						|
                                 unique within PackageList.
 | 
						|
  @param  String                 Points to the new null-terminated string.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The new string was added successfully.
 | 
						|
  @retval EFI_NOT_FOUND          The specified PackageList could not be found in
 | 
						|
                                 database.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   Could not add the string due to lack of resources.
 | 
						|
  @retval EFI_INVALID_PARAMETER  String is NULL or StringId is NULL is NULL.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
HiiLibNewString (
 | 
						|
  IN  EFI_HII_HANDLE                  PackageList,
 | 
						|
  OUT EFI_STRING_ID                   *StringId,
 | 
						|
  IN  CONST EFI_STRING                String
 | 
						|
  )
 | 
						|
{
 | 
						|
  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;
 | 
						|
  EFI_STATUS                Status;
 | 
						|
 | 
						|
  FrameworkHiiHandle = (FRAMEWORK_EFI_HII_HANDLE) (UINTN) PackageList;
 | 
						|
  Status = mHii->NewString (
 | 
						|
            mHii,
 | 
						|
            NULL,
 | 
						|
            FrameworkHiiHandle,
 | 
						|
            StringId,
 | 
						|
            String
 | 
						|
          );
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Get the string given the StringId and String package Producer's Guid. The caller
 | 
						|
  is responsible to free the *String.
 | 
						|
 | 
						|
  If PackageList with the matching ProducerGuid is not found, then ASSERT.
 | 
						|
  If PackageList with the matching ProducerGuid is found but no String is
 | 
						|
  specified by StringId is found, then ASSERT.
 | 
						|
 | 
						|
  @param  ProducerGuid           The Guid of String package list.
 | 
						|
  @param  StringId               The String ID.
 | 
						|
  @param  String                 The output string.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            Operation is successful.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   There is not enought memory in the system.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
HiiLibGetStringFromToken (
 | 
						|
  IN  EFI_GUID                        *ProducerGuid,
 | 
						|
  IN  EFI_STRING_ID                   StringId,
 | 
						|
  OUT EFI_STRING                      *String
 | 
						|
  )
 | 
						|
{
 | 
						|
  return EFI_SUCCESS;  
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Get string specified by StringId form the HiiHandle. The caller
 | 
						|
  is responsible to free the *String.
 | 
						|
 | 
						|
  If String is NULL, then ASSERT.
 | 
						|
  If HiiHandle could not be found in the default HII database, then ASSERT.
 | 
						|
  If StringId is not found in PackageList, then ASSERT.
 | 
						|
 | 
						|
  @param  HiiHandle              The HII handle of package list.
 | 
						|
  @param  StringId               The String ID.
 | 
						|
  @param  String                 The output string.
 | 
						|
 | 
						|
  @retval EFI_NOT_FOUND          String is not found.
 | 
						|
  @retval EFI_SUCCESS            Operation is successful.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   There is not enought memory in the system.
 | 
						|
  @retval EFI_INVALID_PARAMETER  The String is NULL.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
HiiLibGetStringFromHandle (
 | 
						|
  IN  EFI_HII_HANDLE                  PackageList,
 | 
						|
  IN  EFI_STRING_ID                   StringId,
 | 
						|
  OUT EFI_STRING                      *String
 | 
						|
  )
 | 
						|
{
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Create the driver handle for HII driver. The protocol and 
 | 
						|
  Package list of this driver wili be installed into this 
 | 
						|
  driver handle. 
 | 
						|
  The implement set DriverHandle to NULL simpliy to let 
 | 
						|
  handle manager create a default new handle.
 | 
						|
  
 | 
						|
  @param[out] DriverHandle the pointer of driver handle
 | 
						|
  @return always successful.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
HiiLibCreateHiiDriverHandle (
 | 
						|
  OUT EFI_HANDLE               *DriverHandle
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Driver
 | 
						|
  // This implementation does nothing as DriverHandle concept only
 | 
						|
  // applies to UEFI HII specification.
 | 
						|
  //
 | 
						|
  
 | 
						|
  *DriverHandle = NULL;
 | 
						|
  
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 |