]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Add BufToHexString, HexStringToBuf and IsHexDigit to BaseLib.
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 23 May 2008 05:25:44 +0000 (05:25 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 23 May 2008 05:25:44 +0000 (05:25 +0000)
2) Remove the duplicated functions implementation  from the modules that reference these APIs

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5282 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/Library/BaseLib.h
MdePkg/Include/Library/IfrSupportLib.h
MdePkg/Library/BaseLib/String.c
MdePkg/Library/IfrSupportLib/IfrSupportLib.inf
MdePkg/Library/IfrSupportLib/UefiIfrForm.c
MdePkg/Library/IfrSupportLib/UefiIfrLibraryInternal.h

index cf337b71900beeea5d2b4ab27126c9a5d04e4196..0733da131b80d30caecd7be2e0120a505371e6c7 100644 (file)
@@ -604,6 +604,134 @@ StrHexToUint64 (
   IN      CONST CHAR16               *String
   );
 
+/**
+  Convert a nibble in the low 4 bits of a byte to a Unicode hexadecimal character.
+
+  This function converts a nibble in the low 4 bits of a byte to a Unicode hexadecimal 
+  character  For example, the nibble  0x01 and 0x0A will converted to L'1' and L'A' 
+  respectively.
+
+  The upper nibble in the input byte will be masked off.
+
+  @param Nibble     The nibble which is in the low 4 bits of the input byte.
+
+  @retval  CHAR16   The Unicode hexadecimal character.
+  
+**/
+CHAR16
+EFIAPI
+NibbleToHexChar (
+  IN UINT8      Nibble
+  )
+;
+
+/** 
+  Convert binary buffer to a Unicode String in a specified sequence. 
+
+  This function converts bytes in the binary Buffer Buf to a Unicode String Str. 
+  Each byte will be represented by two Unicode characters. For example, byte 0xA1 will 
+  be converted into two Unicode character L'A' and L'1'. In the output String, the Unicode Character 
+  for the Most Significant Nibble will be put before the Unicode Character for the Least Significant
+  Nibble. The output string for the buffer containing a single byte 0xA1 will be L"A1". 
+  For a buffer with multiple bytes, the Unicode character produced by the first byte will be put into the 
+  the last character in the output string. The one next to first byte will be put into the
+  character before the last character. This rules applies to the rest of the bytes. The Unicode
+  character by the last byte will be put into the first character in the output string. For example,
+  the input buffer for a 64-bits unsigned integrer 0x12345678abcdef1234 will be converted to
+  a Unicode string equal to L"12345678abcdef1234".
+
+  @param String                        On input, String is pointed to the buffer allocated for the convertion.
+  @param StringLen                     The Length of String buffer to hold the output String. The length must include the tailing '\0' character.
+                                       The StringLen required to convert a N bytes Buffer will be a least equal to or greater 
+                                       than 2*N + 1.
+  @param Buffer                        The pointer to a input buffer.
+  @param BufferSizeInBytes             Lenth in bytes of the input buffer.
+  
+
+  @retval  EFI_SUCCESS                 The convertion is successfull. All bytes in Buffer has been convert to the corresponding
+                                       Unicode character and placed into the right place in String.
+  @retval  EFI_BUFFER_TOO_SMALL        StringSizeInBytes is smaller than 2 * N + 1the number of bytes required to
+                                       complete the convertion. 
+**/
+RETURN_STATUS
+EFIAPI
+BufToHexString (
+  IN OUT       CHAR16               *String,
+  IN OUT       UINTN                *StringLen,
+  IN     CONST UINT8                *Buffer,
+  IN           UINTN                BufferSizeInBytes
+  )
+;
+
+
+/**
+  Convert a Unicode string consisting of hexadecimal characters to a output byte buffer.
+
+  This function converts a Unicode string consisting of characters in the range of Hexadecimal
+  character (L'0' to L'9', L'A' to L'F' and L'a' to L'f') to a output byte buffer. The function will stop
+  at the first non-hexadecimal character or the NULL character. The convertion process can be
+  simply viewed as the reverse operations defined by BufToHexString. Two Unicode characters will be 
+  converted into one byte. The first Unicode character represents the Most Significant Nibble and the
+  second Unicode character represents the Least Significant Nibble in the output byte. 
+  The first pair of Unicode characters represents the last byte in the output buffer. The second pair of Unicode 
+  characters represent the  the byte preceding the last byte. This rule applies to the rest pairs of bytes. 
+  The last pair represent the first byte in the output buffer. 
+
+  For example, a Unciode String L"12345678" will be converted into a buffer wil the following bytes 
+  (first byte is the byte in the lowest memory address): "0x78, 0x56, 0x34, 0x12".
+
+  If String has N valid hexadecimal characters for conversion,  the caller must make sure Buffer is at least 
+  N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. 
+
+  @param Buffer                      The output buffer allocated by the caller.
+  @param BufferSizeInBytes           On input, the size in bytes of Buffer. On output, it is updated to 
+                                     contain the size of the Buffer which is actually used for the converstion.
+                                     For Unicode string with 2*N hexadecimal characters (not including the 
+                                     tailing NULL character), N bytes of Buffer will be used for the output.
+  @param String                      The input hexadecimal string.
+  @param ConvertedStrLen             The number of hexadecimal characters used to produce content in output
+                                     buffer Buffer.
+
+  @retval  RETURN_BUFFER_TOO_SMALL   The input BufferSizeInBytes is too small to hold the output. BufferSizeInBytes
+                                     will be updated to the size required for the converstion.
+  @retval  RETURN_SUCCESS            The convertion is successful or the first Unicode character from String
+                                     is hexadecimal. If ConvertedStrLen is not NULL, it is updated
+                                     to the number of hexadecimal character used for the converstion.
+**/
+RETURN_STATUS
+EFIAPI
+HexStringToBuf (
+  OUT          UINT8                    *Buffer,   
+  IN OUT       UINTN                    *BufferSizeInBytes,
+  IN     CONST CHAR16                   *String,
+  OUT          UINTN                    *ConvertedStrLen  OPTIONAL
+  )
+;
+
+
+/**
+  Test if  a Unicode character is a hexadecimal digit. If true, the input
+  Unicode character is converted to a byte. 
+
+  This function tests if a Unicode character is a hexadecimal digit. If true, the input
+  Unicode character is converted to a byte. For example, Unicode character
+  L'A' will be converted to 0x0A. 
+
+  If Digit is NULL, then ASSERT.
+
+  @retval TRUE        Char is in the range of Hexadecimal number. Digit is updated
+                      to the byte value of the number.
+  @retval FALSE       Char is not in the range of Hexadecimal number. Digit is keep
+                      intact.
+  
+**/
+BOOLEAN
+EFIAPI
+IsHexDigit (
+  OUT UINT8      *Digit,
+  IN  CHAR16      Char
+  )
+;
 
 /**
   Convert one Null-terminated Unicode string to a Null-terminated
@@ -7108,3 +7236,4 @@ AsmPrepareAndThunk16 (
 
 #endif
 
+
index e3885e1db32d6e9f1393f79800b2bc5a2b660ab5..b8d3183e878ef51deadfcec5bf818e7c5334dc4f 100644 (file)
@@ -1,5 +1,5 @@
 /** @file
-  The file contain all library functions and definitions for IFR opcode creation and \r
+  The file contain all library functions and definitions for IFR opcode creation and 
   related Form Browser utility Operations.
 
   Copyright (c) 2007, Intel Corporation
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
-**/\r
-\r
-#ifndef _IFR_SUPPORT_LIBRARY_H\r
-#define _IFR_SUPPORT_LIBRARY_H\r
-\r
-\r
-#include <Protocol/HiiFont.h>\r
-#include <Protocol/HiiImage.h>\r
-#include <Protocol/HiiString.h>\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiConfigRouting.h>\r
-#include <Protocol/HiiConfigAccess.h>\r
-#include <Protocol/FormBrowser2.h>\r
-#include <Protocol/SimpleTextOut.h>\r
-\r
-#include <Guid/GlobalVariable.h>\r
-\r
-//\r
-// The architectural variable "Lang" and "LangCodes" are deprecated in UEFI\r
-// specification. While, UEFI specification also states that these deprecated\r
-// variables may be provided for backwards compatibility.\r
-// If "LANG_SUPPORT" is defined, "Lang" and "LangCodes" will be produced;\r
-// If "LANG_SUPPORT" is undefined, "Lang" and "LangCodes" will not be produced.\r
-//\r
-#define LANG_SUPPORT\r
-\r
-#define EFI_LANGUAGE_VARIABLE           L"Lang"\r
-#define EFI_LANGUAGE_CODES_VARIABLE     L"LangCodes"\r
-\r
-#define UEFI_LANGUAGE_VARIABLE          L"PlatformLang"\r
-#define UEFI_LANGUAGE_CODES_VARIABLE    L"PlatformLangCodes"\r
-\r
-//\r
-// Limited buffer size recommended by RFC4646 (4.3.  Length Considerations)\r
-// (42 characters plus a NULL terminator)\r
-//\r
-#define RFC_3066_ENTRY_SIZE             (42 + 1)\r
-#define ISO_639_2_ENTRY_SIZE            3\r
-\r
-#define INVALID_VARSTORE_ID             0\r
-\r
-#define QUESTION_FLAGS              (EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY)\r
-#define QUESTION_FLAGS_MASK         (~QUESTION_FLAGS)\r
-\r
-extern EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase;\r
-extern EFI_HII_STRING_PROTOCOL   *gIfrLibHiiString;\r
-\r
-#pragma pack(1)\r
-typedef struct {\r
-  EFI_STRING_ID       StringToken;\r
-  EFI_IFR_TYPE_VALUE  Value;\r
-  UINT8               Flags;\r
-} IFR_OPTION;\r
-#pragma pack()\r
-\r
-typedef struct {\r
-  //\r
-  // Buffer size allocated for Data.\r
-  //\r
-  UINT32                BufferSize;\r
-\r
-  //\r
-  // Offset in Data to append the newly created opcode binary.\r
-  // It will be adjusted automatically in Create***OpCode(), and should be\r
-  // initialized to 0 before invocation of a serial of Create***OpCode()\r
-  //\r
-  UINT32                Offset;\r
-\r
-  //\r
-  // The destination buffer for created op-codes\r
-  //\r
-  UINT8                 *Data;\r
-} EFI_HII_UPDATE_DATA;\r
-\r
-\r
-/**\r
-  Create EFI_IFR_END_OP opcode.\r
-\r
-  If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateEndOpCode (\r
-  IN OUT EFI_HII_UPDATE_DATA *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_DEFAULT_OP opcode.\r
-\r
-  @param  Value                  Value for the default\r
-  @param  Type                   Type for the default\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER The type is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateDefaultOpCode (\r
-  IN     EFI_IFR_TYPE_VALUE  *Value,\r
-  IN     UINT8               Type,\r
-  IN OUT EFI_HII_UPDATE_DATA *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_ACTION_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  QuestionConfig         String ID for configuration\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateActionOpCode (\r
-  IN     EFI_QUESTION_ID      QuestionId,\r
-  IN     EFI_STRING_ID        Prompt,\r
-  IN     EFI_STRING_ID        Help,\r
-  IN     UINT8                QuestionFlags,\r
-  IN     EFI_STRING_ID        QuestionConfig,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_SUBTITLE_OP opcode.\r
-\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  Flags                  Subtitle opcode flags\r
-  @param  Scope                  Subtitle Scope bit\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  \r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateSubTitleOpCode (\r
-  IN      EFI_STRING_ID       Prompt,\r
-  IN      EFI_STRING_ID       Help,\r
-  IN      UINT8               Flags,\r
-  IN      UINT8               Scope,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_TEXT_OP opcode.\r
-\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  TextTwo                String ID for text two\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateTextOpCode (\r
-  IN      EFI_STRING_ID       Prompt,\r
-  IN      EFI_STRING_ID       Help,\r
-  IN      EFI_STRING_ID       TextTwo,\r
-  IN OUT  EFI_HII_UPDATE_DATA *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_REF_OP opcode.\r
-\r
-  @param  FormId                 Destination Form ID\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  QuestionId             Question ID\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateGotoOpCode (\r
-  IN      EFI_FORM_ID         FormId,\r
-  IN      EFI_STRING_ID       Prompt,\r
-  IN      EFI_STRING_ID       Help,\r
-  IN      UINT8               QuestionFlags,\r
-  IN      EFI_QUESTION_ID     QuestionId,\r
-  IN OUT  EFI_HII_UPDATE_DATA *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_ONE_OF_OPTION_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  OptionList             The list of Options.\r
-  @param  Type                   The data type.\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateOneOfOptionOpCode (\r
-  IN     UINTN                OptionCount,\r
-  IN     IFR_OPTION           *OptionsList,\r
-  IN     UINT8                Type,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_ONE_OF_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  VarStoreId             Storage ID\r
-  @param  VarOffset              Offset in Storage\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  OneOfFlags             Flags for oneof opcode\r
-  @param  OptionsList            List of options\r
-  @param  OptionCount            Number of options in option list\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateOneOfOpCode (\r
-  IN     EFI_QUESTION_ID      QuestionId,\r
-  IN     EFI_VARSTORE_ID      VarStoreId,\r
-  IN     UINT16               VarOffset,\r
-  IN     EFI_STRING_ID        Prompt,\r
-  IN     EFI_STRING_ID        Help,\r
-  IN     UINT8                QuestionFlags,\r
-  IN     UINT8                OneOfFlags,\r
-  IN     IFR_OPTION           *OptionsList,\r
-  IN     UINTN                OptionCount,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_ORDERED_LIST_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  VarStoreId             Storage ID\r
-  @param  VarOffset              Offset in Storage\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  Flags                  Flags for ordered list opcode\r
-  @param  DataType               Type for option value\r
-  @param  MaxContainers          Maximum count for options in this ordered list\r
-  @param  OptionsList            List of options\r
-  @param  OptionCount            Number of options in option list\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateOrderedListOpCode (\r
-  IN      EFI_QUESTION_ID     QuestionId,\r
-  IN      EFI_VARSTORE_ID     VarStoreId,\r
-  IN      UINT16              VarOffset,\r
-  IN      EFI_STRING_ID       Prompt,\r
-  IN      EFI_STRING_ID       Help,\r
-  IN      UINT8               QuestionFlags,\r
-  IN      UINT8               Flags,\r
-  IN      UINT8               DataType,\r
-  IN      UINT8               MaxContainers,\r
-  IN      IFR_OPTION          *OptionsList,\r
-  IN     UINTN                OptionCount,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_CHECKBOX_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  VarStoreId             Storage ID\r
-  @param  VarOffset              Offset in Storage\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  CheckBoxFlags          Flags for checkbox opcode\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateCheckBoxOpCode (\r
-  IN      EFI_QUESTION_ID     QuestionId,\r
-  IN      EFI_VARSTORE_ID     VarStoreId,\r
-  IN      UINT16              VarOffset,\r
-  IN      EFI_STRING_ID       Prompt,\r
-  IN      EFI_STRING_ID       Help,\r
-  IN      UINT8               QuestionFlags,\r
-  IN      UINT8               CheckBoxFlags,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_NUMERIC_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  VarStoreId             Storage ID\r
-  @param  VarOffset              Offset in Storage\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  NumericFlags           Flags for numeric opcode\r
-  @param  Minimum                Numeric minimum value\r
-  @param  Maximum                Numeric maximum value\r
-  @param  Step                   Numeric step for edit\r
-  @param  Default                Numeric default value\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateNumericOpCode (\r
-  IN     EFI_QUESTION_ID     QuestionId,\r
-  IN     EFI_VARSTORE_ID     VarStoreId,\r
-  IN     UINT16              VarOffset,\r
-  IN     EFI_STRING_ID       Prompt,\r
-  IN     EFI_STRING_ID       Help,\r
-  IN     UINT8               QuestionFlags,\r
-  IN     UINT8               NumericFlags,\r
-  IN     UINT64              Minimum,\r
-  IN     UINT64              Maximum,\r
-  IN     UINT64              Step,\r
-  IN     UINT64              Default,\r
-  IN OUT EFI_HII_UPDATE_DATA *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Create EFI_IFR_STRING_OP opcode.\r
-\r
-  @param  QuestionId             Question ID\r
-  @param  VarStoreId             Storage ID\r
-  @param  VarOffset              Offset in Storage\r
-  @param  Prompt                 String ID for Prompt\r
-  @param  Help                   String ID for Help\r
-  @param  QuestionFlags          Flags in Question Header\r
-  @param  StringFlags            Flags for string opcode\r
-  @param  MinSize                String minimum length\r
-  @param  MaxSize                String maximum length\r
-  @param  Data                   Destination for the created opcode binary\r
-\r
-  @retval EFI_SUCCESS            Opcode create success\r
-  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateStringOpCode (\r
-  IN      EFI_QUESTION_ID     QuestionId,\r
-  IN      EFI_VARSTORE_ID     VarStoreId,\r
-  IN      UINT16              VarOffset,\r
-  IN      EFI_STRING_ID       Prompt,\r
-  IN      EFI_STRING_ID       Help,\r
-  IN      UINT8               QuestionFlags,\r
-  IN      UINT8               StringFlags,\r
-  IN      UINT8               MinSize,\r
-  IN      UINT8               MaxSize,\r
-  IN OUT EFI_HII_UPDATE_DATA  *Data\r
-  )\r
-;\r
-\r
-/**\r
-  Converts binary buffer to Unicode string in reversed byte order to BufToHexString().\r
-\r
-  @param  Str                    String for output\r
-  @param  Buffer                 Binary buffer.\r
-  @param  BufferSize             Size of the buffer in bytes.\r
-\r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BufferToHexString (\r
-  IN OUT CHAR16    *Str,\r
-  IN UINT8         *Buffer,\r
-  IN UINTN         BufferSize\r
-  )\r
-;\r
-\r
-/**\r
-  Converts Hex String to binary buffer in reversed byte order to HexStringToBuf().\r
-\r
-  @param  Buffer                 Pointer to buffer that receives the data.\r
-  @param  BufferSize             Length in bytes of the buffer to hold converted\r
-                                 data. If routine return with EFI_SUCCESS,\r
-                                 containing length of converted data. If routine\r
-                                 return with EFI_BUFFER_TOO_SMALL, containg length\r
-                                 of buffer desired.\r
-  @param  Str                    String to be converted from.\r
-\r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HexStringToBuffer (\r
-  IN OUT UINT8         *Buffer,\r
-  IN OUT UINTN         *BufferSize,\r
-  IN CHAR16            *Str\r
-  )\r
-;\r
-\r
-/**\r
-  Construct <ConfigHdr> using routing information GUID/NAME/PATH.\r
-\r
-  @param  ConfigHdr              Pointer to the ConfigHdr string.\r
-  @param  StrBufferLen           On input: Length in bytes of buffer to hold the\r
-                                 ConfigHdr string. Includes tailing '\0' character.\r
-                                 On output: If return EFI_SUCCESS, containing\r
-                                 length of ConfigHdr string buffer. If return\r
-                                 EFI_BUFFER_TOO_SMALL, containg length of string\r
-                                 buffer desired.\r
-  @param  Guid                   Routing information: GUID.\r
-  @param  Name                   Routing information: NAME.\r
-  @param  DriverHandle           Driver handle which contains the routing\r
-                                 information: PATH.\r
-\r
-  @retval EFI_SUCCESS            Routine success.\r
-  @retval EFI_BUFFER_TOO_SMALL   The ConfigHdr string buffer is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConstructConfigHdr (\r
-  IN OUT CHAR16                *ConfigHdr,\r
-  IN OUT UINTN                 *StrBufferLen,\r
-  IN EFI_GUID                  *Guid,\r
-  IN CHAR16                    *Name, OPTIONAL\r
-  IN EFI_HANDLE                *DriverHandle\r
-  )\r
-\r
-;\r
-\r
-/**\r
-  Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string.\r
-\r
-  @param  String                 The string to be searched in.\r
-  @param  Offset                 Offset in BlockName.\r
-  @param  Width                  Width in BlockName.\r
-\r
-  @retval TRUE                   Block name found.\r
-  @retval FALSE                  Block name not found.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-FindBlockName (\r
-  IN OUT CHAR16                *String,\r
-  UINTN                        Offset,\r
-  UINTN                        Width\r
-  )\r
-;\r
-\r
-/**\r
-  This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser.\r
-\r
-  @param  VariableGuid           An optional field to indicate the target variable\r
-                                 GUID name to use.\r
-  @param  VariableName           An optional field to indicate the target\r
-                                 human-readable variable name.\r
-  @param  BufferSize             On input: Length in bytes of buffer to hold\r
-                                 retrived data. On output: If return\r
-                                 EFI_BUFFER_TOO_SMALL, containg length of buffer\r
-                                 desired.\r
-  @param  Buffer                 Buffer to hold retrived data.\r
-\r
-  @retval EFI_SUCCESS            Routine success.\r
-  @retval EFI_BUFFER_TOO_SMALL   The intput buffer is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-GetBrowserData (\r
-  EFI_GUID                   *VariableGuid, OPTIONAL\r
-  CHAR16                     *VariableName, OPTIONAL\r
-  UINTN                      *BufferSize,\r
-  UINT8                      *Buffer\r
-  )\r
-;\r
-\r
-/**\r
-  This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser.\r
-\r
-  @param  VariableGuid           An optional field to indicate the target variable\r
-                                 GUID name to use.\r
-  @param  VariableName           An optional field to indicate the target\r
-                                 human-readable variable name.\r
-  @param  BufferSize             Length in bytes of buffer to hold retrived data.\r
-  @param  Buffer                 Buffer to hold retrived data.\r
-  @param  RequestElement         An optional field to specify which part of the\r
-                                 buffer data will be send back to Browser. If NULL,\r
-                                 the whole buffer of data will be committed to\r
-                                 Browser. <RequestElement> ::=\r
-                                 &OFFSET=<Number>&WIDTH=<Number>*\r
-\r
-  @retval EFI_SUCCESS            Routine success.\r
-  @retval Other                  Updating Browser uncommitted data failed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-SetBrowserData (\r
-  EFI_GUID                   *VariableGuid, OPTIONAL\r
-  CHAR16                     *VariableName, OPTIONAL\r
-  UINTN                      BufferSize,\r
-  UINT8                      *Buffer,\r
-  CHAR16                     *RequestElement  OPTIONAL\r
-  )\r
-;\r
-\r
-/**\r
-  Draw a dialog and return the selected key.\r
-\r
-  @param  NumberOfLines          The number of lines for the dialog box\r
-  @param  KeyValue               The EFI_KEY value returned if HotKey is TRUE..\r
-  @param  String                 Pointer to the first string in the list\r
-  @param  ...                    A series of (quantity == NumberOfLines) text\r
-                                 strings which will be used to construct the dialog\r
-                                 box\r
-\r
-  @retval EFI_SUCCESS            Displayed dialog and received user interaction\r
-  @retval EFI_INVALID_PARAMETER  One of the parameters was invalid.\r
-\r
-**/\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-IfrLibCreatePopUp (\r
-  IN  UINTN                       NumberOfLines,\r
-  OUT EFI_INPUT_KEY               *KeyValue,\r
-  IN  CHAR16                      *String,\r
-  ...\r
-  )\r
-;\r
-\r
-#endif\r
+**/
+
+#ifndef _IFR_SUPPORT_LIBRARY_H
+#define _IFR_SUPPORT_LIBRARY_H
+
+
+#include <Protocol/HiiFont.h>
+#include <Protocol/HiiImage.h>
+#include <Protocol/HiiString.h>
+#include <Protocol/HiiDatabase.h>
+#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/HiiConfigAccess.h>
+#include <Protocol/FormBrowser2.h>
+#include <Protocol/SimpleTextOut.h>
+
+#include <Guid/GlobalVariable.h>
+
+//
+// The architectural variable "Lang" and "LangCodes" are deprecated in UEFI
+// specification. While, UEFI specification also states that these deprecated
+// variables may be provided for backwards compatibility.
+
+#define EFI_LANGUAGE_VARIABLE           L"Lang"
+#define EFI_LANGUAGE_CODES_VARIABLE     L"LangCodes"
+
+#define UEFI_LANGUAGE_VARIABLE          L"PlatformLang"
+#define UEFI_LANGUAGE_CODES_VARIABLE    L"PlatformLangCodes"
+
+//
+// Limited buffer size recommended by RFC4646 (4.3.  Length Considerations)
+// (42 characters plus a NULL terminator)
+//
+#define RFC_3066_ENTRY_SIZE             (42 + 1)
+#define ISO_639_2_ENTRY_SIZE            3
+
+#define INVALID_VARSTORE_ID             0
+
+#define QUESTION_FLAGS              (EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY)
+#define QUESTION_FLAGS_MASK         (~QUESTION_FLAGS)
+
+extern EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase;
+extern EFI_HII_STRING_PROTOCOL   *gIfrLibHiiString;
+
+#pragma pack(1)
+typedef struct {
+  EFI_STRING_ID       StringToken;
+  EFI_IFR_TYPE_VALUE  Value;
+  UINT8               Flags;
+} IFR_OPTION;
+#pragma pack()
+
+typedef struct {
+  //
+  // Buffer size allocated for Data.
+  //
+  UINT32                BufferSize;
+
+  //
+  // Offset in Data to append the newly created opcode binary.
+  // It will be adjusted automatically in Create***OpCode(), and should be
+  // initialized to 0 before invocation of a serial of Create***OpCode()
+  //
+  UINT32                Offset;
+
+  //
+  // The destination buffer for created op-codes
+  //
+  UINT8                 *Data;
+} EFI_HII_UPDATE_DATA;
+
+
+/**
+  Create EFI_IFR_END_OP opcode.
+
+  If Data is NULL or Data->Data is NULL, then ASSERT.
+
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateEndOpCode (
+  IN OUT EFI_HII_UPDATE_DATA *Data
+  )
+;
+
+/**
+  Create EFI_IFR_DEFAULT_OP opcode.
+
+  @param  Value                  Value for the default
+  @param  Type                   Type for the default
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER The type is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateDefaultOpCode (
+  IN     EFI_IFR_TYPE_VALUE  *Value,
+  IN     UINT8               Type,
+  IN OUT EFI_HII_UPDATE_DATA *Data
+  )
+;
+
+/**
+  Create EFI_IFR_ACTION_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  QuestionConfig         String ID for configuration
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateActionOpCode (
+  IN     EFI_QUESTION_ID      QuestionId,
+  IN     EFI_STRING_ID        Prompt,
+  IN     EFI_STRING_ID        Help,
+  IN     UINT8                QuestionFlags,
+  IN     EFI_STRING_ID        QuestionConfig,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Create EFI_IFR_SUBTITLE_OP opcode.
+
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  Flags                  Subtitle opcode flags
+  @param  Scope                  Subtitle Scope bit
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  
+**/
+EFI_STATUS
+EFIAPI
+CreateSubTitleOpCode (
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               Flags,
+  IN      UINT8               Scope,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Create EFI_IFR_TEXT_OP opcode.
+
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  TextTwo                String ID for text two
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateTextOpCode (
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      EFI_STRING_ID       TextTwo,
+  IN OUT  EFI_HII_UPDATE_DATA *Data
+  )
+;
+
+/**
+  Create EFI_IFR_REF_OP opcode.
+
+  @param  FormId                 Destination Form ID
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  QuestionId             Question ID
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateGotoOpCode (
+  IN      EFI_FORM_ID         FormId,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN OUT  EFI_HII_UPDATE_DATA *Data
+  )
+;
+
+/**
+  Create EFI_IFR_ONE_OF_OPTION_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  OptionList             The list of Options.
+  @param  Type                   The data type.
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateOneOfOptionOpCode (
+  IN     UINTN                OptionCount,
+  IN     IFR_OPTION           *OptionsList,
+  IN     UINT8                Type,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Create EFI_IFR_ONE_OF_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  VarStoreId             Storage ID
+  @param  VarOffset              Offset in Storage
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  OneOfFlags             Flags for oneof opcode
+  @param  OptionsList            List of options
+  @param  OptionCount            Number of options in option list
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateOneOfOpCode (
+  IN     EFI_QUESTION_ID      QuestionId,
+  IN     EFI_VARSTORE_ID      VarStoreId,
+  IN     UINT16               VarOffset,
+  IN     EFI_STRING_ID        Prompt,
+  IN     EFI_STRING_ID        Help,
+  IN     UINT8                QuestionFlags,
+  IN     UINT8                OneOfFlags,
+  IN     IFR_OPTION           *OptionsList,
+  IN     UINTN                OptionCount,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Create EFI_IFR_ORDERED_LIST_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  VarStoreId             Storage ID
+  @param  VarOffset              Offset in Storage
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  Flags                  Flags for ordered list opcode
+  @param  DataType               Type for option value
+  @param  MaxContainers          Maximum count for options in this ordered list
+  @param  OptionsList            List of options
+  @param  OptionCount            Number of options in option list
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateOrderedListOpCode (
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN      EFI_VARSTORE_ID     VarStoreId,
+  IN      UINT16              VarOffset,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      UINT8               Flags,
+  IN      UINT8               DataType,
+  IN      UINT8               MaxContainers,
+  IN      IFR_OPTION          *OptionsList,
+  IN     UINTN                OptionCount,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Create EFI_IFR_CHECKBOX_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  VarStoreId             Storage ID
+  @param  VarOffset              Offset in Storage
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  CheckBoxFlags          Flags for checkbox opcode
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateCheckBoxOpCode (
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN      EFI_VARSTORE_ID     VarStoreId,
+  IN      UINT16              VarOffset,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      UINT8               CheckBoxFlags,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Create EFI_IFR_NUMERIC_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  VarStoreId             Storage ID
+  @param  VarOffset              Offset in Storage
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  NumericFlags           Flags for numeric opcode
+  @param  Minimum                Numeric minimum value
+  @param  Maximum                Numeric maximum value
+  @param  Step                   Numeric step for edit
+  @param  Default                Numeric default value
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateNumericOpCode (
+  IN     EFI_QUESTION_ID     QuestionId,
+  IN     EFI_VARSTORE_ID     VarStoreId,
+  IN     UINT16              VarOffset,
+  IN     EFI_STRING_ID       Prompt,
+  IN     EFI_STRING_ID       Help,
+  IN     UINT8               QuestionFlags,
+  IN     UINT8               NumericFlags,
+  IN     UINT64              Minimum,
+  IN     UINT64              Maximum,
+  IN     UINT64              Step,
+  IN     UINT64              Default,
+  IN OUT EFI_HII_UPDATE_DATA *Data
+  )
+;
+
+/**
+  Create EFI_IFR_STRING_OP opcode.
+
+  @param  QuestionId             Question ID
+  @param  VarStoreId             Storage ID
+  @param  VarOffset              Offset in Storage
+  @param  Prompt                 String ID for Prompt
+  @param  Help                   String ID for Help
+  @param  QuestionFlags          Flags in Question Header
+  @param  StringFlags            Flags for string opcode
+  @param  MinSize                String minimum length
+  @param  MaxSize                String maximum length
+  @param  Data                   Destination for the created opcode binary
+
+  @retval EFI_SUCCESS            Opcode create success
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.
+  @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.
+
+**/
+EFI_STATUS
+EFIAPI
+CreateStringOpCode (
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN      EFI_VARSTORE_ID     VarStoreId,
+  IN      UINT16              VarOffset,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      UINT8               StringFlags,
+  IN      UINT8               MinSize,
+  IN      UINT8               MaxSize,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+;
+
+/**
+  Converts binary buffer to Unicode string in reversed byte order to BufToHexString().
+
+  @param  Str                    String for output
+  @param  Buffer                 Binary buffer.
+  @param  BufferSize             Size of the buffer in bytes.
+
+  @retval EFI_SUCCESS            The function completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+BufferToHexString (
+  IN OUT CHAR16    *Str,
+  IN UINT8         *Buffer,
+  IN UINTN         BufferSize
+  )
+;
+
+/**
+  Converts Hex String to binary buffer in reversed byte order to HexStringToBuf().
+
+  @param  Buffer                 Pointer to buffer that receives the data.
+  @param  BufferSize             Length in bytes of the buffer to hold converted
+                                 data. If routine return with EFI_SUCCESS,
+                                 containing length of converted data. If routine
+                                 return with EFI_BUFFER_TOO_SMALL, containg length
+                                 of buffer desired.
+  @param  Str                    String to be converted from.
+
+  @retval EFI_SUCCESS            The function completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+HexStringToBuffer (
+  IN OUT UINT8         *Buffer,
+  IN OUT UINTN         *BufferSize,
+  IN CHAR16            *Str
+  )
+;
+
+/**
+  Construct <ConfigHdr> using routing information GUID/NAME/PATH.
+
+  @param  ConfigHdr              Pointer to the ConfigHdr string.
+  @param  StrBufferLen           On input: Length in bytes of buffer to hold the
+                                 ConfigHdr string. Includes tailing '\0' character.
+                                 On output: If return EFI_SUCCESS, containing
+                                 length of ConfigHdr string buffer. If return
+                                 EFI_BUFFER_TOO_SMALL, containg length of string
+                                 buffer desired.
+  @param  Guid                   Routing information: GUID.
+  @param  Name                   Routing information: NAME.
+  @param  DriverHandle           Driver handle which contains the routing
+                                 information: PATH.
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval EFI_BUFFER_TOO_SMALL   The ConfigHdr string buffer is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+ConstructConfigHdr (
+  IN OUT CHAR16                *ConfigHdr,
+  IN OUT UINTN                 *StrBufferLen,
+  IN EFI_GUID                  *Guid,
+  IN CHAR16                    *Name, OPTIONAL
+  IN EFI_HANDLE                *DriverHandle
+  )
+
+;
+
+/**
+  Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string.
+
+  @param  String                 The string to be searched in.
+  @param  Offset                 Offset in BlockName.
+  @param  Width                  Width in BlockName.
+
+  @retval TRUE                   Block name found.
+  @retval FALSE                  Block name not found.
+
+**/
+BOOLEAN
+EFIAPI
+FindBlockName (
+  IN OUT CHAR16                *String,
+  UINTN                        Offset,
+  UINTN                        Width
+  )
+;
+
+/**
+  This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser.
+
+  @param  VariableGuid           An optional field to indicate the target variable
+                                 GUID name to use.
+  @param  VariableName           An optional field to indicate the target
+                                 human-readable variable name.
+  @param  BufferSize             On input: Length in bytes of buffer to hold
+                                 retrived data. On output: If return
+                                 EFI_BUFFER_TOO_SMALL, containg length of buffer
+                                 desired.
+  @param  Buffer                 Buffer to hold retrived data.
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval EFI_BUFFER_TOO_SMALL   The intput buffer is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+GetBrowserData (
+  EFI_GUID                   *VariableGuid, OPTIONAL
+  CHAR16                     *VariableName, OPTIONAL
+  UINTN                      *BufferSize,
+  UINT8                      *Buffer
+  )
+;
+
+/**
+  This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser.
+
+  @param  VariableGuid           An optional field to indicate the target variable
+                                 GUID name to use.
+  @param  VariableName           An optional field to indicate the target
+                                 human-readable variable name.
+  @param  BufferSize             Length in bytes of buffer to hold retrived data.
+  @param  Buffer                 Buffer to hold retrived data.
+  @param  RequestElement         An optional field to specify which part of the
+                                 buffer data will be send back to Browser. If NULL,
+                                 the whole buffer of data will be committed to
+                                 Browser. <RequestElement> ::=
+                                 &OFFSET=<Number>&WIDTH=<Number>*
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval Other                  Updating Browser uncommitted data failed.
+
+**/
+EFI_STATUS
+EFIAPI
+SetBrowserData (
+  EFI_GUID                   *VariableGuid, OPTIONAL
+  CHAR16                     *VariableName, OPTIONAL
+  UINTN                      BufferSize,
+  UINT8                      *Buffer,
+  CHAR16                     *RequestElement  OPTIONAL
+  )
+;
+
+/**
+  Draw a dialog and return the selected key.
+
+  @param  NumberOfLines          The number of lines for the dialog box
+  @param  KeyValue               The EFI_KEY value returned if HotKey is TRUE..
+  @param  String                 Pointer to the first string in the list
+  @param  ...                    A series of (quantity == NumberOfLines) text
+                                 strings which will be used to construct the dialog
+                                 box
+
+  @retval EFI_SUCCESS            Displayed dialog and received user interaction
+  @retval EFI_INVALID_PARAMETER  One of the parameters was invalid.
+
+**/
+
+EFI_STATUS
+EFIAPI
+IfrLibCreatePopUp (
+  IN  UINTN                       NumberOfLines,
+  OUT EFI_INPUT_KEY               *KeyValue,
+  IN  CHAR16                      *String,
+  ...
+  )
+;
+
+#endif
index 94471f332944a0d0bec47c9d706e1295eb134ac3..909262e5872f78e81c4b947acfd7498157450894 100644 (file)
@@ -2073,3 +2073,242 @@ BcdToDecimal8 (
 }\r
 \r
 \r
+/**\r
+  Convert a nibble in the low 4 bits of a byte to a Unicode hexadecimal character.\r
+\r
+  This function converts a nibble in the low 4 bits of a byte to a Unicode hexadecimal \r
+  character  For example, the nibble  0x01 and 0x0A will converted to L'1' and L'A' \r
+  respectively.\r
+\r
+  The upper nibble in the input byte will be masked off.\r
+\r
+  @param Nibble     The nibble which is in the low 4 bits of the input byte.\r
+\r
+  @retval  CHAR16   The Unicode hexadecimal character.\r
+  \r
+**/\r
+CHAR16\r
+NibbleToHexChar (\r
+  IN UINT8      Nibble\r
+  )\r
+{\r
+  Nibble &= 0x0F;\r
+  if (Nibble <= 0x9) {\r
+    return (CHAR16)(Nibble + L'0');\r
+  }\r
+\r
+  return (CHAR16)(Nibble - 0xA + L'A');\r
+}\r
+\r
+/** \r
+  Convert binary buffer to a Unicode String in a specified sequence. \r
+\r
+  This function converts bytes in the binary Buffer Buf to a Unicode String Str. \r
+  Each byte will be represented by two Unicode characters. For example, byte 0xA1 will \r
+  be converted into two Unicode character L'A' and L'1'. In the output String, the Unicode Character \r
+  for the Most Significant Nibble will be put before the Unicode Character for the Least Significant\r
+  Nibble. The output string for the buffer containing a single byte 0xA1 will be L"A1". \r
+  For a buffer with multiple bytes, the Unicode character produced by the first byte will be put into the \r
+  the last character in the output string. The one next to first byte will be put into the\r
+  character before the last character. This rules applies to the rest of the bytes. The Unicode\r
+  character by the last byte will be put into the first character in the output string. For example,\r
+  the input buffer for a 64-bits unsigned integrer 0x12345678abcdef1234 will be converted to\r
+  a Unicode string equal to L"12345678abcdef1234".\r
+\r
+  @param String                        On input, String is pointed to the buffer allocated for the convertion.\r
+  @param StringLen                     The Length of String buffer to hold the output String. The length must include the tailing '\0' character.\r
+                                       The StringLen required to convert a N bytes Buffer will be a least equal to or greater \r
+                                       than 2*N + 1.\r
+  @param Buffer                        The pointer to a input buffer.\r
+  @param BufferSizeInBytes             Lenth in bytes of the input buffer.\r
+  \r
+\r
+  @retval  EFI_SUCCESS                 The convertion is successfull. All bytes in Buffer has been convert to the corresponding\r
+                                       Unicode character and placed into the right place in String.\r
+  @retval  EFI_BUFFER_TOO_SMALL        StringSizeInBytes is smaller than 2 * N + 1the number of bytes required to\r
+                                       complete the convertion. \r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+BufToHexString (\r
+  IN OUT       CHAR16               *String,\r
+  IN OUT       UINTN                *StringLen,\r
+  IN     CONST UINT8                *Buffer,\r
+  IN           UINTN                BufferSizeInBytes\r
+  )\r
+{\r
+  UINTN       Idx;\r
+  UINT8       Byte;\r
+  UINTN       StrLen;\r
+\r
+  //\r
+  // Make sure string is either passed or allocate enough.\r
+  // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
+  // Plus the Unicode termination character.\r
+  //\r
+  StrLen = BufferSizeInBytes * 2;\r
+  if (StrLen > ((*StringLen) - 1)) {\r
+    *StringLen = StrLen + 1;\r
+    return RETURN_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  *StringLen = StrLen + 1;\r
+  //\r
+  // Ends the string.\r
+  //\r
+  String[StrLen] = L'\0'; \r
+\r
+  for (Idx = 0; Idx < BufferSizeInBytes; Idx++) {\r
+\r
+    Byte = Buffer[Idx];\r
+    String[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);\r
+    String[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));\r
+  }\r
+\r
+  return RETURN_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Convert a Unicode string consisting of hexadecimal characters to a output byte buffer.\r
+\r
+  This function converts a Unicode string consisting of characters in the range of Hexadecimal\r
+  character (L'0' to L'9', L'A' to L'F' and L'a' to L'f') to a output byte buffer. The function will stop\r
+  at the first non-hexadecimal character or the NULL character. The convertion process can be\r
+  simply viewed as the reverse operations defined by BufToHexString. Two Unicode characters will be \r
+  converted into one byte. The first Unicode character represents the Most Significant Nibble and the\r
+  second Unicode character represents the Least Significant Nibble in the output byte. \r
+  The first pair of Unicode characters represents the last byte in the output buffer. The second pair of Unicode \r
+  characters represent the  the byte preceding the last byte. This rule applies to the rest pairs of bytes. \r
+  The last pair represent the first byte in the output buffer. \r
+\r
+  For example, a Unciode String L"12345678" will be converted into a buffer wil the following bytes \r
+  (first byte is the byte in the lowest memory address): "0x78, 0x56, 0x34, 0x12".\r
+\r
+  If String has N valid hexadecimal characters for conversion,  the caller must make sure Buffer is at least \r
+  N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. \r
+\r
+  @param Buffer                      The output buffer allocated by the caller.\r
+  @param BufferSizeInBytes           On input, the size in bytes of Buffer. On output, it is updated to \r
+                                     contain the size of the Buffer which is actually used for the converstion.\r
+                                     For Unicode string with 2*N hexadecimal characters (not including the \r
+                                     tailing NULL character), N bytes of Buffer will be used for the output.\r
+  @param String                      The input hexadecimal string.\r
+  @param ConvertedStrLen             The number of hexadecimal characters used to produce content in output\r
+                                     buffer Buffer.\r
+\r
+  @retval  RETURN_BUFFER_TOO_SMALL   The input BufferSizeInBytes is too small to hold the output. BufferSizeInBytes\r
+                                     will be updated to the size required for the converstion.\r
+  @retval  RETURN_SUCCESS            The convertion is successful or the first Unicode character from String\r
+                                     is hexadecimal. If ConvertedStrLen is not NULL, it is updated\r
+                                     to the number of hexadecimal character used for the converstion.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+HexStringToBuf (\r
+  OUT          UINT8                    *Buffer,   \r
+  IN OUT       UINTN                    *BufferSizeInBytes,\r
+  IN     CONST CHAR16                   *String,\r
+  OUT          UINTN                    *ConvertedStrLen  OPTIONAL\r
+  )\r
+{\r
+  UINTN       HexCnt;\r
+  UINTN       Idx;\r
+  UINTN       BufferLength;\r
+  UINT8       Digit;\r
+  UINT8       Byte;\r
+\r
+  //\r
+  // Find out how many hex characters the string has.\r
+  //\r
+  for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, String[Idx]); Idx++, HexCnt++);\r
+\r
+  if (HexCnt == 0) {\r
+    *ConvertedStrLen = 0;\r
+    return RETURN_SUCCESS;\r
+  }\r
+  //\r
+  // Two Unicode characters make up 1 buffer byte. Round up.\r
+  //\r
+  BufferLength = (HexCnt + 1) / 2; \r
+\r
+  //\r
+  // Test if  buffer is passed enough.\r
+  //\r
+  if (BufferLength > (*BufferSizeInBytes)) {\r
+    *BufferSizeInBytes = BufferLength;\r
+    return RETURN_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  *BufferSizeInBytes = BufferLength;\r
+\r
+  for (Idx = 0; Idx < HexCnt; Idx++) {\r
+\r
+    IsHexDigit (&Digit, String[HexCnt - 1 - Idx]);\r
+\r
+    //\r
+    // For odd charaters, write the lower nibble for each buffer byte,\r
+    // and for even characters, the upper nibble.\r
+    //\r
+    if ((Idx & 1) == 0) {\r
+      Byte = Digit;\r
+    } else {\r
+      Byte = Buffer[Idx / 2];\r
+      Byte &= 0x0F;\r
+      Byte = (UINT8) (Byte | Digit << 4);\r
+    }\r
+\r
+    Buffer[Idx / 2] = Byte;\r
+  }\r
+\r
+  if (ConvertedStrLen != NULL) {\r
+    *ConvertedStrLen = HexCnt;\r
+  }\r
+\r
+  return RETURN_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Test if  a Unicode character is a hexadecimal digit. If true, the input\r
+  Unicode character is converted to a byte. \r
+\r
+  This function tests if a Unicode character is a hexadecimal digit. If true, the input\r
+  Unicode character is converted to a byte. For example, Unicode character\r
+  L'A' will be converted to 0x0A. \r
+\r
+  If Digit is NULL, then ASSERT.\r
+\r
+  @retval TRUE        Char is in the range of Hexadecimal number. Digit is updated\r
+                      to the byte value of the number.\r
+  @retval FALSE       Char is not in the range of Hexadecimal number. Digit is keep\r
+                      intact.\r
+  \r
+**/\r
+BOOLEAN\r
+IsHexDigit (\r
+  OUT UINT8      *Digit,\r
+  IN  CHAR16      Char\r
+  )\r
+{\r
+  ASSERT (Digit != NULL);\r
+  \r
+  if ((Char >= L'0') && (Char <= L'9')) {\r
+    *Digit = (UINT8) (Char - L'0');\r
+    return TRUE;\r
+  }\r
+\r
+  if ((Char >= L'A') && (Char <= L'F')) {\r
+    *Digit = (UINT8) (Char - L'A' + 0x0A);\r
+    return TRUE;\r
+  }\r
+\r
+  if ((Char >= L'a') && (Char <= L'f')) {\r
+    *Digit = (UINT8) (Char - L'a' + 0x0A);\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+\r
index a8d5df4c9593725bdd8552ac311b7581057db543..98ac18c07ca88eb6a3f840f2cacd4d68d83f408f 100644 (file)
@@ -38,8 +38,6 @@
   UefiIfrForm.c\r
   UefiIfrLibraryInternal.h\r
   UefiIfrOpCodeCreation.c\r
-  R8Lib.h\r
-  R8Lib.c\r
 \r
 \r
 [Packages]\r
@@ -71,4 +69,3 @@
 \r
 [Pcd]\r
   gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang\r
-  
\ No newline at end of file
index e630e3e39d03ace59ab928cf0038a8bf5d4d24a8..8963789423f63a3beca4e83612ca764f0e647731 100644 (file)
@@ -27,55 +27,6 @@ Abstract:
 //
 UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";
 
-#if 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;
-}
-#endif
-
-
 /**
   Draw a dialog and return the selected key.
 
@@ -301,7 +252,7 @@ SwapBuffer (
 
 
 /**
-  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.
@@ -326,7 +277,7 @@ BufferToHexString (
   SwapBuffer (NewBuffer, BufferSize);
 
   StrBufferLen = (BufferSize + 1) * sizeof (CHAR16);
-  Status = R8_BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize);
+  Status = BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize);
 
   gBS->FreePool (NewBuffer);
 
@@ -335,7 +286,7 @@ BufferToHexString (
 
 
 /**
-  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
@@ -360,7 +311,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);
   }
@@ -496,7 +447,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;
     }
@@ -513,7 +464,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;
     }
@@ -710,7 +661,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 {
index dd41c7aea3afaa8f64fd2615933ad94f1b0f9fe5..dade8592f5248e64f229e5568fd9fff88bab4e7f 100644 (file)
@@ -40,8 +40,4 @@ Abstract:
 #include <Library/HiiLib.h>
 #include <Library/PcdLib.h>
 
-//#include <MdeModuleHii.h>
-
-#include "R8Lib.h"
-
 #endif