return EFI_SUCCESS;\r
}\r
\r
+#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000\r
+\r
+EFI_STATUS\r
+AppendToUpdateBuffer (\r
+ IN CONST UINT8 *OpCodeBuf,\r
+ IN UINTN BufSize,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ UINT8 * NewBuff;\r
+ \r
+ if (UefiData->Offset + BufSize > UefiData->BufferSize) {\r
+ NewBuff = AllocateCopyPool (UefiData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiData->Data);\r
+ if (NewBuff == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ UefiData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+ FreePool (UefiData->Data);\r
+ UefiData->Data = NewBuff;\r
+ }\r
+ \r
+ CopyMem (UefiData->Data + UefiData->Offset, OpCodeBuf, BufSize);\r
+ UefiData->Offset += BufSize;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+Framework2UefiCreateSubtitleOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwSubTitle,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_SUBTITLE USubTitle;\r
+\r
+ ZeroMem (&USubTitle, sizeof(USubTitle));\r
+\r
+ USubTitle.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
+ USubTitle.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
+\r
+ USubTitle.Statement.Prompt = FwSubTitle->SubTitle;\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *)&USubTitle, sizeof(EFI_IFR_SUBTITLE), UefiData);\r
+}\r
+\r
+EFI_STATUS\r
+Framework2UefiCreateTextOpCode (\r
+ IN CONST FRAMEWORK_EFI_IFR_TEXT *FwText,\r
+ OUT EFI_HII_UPDATE_DATA *UefiData\r
+ )\r
+{\r
+ EFI_IFR_TEXT UText;\r
+\r
+ ZeroMem (&UText, sizeof(UText));\r
+ \r
+ UText.Header.OpCode = EFI_IFR_TEXT_OP;\r
+ UText.Header.Length = sizeof (EFI_IFR_TEXT);\r
+\r
+ UText.Statement.Help = FwText->Help;\r
+\r
+ UText.Statement.Prompt = FwText->Text;\r
+ UText.TextTwo = FwText->TextTwo;\r
+ \r
+ return AppendToUpdateBuffer ((UINT8 *) &UText, sizeof(EFI_IFR_TEXT), UefiData);\r
+}\r
+\r
+\r
+EFI_STATUS\r
+ThunkFrameworkUpdateDataToUefiUpdateData (\r
+ IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data,\r
+ IN BOOLEAN AddData,\r
+ OUT EFI_HII_UPDATE_DATA **UefiData\r
+ )\r
+{\r
+ FRAMEWORK_EFI_IFR_OP_HEADER *FrameworkOpcodeBuffer;\r
+ EFI_HII_UPDATE_DATA *UefiUpdateDataBuffer;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+\r
+ UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
+ if (UefiUpdateDataBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ \r
+ UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
+ if (UefiUpdateDataBuffer->Data == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+ UefiUpdateDataBuffer->Offset = 0;\r
+\r
+ FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
+\r
+ for (Index = 0; Index < Data->DataCount; Index++) {\r
+ switch (FrameworkOpcodeBuffer->OpCode) {\r
+ case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
+ Status = Framework2UefiCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
+ break;\r
+ \r
+ case FRAMEWORK_EFI_IFR_TEXT_OP:\r
+ Status = Framework2UefiCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ break;\r
+ \r
+ default:\r
+ ASSERT (FALSE);\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (UefiUpdateDataBuffer->Data);\r
+ FreePool (UefiUpdateDataBuffer);\r
+ return Status;\r
+ }\r
+\r
+ FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length);\r
+ }\r
+\r
+ *UefiData = UefiUpdateDataBuffer;\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
EFI_STATUS\r
EFIAPI\r
HiiUpdateForm (\r
IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
IN EFI_FORM_LABEL Label,\r
IN BOOLEAN AddData,\r
- IN EFI_HII_UPDATE_DATA *Data\r
+ IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data\r
)\r
/*++\r
\r
EFI_STATUS Status;\r
EFI_HII_THUNK_PRIVATE_DATA *Private;\r
HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ EFI_HII_UPDATE_DATA *UefiHiiUpdateData;\r
+ EFI_HII_HANDLE UefiHiiHandle;\r
+\r
+ Status = EFI_SUCCESS;\r
\r
Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
return Status;\r
}\r
}\r
- return EFI_SUCCESS;\r
+\r
+ if (Data->DataCount != 0) {\r
+ if (HandleMapEntry->IsPackageListWithOnlyStringPackages) {\r
+ UefiHiiHandle = TagGuidToUefiIfrHiiHandle (Private, &HandleMapEntry->TagGuid);\r
+\r
+ if (UefiHiiHandle == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ } else {\r
+ UefiHiiHandle = HandleMapEntry->UefiHiiHandle;\r
+ }\r
+\r
+ UefiHiiUpdateData = NULL;\r
+ \r
+ ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData);\r
+\r
+ Status = IfrLibUpdateForm (UefiHiiHandle, NULL, 0, Label, AddData, UefiHiiUpdateData);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ if (UefiHiiUpdateData != NULL) {\r
+ SafeFreePool (UefiHiiUpdateData->Data);\r
+ SafeFreePool (UefiHiiUpdateData);\r
+ }\r
+ }\r
+\r
+ return Status;\r
}\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/FrameworkIfrSupportLib.h>\r
+//#include <Library/FrameworkIfrSupportLib.h>\r
#include <Library/HiiLib.h>\r
#include <Library/ExtendedHiiLib.h>\r
\r
+//\r
+// There are some type redefinitions between Framework Ifr Support Library and \r
+// UEFI HII Ifr Support Library. We undefine the duplicated Framework definition here \r
+// so that the duplicated definitions in UEFI HII Ifr can be defined.\r
+// In this Thunk Module, we will access all Framework definition with "FRAMEWORK_" prefix.\r
+//\r
+#undef IFR_OPTION\r
+#undef EFI_HII_UPDATE_DATA\r
+\r
+#include <Library/IfrSupportLib.h>\r
+#include <Library/ExtendedIfrSupportLib.h>\r
+\r
//\r
// Macros\r
//\r
// Typedef\r
//\r
\r
+#pragma pack (push, 1)\r
typedef struct {\r
UINT32 BinaryLength;\r
EFI_HII_PACKAGE_HEADER PackageHeader;\r
} TIANO_AUTOGEN_PACKAGES_HEADER;\r
+#pragma pack (pop)\r
\r
#define EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, EFI_HII_THUNK_PRIVATE_DATA, Hii, EFI_HII_THUNK_DRIVER_DATA_SIGNATURE)\r
#define EFI_HII_THUNK_DRIVER_DATA_SIGNATURE EFI_SIGNATURE_32 ('H', 'i', 'I', 'T')\r
IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
IN EFI_FORM_LABEL Label,\r
IN BOOLEAN AddData,\r
- IN EFI_HII_UPDATE_DATA *Data\r
+ IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data\r
)\r
;\r
\r
\r
for (Index = 0; Index < NumberOfPackages; Index++) {\r
CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->BinaryLength, sizeof (UINT32));\r
- PackageListLength += PackageLength;\r
+ //\r
+ //TIANO_AUTOGEN_PACKAGES_HEADER.BinaryLength include the BinaryLength itself.\r
+ //\r
+ PackageListLength += (PackageLength - sizeof(UINT32)); \r
}\r
\r
//\r
{\r
EFI_STATUS Status;\r
EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- LIST_ENTRY *ListEntry;\r
HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ EFI_DEVICE_PATH_PROTOCOL *Path;\r
\r
Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
\r
- if (Handle == HandleMapEntry->FrameworkHiiHandle) {\r
- Status = mUefiHiiDatabaseProtocol->RemovePackageList (\r
- mUefiHiiDatabaseProtocol,\r
- HandleMapEntry->UefiHiiHandle\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- RemoveEntryList (ListEntry);\r
- return Status;\r
+ if (HandleMapEntry->UefiHiiHandle != NULL) {\r
+ Status = mUefiHiiDatabaseProtocol->RemovePackageList (\r
+ mUefiHiiDatabaseProtocol,\r
+ HandleMapEntry->UefiHiiHandle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = gBS->HandleProtocol (\r
+ HandleMapEntry->UefiHiiHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &Path\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = gBS->UninstallProtocolInterface (\r
+ HandleMapEntry->UefiHiiHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ Path\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ FreePool (Path);\r
+ }\r
}\r
+\r
+ RemoveEntryList (&HandleMapEntry->List);\r
+\r
+ FreePool (HandleMapEntry);\r
+ return Status;\r
}\r
\r
return EFI_NOT_FOUND;\r
IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle\r
)\r
{\r
- LIST_ENTRY *ListEntry;\r
HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
\r
ASSERT (FrameworkHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
ASSERT (Private != NULL);\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
+ HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, FrameworkHiiHandle);\r
\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
-\r
- if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
- return HandleMapEntry->UefiHiiHandle;\r
- }\r
+ if (HandleMapEntry != NULL) {\r
+ return HandleMapEntry->UefiHiiHandle;\r
}\r
\r
return (EFI_HII_HANDLE) NULL;\r
return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
}\r
\r
+\r
+EFI_HII_HANDLE *\r
+TagGuidToUefiIfrHiiHandle (\r
+ IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+ IN CONST EFI_GUID *Guid\r
+ )\r
+{\r
+ LIST_ENTRY *ListEntry;\r
+ HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+\r
+ for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+ ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+ ListEntry = ListEntry->ForwardLink\r
+ ) {\r
+ HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+\r
+ if (CompareGuid (Guid, &HandleMapEntry->TagGuid) && HandleMapEntry->DoesPackageListImportStringPackages) {\r
+ return HandleMapEntry->UefiHiiHandle;\r
+ }\r
+ }\r
+\r
+ return (EFI_HII_HANDLE *) NULL;\r
+ \r
+}\r
+\r
+\r
+\r
+\r
+\r