]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/IfrSupportLib/UefiIfrForm.c
Merged in the following trackers from EDK:
[mirror_edk2.git] / MdePkg / Library / IfrSupportLib / UefiIfrForm.c
index 10ca13c3d7d5c50e896781f9a4fbf3c1180fef3c..af43db0998428f819a04c96ae7ad066756bff729 100644 (file)
@@ -1,6 +1,6 @@
 /** @file
 
-Copyright (c) 2007, Intel Corporation
+Copyright (c) 2007- 2008, Intel Corporation
 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
@@ -27,53 +27,6 @@ Abstract:
 //
 UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";
 
-STATIC
-EFI_STATUS
-GetPackageDataFromPackageList (
-  IN  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,
-  IN  UINT32                      PackageIndex,
-  OUT UINT32                      *BufferLen,
-  OUT EFI_HII_PACKAGE_HEADER      **Buffer
-  )
-{
-  UINT32                        Index;
-  EFI_HII_PACKAGE_HEADER        *Package;
-  UINT32                        Offset;
-  UINT32                        PackageListLength;
-  EFI_HII_PACKAGE_HEADER        PackageHeader = {0, 0};
-
-  ASSERT(HiiPackageList != NULL);
-
-  if ((BufferLen == NULL) || (Buffer == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Package = NULL;
-  Index   = 0;
-  Offset  = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
-  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
-  while (Offset < PackageListLength) {
-    Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset);
-    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
-    if (Index == PackageIndex) {
-      break;
-    }
-    Offset += PackageHeader.Length;
-    Index++;
-  }
-  if (Offset >= PackageListLength) {
-    //
-    // no package found in this Package List
-    //
-    return EFI_NOT_FOUND;
-  }
-
-  *BufferLen = PackageHeader.Length;
-  *Buffer    = Package;
-  return EFI_SUCCESS;
-}
-
-
 /**
   Draw a dialog and return the selected key.
 
@@ -289,7 +242,7 @@ SwapBuffer (
   UINT8  Temp;
   UINTN  SwapCount;
 
-  SwapCount = (BufferSize - 1) / 2;
+  SwapCount = BufferSize / 2;
   for (Index = 0; Index < SwapCount; Index++) {
     Temp = Buffer[Index];
     Buffer[Index] = Buffer[BufferSize - 1 - Index];
@@ -297,9 +250,31 @@ SwapBuffer (
   }
 }
 
+/**
+  Converts the unicode character of the string from uppercase to lowercase.
+
+  @param Str     String to be converted
+
+  @retval VOID
+  
+**/
+VOID
+ToLower (
+  IN OUT CHAR16    *Str
+  )
+{
+  CHAR16      *Ptr;
+  
+  for (Ptr = Str; *Ptr != L'\0'; Ptr++) {
+    if (*Ptr >= L'A' && *Ptr <= L'Z') {
+      *Ptr = (CHAR16) (*Ptr - L'A' + L'a');
+    }
+  }
+}
+
 
 /**
-  Converts binary buffer to Unicode string in reversed byte order from R8_BufToHexString().
+  Converts binary buffer to Unicode string in reversed byte order from BufToHexString().
 
   @param  Str                    String for output
   @param  Buffer                 Binary buffer.
@@ -323,17 +298,21 @@ BufferToHexString (
   NewBuffer = AllocateCopyPool (BufferSize, Buffer);
   SwapBuffer (NewBuffer, BufferSize);
 
-  StrBufferLen = (BufferSize + 1) * sizeof (CHAR16);
-  Status = R8_BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize);
+  StrBufferLen = BufferSize * sizeof (CHAR16) + 1;
+  Status = BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize);
 
   gBS->FreePool (NewBuffer);
+  //
+  // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.
+  //
+  ToLower (Str);
 
   return Status;
 }
 
 
 /**
-  Converts Hex String to binary buffer in reversed byte order from R8_HexStringToBuf().
+  Converts Hex String to binary buffer in reversed byte order from HexStringToBuf().
 
   @param  Buffer                 Pointer to buffer that receives the data.
   @param  BufferSize             Length in bytes of the buffer to hold converted
@@ -358,7 +337,7 @@ HexStringToBuffer (
   UINTN       ConvertedStrLen;
 
   ConvertedStrLen = 0;
-  Status = R8_HexStringToBuf (Buffer, BufferSize, Str, &ConvertedStrLen);
+  Status = HexStringToBuf (Buffer, BufferSize, Str, &ConvertedStrLen);
   if (!EFI_ERROR (Status)) {
     SwapBuffer (Buffer, ConvertedStrLen);
   }
@@ -366,6 +345,123 @@ HexStringToBuffer (
   return Status;
 }
 
+/**
+  Convert binary representation Config string (e.g. "0041004200430044") to the
+  original string (e.g. "ABCD"). Config string appears in <ConfigHdr> (i.e.
+  "&NAME=<string>"), or Name/Value pair in <ConfigBody> (i.e. "label=<string>").
+
+  @param UnicodeString  Original Unicode string.
+  @param StrBufferLen   On input: Length in bytes of buffer to hold the Unicode string.
+                                    Includes tailing '\0' character.
+                                    On output:
+                                      If return EFI_SUCCESS, containing length of Unicode string buffer.
+                                      If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired.
+  @param ConfigString   Binary representation of Unicode String, <string> := (<HexCh>4)+
+
+  @retval EFI_SUCCESS          Routine success.
+  @retval EFI_BUFFER_TOO_SMALL The string buffer is too small.
+
+**/
+EFI_STATUS
+ConfigStringToUnicode (
+  IN OUT CHAR16                *UnicodeString,
+  IN OUT UINTN                 *StrBufferLen,
+  IN CHAR16                    *ConfigString
+  )
+{
+  UINTN       Index;
+  UINTN       Len;
+  UINTN       BufferSize;
+  CHAR16      BackupChar;
+
+  Len = StrLen (ConfigString) / 4;
+  BufferSize = (Len + 1) * sizeof (CHAR16);
+
+  if (*StrBufferLen < BufferSize) {
+    *StrBufferLen = BufferSize;
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  *StrBufferLen = BufferSize;
+
+  for (Index = 0; Index < Len; Index++) {
+    BackupChar = ConfigString[4];
+    ConfigString[4] = L'\0';
+
+    HexStringToBuf ((UINT8 *) UnicodeString, &BufferSize, ConfigString, NULL);
+
+    ConfigString[4] = BackupChar;
+
+    ConfigString += 4;
+    UnicodeString += 1;
+  }
+
+  //
+  // Add tailing '\0' character
+  //
+  *UnicodeString = L'\0';
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Convert Unicode string to binary representation Config string, e.g.
+  "ABCD" => "0041004200430044". Config string appears in <ConfigHdr> (i.e.
+  "&NAME=<string>"), or Name/Value pair in <ConfigBody> (i.e. "label=<string>").
+
+  @param ConfigString   Binary representation of Unicode String, <string> := (<HexCh>4)+
+  @param  StrBufferLen  On input: Length in bytes of buffer to hold the Unicode string.
+                                    Includes tailing '\0' character.
+                                    On output:
+                                      If return EFI_SUCCESS, containing length of Unicode string buffer.
+                                      If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired.
+  @param  UnicodeString  Original Unicode string.
+
+  @retval EFI_SUCCESS           Routine success.
+  @retval EFI_BUFFER_TOO_SMALL  The string buffer is too small.
+
+**/
+EFI_STATUS
+UnicodeToConfigString (
+  IN OUT CHAR16                *ConfigString,
+  IN OUT UINTN                 *StrBufferLen,
+  IN CHAR16                    *UnicodeString
+  )
+{
+  UINTN       Index;
+  UINTN       Len;
+  UINTN       BufferSize;
+  CHAR16      *String;
+
+  Len = StrLen (UnicodeString);
+  BufferSize = (Len * 4 + 1) * sizeof (CHAR16);
+
+  if (*StrBufferLen < BufferSize) {
+    *StrBufferLen = BufferSize;
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  *StrBufferLen = BufferSize;
+  String        = ConfigString;
+
+  for (Index = 0; Index < Len; Index++) {
+    BufToHexString (ConfigString, &BufferSize, (UINT8 *) UnicodeString, 2);
+
+    ConfigString += 4;
+    UnicodeString += 1;
+  }
+
+  //
+  // Add tailing '\0' character
+  //
+  *ConfigString = L'\0';
+
+  //
+  // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.
+  //
+  ToLower (String);  
+  return EFI_SUCCESS;
+}
 
 /**
   Construct <ConfigHdr> using routing information GUID/NAME/PATH.
@@ -430,10 +526,10 @@ ConstructConfigHdr (
   DevicePathSize = GetDevicePathSize (DevicePath);
 
   //
-  // GUID=<HexCh>32&NAME=<Alpha>NameStrLen&PATH=<HexChar>DevicePathStrLen <NULL>
-  // | 5  |   32   |  6  |   NameStrLen   |  6  |    DevicePathStrLen   |
+  // GUID=<HexCh>32&NAME=<Char>NameStrLen&PATH=<HexChar>DevicePathStrLen <NULL>
+  // | 5  |   32   |  6  |  NameStrLen*4 |  6  |    DevicePathStrLen    | 1 |
   //
-  BufferSize = (5 + 32 + 6 + NameStrLen + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16);
+  BufferSize = (5 + 32 + 6 + NameStrLen * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16);
   if (*StrBufferLen < BufferSize) {
     *StrBufferLen = BufferSize;
     return EFI_BUFFER_TOO_SMALL;
@@ -448,11 +544,15 @@ ConstructConfigHdr (
   BufferToHexString (StrPtr, (UINT8 *) Guid, sizeof (EFI_GUID));
   StrPtr += 32;
 
+  //
+  // Convert name string, e.g. name "ABCD" => "&NAME=0041004200430044"
+  //
   StrCpy (StrPtr, L"&NAME=");
   StrPtr += 6;
   if (Name != NULL) {
-    StrCpy (StrPtr, Name);
-    StrPtr += NameStrLen;
+    BufferSize = (NameStrLen * 4 + 1) * sizeof (CHAR16);
+    UnicodeToConfigString (StrPtr, &BufferSize, Name);
+    StrPtr += (NameStrLen * 4);
   }
 
   StrCpy (StrPtr, L"&PATH=");
@@ -494,7 +594,7 @@ FindBlockName (
 
     Data = 0;
     BufferSize = sizeof (UINTN);
-    Status = R8_HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);
+    Status = HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);
     if (EFI_ERROR (Status)) {
       return FALSE;
     }
@@ -511,7 +611,7 @@ FindBlockName (
 
     Data = 0;
     BufferSize = sizeof (UINTN);
-    Status = R8_HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);
+    Status = HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);
     if (EFI_ERROR (Status)) {
       return FALSE;
     }
@@ -708,7 +808,7 @@ SetBrowserData (
     //
     StringPtr = BlockName + 16;
     BufferLen = sizeof (BlockName) - (16 * sizeof (CHAR16));
-    R8_BufToHexString (StringPtr, &BufferLen, (UINT8 *) &BufferSize, sizeof (UINTN));
+    BufToHexString (StringPtr, &BufferLen, (UINT8 *) &BufferSize, sizeof (UINTN));
 
     Request = BlockName;
   } else {