]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg: Add Dynamic GUID registration into the current GUID<->String conversion...
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index 468365e400d4d40d007218bf81943b18f61451d9..3cdf5f8b131e1feaa31855461619efebb2b06ab5 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Provides interface to advanced shell functionality for parsing both handle and protocol database.\r
 \r
-  Copyright (c) 2013 Hewlett-Packard Development Company, L.P.\r
+  Copyright (c) 2013 - 2014, Hewlett-Packard Development Company, L.P.\r
   Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
 #include "UefiHandleParsingLib.h"\r
 #include "IndustryStandard/Acpi10.h"\r
 \r
-EFI_HANDLE mHandleParsingHiiHandle;\r
+EFI_HANDLE        mHandleParsingHiiHandle;\r
 HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
-\r
+GUID_INFO_BLOCK   *GuidList;\r
+UINTN             GuidListCount;\r
 /**\r
   Function to translate the EFI_MEMORY_TYPE into a string.\r
 \r
@@ -59,7 +60,7 @@ ConvertMemoryType (
 /**\r
   Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.\r
 \r
-  @param[in] Memory     The format type.\r
+  @param[in] Fmt     The format type.\r
 \r
   @retval               A string representation of the type allocated from BS Pool.\r
 **/\r
@@ -98,6 +99,9 @@ HandleParsingLibConstructor (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
+  GuidListCount = 0;\r
+  GuidList      = NULL;\r
+\r
   mHandleParsingHiiHandle = HiiAddPackages (&gHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);\r
   if (mHandleParsingHiiHandle == NULL) {\r
     return (EFI_DEVICE_ERROR);\r
@@ -121,6 +125,13 @@ HandleParsingLibDestructor (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
+  UINTN                 LoopCount;\r
+\r
+  for (LoopCount = 0; GuidList != NULL && LoopCount < GuidListCount; LoopCount++) {\r
+    SHELL_FREE_NON_NULL(GuidList[LoopCount].GuidId);\r
+  }\r
+\r
+  SHELL_FREE_NON_NULL(GuidList);\r
   if (mHandleParsingHiiHandle != NULL) {\r
     HiiRemovePackages(mHandleParsingHiiHandle);\r
   }\r
@@ -651,8 +662,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_IPV4_SB),               &gEfiIp4ServiceBindingProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_IPV4),                  &gEfiIp4ProtocolGuid,                             NULL},\r
   {STRING_TOKEN(STR_IPV4_CFG),              &gEfiIp4ConfigProtocolGuid,                       NULL},\r
-  {STRING_TOKEN(STR_SHELL_PARAMETERS),      &gEfiShellParametersProtocolGuid,                 NULL},\r
-  {STRING_TOKEN(STR_SHELL),                 &gEfiShellProtocolGuid,                           NULL},\r
   {STRING_TOKEN(STR_UDPV4_SB),              &gEfiUdp4ServiceBindingProtocolGuid,              NULL},\r
   {STRING_TOKEN(STR_UDPV4),                 &gEfiUdp4ProtocolGuid,                            NULL},\r
   {STRING_TOKEN(STR_MTFTPV4_SB),            &gEfiMtftp4ServiceBindingProtocolGuid,            NULL},\r
@@ -742,12 +751,24 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
 // UEFI 2.4\r
 //\r
   {STRING_TOKEN(STR_DISK_IO2),              &gEfiDiskIo2ProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_ADAPTER_INFO),          &gEfiAdapterInformationProtocolGuid,              NULL},\r
 \r
 //\r
 // PI Spec ones\r
 //\r
   {STRING_TOKEN(STR_IDE_CONT_INIT),         &gEfiIdeControllerInitProtocolGuid,               NULL},\r
 \r
+//\r
+// UEFI Shell Spec 2.0\r
+//\r
+  {STRING_TOKEN(STR_SHELL_PARAMETERS),      &gEfiShellParametersProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_SHELL),                 &gEfiShellProtocolGuid,                           NULL},\r
+\r
+//\r
+// UEFI Shell Spec 2.1\r
+//\r
+  {STRING_TOKEN(STR_SHELL_DYNAMIC),         &gEfiShellDynamicCommandProtocolGuid,             NULL},\r
+\r
 //\r
 // terminator\r
 //\r
@@ -770,9 +791,16 @@ InternalShellGetNodeFromGuid(
   )\r
 {\r
   CONST GUID_INFO_BLOCK *ListWalker;\r
+  UINTN                 LoopCount;\r
 \r
   ASSERT(Guid != NULL);\r
 \r
+  for (LoopCount = 0, ListWalker = GuidList; GuidList != NULL && LoopCount < GuidListCount; LoopCount++, ListWalker++) {\r
+    if (CompareGuid(ListWalker->GuidId, Guid)) {\r
+      return (ListWalker);\r
+    }\r
+  }\r
+\r
   if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
     for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
       if (CompareGuid(ListWalker->GuidId, Guid)) {\r
@@ -785,7 +813,90 @@ InternalShellGetNodeFromGuid(
       return (ListWalker);\r
     }\r
   }\r
-  return (ListWalker);\r
+  return (NULL);\r
+}\r
+\r
+/**\r
+Function to add a new GUID/Name mapping.\r
+\r
+@param[in] Guid       The Guid\r
+@param[in] NameId     The STRING id of the HII string to use\r
+@param[in] Dump       The pointer to the dump function\r
+\r
+\r
+@retval EFI_SUCCESS           The operation was sucessful\r
+@retval EFI_OUT_OF_RESOURCES  A memory allocation failed\r
+@retval EFI_INVALID_PARAMETER Guid NameId was invalid\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+InsertNewGuidNameMapping(\r
+  IN CONST EFI_GUID           *Guid,\r
+  IN CONST EFI_STRING_ID      NameID,\r
+  IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL\r
+  )\r
+{\r
+  ASSERT(Guid   != NULL);\r
+  ASSERT(NameID != 0);\r
+\r
+  GuidList = ReallocatePool(GuidListCount * sizeof(GUID_INFO_BLOCK), GuidListCount+1 * sizeof(GUID_INFO_BLOCK), GuidList);\r
+  if (GuidList == NULL) {\r
+    GuidListCount = 0;\r
+    return (EFI_OUT_OF_RESOURCES);\r
+  }\r
+  GuidListCount++;\r
+\r
+  GuidList[GuidListCount - 1].GuidId   = AllocateCopyPool(sizeof(EFI_GUID), Guid);\r
+  GuidList[GuidListCount - 1].StringId = NameID;\r
+  GuidList[GuidListCount - 1].DumpInfo = DumpFunc;\r
+\r
+  if (GuidList[GuidListCount - 1].GuidId == NULL) {\r
+    return (EFI_OUT_OF_RESOURCES);\r
+  }\r
+\r
+  return (EFI_SUCCESS);\r
+}\r
+\r
+/**\r
+  Function to add a new GUID/Name mapping.\r
+\r
+  This cannot overwrite an existing mapping.\r
+\r
+  @param[in] Guid       The Guid\r
+  @param[in] TheName    The Guid's name\r
+  @param[in] Lang       RFC4646 language code list or NULL\r
+\r
+  @retval EFI_SUCCESS           The operation was sucessful\r
+  @retval EFI_ACCESS_DENIED     There was a duplicate\r
+  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed\r
+  @retval EFI_INVALID_PARAMETER Guid or TheName was NULL\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+AddNewGuidNameMapping(\r
+  IN CONST EFI_GUID *Guid,\r
+  IN CONST CHAR16   *TheName,\r
+  IN CONST CHAR8    *Lang OPTIONAL\r
+  )\r
+{\r
+  CONST GUID_INFO_BLOCK *Temp;\r
+  EFI_STRING_ID         NameID;\r
+\r
+  if (Guid == NULL || TheName == NULL){\r
+    return (EFI_INVALID_PARAMETER);\r
+  }\r
+\r
+  if ((Temp = InternalShellGetNodeFromGuid(Guid)) != NULL) {\r
+    return (EFI_ACCESS_DENIED);\r
+  }\r
+\r
+  NameID = HiiSetString(mHandleParsingHiiHandle, 0, (CHAR16*)TheName, Lang);\r
+  if (NameID == 0) {\r
+    return (EFI_OUT_OF_RESOURCES);\r
+  }\r
+\r
+  return (InsertNewGuidNameMapping(Guid, NameID, NULL));\r
 }\r
 \r
 /**\r
@@ -809,7 +920,7 @@ GetStringNameFromGuid(
   CONST GUID_INFO_BLOCK *Id;\r
 \r
   Id = InternalShellGetNodeFromGuid(Guid);\r
-  return (HiiGetString(mHandleParsingHiiHandle, Id->StringId, Lang));\r
+  return (HiiGetString(mHandleParsingHiiHandle, Id==NULL?STRING_TOKEN(STR_UNKNOWN_DEVICE):Id->StringId, Lang));\r
 }\r
 \r
 /**\r
@@ -855,9 +966,11 @@ GetProtocolInformationDump(
 /**\r
   Function to get the Guid for a protocol or struct based on it's string name.\r
 \r
+  do not modify the returned Guid.\r
+\r
   @param[in] Name           The pointer to the string name.\r
   @param[in] Lang           The pointer to the language code.\r
-  @param[in] Guid           The pointer to the Guid.\r
+  @param[out] Guid          The pointer to the Guid.\r
 \r
   @retval EFI_SUCCESS       The operation was sucessful.\r
 **/\r
@@ -866,11 +979,12 @@ EFIAPI
 GetGuidFromStringName(\r
   IN CONST CHAR16 *Name,\r
   IN CONST CHAR8  *Lang OPTIONAL,\r
-  IN EFI_GUID     **Guid\r
+  OUT EFI_GUID    **Guid\r
   )\r
 {\r
   CONST GUID_INFO_BLOCK  *ListWalker;\r
   CHAR16                     *String;\r
+  UINTN                  LoopCount;\r
 \r
   ASSERT(Guid != NULL);\r
   if (Guid == NULL) {\r
@@ -900,6 +1014,18 @@ GetGuidFromStringName(
       return (EFI_SUCCESS);\r
     }\r
   }\r
+\r
+  for (LoopCount = 0, ListWalker = GuidList; GuidList != NULL && LoopCount < GuidListCount; LoopCount++, ListWalker++) {\r
+    String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
+    if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
+      *Guid = ListWalker->GuidId;\r
+    }\r
+    SHELL_FREE_NON_NULL(String);\r
+    if (*Guid != NULL) {\r
+      return (EFI_SUCCESS);\r
+    }\r
+  }\r
+\r
   return (EFI_NOT_FOUND);\r
 }\r
 \r