/** @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
/**\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
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
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
{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
// 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
)\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
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
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
/**\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
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
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