#include "HiiDatabase.h"\r
#include "UefiIfrDefault.h"\r
\r
-EFI_GUID mTianoExtendedOpcodeGuid = EFI_IFR_TIANO_GUID;\r
-\r
-\r
-EFI_IFR_GUID_OPTIONKEY mOptionKeyTemplate = {\r
- {EFI_IFR_GUID_OP, sizeof (EFI_IFR_GUID_OPTIONKEY), 0},\r
- EFI_IFR_FRAMEWORK_GUID,\r
- EFI_IFR_EXTEND_OP_OPTIONKEY,\r
- 0,\r
- {0},\r
- 0\r
-};\r
+typedef struct {\r
+ UINT8 *Buffer;\r
+ UINTN BufferSize;\r
+ UINTN Position;\r
+} HII_LIB_OPCODE_BUFFER;\r
\r
/**\r
The dynamic creation of these opcodes is supported in Framework HII modules.\r
\r
\r
\r
-#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000\r
+#define HII_LIB_OPCODE_ALLOCATION_SIZE 0x200\r
+\r
/**\r
- Append the newly created OpCode buffer to EFI_HII_UPDATE_DATA buffer.\r
- Increase the Data buffer in EFI_HII_UPDATE_DATA if the EFI_HII_UPDATE_DATA \r
- buffer's Data Buffer does not have space left for the newly created\r
- OpCode.\r
-\r
- @param OpCodeBuf The newly created OpCode Buffer to be appended to \r
- EFI_HII_UPDATE_DATA buffer.\r
- @param OpCodeBufSize The size of OpCodeBuf.\r
- @param UefiUpdateData The EFI_HII_UPDATE_DATA to be appended.\r
-\r
- @retval EFI_SUCCESS The OpCode buffer is appended to EFI_HII_UPDATE_DATA successfull.\r
- @retval EFI_OUT_OF_RESOURCES There is not enough memory.\r
+ Append raw opcodes to an OpCodeHandle.\r
+\r
+ If OpCodeHandle is NULL, then ASSERT().\r
+ If RawBuffer is NULL, then ASSERT();\r
+\r
+ @param[in] OpCodeHandle Handle to the buffer of opcodes.\r
+ @param[in] RawBuffer Buffer of opcodes to append.\r
+ @param[in] RawBufferSize The size, in bytes, of Buffer.\r
+\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the appended opcodes.\r
+\r
**/\r
-EFI_STATUS\r
-AppendToUpdateBuffer (\r
- IN CONST UINT8 *OpCodeBuf,\r
- IN UINTN OpCodeBufSize,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+UINT8 *\r
+EFIAPI\r
+HiiThunkCreateRawOpCodes (\r
+ IN VOID *OpCodeHandle,\r
+ IN UINT8 *RawBuffer,\r
+ IN UINTN RawBufferSize\r
)\r
{\r
- UINT8 * NewBuff;\r
- \r
- if (UefiUpdateData->Offset + OpCodeBufSize > UefiUpdateData->BufferSize) {\r
- NewBuff = AllocateCopyPool (UefiUpdateData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiUpdateData->Data);\r
- if (NewBuff == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ UINT8 *Buffer;\r
+ HII_LIB_OPCODE_BUFFER *OpCodeBuffer;\r
+\r
+ ASSERT (RawBuffer != NULL);\r
+ ASSERT (OpCodeHandle != NULL);\r
+\r
+ OpCodeBuffer = (HII_LIB_OPCODE_BUFFER *)OpCodeHandle;\r
+ if (OpCodeBuffer->Position + RawBufferSize > OpCodeBuffer->BufferSize) {\r
+ Buffer = ReallocatePool (\r
+ OpCodeBuffer->BufferSize, \r
+ OpCodeBuffer->BufferSize + (RawBufferSize + HII_LIB_OPCODE_ALLOCATION_SIZE),\r
+ OpCodeBuffer->Buffer\r
+ );\r
+ if (Buffer == NULL) {\r
+ return NULL;\r
}\r
- UefiUpdateData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
- FreePool (UefiUpdateData->Data);\r
- UefiUpdateData->Data = NewBuff;\r
+ OpCodeBuffer->Buffer = Buffer;\r
+ OpCodeBuffer->BufferSize += (RawBufferSize + HII_LIB_OPCODE_ALLOCATION_SIZE);\r
}\r
+ Buffer = OpCodeBuffer->Buffer + OpCodeBuffer->Position;\r
+ OpCodeBuffer->Position += RawBufferSize;\r
\r
- CopyMem (UefiUpdateData->Data + UefiUpdateData->Offset, OpCodeBuf, OpCodeBufSize);\r
- UefiUpdateData->Offset += (UINT32) OpCodeBufSize;\r
-\r
- return EFI_SUCCESS;\r
+ return (UINT8 *)CopyMem (Buffer, RawBuffer, RawBufferSize);\r
}\r
\r
/**\r
}\r
}\r
\r
-/**\r
- Create UEFI HII "End Of" Opcode and append it to UefiUpdateData buffer.\r
-\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
-\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
- \r
-**/\r
-EFI_STATUS\r
-UCreateEndOfOpcode (\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
- )\r
-{\r
- EFI_IFR_END UOpcode;\r
-\r
- ZeroMem (&UOpcode, sizeof (UOpcode));\r
-\r
- UOpcode.Header.OpCode = EFI_IFR_END_OP;\r
- UOpcode.Header.Length = sizeof (UOpcode);\r
-\r
- return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiUpdateData);\r
-}\r
-\r
-/**\r
- Create UEFI HII Subtitle Opcode from a Framework HII Subtitle Opcode.\r
-\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
-\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
- \r
-**/\r
-EFI_STATUS\r
-F2UCreateSubtitleOpCode (\r
- IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
- )\r
-{\r
- EFI_IFR_SUBTITLE UOpcode;\r
-\r
- ZeroMem (&UOpcode, sizeof(UOpcode));\r
-\r
- UOpcode.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
- UOpcode.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
-\r
- UOpcode.Statement.Prompt = FwOpcode->SubTitle;\r
-\r
- return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiUpdateData);\r
-}\r
-\r
/**\r
Create UEFI HII Text Opcode from a Framework HII Text Opcode.\r
\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateTextOpCode (\r
- IN CONST FRAMEWORK_EFI_IFR_TEXT *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
+ IN CONST FRAMEWORK_EFI_IFR_TEXT *FwOpcode\r
)\r
{\r
EFI_IFR_TEXT UTextOpCode;\r
- EFI_IFR_ACTION UActionOpCode;\r
\r
if ((FwOpcode->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
ZeroMem (&UTextOpCode, sizeof(UTextOpCode));\r
UTextOpCode.Statement.Prompt = FwOpcode->Text;\r
UTextOpCode.TextTwo = FwOpcode->TextTwo;\r
\r
- return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiUpdateData);\r
+ return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UTextOpCode, sizeof(UTextOpCode));\r
} else {\r
//\r
// Iteractive Text Opcode is EFI_IFR_ACTION\r
//\r
-\r
- ZeroMem (&UActionOpCode, sizeof (UActionOpCode));\r
-\r
- UActionOpCode.Header.OpCode = EFI_IFR_ACTION_OP;\r
- UActionOpCode.Header.Length = sizeof (EFI_IFR_ACTION);\r
-\r
- UActionOpCode.Question.Header.Prompt = FwOpcode->Text;\r
- UActionOpCode.Question.Header.Help = FwOpcode->Help;\r
- UActionOpCode.Question.Flags = EFI_IFR_FLAG_CALLBACK;\r
- UActionOpCode.Question.QuestionId = FwOpcode->Key;\r
-\r
- return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiUpdateData);\r
- \r
+ return HiiCreateActionOpCode (UefiUpdateDataHandle, FwOpcode->Key, FwOpcode->Text, FwOpcode->Help, EFI_IFR_FLAG_CALLBACK, 0);\r
}\r
}\r
\r
/**\r
Create UEFI HII Reference Opcode from a Framework HII Reference Opcode.\r
\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateReferenceOpCode (\r
- IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
+ IN CONST FRAMEWORK_EFI_IFR_REF *FwOpcode\r
)\r
{\r
EFI_IFR_REF UOpcode;\r
//\r
UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
\r
-\r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+ return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
}\r
\r
-\r
/**\r
Create UEFI HII "One Of Option" Opcode from a Framework HII "One Of Option" Opcode.\r
\r
- @param FwOpcode The input Framework Opcode.\r
- @param Width The size of the One Of Option. 1 bytes or 2 bytes.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param Width The size of the One Of Option. 1 bytes or 2 bytes.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateOneOfOptionOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOpcode,\r
- IN UINTN Width,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN UINTN Width\r
)\r
{\r
EFI_IFR_ONE_OF_OPTION UOpcode;\r
\r
default:\r
ASSERT (FALSE);\r
- return EFI_UNSUPPORTED;\r
+ return NULL;\r
}\r
\r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+ return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
}\r
\r
/**\r
Create a GUID Opcode EFI_IFR_GUID_OPTIONKEY to map the Framework One Of Option callback key\r
to a UEFI Question ID. This information is used to invoke the Framework HII Browser Callback\r
- function. The opcode is appened to UefiUpdateData.\r
+ function. The opcode is appened to UefiUpdateDataHandle.\r
\r
- @param QuestionId The UEFI Question ID.\r
- @param OptionValue The value of the "One Of Option".\r
- @param KeyValue The Framework "One Of Option" callback key.\r
- @param UefiDat The UEFI Update Data buffer.\r
+ @param QuestionId The UEFI Question ID.\r
+ @param OptionValue The value of the "One Of Option".\r
+ @param KeyValue The Framework "One Of Option" callback key.\r
+ @param UefiUpdateDataHandle The UEFI Update Data buffer.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
**/\r
-\r
-EFI_STATUS\r
+UINT8 *\r
CreateGuidOptionKeyOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN EFI_QUESTION_ID QuestionId,\r
IN UINT16 OptionValue,\r
- IN EFI_QUESTION_ID KeyValue,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN EFI_QUESTION_ID KeyValue\r
)\r
{\r
- EFI_IFR_GUID_OPTIONKEY UOpcode;\r
-\r
- CopyMem (&UOpcode, &mOptionKeyTemplate, sizeof (EFI_IFR_GUID_OPTIONKEY));\r
-\r
- UOpcode.QuestionId = QuestionId;\r
- CopyMem (&UOpcode.OptionValue, &OptionValue, sizeof (OptionValue)); \r
- UOpcode.KeyValue = KeyValue;\r
+ EFI_IFR_GUID_OPTIONKEY *UOpcode;\r
\r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+ UOpcode = (EFI_IFR_GUID_OPTIONKEY *) HiiCreateGuidOpCode (\r
+ UefiUpdateDataHandle, \r
+ &gEfiIfrFrameworkGuid, \r
+ NULL,\r
+ sizeof (EFI_IFR_GUID_OPTIONKEY)\r
+ );\r
+\r
+ UOpcode->ExtendOpCode = EFI_IFR_EXTEND_OP_OPTIONKEY;\r
+ UOpcode->QuestionId = QuestionId;\r
+ CopyMem (&UOpcode->OptionValue, &OptionValue, sizeof (OptionValue)); \r
+ UOpcode->KeyValue = KeyValue;\r
+\r
+ return (UINT8 *) UOpcode;\r
}\r
\r
/**\r
Create UEFI HII "One Of" Opcode from a Framework HII "One Of" Opcode.\r
\r
- @param ThunkContext The HII Thunk Context.\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
- @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
- the "One Of Option".\r
- @param OpcodeCount The number of Opcode for the complete Framework "One Of" Opcode.\r
+ @param ThunkContext The HII Thunk Context.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+ @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
+ the "One Of Option".\r
+ @param OpcodeCount The number of Opcode for the complete Framework "One Of" Opcode.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateOneOfOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN HII_THUNK_CONTEXT *ThunkContext,\r
IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData,\r
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
OUT UINTN *OpcodeCount\r
)\r
EFI_IFR_ONE_OF UOpcode;\r
FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
+ UINT8 *OpCodeBuffer;\r
+ UINT8 *OneOfOpCodeBuffer;\r
\r
ASSERT (NextFwOpcode != NULL);\r
ASSERT (OpcodeCount != NULL);\r
}\r
}\r
\r
- Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ OneOfOpCodeBuffer = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof (UOpcode));\r
+ if (OneOfOpCodeBuffer == NULL) {\r
+ return NULL;\r
}\r
*OpcodeCount += 1;\r
\r
\r
FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
\r
- Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ OpCodeBuffer = F2UCreateOneOfOptionOpCode (UefiUpdateDataHandle, (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width);\r
+ if (OpCodeBuffer == NULL) {\r
+ return NULL;\r
}\r
\r
- Status = CreateGuidOptionKeyOpCode (UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key, UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ OpCodeBuffer = CreateGuidOptionKeyOpCode (UefiUpdateDataHandle, UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key);\r
+ if (OpCodeBuffer == NULL) {\r
+ return NULL;\r
}\r
+\r
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
*OpcodeCount += 1;\r
}\r
\r
- Status = UCreateEndOfOpcode (UefiUpdateData);\r
- if (!EFI_ERROR (Status)) {\r
+ OpCodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);\r
+ if (OpCodeBuffer != NULL) {\r
*NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
*OpcodeCount += 1;\r
}\r
\r
- return Status;\r
+ return OneOfOpCodeBuffer;\r
}\r
\r
/**\r
Create UEFI HII "Ordered List" Opcode from a Framework HII "Ordered List" Opcode.\r
\r
- @param ThunkContext The HII Thunk Context.\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
- @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
- the "Ordered List".\r
- @param OpcodeCount The number of Opcode for the complete Framework "Ordered List" Opcode.\r
+ @param ThunkContext The HII Thunk Context.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+ @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
+ the "Ordered List".\r
+ @param OpcodeCount The number of Opcode for the complete Framework "Ordered List" Opcode.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateOrderedListOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN HII_THUNK_CONTEXT *ThunkContext,\r
IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData,\r
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
OUT UINTN *OpcodeCount\r
)\r
EFI_IFR_ORDERED_LIST UOpcode;\r
EFI_STATUS Status;\r
FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
- FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
+ FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
+ UINT8 *OpcodeBuffer; \r
+ UINT8 *OrderListOpCode;\r
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
*OpcodeCount = 0;\r
}\r
}\r
\r
- Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ OrderListOpCode = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
+ if (OrderListOpCode == NULL) {\r
+ return NULL;\r
}\r
*OpcodeCount += 1;\r
\r
//\r
// Each entry of Order List in Framework HII is always 1 byte in size\r
//\r
- Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ OpcodeBuffer = F2UCreateOneOfOptionOpCode (UefiUpdateDataHandle, (CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1);\r
+ if (OpcodeBuffer == NULL) {\r
+ return NULL;\r
}\r
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
*OpcodeCount += 1;\r
}\r
\r
- Status = UCreateEndOfOpcode (UefiUpdateData);\r
- if (!EFI_ERROR (Status)) {\r
+ OpcodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);\r
+ if (OpcodeBuffer != NULL) {\r
*NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
*OpcodeCount += 1;\r
}\r
\r
- return Status;\r
+ return OrderListOpCode;\r
}\r
\r
/**\r
Create UEFI HII CheckBox Opcode from a Framework HII Checkbox Opcode.\r
\r
- @param ThunkContext The HII Thunk Context.\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param ThunkContext The HII Thunk Context.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateCheckBoxOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN HII_THUNK_CONTEXT *ThunkContext,\r
- IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode\r
)\r
{\r
EFI_STATUS Status;\r
//\r
UOpcode.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
\r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+ return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
}\r
\r
\r
/**\r
Create UEFI HII Numeric Opcode from a Framework HII Numeric Opcode.\r
\r
- @param ThunkContext The HII Thunk Context.\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param ThunkContext The HII Thunk Context.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateNumericOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN HII_THUNK_CONTEXT *ThunkContext,\r
- IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode\r
)\r
{\r
EFI_STATUS Status;\r
EFI_IFR_NUMERIC UOpcode;\r
EFI_IFR_DEFAULT UOpcodeDefault;\r
+ UINT8 *NumbericOpCode;\r
+ UINT8 *OpcodeBuffer;\r
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
\r
default: \r
{\r
ASSERT (FALSE);\r
- return EFI_INVALID_PARAMETER;\r
+ return NULL;\r
}\r
}\r
\r
- Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ NumbericOpCode = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
+ if (NumbericOpCode == NULL) {\r
+ return NULL;\r
}\r
\r
//\r
\r
CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
\r
- Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiUpdateData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ OpcodeBuffer = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault));\r
+ if (OpcodeBuffer == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ OpcodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);\r
+ if (OpcodeBuffer == NULL) {\r
+ return NULL;\r
}\r
- Status = UCreateEndOfOpcode (UefiUpdateData);\r
\r
- return Status;\r
+ return NumbericOpCode;\r
}\r
\r
\r
/**\r
Create UEFI HII String Opcode from a Framework HII String Opcode.\r
\r
- @param ThunkContext The HII Thunk Context.\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param ThunkContext The HII Thunk Context.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateStringOpCode (\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
IN HII_THUNK_CONTEXT *ThunkContext,\r
- IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode\r
)\r
{\r
EFI_IFR_STRING UOpcode;\r
+ EFI_STATUS Status;\r
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
\r
if (FwOpcode->Key == 0) {\r
- FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
+ //\r
+ UOpcode.Question.QuestionId = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);\r
+ }\r
} else {\r
UOpcode.Question.QuestionId = FwOpcode->Key;\r
}\r
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
UOpcode.Question.Header.Help = FwOpcode->Help;\r
\r
- UOpcode.Question.QuestionId = FwOpcode->Key;\r
UOpcode.Question.Flags = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
\r
UOpcode.Question.VarStoreId = ThunkContext->FormSet->DefaultVarStoreId;\r
UOpcode.MaxSize = FwOpcode->MaxSize;\r
UOpcode.Flags = EFI_IFR_STRING_MULTI_LINE;\r
\r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+ return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
}\r
\r
/**\r
Create UEFI HII Banner Opcode from a Framework HII Banner Opcode.\r
\r
- @param FwOpcode The input Framework Opcode.\r
- @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+ @param FwOpcode The input Framework Opcode.\r
+ @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
\r
- @retval EFI_SUCCESS The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
- @retval EFI_OUT_OF_RESOURCE There is not enough resource.\r
+ @retval NULL There is not enough space left in Buffer to add the opcode.\r
+ @retval Other A pointer to the created opcode.\r
\r
**/\r
-EFI_STATUS\r
+UINT8 *\r
F2UCreateBannerOpCode (\r
- IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode,\r
- IN OUT EFI_HII_UPDATE_DATA *UefiUpdateData\r
+ IN OUT VOID *UefiUpdateDataHandle,\r
+ IN CONST FRAMEWORK_EFI_IFR_BANNER *FwOpcode\r
)\r
{\r
- EFI_IFR_GUID_BANNER UOpcode;\r
+ EFI_IFR_GUID_BANNER *UOpcode;\r
\r
- ZeroMem (&UOpcode, sizeof(UOpcode));\r
+ UOpcode = (EFI_IFR_GUID_BANNER *) HiiCreateGuidOpCode (\r
+ UefiUpdateDataHandle, \r
+ &gEfiIfrTianoGuid, \r
+ NULL,\r
+ sizeof (EFI_IFR_GUID_BANNER)\r
+ ); \r
\r
- UOpcode.Header.Length = sizeof(UOpcode);\r
- UOpcode.Header.OpCode = EFI_IFR_GUID_OP;\r
+ UOpcode->ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
+ UOpcode->Title = FwOpcode->Title;\r
+ UOpcode->LineNumber = FwOpcode->LineNumber;\r
+ UOpcode->Alignment = FwOpcode->Alignment;\r
\r
- CopyMem (&UOpcode.Guid, &mTianoExtendedOpcodeGuid, sizeof (EFI_GUID));\r
- UOpcode.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
- UOpcode.Title = FwOpcode->Title;\r
- UOpcode.LineNumber = FwOpcode->LineNumber;\r
- UOpcode.Alignment = FwOpcode->Alignment;\r
-\r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+ return (UINT8 *) UOpcode;\r
}\r
\r
/**\r
- Create a EFI_HII_UPDATE_DATA structure used to call IfrLibUpdateForm.\r
+ Create a Hii Update data Handle used to call IfrLibUpdateForm.\r
\r
- @param ThunkContext The HII Thunk Context.\r
- @param FwUpdateData The Framework Update Data.\r
- @param UefiUpdateData The UEFI Update Data.\r
+ @param ThunkContext The HII Thunk Context.\r
+ @param FwUpdateData The Framework Update Data.\r
+ @param UefiUpdateData The UEFI Update Data.\r
\r
@retval EFI_SUCCESS The UEFI Update Data is created successfully.\r
@retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData.\r
@retval EFI_OUT_OF_RESOURCES There is not enough resource.\r
**/\r
-EFI_STATUS\r
+EFI_STATUS \r
FwUpdateDataToUefiUpdateData (\r
IN HII_THUNK_CONTEXT *ThunkContext,\r
IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *FwUpdateData,\r
- OUT EFI_HII_UPDATE_DATA **UefiUpdateData\r
+ IN VOID *UefiOpCodeHandle\r
)\r
{\r
FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode;\r
FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode;\r
- EFI_HII_UPDATE_DATA *UefiOpCode;\r
UINTN Index;\r
- EFI_STATUS Status;\r
UINTN DataCount;\r
-\r
- UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
- if (UefiOpCode == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
- if (UefiOpCode->Data == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
- UefiOpCode->Offset = 0;\r
+ UINT8 *OpCodeBuffer;\r
\r
FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data;\r
\r
for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) {\r
switch (FwOpCode->OpCode) {\r
case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
- Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode, UefiOpCode);\r
+ OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode)->SubTitle, 0, 0, 0);\r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_TEXT_OP:\r
- Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FwOpCode, UefiOpCode); \r
+ OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT *) FwOpCode); \r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_REF_OP:\r
- Status = F2UCreateReferenceOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode); \r
+ OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode); \r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
- Status = F2UCreateOneOfOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
- if (!EFI_ERROR (Status)) {\r
+ OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount);\r
+ if (OpCodeBuffer != NULL) {\r
FwOpCode = NextFwOpCode;\r
//\r
// FwOpCode is already updated to point to the next opcode.\r
break;\r
\r
case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
- Status = F2UCreateOrderedListOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
- if (!EFI_ERROR (Status)) {\r
+ OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount);\r
+ if (OpCodeBuffer != NULL) {\r
FwOpCode = NextFwOpCode;\r
//\r
// FwOpCode is already updated to point to the next opcode.\r
break;\r
\r
case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
- Status = F2UCreateCheckBoxOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode); \r
+ OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode); \r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_STRING_OP:\r
- Status = F2UCreateStringOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode); \r
+ OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode); \r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_BANNER_OP:\r
- Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode); \r
+ OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_BANNER *) FwOpCode); \r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
- Status = UCreateEndOfOpcode (UefiOpCode);\r
+ OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle);\r
DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_NUMERIC_OP:\r
- Status = F2UCreateNumericOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode, UefiOpCode);\r
+ OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode);\r
DataCount = 1;\r
break;\r
\r
return EFI_UNSUPPORTED;\r
}\r
\r
- if (EFI_ERROR (Status)) {\r
- FreePool (UefiOpCode->Data);\r
- FreePool (UefiOpCode);\r
- return Status;\r
+ if (OpCodeBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
}\r
\r
- *UefiUpdateData = UefiOpCode;\r
- \r
return EFI_SUCCESS;\r
}\r
\r
Rountine used to display a generic dialog interface and return \r
the Key or Input from user input.\r
\r
- @param NumberOfLines The number of lines for the dialog box.\r
+ @param LinesNumber The number of lines for the dialog box.\r
@param HotKey Defines if a single character is parsed (TRUE) and returned in KeyValue\r
or if a string is returned in StringBuffer.\r
@param MaximumStringSize The maximum size in bytes of a typed-in string.\r
- @param StringBuffer On return contains the typed-in string if HotKey\r
- is FALSE.\r
- @param KeyValue The EFI_INPUT_KEY value returned if HotKey is TRUE.\r
- @param String The pointer to the first string in the list of strings\r
+ @param StringBuffer On return contains the typed-in string if HotKey is FALSE.\r
+ @param Key The EFI_INPUT_KEY value returned if HotKey is TRUE.\r
+ @param FirstString The pointer to the first string in the list of strings\r
that comprise the dialog box.\r
@param ... A series of NumberOfLines text strings that will be used\r
to construct the dialog box.\r
EFI_STATUS\r
EFIAPI \r
ThunkCreatePopUp (\r
- IN UINTN NumberOfLines,\r
+ IN UINTN LinesNumber,\r
IN BOOLEAN HotKey,\r
IN UINTN MaximumStringSize,\r
OUT CHAR16 *StringBuffer,\r
- OUT EFI_INPUT_KEY *KeyValue,\r
- IN CHAR16 *String,\r
+ OUT EFI_INPUT_KEY *Key,\r
+ IN CHAR16 *FirstString,\r
...\r
)\r
{\r
- EFI_STATUS Status;\r
- VA_LIST Marker;\r
-\r
- if (HotKey != TRUE) {\r
+ VA_LIST Args;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
+ EFI_SIMPLE_TEXT_OUTPUT_MODE SavedConsoleMode;\r
+ UINTN Columns;\r
+ UINTN Rows;\r
+ UINTN Column;\r
+ UINTN Row;\r
+ UINTN NumberOfLines;\r
+ UINTN MaxLength;\r
+ CHAR16 *String;\r
+ UINTN Length;\r
+ CHAR16 *Line;\r
+ UINTN EventIndex;\r
+\r
+ if (!HotKey) {\r
return EFI_UNSUPPORTED;\r
}\r
+ \r
+ if (MaximumStringSize == 0) {\r
+ //\r
+ // Blank strint to output\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Determine the length of the longest line in the popup and the the total \r
+ // number of lines in the popup\r
+ //\r
+ MaxLength = StrLen (FirstString);\r
+ NumberOfLines = 1;\r
+ VA_START (Args, FirstString);\r
+ while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {\r
+ MaxLength = MAX (MaxLength, StrLen (String));\r
+ NumberOfLines++;\r
+ }\r
+ VA_END (Args);\r
+\r
+ //\r
+ // If the total number of lines in the popup is not same to the input NumberOfLines\r
+ // the parameter is not valid. Not check.\r
+ //\r
+ // if (NumberOfLines != LinesNumber) {\r
+ // return EFI_INVALID_PARAMETER;\r
+ // }\r
+\r
+ //\r
+ // If the maximum length of all the strings is not same to the input MaximumStringSize\r
+ // the parameter is not valid. Not check.\r
+ //\r
+ // if (MaxLength != MaximumStringSize) {\r
+ // return EFI_INVALID_PARAMETER;\r
+ // }\r
\r
- VA_START (Marker, String);\r
+ //\r
+ // Cache a pointer to the Simple Text Output Protocol in the EFI System Table\r
+ //\r
+ ConOut = gST->ConOut;\r
\r
- Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, String, Marker);\r
+ //\r
+ // Save the current console cursor position and attributes\r
+ //\r
+ CopyMem (&SavedConsoleMode, ConOut->Mode, sizeof (SavedConsoleMode));\r
+\r
+ //\r
+ // Retrieve the number of columns and rows in the current console mode\r
+ //\r
+ ConOut->QueryMode (ConOut, SavedConsoleMode.Mode, &Columns, &Rows);\r
+\r
+ //\r
+ // Disable cursor and set the foreground and background colors specified by Attribute\r
+ //\r
+ ConOut->EnableCursor (ConOut, FALSE);\r
+ ConOut->SetAttribute (ConOut, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE);\r
+\r
+ //\r
+ // Limit NumberOfLines to height of the screen minus 3 rows for the box itself\r
+ //\r
+ NumberOfLines = MIN (NumberOfLines, Rows - 3);\r
+\r
+ //\r
+ // Limit MaxLength to width of the screen minus 2 columns for the box itself\r
+ //\r
+ MaxLength = MIN (MaxLength, Columns - 2);\r
\r
- VA_END (Marker);\r
+ //\r
+ // Compute the starting row and starting column for the popup\r
+ //\r
+ Row = (Rows - (NumberOfLines + 3)) / 2;\r
+ Column = (Columns - (MaxLength + 2)) / 2;\r
+\r
+ //\r
+ // Allocate a buffer for a single line of the popup with borders and a Null-terminator\r
+ //\r
+ Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));\r
+ ASSERT (Line != NULL);\r
+\r
+ //\r
+ // Draw top of popup box \r
+ //\r
+ SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
+ Line[0] = BOXDRAW_DOWN_RIGHT;\r
+ Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;\r
+ Line[MaxLength + 2] = L'\0';\r
+ ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+ ConOut->OutputString (ConOut, Line);\r
+\r
+ //\r
+ // Draw middle of the popup with strings\r
+ //\r
+ VA_START (Args, FirstString);\r
+ String = FirstString;\r
+ while ((String != NULL) && (NumberOfLines > 0)) {\r
+ Length = StrLen (String);\r
+ SetMem16 (Line, (MaxLength + 2) * 2, L' ');\r
+ if (Length <= MaxLength) {\r
+ //\r
+ // Length <= MaxLength\r
+ //\r
+ CopyMem (Line + 1 + (MaxLength - Length) / 2, String , Length * sizeof (CHAR16));\r
+ } else {\r
+ //\r
+ // Length > MaxLength\r
+ //\r
+ CopyMem (Line + 1, String + (Length - MaxLength) / 2 , MaxLength * sizeof (CHAR16));\r
+ }\r
+ Line[0] = BOXDRAW_VERTICAL;\r
+ Line[MaxLength + 1] = BOXDRAW_VERTICAL;\r
+ Line[MaxLength + 2] = L'\0';\r
+ ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+ ConOut->OutputString (ConOut, Line);\r
+ String = VA_ARG (Args, CHAR16 *);\r
+ NumberOfLines--;\r
+ }\r
+ VA_END (Args);\r
+\r
+ //\r
+ // Draw bottom of popup box\r
+ //\r
+ SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
+ Line[0] = BOXDRAW_UP_RIGHT;\r
+ Line[MaxLength + 1] = BOXDRAW_UP_LEFT;\r
+ Line[MaxLength + 2] = L'\0';\r
+ ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+ ConOut->OutputString (ConOut, Line);\r
+\r
+ //\r
+ // Free the allocated line buffer\r
+ //\r
+ FreePool (Line);\r
+\r
+ //\r
+ // Restore the cursor visibility, position, and attributes\r
+ //\r
+ ConOut->EnableCursor (ConOut, SavedConsoleMode.CursorVisible);\r
+ ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);\r
+ ConOut->SetAttribute (ConOut, SavedConsoleMode.Attribute);\r
+\r
+ //\r
+ // Wait for a keystroke\r
+ //\r
+ if (Key != NULL) {\r
+ gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
+ gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
+ }\r
\r
- return Status;\r
+ return EFI_SUCCESS;\r
}\r
\r
/** \r