1) Remove the hard-code length before building FRAMEWORK_EFI_IFR_DATA_ARRAY.
authorqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Mon, 1 Sep 2008 06:15:02 +0000 (06:15 +0000)
committerqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Mon, 1 Sep 2008 06:15:02 +0000 (06:15 +0000)
2) Support data type of EFI_IFR_TYPE_STRING when building FRAMEWORK_EFI_IFR_DATA_ARRAY.

git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@5760 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c

index b5f4bf4..b1f3651 100644 (file)
@@ -1,3 +1,4 @@
+\r
 /**@file\r
   This file contains functions related to Config Access Protocols installed by\r
   by HII Thunk Modules which is used to thunk UEFI Config Access Callback to \r
@@ -644,13 +645,47 @@ CreateIfrDataArray (
   BUFFER_STORAGE_ENTRY              *BufferStorageEntry;\r
   LIST_ENTRY                        *Link;\r
   EFI_STATUS                        Status;\r
+  UINTN                             Size;\r
+  UINTN                             StringSize;\r
+  EFI_STRING                        String;\r
+\r
+  String = NULL;\r
 \r
   Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
   if (IsNull (&ConfigAccess->BufferStorageListHead, Link)) {\r
     return NULL;\r
   }\r
-  \r
-  IfrDataArray = AllocateZeroPool (0x100);\r
+\r
+  switch (Type) {\r
+    case EFI_IFR_TYPE_NUM_SIZE_8:\r
+    case EFI_IFR_TYPE_NUM_SIZE_16:\r
+    case EFI_IFR_TYPE_NUM_SIZE_32:\r
+    case EFI_IFR_TYPE_NUM_SIZE_64:\r
+    case EFI_IFR_TYPE_BOOLEAN:\r
+      Size = sizeof (*Value);\r
+      break;\r
+\r
+    case EFI_IFR_TYPE_STRING:\r
+      StringSize = 0;\r
+      Status = HiiLibGetString (ConfigAccess->ThunkContext->UefiHiiHandle, Value->string, String, &StringSize);\r
+      ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+\r
+      String = AllocateZeroPool (StringSize);\r
+      ASSERT (String != NULL);\r
+\r
+      Status = HiiLibGetString (ConfigAccess->ThunkContext->UefiHiiHandle, Value->string, String, &StringSize);\r
+      ASSERT_EFI_ERROR (Status);\r
+\r
+      Size = StringSize;\r
+      break;\r
+      \r
+    default:\r
+      ASSERT (FALSE);\r
+      Size = 0;\r
+      break;\r
+  }\r
+\r
+  IfrDataArray = AllocateZeroPool (sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY) + sizeof (FRAMEWORK_EFI_IFR_DATA_ENTRY) + Size);\r
   ASSERT (IfrDataArray != NULL);\r
 \r
   BufferStorageEntry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
@@ -678,6 +713,11 @@ CreateIfrDataArray (
       CopyMem (&IfrDataEntry->Data, &(Value->u8), sizeof (*Value));\r
       break;\r
 \r
+    case EFI_IFR_TYPE_STRING:\r
+      ASSERT (String != NULL);\r
+      StrCpy ((CHAR16 *) &IfrDataEntry->Data, String);\r
+      FreePool (String);\r
+      break;\r
     default:\r
       ASSERT (FALSE);\r
       break;\r