\r
#include "HiiDatabase.h"\r
\r
-HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE ConfigAccessProtocolInstanceTempate = {\r
- HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE,\r
+BOOLEAN mHiiPackageListUpdated;\r
+\r
+CONFIG_ACCESS_PRIVATE gConfigAccessPrivateTempate = {\r
+ CONFIG_ACCESS_PRIVATE_SIGNATURE,\r
{\r
ThunkExtractConfig,\r
ThunkRouteConfig,\r
ThunkCallback\r
}, //ConfigAccessProtocol\r
- NULL, //FrameworkFormCallbackProtocol\r
- {NULL, NULL} //ConfigAccessStorageListHead\r
+ NULL, //FormCallbackProtocol\r
+ {NULL, NULL}, //ConfigAccessStorageListHead\r
+ NULL \r
};\r
\r
/**\r
Framework Module which does not include packages introduced by UEFI Specification\r
or packages that is not supported by Thunk layer.\r
\r
- @param Packages The Framework Package List\r
+ @param Packages The Framework Package List\r
\r
- @retval EFI_HII_PACKAGE_HEADER* Return the Package Header of\r
- Form Package.\r
- @retval NULL If no Form Package is found.\r
+ @retval EFI_HII_PACKAGE_HEADER* Return the Package Header of Form Package.\r
+ @retval NULL If no Form Package is found.\r
**/\r
EFI_HII_PACKAGE_HEADER *\r
GetIfrFormSet (\r
If FormSetPackage is not EFI_HII_PACKAGE_FORM, then ASSERT.\r
If there is no linear buffer storage in this formset, then ASSERT.\r
\r
- @param FormSetPackage The Form Package header.\r
+ @param FormSetPackage The Form Package header.\r
@param BufferStorageListHead The link list for the VARSTORE found in the form package.\r
\r
- @retval EFI_SUCCESS The function scan the form set and find one or more \r
- VARSTOREs.\r
+ @retval EFI_SUCCESS The function scan the form set and find one or more VARSTOREs.\r
@retval EFI_OUT_OF_RESOURCES There is not enough memory to complete the function.\r
**/\r
EFI_STATUS\r
UINT8 *OpCodeData;\r
UINT8 Operand;\r
EFI_IFR_VARSTORE *VarStoreOpCode;\r
- HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey;\r
+ BUFFER_STORAGE_ENTRY *BufferStorage;\r
\r
ASSERT (FormSetPackage->Type == EFI_HII_PACKAGE_FORM);\r
\r
OpCodeOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ //\r
+ // Scan all opcode for the FormSet Package for \r
+ // EFI_IFR_VARSTORE_OP opcode.\r
+ //\r
while (OpCodeOffset < FormSetPackage->Length) {\r
OpCodeData = (UINT8 *) FormSetPackage + OpCodeOffset;\r
\r
\r
if (Operand == EFI_IFR_VARSTORE_OP) {\r
VarStoreOpCode = (EFI_IFR_VARSTORE *)OpCodeData;\r
- BufferStorageKey = AllocateZeroPool (sizeof (*BufferStorageKey));\r
- if (BufferStorageKey == NULL) {\r
+ BufferStorage = AllocateZeroPool (sizeof (*BufferStorage));\r
+ if (BufferStorage == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- CopyMem (&BufferStorageKey->Guid, &VarStoreOpCode->Guid, sizeof (EFI_GUID));\r
+ //\r
+ // Record the attributes: GUID, Name, VarStoreId and Size.\r
+ //\r
+ CopyMem (&BufferStorage->Guid, &VarStoreOpCode->Guid, sizeof (EFI_GUID));\r
\r
- BufferStorageKey->Name = AllocateZeroPool (AsciiStrSize (VarStoreOpCode->Name) * 2);\r
- AsciiStrToUnicodeStr (VarStoreOpCode->Name, BufferStorageKey->Name);\r
+ BufferStorage->Name = AllocateZeroPool (AsciiStrSize (VarStoreOpCode->Name) * 2);\r
+ AsciiStrToUnicodeStr (VarStoreOpCode->Name, BufferStorage->Name);\r
\r
- BufferStorageKey->VarStoreId = VarStoreOpCode->VarStoreId;\r
+ BufferStorage->VarStoreId = VarStoreOpCode->VarStoreId;\r
\r
- BufferStorageKey->Size = VarStoreOpCode->Size;\r
- BufferStorageKey->Signature = HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE;\r
+ BufferStorage->Size = VarStoreOpCode->Size;\r
+ BufferStorage->Signature = BUFFER_STORAGE_ENTRY_SIGNATURE;\r
\r
- InsertTailList (BufferStorageListHead, &BufferStorageKey->List);\r
+ InsertTailList (BufferStorageListHead, &BufferStorage->Link);\r
}\r
}\r
\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
+\r
/**\r
This function installs a EFI_CONFIG_ACCESS_PROTOCOL instance for a form package registered\r
by a module using Framework HII Protocol Interfaces.\r
UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
that Setup Utility can load the Buffer Storage using this protocol.\r
\r
- @param Packages The framework package list.\r
- @param MapEntry The Thunk Layer Handle Mapping Database Entry.\r
+ @param Packages The framework package list.\r
+ @param ThunkContext The Thunk Layer Handle Mapping Database Entry.\r
\r
- @retval EFI_SUCCESS The Config Access Protocol is installed successfully.\r
- @retval EFI_OUT_RESOURCE There is not enough memory.\r
+ @retval EFI_SUCCESS The Config Access Protocol is installed successfully.\r
+ @retval EFI_OUT_RESOURCE There is not enough memory.\r
\r
**/\r
EFI_STATUS\r
-InstallDefaultUefiConfigAccessProtocol (\r
- IN CONST EFI_HII_PACKAGES *Packages,\r
- IN OUT HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
+InstallDefaultConfigAccessProtocol (\r
+ IN CONST EFI_HII_PACKAGES *Packages,\r
+ IN OUT HII_THUNK_CONTEXT *ThunkContext\r
)\r
{\r
EFI_HII_PACKAGE_HEADER *FormSetPackage;\r
EFI_STATUS Status;\r
- HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigAccessInstance;\r
+ CONFIG_ACCESS_PRIVATE *ConfigAccessInstance;\r
\r
- Status = HiiLibCreateHiiDriverHandle (&MapEntry->UefiHiiDriverHandle);\r
+ Status = HiiLibCreateHiiDriverHandle (&ThunkContext->UefiHiiDriverHandle);\r
ConfigAccessInstance = AllocateCopyPool (\r
- sizeof (HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE), \r
- &ConfigAccessProtocolInstanceTempate\r
+ sizeof (CONFIG_ACCESS_PRIVATE), \r
+ &gConfigAccessPrivateTempate\r
);\r
ASSERT (ConfigAccessInstance != NULL);\r
- InitializeListHead (&ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
+ \r
+ InitializeListHead (&ConfigAccessInstance->BufferStorageListHead);\r
\r
//\r
// We assume there is only one formset package in each Forms Package\r
FormSetPackage = GetIfrFormSet (Packages);\r
ASSERT (FormSetPackage != NULL);\r
\r
- Status = GetBufferStorage (FormSetPackage, &ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
+ Status = GetBufferStorage (FormSetPackage, &ConfigAccessInstance->BufferStorageListHead);\r
if (EFI_ERROR (Status)) {\r
FreePool (ConfigAccessInstance);\r
ASSERT (FALSE);\r
}\r
\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
- &MapEntry->UefiHiiDriverHandle,\r
+ &ThunkContext->UefiHiiDriverHandle,\r
&gEfiHiiConfigAccessProtocolGuid,\r
&ConfigAccessInstance->ConfigAccessProtocol,\r
NULL\r
);\r
+ //\r
+ //BUGBUG: Remove when done.\r
+ //\r
ASSERT_EFI_ERROR (Status);\r
+ \r
if (EFI_ERROR (Status)) {\r
FreePool (ConfigAccessInstance);\r
return Status;\r
}\r
+\r
+ ConfigAccessInstance->ThunkContext = ThunkContext;\r
\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
+VOID\r
+DestroyBufferStorageList (\r
+ IN LIST_ENTRY *ListHead\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ BUFFER_STORAGE_ENTRY *Entry;\r
\r
- Wrap EFI_HII_CONFIG_ACCESS_PROTOCOL.RouteConfig to a call to EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
- \r
- @param BufferStorageKey The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
- @param FrameworkFormCallBack The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
- @param Data The data to be saved.\r
- @param DataSize The size of data.\r
- \r
- @retval EFI_STATUS The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
- **/\r
-EFI_STATUS\r
-RouteConfigToFrameworkFormCallBack (\r
- IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
- IN EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallBack,\r
- IN VOID *Data,\r
- IN UINTN DataSize\r
+ while (!IsListEmpty (ListHead)) {\r
+ Link = GetFirstNode (ListHead);\r
+ \r
+ Entry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
+\r
+ FreePool (Entry->Name);\r
+ Link = RemoveEntryList (Link);\r
+\r
+ FreePool (Entry);\r
+ }\r
+}\r
+\r
+VOID\r
+UninstallDefaultConfigAccessProtocol (\r
+ IN HII_THUNK_CONTEXT *ThunkContext\r
)\r
{\r
- EFI_STATUS Status;\r
- BOOLEAN ResetRequired;\r
+ EFI_STATUS Status;\r
+ EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
+ CONFIG_ACCESS_PRIVATE *ConfigAccessInstance;\r
+ \r
+ HiiLibDestroyHiiDriverHandle (ThunkContext->UefiHiiDriverHandle);\r
+\r
+ Status = gBS->HandleProtocol (\r
+ ThunkContext->UefiHiiDriverHandle,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ (VOID **) &ConfigAccess\r
+ );\r
+\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = gBS->UninstallProtocolInterface (\r
+ ThunkContext->UefiHiiDriverHandle,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ ConfigAccess\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ ConfigAccessInstance = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (ConfigAccess);\r
+\r
+ DestroyBufferStorageList (&ConfigAccessInstance->BufferStorageListHead);\r
\r
- Status = FrameworkFormCallBack->NvWrite (\r
- FrameworkFormCallBack, \r
- BufferStorageKey->Name,\r
- &BufferStorageKey->Guid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- DataSize,\r
- Data,\r
- &ResetRequired\r
- );\r
- return Status;\r
}\r
+ \r
\r
/**\r
Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
\r
- @param BufferStorageKey The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
- @param FrameworkFormCallBack The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
- @param Data The data read.\r
- @param DataSize The size of data.\r
+ @param BufferStorage The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
+ @param FwFormCallBack The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
+ @param Data The data read.\r
+ @param DataSize The size of data.\r
\r
- @retval EFI_STATUS The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
+ @retval EFI_STATUS The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
@retval EFI_INVALID_PARAMETER If the EFI_FORM_CALLBACK_PROTOCOL.NvRead return the size information of the data\r
- does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
+ does not match what has been recorded early in he BUFFER_STORAGE_ENTRY.\r
**/\r
EFI_STATUS\r
-ExtractConfigFromFrameworkFormCallBack (\r
- IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
- IN EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallBack,\r
+CallFormCallBack (\r
+ IN BUFFER_STORAGE_ENTRY *BufferStorage,\r
+ IN EFI_FORM_CALLBACK_PROTOCOL *FwFormCallBack,\r
OUT VOID **Data,\r
OUT UINTN *DataSize\r
)\r
*DataSize = 0;\r
*Data = NULL;\r
\r
- Status = FrameworkFormCallBack->NvRead (\r
- FrameworkFormCallBack, \r
- BufferStorageKey->Name,\r
- &BufferStorageKey->Guid,\r
+ Status = FwFormCallBack->NvRead (\r
+ FwFormCallBack, \r
+ BufferStorage->Name,\r
+ &BufferStorage->Guid,\r
NULL,\r
DataSize,\r
*Data\r
);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
- if (BufferStorageKey->Size != *DataSize) {\r
+ if (BufferStorage->Size != *DataSize) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- FrameworkFormCallBack->NvRead (\r
- FrameworkFormCallBack, \r
- BufferStorageKey->Name,\r
- &BufferStorageKey->Guid,\r
+ FwFormCallBack->NvRead (\r
+ FwFormCallBack, \r
+ BufferStorage->Name,\r
+ &BufferStorage->Guid,\r
NULL,\r
DataSize,\r
*Data\r
return Status;\r
}\r
\r
-/**\r
- Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to UEFI Variable Set Service.\r
- \r
- @param BufferStorageKey The key with all attributes needed to call a UEFI Variable Get Service.\r
- @param Data The data read.\r
- @param DataSize The size of data.\r
-\r
- @retval EFI_STATUS The status returned by the UEFI Variable Set Service.\r
- \r
- **/\r
-EFI_STATUS\r
-RouteConfigToUefiVariable (\r
- IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
- IN VOID *Data,\r
- IN UINTN DataSize\r
- )\r
-{\r
- return gRT->SetVariable (\r
- BufferStorageKey->Name,\r
- &BufferStorageKey->Guid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- DataSize,\r
- Data\r
- );\r
- \r
-}\r
\r
/**\r
Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to UEFI Variable Get Service.\r
\r
- @param BufferStorageKey The key with all attributes needed to call a UEFI Variable Get Service.\r
- @param Data The data read.\r
- @param DataSize The size of data.\r
+ @param BufferStorage The key with all attributes needed to call a UEFI Variable Get Service.\r
+ @param Data The data read.\r
+ @param DataSize The size of data.\r
\r
If the UEFI Variable Get Service return the size information of the data\r
- does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
+ does not match what has been recorded early in he BUFFER_STORAGE_ENTRY.\r
then ASSERT.\r
\r
- @retval EFI_STATUS The status returned by the UEFI Variable Get Service.\r
+ @retval EFI_STATUS The status returned by the UEFI Variable Get Service.\r
@retval EFI_INVALID_PARAMETER If the UEFI Variable Get Service return the size information of the data\r
- does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
+ does not match what has been recorded early in he BUFFER_STORAGE_ENTRY.\r
**/\r
\r
EFI_STATUS\r
-ExtractConfigFromUefiVariable (\r
- IN HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey,\r
+GetUefiVariable (\r
+ IN BUFFER_STORAGE_ENTRY *BufferStorage,\r
OUT VOID **Data,\r
OUT UINTN *DataSize\r
)\r
*DataSize = 0;\r
*Data = NULL;\r
Status = gRT->GetVariable (\r
- BufferStorageKey->Name,\r
- &BufferStorageKey->Guid,\r
+ BufferStorage->Name,\r
+ &BufferStorage->Guid,\r
NULL,\r
DataSize,\r
*Data\r
);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
\r
- if (BufferStorageKey->Size != *DataSize) {\r
+ if (BufferStorage->Size != *DataSize) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
\r
Status = gRT->GetVariable (\r
- BufferStorageKey->Name,\r
- &BufferStorageKey->Guid,\r
+ BufferStorage->Name,\r
+ &BufferStorage->Guid,\r
NULL,\r
DataSize,\r
*Data\r
so that data can be read from the data storage such as UEFI Variable or module's\r
customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
@param Request A null-terminated Unicode string in <ConfigRequest> format. Note that this\r
- includes the routing information as well as the configurable name / value pairs. It is\r
- invalid for this string to be in <MultiConfigRequest> format.\r
+ includes the routing information as well as the configurable name / value pairs. It is\r
+ invalid for this string to be in <MultiConfigRequest> format.\r
\r
- @param Progress On return, points to a character in the Request string. Points to the string's null\r
- terminator if request was successful. Points to the most recent '&' before the first\r
- failing name / value pair (or the beginning of the string if the failure is in the first\r
- name / value pair) if the request was not successful\r
+ @param Progress On return, points to a character in the Request string. Points to the string's null\r
+ terminator if request was successful. Points to the most recent '&' before the first\r
+ failing name / value pair (or the beginning of the string if the failure is in the first\r
+ name / value pair) if the request was not successful\r
@param Results A null-terminated Unicode string in <ConfigAltResp> format which has all\r
- values filled in for the names in the Request string. String to be allocated by the called\r
- function.\r
+ values filled in for the names in the Request string. String to be allocated by the called\r
+ function.\r
\r
@retval EFI_INVALID_PARAMETER If there is no Buffer Storage for this Config Access instance.\r
- @retval EFI_SUCCESS The setting is retrived successfully.\r
- @retval !EFI_SUCCESS The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
+ @retval EFI_SUCCESS The setting is retrived successfully.\r
+ @retval !EFI_SUCCESS The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
**/\r
EFI_STATUS\r
EFIAPI\r
)\r
{\r
EFI_STATUS Status;\r
- HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigaAccessInstance;\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey;\r
+ CONFIG_ACCESS_PRIVATE *ConfigAccess;\r
+ LIST_ENTRY *Link;\r
+ BUFFER_STORAGE_ENTRY *BufferStorage;\r
VOID *Data;\r
UINTN DataSize;\r
\r
Data = NULL;\r
- ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+ ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);\r
\r
//\r
// For now, only one var varstore is supported so that we don't need to parse the Configuration string.\r
//\r
- ListEntry = GetFirstNode (&ConfigaAccessInstance->ConfigAccessBufferStorageListHead);\r
- if (ListEntry == NULL) {\r
+ Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+ if (Link == NULL) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- BufferStorageKey = HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry);\r
+ BufferStorage = BUFFER_STORAGE_ENTRY_FROM_LINK (Link);\r
\r
- if (ConfigaAccessInstance->FrameworkFormCallbackProtocol == NULL ||\r
- ConfigaAccessInstance->FrameworkFormCallbackProtocol->NvRead == NULL) {\r
- Status = ExtractConfigFromUefiVariable (\r
- BufferStorageKey,\r
+ if (ConfigAccess->FormCallbackProtocol == NULL ||\r
+ ConfigAccess->FormCallbackProtocol->NvRead == NULL) {\r
+ Status = GetUefiVariable (\r
+ BufferStorage,\r
&Data,\r
&DataSize\r
);\r
} else {\r
- Status = ExtractConfigFromFrameworkFormCallBack (\r
- BufferStorageKey,\r
- ConfigaAccessInstance->FrameworkFormCallbackProtocol,\r
+ Status = CallFormCallBack (\r
+ BufferStorage,\r
+ ConfigAccess->FormCallbackProtocol,\r
&Data,\r
&DataSize\r
);\r
so that data can be written to the data storage such as UEFI Variable or module's\r
customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
- @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
+ @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
@param Progress A pointer to a string filled in with the offset of the most recent '&' before the first\r
- failing name / value pair (or the beginning of the string if the failure is in the first\r
- name / value pair) or the terminating NULL if all was successful.\r
+ failing name / value pair (or the beginning of the string if the failure is in the first\r
+ name / value pair) or the terminating NULL if all was successful.\r
\r
@retval EFI_INVALID_PARAMETER If there is no Buffer Storage for this Config Access instance.\r
- @retval EFI_SUCCESS The setting is saved successfully.\r
- @retval !EFI_SUCCESS The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
+ @retval EFI_SUCCESS The setting is saved successfully.\r
+ @retval !EFI_SUCCESS The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
**/ \r
EFI_STATUS\r
EFIAPI\r
)\r
{\r
EFI_STATUS Status;\r
- HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigaAccessInstance;\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey;\r
- VOID *Data;\r
+ CONFIG_ACCESS_PRIVATE *ConfigAccess;\r
+ LIST_ENTRY *Link;\r
+ BUFFER_STORAGE_ENTRY *BufferStorage;\r
+ UINT8 *Data;\r
UINTN DataSize;\r
+ UINTN DataSize2;\r
UINTN LastModifiedByteIndex;\r
+ BOOLEAN ResetRequired;\r
+ BOOLEAN DataAllocated;\r
\r
Data = NULL;\r
- ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+ DataAllocated = TRUE;\r
+ ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);\r
\r
//\r
// For now, only one var varstore is supported so that we don't need to parse the Configuration string.\r
//\r
- ListEntry = GetFirstNode (&ConfigaAccessInstance->ConfigAccessBufferStorageListHead);\r
- if (ListEntry == NULL) {\r
+ Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+ if (Link == NULL) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- BufferStorageKey = HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry);\r
-\r
- Data = AllocateZeroPool (BufferStorageKey->Size);\r
- if (Data == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ BufferStorage = BUFFER_STORAGE_ENTRY_FROM_LINK (Link);\r
+ DataSize2 = BufferStorage->Size;\r
+ if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {\r
+ if (ConfigAccess->FormCallbackProtocol == NULL ||\r
+ ConfigAccess->FormCallbackProtocol->NvRead == NULL) {\r
+ Status = GetUefiVariable (\r
+ BufferStorage,\r
+ &Data,\r
+ &DataSize\r
+ );\r
+ ASSERT (DataSize == DataSize2);\r
+ \r
+ } else {\r
+ Status = CallFormCallBack (\r
+ BufferStorage,\r
+ ConfigAccess->FormCallbackProtocol,\r
+ &Data,\r
+ &DataSize\r
+ );\r
+ ASSERT (DataSize == DataSize2);\r
+ \r
+ }\r
+ } else {\r
+ Status = EFI_SUCCESS;\r
+ Data = ConfigAccess->ThunkContext->NvMapOverride;\r
+ DataSize = DataSize2;\r
+ DataAllocated = FALSE;\r
+ } \r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
}\r
+\r
Status = mHiiConfigRoutingProtocol->ConfigToBlock (\r
mHiiConfigRoutingProtocol,\r
Configuration,\r
&LastModifiedByteIndex,\r
Progress\r
);\r
-\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
\r
- DataSize = BufferStorageKey->Size;\r
- if (ConfigaAccessInstance->FrameworkFormCallbackProtocol == NULL ||\r
- ConfigaAccessInstance->FrameworkFormCallbackProtocol->NvRead == NULL) {\r
- Status = RouteConfigToUefiVariable (\r
- BufferStorageKey,\r
- Data,\r
- DataSize\r
- );\r
+ if (ConfigAccess->FormCallbackProtocol == NULL ||\r
+ ConfigAccess->FormCallbackProtocol->NvWrite == NULL) {\r
+ Status = gRT->SetVariable (\r
+ BufferStorage->Name,\r
+ &BufferStorage->Guid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ DataSize,\r
+ Data\r
+ );\r
} else {\r
- Status = RouteConfigToFrameworkFormCallBack (\r
- BufferStorageKey,\r
- ConfigaAccessInstance->FrameworkFormCallbackProtocol,\r
- Data,\r
- DataSize\r
- );\r
+ Status = ConfigAccess->FormCallbackProtocol->NvWrite (\r
+ ConfigAccess->FormCallbackProtocol, \r
+ BufferStorage->Name,\r
+ &BufferStorage->Guid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ DataSize,\r
+ Data,\r
+ &ResetRequired\r
+ );\r
+ \r
}\r
\r
-Done: \r
- SafeFreePool (Data);\r
+Done: \r
+ if (DataAllocated && (Data != NULL)) {\r
+ FreePool (Data);\r
+ }\r
+ \r
return Status;\r
}\r
\r
+FRAMEWORK_EFI_IFR_DATA_ARRAY *\r
+CreateIfrDataArray (\r
+ IN CONFIG_ACCESS_PRIVATE *ConfigAccess,\r
+ IN EFI_QUESTION_ID QuestionId,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE *Value,\r
+ OUT BOOLEAN *NvMapAllocated\r
+ )\r
+{\r
+ FRAMEWORK_EFI_IFR_DATA_ARRAY *IfrDataArray;\r
+ FRAMEWORK_EFI_IFR_DATA_ENTRY *IfrDataEntry;\r
+ UINTN BrowserDataSize;\r
+ BUFFER_STORAGE_ENTRY *BufferStorageEntry;\r
+ LIST_ENTRY *Link;\r
+\r
+ IfrDataArray = AllocateZeroPool (0x100);\r
+ ASSERT (IfrDataArray != NULL);\r
+\r
+ if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {\r
+ Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+\r
+ ASSERT (!IsNull (&ConfigAccess->BufferStorageListHead, Link));\r
+\r
+ BufferStorageEntry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
+\r
+ BrowserDataSize = BufferStorageEntry->Size;\r
+ *NvMapAllocated = TRUE;\r
+ IfrDataArray->NvRamMap = AllocateZeroPool (BrowserDataSize);\r
+ GetBrowserData (NULL, NULL, &BrowserDataSize, IfrDataArray->NvRamMap);\r
+ } else {\r
+ *NvMapAllocated = FALSE;\r
+ IfrDataArray->NvRamMap = ConfigAccess->ThunkContext->NvMapOverride;\r
+ }\r
+\r
+ IfrDataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) (IfrDataArray + 1);\r
+\r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ case EFI_IFR_TYPE_BOOLEAN:\r
+ CopyMem (&IfrDataEntry->Data, &(Value->u8), sizeof (*Value));\r
+ break;\r
+\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ }\r
+\r
+ return IfrDataArray;\r
+}\r
+\r
+VOID\r
+DestroyIfrDataArray (\r
+ IN FRAMEWORK_EFI_IFR_DATA_ARRAY *Array,\r
+ IN BOOLEAN NvMapAllocated\r
+ )\r
+{\r
+ if (NvMapAllocated) {\r
+ FreePool (Array->NvRamMap);\r
+ }\r
+\r
+ FreePool (Array);\r
+}\r
+\r
+\r
+ONE_OF_OPTION_MAP_ENTRY *\r
+GetOneOfOptionMapEntry (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN EFI_QUESTION_ID QuestionId,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE *Value\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+ ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
+ ONE_OF_OPTION_MAP *OneOfOptionMap;\r
+\r
+ Link = GetFirstNode (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+ while (!IsNull (&ThunkContext->OneOfOptionMapListHead, Link)) {\r
+ OneOfOptionMap = ONE_OF_OPTION_MAP_FROM_LINK(Link);\r
+ if (OneOfOptionMap->QuestionId == QuestionId) {\r
+ ASSERT (OneOfOptionMap->ValueType == Type);\r
+\r
+ Link2 = GetFirstNode (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+\r
+ while (!IsNull (&OneOfOptionMap->OneOfOptionMapEntryListHead, Link2)) {\r
+ OneOfOptionMapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+ if (CompareMem (Value, &OneOfOptionMapEntry->Value, sizeof (EFI_IFR_TYPE_VALUE)) == 0) {\r
+ return OneOfOptionMapEntry;\r
+ }\r
+\r
+ Link2 = GetNextNode (&OneOfOptionMap->OneOfOptionMapEntryListHead, Link2);\r
+ }\r
+ }\r
+\r
+ Link = GetNextNode (&ThunkContext->OneOfOptionMapListHead, Link);\r
+ }\r
+\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Functions which are registered to receive notification of\r
+ database events have this prototype. The actual event is encoded\r
+ in NotifyType. The following table describes how PackageType,\r
+ PackageGuid, Handle, and Package are used for each of the\r
+ notification types.\r
+\r
+ @param PackageType Package type of the notification.\r
+\r
+ @param PackageGuid If PackageType is\r
+ EFI_HII_PACKAGE_TYPE_GUID, then this is\r
+ the pointer to the GUID from the Guid\r
+ field of EFI_HII_PACKAGE_GUID_HEADER.\r
+ Otherwise, it must be NULL.\r
+\r
+ @param Package Points to the package referred to by the\r
+ notification Handle The handle of the package\r
+ list which contains the specified package.\r
+\r
+ @param Handle The HII handle.\r
+\r
+ @param NotifyType The type of change concerning the\r
+ database. See\r
+ EFI_HII_DATABASE_NOTIFY_TYPE.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FormUpdateNotify (\r
+ IN UINT8 PackageType,\r
+ IN CONST EFI_GUID *PackageGuid,\r
+ IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
+ IN EFI_HII_HANDLE Handle,\r
+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
+ )\r
+{\r
+ mHiiPackageListUpdated = TRUE;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.CallBack to EFI_FORM_CALLBACK_PROTOCOL.Callback. Therefor,\r
the framework HII module willl do no porting (except some porting works needed for callback for EFI_ONE_OF_OPTION opcode)\r
and still work with a UEFI HII SetupBrowser.\r
\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Action Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param Action Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
@param QuestionId A unique value which is sent to the original exporting driver so that it can identify the\r
- type of data to expect. The format of the data tends to vary based on the opcode that\r
- generated the callback.\r
- @param Type The type of value for the question. See EFI_IFR_TYPE_x in\r
- EFI_IFR_ONE_OF_OPTION.\r
- @param Value A pointer to the data being sent to the original exporting driver. The type is specified\r
- by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
- EFI_IFR_ONE_OF_OPTION.\r
+ type of data to expect. The format of the data tends to vary based on the opcode that\r
+ generated the callback.\r
+ @param Type The type of value for the question. See EFI_IFR_TYPE_x in\r
+ EFI_IFR_ONE_OF_OPTION.\r
+ @param Value A pointer to the data being sent to the original exporting driver. The type is specified\r
+ by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
+ EFI_IFR_ONE_OF_OPTION.\r
@param ActionRequest On return, points to the action requested by the callback function. Type\r
- EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
- Browser Protocol.\r
+ EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
+ Browser Protocol.\r
\r
- @retval EFI_UNSUPPORTED If the Framework HII module does not register Callback although it specify the opcode under\r
- focuse to be INTERRACTIVE.\r
+ @retval EFI_UNSUPPORTED If the Framework HII module does not register Callback although it specify the opcode under\r
+ focuse to be INTERRACTIVE.\r
@retval EFI_SUCCESS The callback complete successfully.\r
@retval !EFI_SUCCESS The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.\r
\r
)\r
{\r
EFI_STATUS Status;\r
- HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigaAccessInstance;\r
- EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallbackProtocol;\r
+ CONFIG_ACCESS_PRIVATE *ConfigAccess;\r
+ EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;\r
EFI_HII_CALLBACK_PACKET *Packet;\r
- FRAMEWORK_EFI_IFR_DATA_ARRAY Data;\r
+ FRAMEWORK_EFI_IFR_DATA_ARRAY *Data;\r
FRAMEWORK_EFI_IFR_DATA_ENTRY *DataEntry;\r
- EFI_FORM_CALLBACK Callback; \r
+ UINT16 KeyValue;\r
+ ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
+ EFI_HANDLE NotifyHandle;\r
+ EFI_INPUT_KEY Key; \r
+ BOOLEAN NvMapAllocated;\r
\r
ASSERT (This != NULL);\r
ASSERT (Value != NULL);\r
\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
\r
- ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+ ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);\r
\r
- FrameworkFormCallbackProtocol = ConfigaAccessInstance->FrameworkFormCallbackProtocol;\r
- if (FrameworkFormCallbackProtocol == NULL) {\r
+ FormCallbackProtocol = ConfigAccess->FormCallbackProtocol;\r
+ if (FormCallbackProtocol == NULL) {\r
+ ASSERT (FALSE);\r
return EFI_UNSUPPORTED;\r
}\r
- Callback = FrameworkFormCallbackProtocol->Callback;\r
\r
- Status = Callback (\r
- FrameworkFormCallbackProtocol,\r
- QuestionId,\r
- &Data,\r
+ //\r
+ // Check if the QuestionId match a OneOfOption.\r
+ //\r
+ OneOfOptionMapEntry = GetOneOfOptionMapEntry (ConfigAccess->ThunkContext, QuestionId, Type, Value);\r
+\r
+ if (OneOfOptionMapEntry == NULL) {\r
+ //\r
+ // This is not a One-Of-Option opcode. QuestionId is the KeyValue\r
+ //\r
+ KeyValue = QuestionId;\r
+ } else {\r
+ KeyValue = OneOfOptionMapEntry->FwKey;\r
+ }\r
+\r
+ //\r
+ // Build the FRAMEWORK_EFI_IFR_DATA_ARRAY\r
+ //\r
+ Data = CreateIfrDataArray (ConfigAccess, QuestionId, Type, Value, &NvMapAllocated);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_FORM,\r
+ NULL,\r
+ FormUpdateNotify,\r
+ EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
+ &NotifyHandle\r
+ );\r
+ //\r
+ //\r
+ //\r
+ Packet = NULL;\r
+ Status = FormCallbackProtocol->Callback (\r
+ FormCallbackProtocol,\r
+ KeyValue,\r
+ Data,\r
&Packet\r
);\r
\r
//\r
// Callback require browser to perform action\r
//\r
- if (Packet != NULL) {\r
- if (Packet->DataArray.EntryCount == 1 && Packet->DataArray.NvRamMap == NULL) {\r
- DataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY));\r
- switch (DataEntry->Flags) {\r
- case EXIT_REQUIRED:\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
- break;\r
- case SAVE_REQUIRED:\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
- break;\r
- case RESET_REQUIRED:\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_RESET;\r
- break;\r
- default:\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
- break; \r
- }\r
+ if (EFI_ERROR (Status)) {\r
+ if (Packet != NULL) {\r
+ //\r
+ // BUGBUG: need to restore the changing question to default value\r
+ //\r
+\r
+ do {\r
+ IfrLibCreatePopUp (1, &Key, Packet->String);\r
+\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+ \r
}\r
+\r
+ //\r
+ // Error Code in Status is discarded.\r
+ //\r
+ } else {\r
+ if (Packet != NULL) {\r
+ if (Packet->DataArray.EntryCount == 1 && Packet->DataArray.NvRamMap == NULL) {\r
+ DataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY));\r
+ if ((DataEntry->Flags & EXIT_REQUIRED) == EXIT_REQUIRED) {\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+ }\r
+\r
+ if ((DataEntry->Flags & SAVE_REQUIRED) == SAVE_REQUIRED) {\r
+ Status = ConfigAccess->ConfigAccessProtocol.RouteConfig (\r
+ &ConfigAccess->ConfigAccessProtocol,\r
+ NULL,\r
+ NULL\r
+ );\r
+ }\r
+ }\r
+ FreePool (Packet);\r
+ }\r
+ }\r
+\r
+ //\r
+ // Unregister notify for Form package update\r
+ //\r
+ Status = mHiiDatabase->UnregisterPackageNotify (\r
+ mHiiDatabase,\r
+ NotifyHandle\r
+ );\r
+ //\r
+ // UEFI SetupBrowser handles scenario differently with Framework SetupBrowser when call back function \r
+ // update any forms in HII database. UEFI SetupBrowser will re-parse the displaying form package and load\r
+ // the values from variable storages. Framework SetupBrowser will only re-parse the displaying form packages.\r
+ // To make sure customer's previous changes is saved and the changing question behaves as expected, we\r
+ // issue a EFI_BROWSER_ACTION_REQUEST_SUBMIT to ask UEFI SetupBrowser to save the changes proceed to re-parse\r
+ // the form and load all the variable storages.\r
+ //\r
+ if (*ActionRequest == EFI_BROWSER_ACTION_REQUEST_NONE && mHiiPackageListUpdated) {\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
}\r
+\r
+ DestroyIfrDataArray (Data, NvMapAllocated);\r
\r
return Status;\r
}\r
that Setup Utility can load the Buffer Storage using this protocol.\r
\r
@param Packages The framework package list.\r
- @param MapEntry The Thunk Layer Handle Mapping Database Entry.\r
+ @param ThunkContext The Thunk Layer Handle Mapping Database Entry.\r
\r
- @retval EFI_SUCCESS The Config Access Protocol is installed successfully.\r
+ @retval EFI_SUCCESS The Config Access Protocol is installed successfully.\r
@retval EFI_OUT_RESOURCE There is not enough memory.\r
\r
**/\r
EFI_STATUS\r
-InstallDefaultUefiConfigAccessProtocol (\r
+InstallDefaultConfigAccessProtocol (\r
IN CONST EFI_HII_PACKAGES *Packages,\r
- IN OUT HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
+ IN OUT HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+;\r
+\r
+VOID\r
+UninstallDefaultConfigAccessProtocol (\r
+ IN HII_THUNK_CONTEXT *ThunkContext\r
)\r
;\r
\r
so that data can be read from the data storage such as UEFI Variable or module's\r
customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
@param Request A null-terminated Unicode string in <ConfigRequest> format. Note that this\r
- includes the routing information as well as the configurable name / value pairs. It is\r
- invalid for this string to be in <MultiConfigRequest> format.\r
+ includes the routing information as well as the configurable name / value pairs. It is\r
+ invalid for this string to be in <MultiConfigRequest> format.\r
\r
- @param Progress On return, points to a character in the Request string. Points to the string's null\r
- terminator if request was successful. Points to the most recent '&' before the first\r
- failing name / value pair (or the beginning of the string if the failure is in the first\r
- name / value pair) if the request was not successful\r
+ @param Progress On return, points to a character in the Request string. Points to the string's null\r
+ terminator if request was successful. Points to the most recent '&' before the first\r
+ failing name / value pair (or the beginning of the string if the failure is in the first\r
+ name / value pair) if the request was not successful\r
@param Results A null-terminated Unicode string in <ConfigAltResp> format which has all\r
- values filled in for the names in the Request string. String to be allocated by the called\r
- function.\r
+ values filled in for the names in the Request string. String to be allocated by the called\r
+ function.\r
\r
@retval EFI_INVALID_PARAMETER If there is no Buffer Storage for this Config Access instance.\r
- @retval EFI_SUCCESS The setting is retrived successfully.\r
- @retval !EFI_SUCCESS The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
+ @retval EFI_SUCCESS The setting is retrived successfully.\r
+ @retval !EFI_SUCCESS The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
**/\r
EFI_STATUS\r
EFIAPI\r
customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
\r
@param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
- @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
- @param Progress A pointer to a string filled in with the offset of the most recent '&' before the first\r
- failing name / value pair (or the beginning of the string if the failure is in the first\r
- name / value pair) or the terminating NULL if all was successful.\r
+ @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
+ @param Progress A pointer to a string filled in with the offset of the most recent '&' before the first\r
+ failing name / value pair (or the beginning of the string if the failure is in the first\r
+ name / value pair) or the terminating NULL if all was successful.\r
\r
@retval EFI_INVALID_PARAMETER If there is no Buffer Storage for this Config Access instance.\r
- @retval EFI_SUCCESS The setting is saved successfully.\r
- @retval !EFI_SUCCESS The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
+ @retval EFI_SUCCESS The setting is saved successfully.\r
+ @retval !EFI_SUCCESS The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
**/ \r
EFI_STATUS\r
EFIAPI\r
the framework HII module willl do no porting (except some porting works needed for callback for EFI_ONE_OF_OPTION opcode)\r
and still work with a UEFI HII SetupBrowser.\r
\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Action Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
- @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the\r
- type of data to expect. The format of the data tends to vary based on the opcode that\r
- generated the callback.\r
- @param Type The type of value for the question. See EFI_IFR_TYPE_x in\r
- EFI_IFR_ONE_OF_OPTION.\r
- @param Value A pointer to the data being sent to the original exporting driver. The type is specified\r
- by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
- EFI_IFR_ONE_OF_OPTION.\r
- @param ActionRequest On return, points to the action requested by the callback function. Type\r
- EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
- Browser Protocol.\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param Action Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
+ @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the\r
+ type of data to expect. The format of the data tends to vary based on the opcode that\r
+ generated the callback.\r
+ @param Type The type of value for the question. See EFI_IFR_TYPE_x in\r
+ EFI_IFR_ONE_OF_OPTION.\r
+ @param Value A pointer to the data being sent to the original exporting driver. The type is specified\r
+ by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
+ EFI_IFR_ONE_OF_OPTION.\r
+ @param ActionRequest On return, points to the action requested by the callback function. Type\r
+ EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
+ Browser Protocol.\r
\r
@retval EFI_UNSUPPORTED If the Framework HII module does not register Callback although it specify the opcode under\r
- focuse to be INTERRACTIVE.\r
- @retval EFI_SUCCESS The callback complete successfully.\r
- @retval !EFI_SUCCESS The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.\r
+ focuse to be INTERRACTIVE.\r
+ @retval EFI_SUCCESS The callback complete successfully.\r
+ @retval !EFI_SUCCESS The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.\r
\r
**/\r
EFI_STATUS\r
\r
UINT8 mGlyphBuffer[EFI_GLYPH_WIDTH * 2 * EFI_GLYPH_HEIGHT];\r
\r
+/**\r
+ This function is only called by Graphics Console module and GraphicsLib. \r
+ EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib \r
+ complying to UEFI HII.\r
+ \r
+ This function will ASSERT and return EFI_UNSUPPORTED.\r
+\r
+ @param This N.A.\r
+ @param Source N.A.\r
+ @param Index N.A.\r
+ @param GlyphBuffer N.A.\r
+ @param BitWidth N.A.\r
+ @param InternalStatus N.A.\r
+\r
+ @return EFI_UNSUPPORTED N.A.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
HiiGetGlyph (\r
OUT UINT16 *BitWidth,\r
IN OUT UINT32 *InternalStatus\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Translates a Unicode character into the corresponding font glyph.\r
- If the Source was pointing to a non-spacing character, the next Source[*Index]\r
- character will be parsed and OR'd to the GlyphBuffer until a spacing character\r
- is found in the Source. Since non-spacing characters are considered to be the\r
- same pixel width as a regular character their BitWidth will be reflected correctly\r
- however due to their special attribute, they are considered to be zero advancing width.\r
- This basically means that the cursor would not advance, thus the character that follows\r
- it would overlay the non-spacing character. The Index is modified to reflect both the\r
- incoming array entry into the Source string but also the outgoing array entry after having\r
- parsed the equivalent of a single Glyph's worth of data.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
{\r
ASSERT (FALSE);\r
return EFI_UNSUPPORTED;\r
}\r
\r
+/**\r
+ This function is only called by Graphics Console module and GraphicsLib. \r
+ EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib \r
+ complying to UEFI HII.\r
+ \r
+ This function will ASSERT and return EFI_UNSUPPORTED.\r
+\r
+ @param This N.A.\r
+ @param GlyphBuffer N.A.\r
+ @param Foreground N.A.\r
+ @param Background N.A.\r
+ @param Count N.A.\r
+ @param Width N.A.\r
+ @param Height N.A.\r
+ @param BltBuffer N.A.\r
+\r
+ @return EFI_UNSUPPORTED N.A.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
HiiGlyphToBlt (\r
#include "UefiIfrDefault.h"\r
#include "OpcodeCreation.h"\r
\r
-EFI_STATUS\r
-EFIAPI\r
-HiiExportDatabase (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function allows a program to extract a form or form package that has\r
- previously been registered with the EFI HII database.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- ASSERT (FALSE);\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
+//\r
+// This structure is only intended to be used in this file.\r
+//\r
#pragma pack(push, 1)\r
typedef struct {\r
EFI_HII_PACK_HEADER PackageHeader;\r
FRAMEWORK_EFI_IFR_FORM_SET FormSet;\r
FRAMEWORK_EFI_IFR_END_FORM_SET EndFormSet;\r
-} FRAMEWORK_HII_FORMSET_TEMPLATE;\r
+} FW_HII_FORMSET_TEMPLATE;\r
#pragma pack(pop)\r
\r
-FRAMEWORK_HII_FORMSET_TEMPLATE FormSetTemplate = {\r
+FW_HII_FORMSET_TEMPLATE FormSetTemplate = {\r
{\r
- sizeof (FRAMEWORK_HII_FORMSET_TEMPLATE),\r
+ sizeof (FW_HII_FORMSET_TEMPLATE),\r
EFI_HII_IFR\r
},\r
{\r
}\r
};\r
\r
-EFI_STATUS\r
-EFIAPI\r
-HiiGetForms (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN EFI_FORM_ID FormId,\r
- IN OUT UINTN *BufferLengthTemp,\r
- OUT UINT8 *Buffer\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
- This function allows a program to extract a form or form package that has\r
- previously been registered with the EFI HII database.\r
+/**\r
\r
-Arguments:\r
- This - A pointer to the EFI_HII_PROTOCOL instance.\r
+ This thunk module only handles UEFI HII packages. The caller of this function \r
+ won¡¯t be able to parse the content. Therefore, it is not supported.\r
+ \r
+ This function will ASSERT and return EFI_UNSUPPORTED.\r
\r
- Handle - Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE is defined in\r
- EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
+ @param This N.A.\r
+ @param Handle N.A.\r
+ @param BufferSize N.A.\r
+ @param Buffer N.A.\r
\r
- FormId - The ID of the form to return. If the ID is zero, the entire form package is returned.\r
- Type EFI_FORM_ID is defined in "Related Definitions" below.\r
+ @retval EFI_UNSUPPORTED\r
\r
- BufferLength - On input, the length of the Buffer. On output, the length of the returned buffer, if\r
- the length was sufficient and, if it was not, the length that is required to fit the\r
- requested form(s).\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiExportDatabase (\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ ASSERT (FALSE);\r
+ return EFI_UNSUPPORTED;\r
+}\r
\r
- Buffer - The buffer designed to receive the form(s).\r
\r
-Returns:\r
+/**\r
+ This function allows a program to extract a form or form package that has\r
+ previously been registered with the EFI HII database.\r
\r
- EFI_SUCCESS - Buffer filled with the requested forms. BufferLength\r
- was updated.\r
+ In this thunk module, this function will create a IFR Package with only \r
+ one Formset. Effectively, only the GUID of the Formset is updated and return\r
+ in this IFR package to caller. This is enable the Framework modules which call \r
+ a API named GetStringFromToken. GetStringFromToken retieves a String based on\r
+ a String Token from a Package List known only by the Formset GUID.\r
+ \r
\r
- EFI_INVALID_PARAMETER - The handle is unknown.\r
\r
- EFI_NOT_FOUND - A form on the requested handle cannot be found with the\r
- requested FormId.\r
+ @param This A pointer to the EFI_HII_PROTOCOL instance.\r
+ @param Handle Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE is defined in\r
+ EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
+ @param FormId Ignored by this implementation.\r
+ @param BufferLengthTemp On input, the size of input buffer. On output, it\r
+ is the size of FW_HII_FORMSET_TEMPLATE.\r
+ @param Buffer The buffer designed to receive the form(s).\r
\r
- EFI_BUFFER_TOO_SMALL - The buffer provided was not large enough to allow the form to be stored.\r
+ @retval EFI_SUCCESS Buffer filled with the requested forms. BufferLength\r
+ was updated.\r
+ @retval EFI_INVALID_PARAMETER The handle is unknown.\r
+ @retval EFI_NOT_FOUND A form on the requested handle cannot be found with the\r
+ requested FormId.\r
+ @retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough to allow the form to be stored.\r
\r
---*/\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetForms (\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN EFI_FORM_ID FormId,\r
+ IN OUT UINTN *BufferLengthTemp,\r
+ OUT UINT8 *Buffer\r
+ )\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry;\r
- FRAMEWORK_HII_FORMSET_TEMPLATE *OutputFormSet;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ FW_HII_FORMSET_TEMPLATE *OutputFormSet;\r
\r
- if (*BufferLengthTemp < sizeof(FRAMEWORK_HII_FORMSET_TEMPLATE)) {\r
- *BufferLengthTemp = sizeof(FRAMEWORK_HII_FORMSET_TEMPLATE);\r
+ if (*BufferLengthTemp < sizeof(FW_HII_FORMSET_TEMPLATE)) {\r
+ *BufferLengthTemp = sizeof(FW_HII_FORMSET_TEMPLATE);\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- MapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+ ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
\r
- if (MapEntry == NULL) {\r
+ if (ThunkContext == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
\r
- OutputFormSet = (FRAMEWORK_HII_FORMSET_TEMPLATE *) Buffer;\r
- \r
- CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FRAMEWORK_HII_FORMSET_TEMPLATE));\r
- CopyMem (&OutputFormSet->FormSet.Guid, &MapEntry->TagGuid, sizeof (EFI_GUID)); \r
+ OutputFormSet = (FW_HII_FORMSET_TEMPLATE *) Buffer;\r
\r
+ CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FW_HII_FORMSET_TEMPLATE));\r
+ CopyMem (&OutputFormSet->FormSet.Guid, &ThunkContext->TagGuid, sizeof (EFI_GUID)); \r
+\r
+ OutputFormSet->FormSet.Class = ThunkContext->FormSetClass;\r
+ OutputFormSet->FormSet.SubClass = ThunkContext->FormSetSubClass;\r
+ OutputFormSet->FormSet.Help = ThunkContext->FormSetHelp;\r
+ OutputFormSet->FormSet.FormSetTitle = ThunkContext->FormSetTitle;\r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
-EFI_STATUS\r
-EFIAPI\r
-HiiGetDefaultImage (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN UINTN DefaultMask,\r
- OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
- )\r
-/*++\r
-\r
- Routine Description:\r
+/**\r
\r
This function allows a program to extract the NV Image\r
that represents the default storage image\r
\r
- Arguments:\r
- This - A pointer to the EFI_HII_PROTOCOL instance.\r
- Handle - The HII handle from which will have default data retrieved.\r
- UINTN - Mask used to retrieve the default image.\r
- VariablePackList - Callee allocated, tightly-packed, link list data\r
+\r
+ @param This A pointer to the EFI_HII_PROTOCOL instance.\r
+ @param Handle The HII handle from which will have default data retrieved.\r
+ UINTN - Mask used to retrieve the default image.\r
+ @param DefaultMask EDES_TODO: Add parameter description\r
+ @param VariablePackList Callee allocated, tightly-packed, link list data\r
structure that contain all default varaible packs\r
from the Hii Database.\r
\r
- Returns:\r
- EFI_NOT_FOUND - If Hii database does not contain any default images.\r
- EFI_INVALID_PARAMETER - Invalid input parameter.\r
- EFI_SUCCESS - Operation successful.\r
+ @retval EFI_NOT_FOUND If Hii database does not contain any default images.\r
+ @retval EFI_INVALID_PARAMETER Invalid input parameter.\r
+ @retval EFI_SUCCESS Operation successful.\r
\r
---*/\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetDefaultImage (\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN UINTN DefaultMask,\r
+ OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
+ )\r
{\r
LIST_ENTRY *UefiDefaults;\r
EFI_HII_HANDLE UefiHiiHandle;\r
EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
if (UefiHiiHandle == NULL) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
\r
- Status = UefiDefaultsToFrameworkDefaults (UefiDefaults, DefaultMask, VariablePackList);\r
+ Status = UefiDefaultsToFwDefaults (UefiDefaults, DefaultMask, VariablePackList);\r
\r
Done:\r
FreeDefaultList (UefiDefaults);\r
return Status;\r
}\r
\r
+/**\r
+ EDES_TODO: Add function description.\r
+\r
+ @param CallbackHandle EDES_TODO: Add parameter description\r
+ @param ThunkContext EDES_TODO: Add parameter description\r
+\r
+ @return EDES_TODO: Add description for return value\r
+\r
+**/\r
EFI_STATUS\r
-ThunkUpdateFormCallBack (\r
+UpdateFormCallBack (\r
IN EFI_HANDLE CallbackHandle,\r
- IN CONST HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry\r
+ IN CONST HII_THUNK_CONTEXT *ThunkContext\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallbackProtocol;\r
+ EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccessProtocol;\r
EFI_HANDLE UefiDriverHandle;\r
- HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigAccessProtocolInstance;\r
+ CONFIG_ACCESS_PRIVATE *ConfigAccessPrivate;\r
\r
Status = gBS->HandleProtocol (\r
CallbackHandle,\r
&gEfiFormCallbackProtocolGuid,\r
- (VOID **) &FrameworkFormCallbackProtocol\r
+ (VOID **) &FormCallbackProtocol\r
);\r
if (EFI_ERROR (Status)) {\r
return EFI_INVALID_PARAMETER;\r
\r
Status = mHiiDatabase->GetPackageListHandle (\r
mHiiDatabase,\r
- HandleMapEntry->UefiHiiHandle,\r
+ ThunkContext->UefiHiiHandle,\r
&UefiDriverHandle\r
);\r
ASSERT_EFI_ERROR (Status);\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- ConfigAccessProtocolInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (ConfigAccessProtocol);\r
+ ConfigAccessPrivate = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (ConfigAccessProtocol);\r
\r
- ConfigAccessProtocolInstance->FrameworkFormCallbackProtocol = FrameworkFormCallbackProtocol;\r
+ ConfigAccessPrivate->FormCallbackProtocol = FormCallbackProtocol;\r
\r
return EFI_SUCCESS;\r
}\r
\r
\r
+/**\r
+ EDES_TODO: Add function description.\r
+\r
+ @param HiiPackageList EDES_TODO: Add parameter description\r
+ @param PackageIndex EDES_TODO: Add parameter description\r
+ @param BufferLen EDES_TODO: Add parameter description\r
+ @param Buffer EDES_TODO: Add parameter description\r
+\r
+ @return EDES_TODO: Add description for return value\r
+\r
+**/\r
STATIC\r
EFI_STATUS\r
-GetPackageDataFromPackageList (\r
+GetPackageData (\r
IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,\r
IN UINT32 PackageIndex,\r
OUT UINT32 *BufferLen,\r
@retval EFI_SUCCESS The first found Form ID is returned in FormId.\r
**/\r
EFI_STATUS\r
-ThunkLocateFormId (\r
+LocateFormId (\r
IN EFI_HII_HANDLE Handle,\r
IN EFI_FORM_LABEL Label,\r
OUT EFI_GUID *FormsetGuid,\r
}\r
\r
for (Index = 0; ; Index++) {\r
- Status = GetPackageDataFromPackageList (HiiPackageList, Index, &PackageLength, &Package);\r
+ Status = GetPackageData (HiiPackageList, Index, &PackageLength, &Package);\r
if (!EFI_ERROR (Status)) {\r
CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
\r
return Status;\r
}\r
+/**\r
+ This function allows the caller to update a form that has\r
+ previously been registered with the EFI HII database.\r
+\r
+\r
+ @param This EDES_TODO: Add parameter description\r
+ @param Handle Hii Handle associated with the Formset to modify\r
+ @param Label Update information starting immediately after this label in the IFR\r
+ @param AddData If TRUE, add data. If FALSE, remove data\r
+ @param Data If adding data, this is the pointer to the data to add\r
+\r
+ @retval EFI_SUCCESS Update success.\r
+ @retval Other Update fail.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
HiiUpdateForm (\r
- IN EFI_HII_PROTOCOL *This,\r
+ IN EFI_HII_PROTOCOL *This,\r
IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN EFI_FORM_LABEL Label,\r
- IN BOOLEAN AddData,\r
+ IN EFI_FORM_LABEL Label,\r
+ IN BOOLEAN AddData,\r
IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data\r
)\r
-/*++\r
-\r
-Routine Description:\r
- This function allows the caller to update a form that has\r
- previously been registered with the EFI HII database.\r
-\r
-Arguments:\r
- Handle - Hii Handle associated with the Formset to modify\r
- Label - Update information starting immediately after this label in the IFR\r
- AddData - If TRUE, add data. If FALSE, remove data\r
- Data - If adding data, this is the pointer to the data to add\r
-\r
-Returns:\r
- EFI_SUCCESS - Update success.\r
- Other - Update fail.\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
EFI_HII_UPDATE_DATA *UefiHiiUpdateData;\r
EFI_HII_HANDLE UefiHiiHandle;\r
EFI_GUID FormsetGuid;\r
EFI_FORM_ID FormId;\r
+ EFI_TPL OldTpl;\r
\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+ \r
+ mInFrameworkUpdatePakcage = TRUE;\r
Status = EFI_SUCCESS;\r
+ UefiHiiUpdateData = NULL;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- if (HandleMapEntry == NULL) {\r
- return EFI_NOT_FOUND;\r
+ ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
+\r
+ if (ThunkContext == NULL) {\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
}\r
\r
if (Data->FormSetUpdate) {\r
- Status = ThunkUpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, HandleMapEntry);\r
+ Status = UpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, ThunkContext);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
}\r
\r
- if (HandleMapEntry->IsPackageListWithOnlyStringPackages) {\r
- UefiHiiHandle = TagGuidToUefiIfrHiiHandle (Private, &HandleMapEntry->TagGuid);\r
+ if ((ThunkContext->IfrPackageCount == 0) && (ThunkContext->StringPackageCount != 0)) {\r
+ UefiHiiHandle = TagGuidToUefiHiiHandle (Private, &ThunkContext->TagGuid);\r
\r
if (UefiHiiHandle == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
} else {\r
- UefiHiiHandle = HandleMapEntry->UefiHiiHandle;\r
+ UefiHiiHandle = ThunkContext->UefiHiiHandle;\r
}\r
\r
- UefiHiiUpdateData = NULL;\r
+ Status = LocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Can't find the label.\r
+ //\r
+ goto Done;\r
+ }\r
\r
if (AddData) {\r
if (Data->DataCount != 0) {\r
- \r
- Status = ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData);\r
- ASSERT_EFI_ERROR (Status);\r
\r
- Status = ThunkLocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
+ ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
+ Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, AddData, &UefiHiiUpdateData);\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = IfrLibUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, Label, AddData, UefiHiiUpdateData);\r
\r
} \r
} else {\r
- Status = ThunkLocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
//\r
// Delete Opcode starting from Labe in FormId found\r
//\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
+Done:\r
if (UefiHiiUpdateData != NULL) {\r
SafeFreePool (UefiHiiUpdateData->Data);\r
SafeFreePool (UefiHiiUpdateData);\r
}\r
\r
+ mInFrameworkUpdatePakcage = FALSE; \r
+\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
return Status;\r
}\r
#\r
\r
[Sources.common]\r
+ ConfigAccess.c\r
+ ConfigAccess.h\r
OpcodeCreation.c\r
OpcodeCreation.h\r
UefiIfrParserInternal.h\r
Forms.c\r
HiiDatabase.h\r
HiiDatabase.c\r
- ConfigAccess.c\r
- ConfigAccess.h\r
Utility.c\r
Utility.h\r
+\r
+ SetupBrowser.c\r
\r
\r
[Packages]\r
gEfiFormBrowserProtocolGuid\r
\r
[Depex]\r
- gEfiHiiImageProtocolGuid AND\r
gEfiHiiDatabaseProtocolGuid AND\r
gEfiHiiStringProtocolGuid AND\r
- gEfiHiiFontProtocolGuid AND\r
gEfiHiiConfigRoutingProtocolGuid\r
\r
\r
\r
#include "HiiDatabase.h"\r
\r
-EFI_HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
-\r
-EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
- //Signature\r
- EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
- ,\r
- //Handle\r
- (EFI_HANDLE) NULL\r
- ,\r
- { //Hii\r
+HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
+\r
+HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
+ HII_THUNK_PRIVATE_DATA_SIGNATURE,\r
+ (EFI_HANDLE) NULL,\r
+ {\r
HiiNewPack,\r
HiiRemovePack,\r
HiiFindHandles,\r
\r
HiiGetKeyboardLayout\r
},\r
+\r
+ //\r
//StaticHiiHandle\r
//The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
// and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
// The code will assert to prevent overflow.\r
- (FRAMEWORK_EFI_HII_HANDLE) 1 \r
- ,\r
+ (FRAMEWORK_EFI_HII_HANDLE) 1,\r
+\r
+ //\r
//StaticPureUefiHiiHandle\r
//The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
// and decrease downwords untill reach the value of StaticHiiHandle. \r
// The code will assert to prevent overflow.\r
- (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF \r
- ,\r
+ //\r
+ (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,\r
{\r
NULL, NULL //HiiHandleLinkList\r
},\r
EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
(EFI_HANDLE) NULL,\r
+ (HII_THUNK_PRIVATE_DATA *) NULL,\r
{\r
ThunkSendForm,\r
ThunkCreatePopUp\r
\r
\r
CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
-CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
+CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;\r
\r
-EFI_STATUS\r
-RegisterUefiHiiHandle (\r
- EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_GUID PackageGuid;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
-\r
- HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
- HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
-\r
- Status = AssignPureUefiHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- \r
- HandleMappingEntry->UefiHiiHandle = UefiHiiHandle;\r
- Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- CopyGuid(&HandleMappingEntry->TagGuid, &PackageGuid);\r
- \r
- InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-UnRegisterUefiHiiHandle (\r
- EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry;\r
-\r
- MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, UefiHiiHandle);\r
- ASSERT (MapEntry != NULL);\r
- \r
- RemoveEntryList (&MapEntry->List);\r
\r
- FreePool (MapEntry);\r
- \r
- return EFI_SUCCESS;\r
-}\r
\r
-EFI_STATUS\r
-EFIAPI\r
-AddPackNotify (\r
- IN UINT8 PackageType,\r
- IN CONST EFI_GUID *PackageGuid,\r
- IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
- IN EFI_HII_HANDLE Handle,\r
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-\r
- ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
- ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK);\r
-\r
- Status = EFI_SUCCESS;\r
- Private = mHiiThunkPrivateData;\r
\r
- if (mInFrameworkHiiNewPack) {\r
- return EFI_SUCCESS;\r
- }\r
\r
- //\r
- // We only create a MapEntry if the Uefi Hii Handle is only already registered\r
- // by the HII Thunk Layer.\r
- //\r
- if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
- Status = RegisterUefiHiiHandle (Private, Handle);\r
- } \r
-\r
- return Status; \r
-}\r
-EFI_STATUS\r
-EFIAPI\r
-NewPackNotify (\r
- IN UINT8 PackageType,\r
- IN CONST EFI_GUID *PackageGuid,\r
- IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
- IN EFI_HII_HANDLE Handle,\r
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-\r
- ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
- ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
-\r
- if (mInFrameworkHiiNewPack) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Status = EFI_SUCCESS;\r
- Private = mHiiThunkPrivateData;\r
-\r
- //\r
- // We only\r
- //\r
- if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
- Status = RegisterUefiHiiHandle (Private, Handle);\r
- } \r
-\r
- return Status;\r
-}\r
-\r
-BOOLEAN\r
-IsLastStringPack (\r
- IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
- IN EFI_HII_HANDLE Handle\r
- )\r
-{\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINTN BufferSize;\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGE_HEADER *PackageHdrPtr;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
- BOOLEAN Match;\r
-\r
- Match = FALSE;\r
- HiiPackageList = NULL;\r
- BufferSize = 0;\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- ASSERT (Status != EFI_NOT_FOUND);\r
- \r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HiiPackageList = AllocateZeroPool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- }\r
-\r
- \r
- PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
- CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- while (PackageHeader.Type != EFI_HII_PACKAGE_END) {\r
- switch (PackageHeader.Type) {\r
- case EFI_HII_PACKAGE_STRINGS:\r
- if (CompareMem (Package, PackageHdrPtr, Package->Length) != 0) {\r
- FreePool (HiiPackageList);\r
- return FALSE;\r
- }\r
- break; \r
- default:\r
- break;\r
- }\r
- //\r
- // goto header of next package\r
- //\r
- PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
- CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
- }\r
-\r
- FreePool (HiiPackageList);\r
- return TRUE;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-RemovePackNotify (\r
- IN UINT8 PackageType,\r
- IN CONST EFI_GUID *PackageGuid,\r
- IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
- IN EFI_HII_HANDLE Handle,\r
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
- ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
-\r
- if (mInFrameworkHiiRemovePack) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Private = mHiiThunkPrivateData;\r
-\r
- MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle);\r
-\r
- if (MapEntry->FrameworkHiiHandle > Private->StaticHiiHandle) {\r
- //\r
- // This is a PackageList registered using UEFI HII Protocol Instance.\r
- // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID\r
- // to link StringPack with IfrPack.\r
- // RemovePackNotify is only used to remove PackageList when it is removed by\r
- // calling mHiiDatabase->RemovePackageList interface.\r
- if (IsLastStringPack (Package, Handle)) {\r
- Status = UnRegisterUefiHiiHandle (Private, Handle);\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-MapUefiHiiHandles (\r
- EFI_HII_THUNK_PRIVATE_DATA *Private\r
- )\r
-{\r
- UINTN HandleBufferLength;\r
- EFI_HII_HANDLE *HandleBuffer;\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
-\r
- HandleBufferLength = 0;\r
- HandleBuffer = NULL;\r
- Status = mHiiDatabase->ListPackageLists (\r
- mHiiDatabase,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &HandleBufferLength,\r
- HandleBuffer\r
- );\r
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
- //\r
- // As no package is registered to UEFI HII Database, EFI_SUCCESS is returned.\r
- // \r
- //\r
- if (Status == EFI_NOT_FOUND) {\r
- return EFI_SUCCESS;\r
- } else {\r
- return Status;\r
- }\r
- }\r
-\r
- HandleBuffer = AllocateZeroPool (HandleBufferLength);\r
- Status = mHiiDatabase->ListPackageLists (\r
- mHiiDatabase,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &HandleBufferLength,\r
- HandleBuffer\r
- );\r
-\r
- for (Index = 0; Index < HandleBufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
- MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, HandleBuffer[Index]);\r
- //\r
- // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.\r
- //\r
- if (MapEntry == NULL) {\r
- Status = RegisterUefiHiiHandle (Private, HandleBuffer[Index]);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
- }\r
-\r
- return EFI_SUCCESS; \r
-}\r
\r
EFI_STATUS\r
EFIAPI\r
\r
--*/\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *HiiData;\r
- EFI_HANDLE Handle;\r
- EFI_STATUS Status;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ EFI_HANDLE Handle;\r
+ EFI_STATUS Status;\r
+ UINTN BufferLength;\r
+ EFI_HII_HANDLE *Buffer;\r
+ UINTN Index;\r
+ \r
\r
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
\r
- HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
- ASSERT (HiiData != NULL);\r
- InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
+ Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
+ ASSERT (Private != NULL);\r
+ InitializeListHead (&Private->ThunkContextListHead);\r
\r
- mHiiThunkPrivateData = HiiData;\r
+ mHiiThunkPrivateData = Private;\r
\r
Status = gBS->LocateProtocol (\r
&gEfiHiiDatabaseProtocolGuid,\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiFontProtocolGuid,\r
+ &gEfiHiiStringProtocolGuid,\r
NULL,\r
- (VOID **) &mHiiFontProtocol\r
+ (VOID **) &mHiiStringProtocol\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiImageProtocolGuid,\r
+ &gEfiHiiConfigRoutingProtocolGuid,\r
NULL,\r
- (VOID **) &mHiiImageProtocol\r
+ (VOID **) &mHiiConfigRoutingProtocol\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiStringProtocolGuid,\r
- NULL,\r
- (VOID **) &mHiiStringProtocol\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
\r
Status = gBS->LocateProtocol (\r
- &gEfiHiiConfigRoutingProtocolGuid,\r
+ &gEfiFormBrowser2ProtocolGuid,\r
NULL,\r
- (VOID **) &mHiiConfigRoutingProtocol\r
+ (VOID **) &mFormBrowser2Protocol\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+\r
+ \r
+\r
//\r
// Install protocol interface\r
//\r
- Handle = NULL;\r
Status = gBS->InstallProtocolInterface (\r
- &HiiData->Handle,\r
+ &Private->Handle,\r
&gEfiHiiProtocolGuid,\r
EFI_NATIVE_INTERFACE,\r
- (VOID *) &HiiData->Hii\r
+ (VOID *) &Private->Hii\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- Status = MapUefiHiiHandles (HiiData);\r
- ASSERT_EFI_ERROR (Status);\r
+ Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
+ if (Status == EFI_SUCCESS) {\r
+ for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
+ CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ FreePool (Buffer);\r
+ }\r
\r
Status = mHiiDatabase->RegisterPackageNotify (\r
mHiiDatabase,\r
EFI_HII_PACKAGE_STRINGS,\r
NULL,\r
- NewPackNotify,\r
+ NewOrAddPackNotify,\r
EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
- &HiiData->NewPackNotifyHandle\r
+ &Handle\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
mHiiDatabase,\r
EFI_HII_PACKAGE_STRINGS,\r
NULL,\r
- AddPackNotify,\r
+ NewOrAddPackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_FORM,\r
+ NULL,\r
+ NewOrAddPackNotify,\r
+ EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+ &Handle\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = mHiiDatabase->RegisterPackageNotify (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_FORM,\r
+ NULL,\r
+ NewOrAddPackNotify,\r
EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
- &HiiData->AddPackNotifyHandle\r
+ &Handle\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
NULL,\r
RemovePackNotify,\r
EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
- &HiiData->RemovePackNotifyHandle\r
+ &Handle\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
Status = gBS->InstallProtocolInterface (\r
&mBrowserThunkPrivateDataTemplate.Handle,\r
&gEfiFormBrowserProtocolGuid,\r
--*/\r
{\r
UINT16 Count;\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
\r
if (HandleBufferLength == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
\r
+ //\r
+ // Count the number of handles.\r
+ //\r
Count = 0;\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
Count++;\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
if (Count > *HandleBufferLength) {\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
\r
+ //\r
+ // Output the handles.\r
+ //\r
Count = 0;\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
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+ Handle[Count] = ThunkContext->FwHiiHandle;\r
\r
- Handle[Count] = HandleMapEntry->FrameworkHiiHandle;\r
- \r
Count++;\r
- } \r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+\r
+ }\r
\r
*HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
return EFI_SUCCESS;\r
}\r
\r
+EFI_STATUS\r
+LangCodes3066To639 (\r
+ IN CHAR8 *LangCodes3066,\r
+ IN CHAR8 **LangCodes639\r
+ )\r
+{\r
+ CHAR8 *AsciiLangCodes;\r
+ CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
+ UINTN Index;\r
+ UINTN Count;\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (LangCodes3066 != NULL);\r
+ ASSERT (LangCodes639 != NULL);\r
+ \r
+ //\r
+ // Count the number of RFC 3066 language codes.\r
+ //\r
+ Index = 0;\r
+ AsciiLangCodes = LangCodes3066;\r
+ while (AsciiStrLen (AsciiLangCodes) != 0) {\r
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+ Index++;\r
+ }\r
+\r
+ Count = Index;\r
+\r
+ //\r
+ // \r
+ //\r
+ *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
+ if (*LangCodes639 == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ AsciiLangCodes = LangCodes3066;\r
+\r
+ for (Index = 0; Index < Count; Index++) {\r
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+ Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
EFI_STATUS\r
EFIAPI\r
HiiGetPrimaryLanguages (\r
\r
--*/\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
EFI_HII_HANDLE UefiHiiHandle;\r
- CHAR8 *AsciiLanguageCodes;\r
- CHAR16 *UnicodeLanguageCodes;\r
+ CHAR8 *LangCodes3066;\r
+ CHAR16 *UnicodeLangCodes639;\r
+ CHAR8 *LangCodes639;\r
+ EFI_STATUS Status;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- \r
- \r
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
if (UefiHiiHandle == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AsciiLanguageCodes = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
+ LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
\r
- if (AsciiLanguageCodes == NULL) {\r
+ if (LangCodes3066 == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
- if (UnicodeLanguageCodes == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+\r
+ LangCodes639 = NULL;\r
+ Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ \r
+ UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
+ if (UnicodeLangCodes639 == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
}\r
\r
//\r
- // The language returned is in RFC 3066 format.\r
+ // The language returned is in RFC 639-2 format.\r
//\r
- *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+ AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
+ *LanguageString = UnicodeLangCodes639;\r
\r
- return EFI_SUCCESS;\r
+Done:\r
+ FreePool (LangCodes3066);\r
+ SafeFreePool (LangCodes639);\r
+\r
+ return Status;\r
}\r
\r
+\r
+\r
EFI_STATUS\r
EFIAPI\r
HiiGetSecondaryLanguages (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN CHAR16 *PrimaryLanguage,\r
- OUT EFI_STRING *LanguageString\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN CHAR16 *PrimaryLanguage,\r
+ OUT EFI_STRING *LanguageString\r
)\r
/*++\r
\r
\r
--*/\r
{\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
EFI_HII_HANDLE UefiHiiHandle;\r
- CHAR8 *AsciiPrimaryLanguage;\r
- CHAR8 *AsciiLanguageCodes;\r
- CHAR16 *UnicodeLanguageCodes;\r
+ CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *PrimaryLang639;\r
+ CHAR8 *SecLangCodes3066;\r
+ CHAR8 *SecLangCodes639;\r
+ CHAR16 *UnicodeSecLangCodes639;\r
+ EFI_STATUS Status;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- \r
- \r
- UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+ SecLangCodes639 = NULL;\r
+ SecLangCodes3066 = NULL;\r
+ UnicodeSecLangCodes639 = NULL;\r
+\r
+ UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
if (UefiHiiHandle == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- AsciiPrimaryLanguage = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+ PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+ if (PrimaryLang639 == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
\r
- UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage);\r
+ UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
\r
- AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage);\r
+ Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- if (AsciiLanguageCodes == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
+ SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
+\r
+ if (SecLangCodes3066 == NULL) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
- UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
- if (UnicodeLanguageCodes == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
+ if (UnicodeSecLangCodes639 == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
}\r
\r
//\r
// The language returned is in RFC 3066 format.\r
//\r
- *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+ *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI \r
-ThunkSendForm (\r
- IN EFI_FORM_BROWSER_PROTOCOL *This,\r
- IN BOOLEAN UseDatabase,\r
- IN FRAMEWORK_EFI_HII_HANDLE *Handle,\r
- IN UINTN HandleCount,\r
- IN FRAMEWORK_EFI_IFR_PACKET *Packet, OPTIONAL\r
- IN EFI_HANDLE CallbackHandle, OPTIONAL\r
- IN UINT8 *NvMapOverride, OPTIONAL\r
- IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL\r
- OUT BOOLEAN *ResetRequired OPTIONAL\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI \r
-ThunkCreatePopUp (\r
- IN UINTN NumberOfLines,\r
- IN BOOLEAN HotKey,\r
- IN UINTN MaximumStringSize,\r
- OUT CHAR16 *StringBuffer,\r
- OUT EFI_INPUT_KEY *KeyValue,\r
- IN CHAR16 *String,\r
- ...\r
- )\r
-{\r
- ASSERT (FALSE);\r
- return EFI_UNSUPPORTED;\r
+Done:\r
+ \r
+ SafeFreePool (PrimaryLang639);\r
+ SafeFreePool (SecLangCodes639);\r
+ SafeFreePool (SecLangCodes3066);\r
+ SafeFreePool (UnicodeSecLangCodes639);\r
+ \r
+ return Status;\r
}\r
\r
+ \r
#include <Library/BaseMemoryLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UefiRuntimeServicesTableLib.h>\r
-//#include <Library/FrameworkIfrSupportLib.h>\r
#include <Library/HiiLib.h>\r
#include <Library/ExtendedHiiLib.h>\r
\r
\r
#include <MdeModuleHii.h>\r
\r
-//\r
-// Macros\r
-//\r
-\r
-\r
-//\r
-// Typedef\r
-//\r
-\r
#pragma pack (push, 1)\r
typedef struct {\r
UINT32 BinaryLength;\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
+#define HII_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, HII_THUNK_PRIVATE_DATA, Hii, HII_THUNK_PRIVATE_DATA_SIGNATURE)\r
+#define HII_THUNK_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('H', 'i', 'I', 'T')\r
typedef struct {\r
UINTN Signature;\r
EFI_HANDLE Handle;\r
FRAMEWORK_EFI_HII_HANDLE StaticPureUefiHiiHandle;\r
\r
//\r
- // This LIST_ENTRY is the list head which has HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY type \r
- // as list entry.\r
+ // The head of link list for all HII_THUNK_CONTEXT.\r
//\r
- LIST_ENTRY HiiThunkHandleMappingDBListHead;\r
+ LIST_ENTRY ThunkContextListHead;\r
\r
- EFI_HANDLE NewPackNotifyHandle;\r
EFI_HANDLE RemovePackNotifyHandle;\r
EFI_HANDLE AddPackNotifyHandle;\r
-} EFI_HII_THUNK_PRIVATE_DATA;\r
+} HII_THUNK_PRIVATE_DATA;\r
+\r
\r
\r
-#define HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY(Record) CR(Record, HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY, List, HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE)\r
-#define HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE EFI_SIGNATURE_32 ('H', 'T', 'H', 'M')\r
+#define ONE_OF_OPTION_MAP_ENTRY_FROM_LINK(Record) CR(Record, ONE_OF_OPTION_MAP_ENTRY, Link, ONE_OF_OPTION_MAP_ENTRY_SIGNATURE)\r
+#define ONE_OF_OPTION_MAP_ENTRY_SIGNATURE EFI_SIGNATURE_32 ('O', 'O', 'M', 'E')\r
typedef struct {\r
- LIST_ENTRY List;\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ UINT16 FwKey;\r
+ EFI_IFR_TYPE_VALUE Value;\r
+ \r
+} ONE_OF_OPTION_MAP_ENTRY;\r
+\r
+\r
+\r
+#define ONE_OF_OPTION_MAP_FROM_LINK(Record) CR(Record, ONE_OF_OPTION_MAP, Link, ONE_OF_OPTION_MAP_SIGNATURE)\r
+#define ONE_OF_OPTION_MAP_SIGNATURE EFI_SIGNATURE_32 ('O', 'O', 'O', 'M')\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link; \r
+\r
+ UINT8 ValueType; //EFI_IFR_TYPE_NUM_* \r
+\r
+ EFI_QUESTION_ID QuestionId;\r
+\r
+ LIST_ENTRY OneOfOptionMapEntryListHead; //ONE_OF_OPTION_MAP_ENTRY\r
+} ONE_OF_OPTION_MAP;\r
+\r
+\r
+\r
+#define QUESTION_ID_MAP_ENTRY_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP_ENTRY, Link, QUESTION_ID_MAP_ENTRY_SIGNATURE)\r
+#define QUESTION_ID_MAP_ENTRY_SIGNATURE EFI_SIGNATURE_32 ('Q', 'I', 'M', 'E')\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ UINT16 FwQId;\r
+ EFI_QUESTION_ID UefiQid;\r
+} QUESTION_ID_MAP_ENTRY;\r
+\r
+\r
+\r
+#define QUESTION_ID_MAP_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP, Link, QUESTION_ID_MAP_SIGNATURE)\r
+#define QUESTION_ID_MAP_SIGNATURE EFI_SIGNATURE_32 ('Q', 'I', 'M', 'P')\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ UINT16 VarStoreId;\r
+ UINTN VarSize;\r
+ LIST_ENTRY MapEntryListHead;\r
+} QUESTION_ID_MAP;\r
+\r
+\r
+\r
+#define HII_THUNK_CONTEXT_FROM_LINK(Record) CR(Record, HII_THUNK_CONTEXT, Link, HII_THUNK_CONTEXT_SIGNATURE)\r
+#define HII_THUNK_CONTEXT_SIGNATURE EFI_SIGNATURE_32 ('H', 'T', 'H', 'M')\r
+typedef struct {\r
+ LIST_ENTRY Link;\r
UINT32 Signature;\r
- FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle;\r
+ FRAMEWORK_EFI_HII_HANDLE FwHiiHandle;\r
EFI_HII_HANDLE UefiHiiHandle;\r
EFI_HANDLE UefiHiiDriverHandle;\r
\r
- BOOLEAN IsPackageListWithOnlyStringPackages;\r
+ UINTN IfrPackageCount;\r
+ UINTN StringPackageCount;\r
+\r
//\r
// The field below is only valid if IsPackageListWithOnlyStringPack is TRUE.\r
// The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption\r
// in both HII Database implementation and all modules that registering packages:\r
- // If a Package List has only IFR package and no String Package, the String Package containing the strings \r
- // referenced by this IFR package is in another Package List\r
- // registered with the HII database with the same EFI_HII_PACKAGES.GuidId.\r
- //\r
- //\r
- // Only valid if IsPackageListWithSingleStringPack is TRUE.\r
- // UEFI Package List Head Pointer, pointing to a allocated buffer containing the package\r
- //\r
- EFI_HII_PACKAGE_LIST_HEADER *UefiStringPackageListHeader; //Only valid if IsStringPack is TRUE.\r
- //This UEFI Package list only consists of a list of string packages.\r
-\r
+ // If a Package List has only IFR package and no String Package, the IFR package will reference \r
+ // String in another Package List registered with the HII database with the same EFI_HII_PACKAGES.GuidId.\r
+ // TagGuid is the used to record this GuidId.\r
EFI_GUID TagGuid;\r
- //\r
- // TRUE if the package list identified by UefiHiiHandle imports String Packages from \r
- // other package list with IsPackageListWithOnlyStringPackages is TRUE.\r
- //\r
- BOOLEAN DoesPackageListImportStringPackages;\r
+\r
+ LIST_ENTRY QuestionIdMapListHead; //QUESTION_ID_MAP\r
+\r
+ LIST_ENTRY OneOfOptionMapListHead; //ONE_OF_OPTION_MAP\r
+\r
+ UINT8 *NvMapOverride;\r
+\r
+ UINT16 FormSetClass;\r
+ UINT16 FormSetSubClass;\r
+ STRING_REF FormSetTitle;\r
+ STRING_REF FormSetHelp;\r
\r
-} HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY;\r
+} HII_THUNK_CONTEXT;\r
+\r
\r
-#define HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE EFI_SIGNATURE_32 ('H', 'T', 's', 'k')\r
-#define HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY(Record) CR(Record, HII_TRHUNK_BUFFER_STORAGE_KEY, List, HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE)\r
+\r
+#define BUFFER_STORAGE_ENTRY_SIGNATURE EFI_SIGNATURE_32 ('H', 'T', 's', 'k')\r
+#define BUFFER_STORAGE_ENTRY_FROM_LINK(Record) CR(Record, BUFFER_STORAGE_ENTRY, Link, BUFFER_STORAGE_ENTRY_SIGNATURE)\r
typedef struct {\r
- LIST_ENTRY List;\r
+ LIST_ENTRY Link;\r
UINT32 Signature;\r
EFI_GUID Guid;\r
CHAR16 *Name;\r
UINTN Size;\r
UINT16 VarStoreId;\r
-} HII_TRHUNK_BUFFER_STORAGE_KEY;\r
+} BUFFER_STORAGE_ENTRY;\r
+\r
\r
-#define HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE EFI_SIGNATURE_32 ('H', 'T', 'c', 'a')\r
-#define HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL(Record) CR(Record, HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE, ConfigAccessProtocol, HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE)\r
+\r
+#define CONFIG_ACCESS_PRIVATE_SIGNATURE EFI_SIGNATURE_32 ('H', 'T', 'c', 'a')\r
+#define CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL(Record) CR(Record, CONFIG_ACCESS_PRIVATE, ConfigAccessProtocol, CONFIG_ACCESS_PRIVATE_SIGNATURE)\r
typedef struct {\r
UINT32 Signature;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccessProtocol;\r
- EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallbackProtocol;\r
- LIST_ENTRY ConfigAccessBufferStorageListHead;\r
-} HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE;\r
+ //\r
+ // Framework's callback\r
+ //\r
+ EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;\r
+\r
+ LIST_ENTRY BufferStorageListHead;\r
+\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+} CONFIG_ACCESS_PRIVATE;\r
+\r
+\r
\r
#define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('F', 'B', 'T', 'd')\r
+#define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS(Record) CR(Record, EFI_FORMBROWSER_THUNK_PRIVATE_DATA, FormBrowser, EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE)\r
typedef struct {\r
UINTN Signature;\r
EFI_HANDLE Handle;\r
+ HII_THUNK_PRIVATE_DATA *ThunkPrivate;\r
EFI_FORM_BROWSER_PROTOCOL FormBrowser;\r
} EFI_FORMBROWSER_THUNK_PRIVATE_DATA;\r
\r
// Extern Variables\r
//\r
extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
-extern CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
+extern CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;\r
\r
-extern BOOLEAN mInFrameworkHiiNewPack;\r
-extern BOOLEAN mInFrameworkHiiRemovePack;\r
+extern HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
+\r
+extern BOOLEAN mInFrameworkUpdatePakcage;\r
\r
\r
//\r
...\r
);\r
\r
+EFI_STATUS\r
+EFIAPI\r
+RemovePackNotify (\r
+ IN UINT8 PackageType,\r
+ IN CONST EFI_GUID *PackageGuid,\r
+ IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
+ IN EFI_HII_HANDLE Handle,\r
+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+NewOrAddPackNotify (\r
+ IN UINT8 PackageType,\r
+ IN CONST EFI_GUID *PackageGuid,\r
+ IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
+ IN EFI_HII_HANDLE Handle,\r
+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
+ )\r
+;\r
+\r
#include "Utility.h"\r
#include "ConfigAccess.h"\r
\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+\r
+EFI_STATUS\r
+FwQuestionIdToUefiQuestionId (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
+ IN UINT16 FwId,\r
+ OUT EFI_QUESTION_ID *UefiQId\r
+ )\r
+{\r
+ LIST_ENTRY *MapEntryListHead;\r
+ LIST_ENTRY *Link;\r
+ QUESTION_ID_MAP_ENTRY *MapEntry;\r
+\r
+ MapEntryListHead = GetMapEntryListHead (ThunkContext, VarStoreId);\r
+ ASSERT (MapEntryListHead != NULL);\r
+\r
+ Link = GetFirstNode (MapEntryListHead);\r
+\r
+ while (!IsNull (MapEntryListHead, Link)) {\r
+ MapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+ if (MapEntry->FwQId == FwId) {\r
+ *UefiQId = MapEntry->UefiQid;\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ Link = GetNextNode (MapEntryListHead, Link);\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
+\r
+\r
EFI_STATUS\r
UCreateEndOfOpcode (\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
{\r
- EFI_IFR_TEXT UOpcode;\r
+ EFI_IFR_TEXT UTextOpCode;\r
+ EFI_IFR_ACTION UActionOpCode;\r
\r
- ZeroMem (&UOpcode, sizeof(UOpcode));\r
- \r
- UOpcode.Header.OpCode = EFI_IFR_TEXT_OP;\r
- UOpcode.Header.Length = sizeof (EFI_IFR_TEXT);\r
+ if ((FwText->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
+ ZeroMem (&UTextOpCode, sizeof(UTextOpCode));\r
+ \r
+ UTextOpCode.Header.OpCode = EFI_IFR_TEXT_OP;\r
+ UTextOpCode.Header.Length = sizeof (EFI_IFR_TEXT);\r
\r
- UOpcode.Statement.Help = FwText->Help;\r
+ UTextOpCode.Statement.Help = FwText->Help;\r
\r
- UOpcode.Statement.Prompt = FwText->Text;\r
- UOpcode.TextTwo = FwText->TextTwo;\r
- \r
- return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+ UTextOpCode.Statement.Prompt = FwText->Text;\r
+ UTextOpCode.TextTwo = FwText->TextTwo;\r
+ \r
+ return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiData);\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 = FwText->Text;\r
+ UActionOpCode.Question.Header.Help = FwText->Help;\r
+ UActionOpCode.Question.Flags = EFI_IFR_FLAG_CALLBACK;\r
+ UActionOpCode.Question.QuestionId = FwText->Key;\r
+\r
+ return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiData);\r
+ \r
+ }\r
}\r
\r
/*\r
\r
EFI_STATUS\r
F2UCreateOneOfOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData,\r
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
OUT UINTN *DataCount\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_IFR_ONE_OF UOpcode;\r
- FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
- FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
- BOOLEAN HasQuestionId;\r
+ EFI_STATUS Status;\r
+ EFI_IFR_ONE_OF UOpcode;\r
+ FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
+ FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
+ ONE_OF_OPTION_MAP *OneOfOptionMap;\r
+ ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
\r
ASSERT (NextFwOpcode != NULL);\r
ASSERT (DataCount != NULL);\r
\r
+ OneOfOptionMap = NULL;\r
+\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
*DataCount = 0;\r
\r
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
UOpcode.Question.Header.Help = FwOpcode->Help;\r
\r
- Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- *DataCount += 1;\r
-\r
//\r
// Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
//\r
- HasQuestionId = FALSE;\r
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
\r
FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
- if (((FwOneOfOp->Key & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) & !HasQuestionId) {\r
- HasQuestionId = TRUE;\r
- UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+ if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
+ UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
+ \r
+ if (UOpcode.Question.QuestionId == 0) {\r
+ Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ if (EFI_ERROR (Status)) {\r
+ UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+ }\r
+\r
+ OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+ ASSERT (OneOfOptionMap != NULL);\r
+ OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+ OneOfOptionMap->QuestionId = UOpcode.Question.QuestionId;\r
+ InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+ switch (FwOpcode->Width) {\r
+ case 1:\r
+ OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ break;\r
+ case 2:\r
+ OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ }\r
+\r
+ InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+ } else { \r
+ OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+ ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+ OneOfOptionMapEntry->FwKey = FwOneOfOp->Key;\r
+ OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+ \r
+ CopyMem (&OneOfOptionMapEntry->Value, &FwOneOfOp->Value, FwOpcode->Width);\r
+\r
+ ASSERT (OneOfOptionMap != NULL);\r
+ InsertTailList (&OneOfOptionMap->OneOfOptionMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+ }\r
+ }\r
+\r
+ if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+ UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
}\r
\r
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
}\r
\r
+\r
+ if (UOpcode.Question.QuestionId == 0) {\r
+ //\r
+ // Assign QuestionId if still not assigned.\r
+ //\r
+ Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ if (EFI_ERROR (Status)) {\r
+ UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+ }\r
+ }\r
+ \r
+ Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ *DataCount += 1;\r
+\r
//\r
// Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.\r
//\r
*/\r
EFI_STATUS\r
F2UCreateOrderedListOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData,\r
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\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
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
*DataCount = 0;\r
\r
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
UOpcode.Question.Header.Help = FwOpcode->Help;\r
+ UOpcode.Question.VarStoreId = VarStoreId;\r
\r
UOpcode.MaxContainers = FwOpcode->MaxEntries;\r
+\r
+ //\r
+ // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
+ //\r
+ FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
+ while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
+ ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
+ \r
+ FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
+ if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
+ UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
+ \r
+ if (UOpcode.Question.QuestionId == 0) {\r
+ Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ if (EFI_ERROR (Status)) {\r
+ UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+ UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
+ }\r
+\r
+ FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+ }\r
+\r
+ if (UOpcode.Question.QuestionId == 0) {\r
+ Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ if (EFI_ERROR (Status)) {\r
+ UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+ }\r
+ }\r
\r
Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
if (EFI_ERROR (Status)) {\r
\r
FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
- Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->MaxEntries, UefiData);\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, UefiData);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
EFI_STATUS\r
F2UCreateCheckBoxOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
{\r
+ EFI_STATUS Status;\r
EFI_IFR_CHECKBOX UOpcode;\r
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
UOpcode.Question.Header.Help = FwOpcode->Help;\r
\r
- UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ if (FwOpcode->Key == 0) {\r
+ Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, 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 = FwOpcode->QuestionId;\r
+ }\r
+ } else {\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ }\r
+\r
UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
\r
\r
//\r
// We also map 2 flags:\r
- // FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE, \r
- // FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
+ // FRAMEWORK_EFI_IFR_FLAG_DEFAULT, \r
+ // FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING,\r
// to UEFI IFR CheckBox Opcode default flags.\r
//\r
UOpcode.Flags = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
\r
EFI_STATUS\r
F2UCreateNumericOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
\r
+ if (FwOpcode->Key == 0) {\r
+ Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, 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 = FwOpcode->QuestionId;\r
+ }\r
+ } else {\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ }\r
+\r
UOpcode.Header.Length = sizeof(UOpcode);\r
UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
//\r
UOpcode.Question.Header.Help = FwOpcode->Help;\r
\r
UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ //\r
+ // BUGBUG RESERVED_VARSTORE_ID should be passed in.\r
+ //\r
UOpcode.Question.VarStoreId = RESERVED_VARSTORE_ID;\r
UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
\r
\r
EFI_STATUS\r
F2UCreateStringOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
\r
ZeroMem (&UOpcode, sizeof(UOpcode));\r
\r
+ if (FwOpcode->Key == 0) {\r
+ FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+ } else {\r
+ UOpcode.Question.QuestionId = FwOpcode->Key;\r
+ }\r
+\r
UOpcode.Header.Length = sizeof(UOpcode);\r
UOpcode.Header.OpCode = EFI_IFR_STRING_OP;\r
\r
}\r
\r
\r
-\r
EFI_STATUS\r
-ThunkFrameworkUpdateDataToUefiUpdateData (\r
+FwUpdateDataToUefiUpdateData (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\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
- FRAMEWORK_EFI_IFR_OP_HEADER *NextFrameworkOpcodeBuffer;\r
- EFI_HII_UPDATE_DATA *UefiUpdateDataBuffer;\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
- static UINTN mOneOfOptionWidth;\r
+ UINT16 VarStoreId;\r
\r
- mOneOfOptionWidth = 0;\r
- \r
+ //\r
+ // Assume all dynamic opcode created is using active variable with VarStoreId of 1.\r
+ //\r
+ VarStoreId = 1;\r
\r
- UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
- if (UefiUpdateDataBuffer == NULL) {\r
+ UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
+ if (UefiOpCode == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
- if (UefiUpdateDataBuffer->Data == NULL) {\r
+ UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
+ if (UefiOpCode->Data == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
- UefiUpdateDataBuffer->Offset = 0;\r
+ UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+ UefiOpCode->Offset = 0;\r
\r
- FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
+ FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
\r
for (Index = 0; Index < Data->DataCount; Index += DataCount) {\r
- //\r
- // By default Datacount is 1. For FRAMEWORK_EFI_IFR_ONE_OF_OP and FRAMEWORK_EFI_IFR_ORDERED_LIST_OP,\r
- // DataCount maybe more than 1.\r
- //\r
- DataCount = 1;\r
- switch (FrameworkOpcodeBuffer->OpCode) {\r
+ switch (FwOpCode->OpCode) {\r
case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
- Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
+ Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode, UefiOpCode);\r
+ DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_TEXT_OP:\r
- Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FwOpCode, UefiOpCode); \r
+ DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_REF_OP:\r
- Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode); \r
+ DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
- Status = F2UCreateOneOfOpCode ((FRAMEWORK_EFI_IFR_ONE_OF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
+ Status = F2UCreateOneOfOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
if (!EFI_ERROR (Status)) {\r
- FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+ FwOpCode = NextFwOpCode;\r
//\r
- // F2UCreateOneOfOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+ // FwOpCode is already updated to point to the next opcode.\r
//\r
continue;\r
}\r
break;\r
\r
case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
- Status = F2UCreateOrderedListOpCode ((FRAMEWORK_EFI_IFR_ORDERED_LIST *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
+ Status = F2UCreateOrderedListOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
if (!EFI_ERROR (Status)) {\r
- FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+ FwOpCode = NextFwOpCode;\r
//\r
- // F2UCreateOrderedListOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+ // FwOpCode is already updated to point to the next opcode.\r
//\r
continue;\r
}\r
break;\r
\r
case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
- Status = F2UCreateCheckBoxOpCode ((FRAMEWORK_EFI_IFR_CHECKBOX *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ Status = F2UCreateCheckBoxOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode); \r
+ DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_STRING_OP:\r
- Status = F2UCreateStringOpCode ((FRAMEWORK_EFI_IFR_STRING *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ Status = F2UCreateStringOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode); \r
+ DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_BANNER_OP:\r
- Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
+ Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode); \r
+ DataCount = 1;\r
break;\r
\r
case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
- Status = UCreateEndOfOpcode (UefiUpdateDataBuffer);\r
- mOneOfOptionWidth = 0;\r
+ Status = UCreateEndOfOpcode (UefiOpCode);\r
+ DataCount = 1;\r
break;\r
- \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
+ FreePool (UefiOpCode->Data);\r
+ FreePool (UefiOpCode);\r
return Status;\r
}\r
\r
- FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length);\r
+ FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
}\r
\r
- *UefiData = UefiUpdateDataBuffer;\r
+ *UefiData = UefiOpCode;\r
\r
return EFI_SUCCESS;\r
}\r
\r
EFI_STATUS\r
F2UCreateOneOfOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_ONE_OF *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData,\r
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
\r
EFI_STATUS\r
F2UCreateOrderedListOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData,\r
OUT FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
\r
EFI_STATUS\r
F2UCreateCheckBoxOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_CHECKBOX *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
\r
EFI_STATUS\r
F2UCreateNumericOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_NUMERIC *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
\r
EFI_STATUS\r
F2UCreateStringOpCode (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId,\r
IN CONST FRAMEWORK_EFI_IFR_STRING *FwOpcode,\r
OUT EFI_HII_UPDATE_DATA *UefiData\r
)\r
;\r
\r
EFI_STATUS\r
-ThunkFrameworkUpdateDataToUefiUpdateData (\r
+FwUpdateDataToUefiUpdateData (\r
+ IN HII_THUNK_CONTEXT *ThunkContext,\r
IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data,\r
IN BOOLEAN AddData,\r
OUT EFI_HII_UPDATE_DATA **UefiData\r
/**@file\r
-\r
- This file contains the keyboard processing code to the HII database.\r
+ Implement protocol interface related to package registrations.\r
\r
Copyright (c) 2006 - 2008, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
#include "HiiDatabase.h"\r
\r
\r
-BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
-BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
+STATIC BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
+STATIC BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
+BOOLEAN mInFrameworkUpdatePakcage = FALSE;\r
\r
\r
EFI_STATUS\r
-GetIfrAndStringPackNum (\r
+GetPackageCount (\r
IN CONST EFI_HII_PACKAGES *Packages,\r
- UINTN *IfrPackNum,\r
- UINTN *StringPackNum\r
+ UINTN *IfrPackageCount,\r
+ UINTN *StringPackageCount\r
)\r
{\r
UINTN Index;\r
TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
\r
ASSERT (Packages != NULL);\r
- ASSERT (IfrPackNum != NULL);\r
- ASSERT (StringPackNum != NULL);\r
+ ASSERT (IfrPackageCount != NULL);\r
+ ASSERT (StringPackageCount != NULL);\r
\r
- *IfrPackNum = 0;\r
- *StringPackNum = 0;\r
+ *IfrPackageCount = 0;\r
+ *StringPackageCount = 0;\r
\r
TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
+ \r
for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
//\r
// BugBug: The current UEFI HII build tool generate a binary in the format defined in: \r
// TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
- // this binary is with same package type. So the returned IfrPackNum and StringPackNum\r
+ // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
// may not be the exact number of valid package number in the binary generated \r
// by HII Build tool.\r
//\r
switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
case EFI_HII_PACKAGE_FORM:\r
- *IfrPackNum += 1;\r
+ *IfrPackageCount += 1;\r
break;\r
case EFI_HII_PACKAGE_STRINGS:\r
- *StringPackNum += 1;\r
+ *StringPackageCount += 1;\r
break;\r
\r
case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS \r
-LibExportPackageLists (\r
- IN EFI_HII_HANDLE UefiHiiHandle,\r
- OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
- OUT UINTN *PackageListSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Size;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
-\r
- ASSERT (PackageListSize != NULL);\r
- ASSERT (PackageListHeader != NULL);\r
-\r
- Size = 0;\r
- PackageListHdr = NULL;\r
- Status = mHiiDatabase->ExportPackageLists (\r
- mHiiDatabase,\r
- UefiHiiHandle,\r
- &Size,\r
- PackageListHdr\r
- );\r
- ASSERT_EFI_ERROR (Status == EFI_BUFFER_TOO_SMALL);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- PackageListHdr = AllocateZeroPool (Size);\r
- ASSERT (PackageListHdr != NULL);\r
- \r
- if (PackageListHeader == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- } else {\r
- Status = mHiiDatabase->ExportPackageLists (\r
- mHiiDatabase,\r
- UefiHiiHandle,\r
- &Size,\r
- PackageListHdr\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
- }\r
-\r
- if (!EFI_ERROR (Status)) {\r
- *PackageListHeader = PackageListHdr;\r
- *PackageListSize = Size;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-InsertStringPackagesToIfrPackageList (\r
- IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader,\r
- IN EFI_HII_HANDLE UefiHiiHandle \r
- )\r
-{\r
- EFI_STATUS Status;\r
- Status = mHiiDatabase->UpdatePackageList (\r
- mHiiDatabase,\r
- UefiHiiHandle,\r
- StringPackageListHeader\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-\r
/**\r
Removes a node from a doubly linked list, and returns the node that follows\r
the removed node.\r
\r
**/\r
EFI_STATUS\r
-AddStringPackagesToMatchingIfrPackageList (\r
- IN EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+FindPackListWithOnlyIfrPackAndAddStringPack (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN HII_THUNK_CONTEXT *StringPackageThunkContext,\r
IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader\r
)\r
{\r
EFI_STATUS Status;\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
- if (CompareGuid (&StringPackageListHeader->PackageListGuid, &HandleMapEntry->TagGuid)) {\r
- Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, HandleMapEntry->UefiHiiHandle);\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+ if (StringPackageThunkContext != ThunkContext) {\r
+ //\r
+ // Skip the String Package Thunk Entry itself.\r
+ //\r
+ \r
+ if (CompareGuid (&StringPackageListHeader->PackageListGuid, &ThunkContext->TagGuid)) {\r
+\r
+ ASSERT (ThunkContext->StringPackageCount == 0 && ThunkContext->IfrPackageCount == 1);\r
+\r
+ ThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);\r
+ \r
+ Status = mHiiDatabase->UpdatePackageList (\r
+ mHiiDatabase,\r
+ ThunkContext->UefiHiiHandle,\r
+ StringPackageListHeader\r
+ );\r
+ ASSERT (Status != EFI_NOT_FOUND);\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
}\r
+ \r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
+\r
return EFI_NOT_FOUND;\r
}\r
+\r
+\r
EFI_HII_PACKAGE_LIST_HEADER *\r
PrepareUefiPackageListFromFrameworkHiiPackages (\r
IN CONST EFI_HII_PACKAGES *Packages,\r
}\r
\r
EFI_STATUS\r
-FindAndAddStringPackageToIfrPackageList(\r
- EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- EFI_GUID *GuidId,\r
- EFI_HII_HANDLE UefiIfrHiiHandle\r
+FindStringPackAndAddToPackListWithOnlyIfrPack(\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN HII_THUNK_CONTEXT *IfrThunkContext\r
)\r
{\r
- EFI_STATUS Status;\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
- EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;\r
- UINTN Size;\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
- if (CompareGuid (GuidId, &HandleMapEntry->TagGuid) && (!HandleMapEntry->DoesPackageListImportStringPackages)) {\r
- Status = LibExportPackageLists (HandleMapEntry->UefiHiiHandle, &StringPackageListHeader, &Size);\r
- ASSERT_EFI_ERROR (Status);\r
+ EFI_STATUS Status;\r
+ LIST_ENTRY *Link;\r
+ EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;\r
+ UINTN Size;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
\r
- //\r
- // Add Function to only get only String Packages from the Package List\r
- //\r
+ \r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+ if (ThunkContext != IfrThunkContext) {\r
+ if (CompareGuid (&IfrThunkContext->TagGuid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount == 0)) {\r
+ Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &StringPackageListHeader, &Size);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ IfrThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);\r
+ //\r
+ // Add Function to only get only String Packages from the Package List\r
+ //\r
+ Status = mHiiDatabase->UpdatePackageList (\r
+ mHiiDatabase,\r
+ IfrThunkContext->UefiHiiHandle,\r
+ StringPackageListHeader\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ FreePool (StringPackageListHeader);\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
\r
- Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, UefiIfrHiiHandle);\r
- ASSERT_EFI_ERROR (Status);\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+\r
+}\r
+\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN UINTN StringPackageCount,\r
+ IN UINTN IfrPackageCount\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
+ ASSERT (ThunkContext != NULL);\r
+ \r
+ ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+ ThunkContext->IfrPackageCount = IfrPackageCount;\r
+ ThunkContext->StringPackageCount = StringPackageCount;\r
+ Status = AssignFrameworkHiiHandle (Private, TRUE, &ThunkContext->FwHiiHandle);\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+ InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+\r
+ return ThunkContext;\r
+ \r
+}\r
+\r
+VOID\r
+FreeFrameworkHiiHandle (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHandle\r
+ )\r
+{\r
+ //\r
+ // TODO: \r
+ //\r
+ \r
+ return;\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+ IN LIST_ENTRY *OneOfOptionMapListHead\r
+ )\r
+{\r
+ ONE_OF_OPTION_MAP *Map;\r
+ ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+\r
+ while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+ Link = GetFirstNode (OneOfOptionMapListHead);\r
+ \r
+ Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+ Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
\r
- FreePool (StringPackageListHeader);\r
- return EFI_SUCCESS;\r
+ MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (MapEntry);\r
}\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (Map);\r
}\r
+}\r
\r
- return EFI_NOT_FOUND;\r
+VOID\r
+DestroyQuestionIdMap (\r
+ IN LIST_ENTRY *QuestionIdMapListHead\r
+ )\r
+{\r
+ QUESTION_ID_MAP *IdMap;\r
+ QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
\r
+ while (!IsListEmpty (QuestionIdMapListHead)) {\r
+ Link = GetFirstNode (QuestionIdMapListHead);\r
+ \r
+ IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
+ Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
+ \r
+ IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (IdMapEntry);\r
+ }\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (IdMap);\r
+ }\r
+}\r
+\r
+VOID\r
+DestroyThunkContext (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+{\r
+ ASSERT (ThunkContext != NULL);\r
+\r
+ FreeFrameworkHiiHandle (Private, ThunkContext->FwHiiHandle);\r
+\r
+ DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
+\r
+ DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+ FreePool (ThunkContext);\r
}\r
\r
CONST EFI_GUID mAGuid = \r
\r
EFI_STATUS\r
UefiRegisterPackageList(\r
- EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- EFI_HII_PACKAGES *Packages,\r
- FRAMEWORK_EFI_HII_HANDLE *Handle\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN EFI_HII_PACKAGES *Packages,\r
+ OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
)\r
{\r
EFI_STATUS Status;\r
- UINTN StringPackNum;\r
- UINTN IfrPackNum;\r
- EFI_HII_PACKAGE_LIST_HEADER *UefiPackageListHeader;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
+ UINTN StringPackageCount;\r
+ UINTN IfrPackageCount;\r
+ EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
EFI_GUID GuidId;\r
\r
- UefiPackageListHeader = NULL;\r
+ PackageListHeader = NULL;\r
\r
- Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
+ Status = GetPackageCount (Packages, &IfrPackageCount, &StringPackageCount);\r
ASSERT_EFI_ERROR (Status);\r
- //\r
- // Thunk Layer only handle the following combinations of IfrPack, StringPkg and FontPack.\r
- // Thunk Layer only allow zero or one IfrPack in the Package List.\r
- //\r
- if (IfrPackNum > 1) {\r
+ \r
+ if (IfrPackageCount > 1) {\r
+ //\r
+ // HII Thunk only handle package with 0 or 1 IFR package. \r
+ //\r
return EFI_UNSUPPORTED;\r
}\r
\r
- HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
- ASSERT (HandleMappingEntry != NULL);\r
- \r
- HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
- Status = AssignHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
+ ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
+ if (ThunkContext == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- //\r
- // Packages->GuidId may be NULL. In such case, caller of FramworkHii->NewPack is registering\r
- // package with StringPack and IfrPack.\r
- //\r
if (Packages->GuidId == NULL) {\r
+ //\r
+ // UEFI HII Database require Package List GUID must be unique.\r
+ //\r
+ // If Packages->GuidId is NULL, the caller of FramworkHii->NewPack is registering\r
+ // packages with at least 1 StringPack and 1 IfrPack. Therefore, Packages->GuidId is\r
+ // not used as the name of the package list. A GUID is generated as a Package List\r
+ // GUID.\r
+ //\r
+ ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
Packages->GuidId = &GuidId;\r
GenerateGuidId (&mAGuid, Packages->GuidId);\r
} else {\r
+ //BugBug We need fix this.\r
+ //ASSERT (StringPackageCount == 0 || IfrPackageCount == 0);\r
CopyGuid (&GuidId, Packages->GuidId);\r
}\r
- \r
- CopyGuid (&HandleMappingEntry->TagGuid, Packages->GuidId);\r
\r
- if ((StringPackNum == 0) && (IfrPackNum != 0)) {\r
+ //\r
+ // Record the Package List GUID, it is used as a name for the package list by Framework HII.\r
+ //\r
+ CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);\r
+\r
+ if ((StringPackageCount == 0) && (IfrPackageCount != 0)) {\r
//\r
// UEFI HII database does not allow two package list with the same GUID.\r
// In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
// UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
// that Setup Utility can load the Buffer Storage using this protocol.\r
//\r
- if (IfrPackNum != 0) {\r
- InstallDefaultUefiConfigAccessProtocol (Packages, HandleMappingEntry);\r
+ if (IfrPackageCount != 0) {\r
+ InstallDefaultConfigAccessProtocol (Packages, ThunkContext);\r
}\r
- UefiPackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
+ PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
Status = mHiiDatabase->NewPackageList (\r
mHiiDatabase,\r
- UefiPackageListHeader, \r
- HandleMappingEntry->UefiHiiDriverHandle,\r
- &HandleMappingEntry->UefiHiiHandle\r
+ PackageListHeader, \r
+ ThunkContext->UefiHiiDriverHandle,\r
+ &ThunkContext->UefiHiiHandle\r
);\r
+\r
+ //\r
+ // BUGBUG: Remove when development is done\r
+ //\r
ASSERT_EFI_ERROR (Status);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
\r
- if (IfrPackNum == 0) {\r
- if (StringPackNum != 0) {\r
+ if (IfrPackageCount == 0) {\r
+ if (StringPackageCount != 0) {\r
//\r
- // Look for a package list with IFR Pack which has already registed with HII Database\r
+ // Find if there is Package List with only IFR Package in the databasee with the same\r
+ // tag. If found, add the String Package to this Package List.\r
//\r
- HandleMappingEntry->IsPackageListWithOnlyStringPackages = TRUE;\r
- Status = AddStringPackagesToMatchingIfrPackageList (\r
+ Status = FindPackListWithOnlyIfrPackAndAddStringPack (\r
Private,\r
- UefiPackageListHeader\r
+ ThunkContext,\r
+ PackageListHeader\r
);\r
\r
- if (!EFI_ERROR (Status) || Status == EFI_NOT_FOUND) {\r
-\r
- if (Status == EFI_NOT_FOUND) {\r
- Status = EFI_SUCCESS;\r
- }\r
+ if (Status == EFI_NOT_FOUND) {\r
+ Status = EFI_SUCCESS;\r
}\r
}\r
} else {\r
- if (StringPackNum == 0) {\r
+ CreateQuestionIdMap (ThunkContext);\r
+ \r
+ if (StringPackageCount == 0) {\r
//\r
// Register the Package List to UEFI HII first.\r
//\r
- Status = FindAndAddStringPackageToIfrPackageList (\r
+ Status = FindStringPackAndAddToPackListWithOnlyIfrPack (\r
Private,\r
- Packages->GuidId,\r
- HandleMappingEntry->UefiHiiHandle\r
+ ThunkContext\r
);\r
ASSERT_EFI_ERROR (Status);\r
- if (!EFI_ERROR (Status)) {\r
- HandleMappingEntry->DoesPackageListImportStringPackages = TRUE;\r
- }\r
}\r
}\r
\r
- if (!EFI_ERROR (Status)) {\r
- InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
- }\r
-\r
Done:\r
if (EFI_ERROR (Status)) {\r
- FreePool (HandleMappingEntry);\r
+ DestroyThunkContext (Private, ThunkContext);\r
} else {\r
- *Handle = HandleMappingEntry->FrameworkHiiHandle;\r
+ InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
+ *Handle = ThunkContext->FwHiiHandle;\r
}\r
\r
- SafeFreePool (UefiPackageListHeader);\r
+ SafeFreePool (PackageListHeader);\r
\r
return Status;\r
}\r
--*/\r
{\r
EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
EFI_TPL OldTpl;\r
\r
if (Handle == NULL) {\r
//\r
mInFrameworkHiiNewPack = TRUE;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
Status = UefiRegisterPackageList (\r
Private,\r
--*/\r
{\r
EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
EFI_TPL OldTpl;\r
- EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
mInFrameworkHiiRemovePack = TRUE;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+ ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
\r
- if (HandleMapEntry != NULL) {\r
+ if (ThunkContext != NULL) {\r
Status = mHiiDatabase->RemovePackageList (\r
mHiiDatabase,\r
- HandleMapEntry->UefiHiiHandle\r
+ ThunkContext->UefiHiiHandle\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- HiiLibDestroyHiiDriverHandle (HandleMapEntry->UefiHiiHandle);\r
-\r
- Status = gBS->HandleProtocol (\r
- HandleMapEntry->UefiHiiDriverHandle,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- (VOID **) &ConfigAccess\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->UninstallProtocolInterface (\r
- HandleMapEntry->UefiHiiDriverHandle,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- ConfigAccess\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- } else {\r
- Status = EFI_SUCCESS;\r
+ if (ThunkContext->IfrPackageCount != 0) {\r
+ UninstallDefaultConfigAccessProtocol (ThunkContext);\r
}\r
\r
- RemoveEntryList (&HandleMapEntry->List);\r
-\r
- FreePool (HandleMapEntry);\r
+ RemoveEntryList (&ThunkContext->Link);\r
\r
+ DestroyThunkContext (Private, ThunkContext);\r
}else {\r
Status = EFI_NOT_FOUND;\r
}\r
\r
return Status;\r
}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+NewOrAddPackNotify (\r
+ IN UINT8 PackageType,\r
+ IN CONST EFI_GUID *PackageGuid,\r
+ IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
+ IN EFI_HII_HANDLE Handle,\r
+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS || PackageType == EFI_HII_PACKAGE_FORM);\r
+ ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK || NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
+\r
+ Status = EFI_SUCCESS;\r
+ Private = mHiiThunkPrivateData;\r
+\r
+ if (mInFrameworkHiiNewPack || mInFrameworkUpdatePakcage) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ //\r
+ // We only create a ThunkContext if the Uefi Hii Handle is only already registered\r
+ // by the HII Thunk Layer.\r
+ //\r
+ ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
+ if (ThunkContext == NULL) {\r
+ ThunkContext = CreateThunkContextForUefiHiiHandle (Private, Handle);\r
+ ASSERT (ThunkContext != NULL);\r
+ } \r
+\r
+\r
+ if (PackageType == EFI_HII_PACKAGE_FORM) {\r
+ Status = CreateQuestionIdMap (ThunkContext);\r
+ }\r
+\r
+ return Status; \r
+}\r
+\r
+\r
+BOOLEAN\r
+IsRemovingLastStringPack (\r
+ IN EFI_HII_HANDLE Handle\r
+ )\r
+{\r
+ EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
+ UINTN BufferSize;\r
+ EFI_STATUS Status;\r
+ EFI_HII_PACKAGE_HEADER *PackageHeader;\r
+ UINTN StringPackageCount;\r
+\r
+ HiiPackageList = NULL;\r
+ BufferSize = 0;\r
+ StringPackageCount = 0;\r
+\r
+ Status = HiiLibExportPackageLists (Handle, &HiiPackageList, &BufferSize);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
+\r
+ while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
+ switch (PackageHeader->Type) {\r
+ case EFI_HII_PACKAGE_STRINGS:\r
+ StringPackageCount++;\r
+\r
+ if (StringPackageCount > 1) {\r
+ //\r
+ // More than one String Pack in the package list\r
+ //\r
+ FreePool (HiiPackageList);\r
+ return FALSE;\r
+ }\r
+ break; \r
+\r
+ default:\r
+ break;\r
+ }\r
+ //\r
+ // goto header of next package\r
+ //\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
+ }\r
+\r
+\r
+ //\r
+ // We will always be notified for the removal of String Pack from a package list.\r
+ // So StringPackageCount must be one at this point.\r
+ //\r
+ ASSERT (StringPackageCount == 1);\r
+ \r
+ FreePool (HiiPackageList);\r
+ return TRUE;\r
+}\r
+\r
+\r
+\r
+// Framework HII module may cache a GUID as the name of the package list.\r
+// Then search for the Framework HII handle database for the handle matching\r
+// this GUID\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RemovePackNotify (\r
+ IN UINT8 PackageType,\r
+ IN CONST EFI_GUID *PackageGuid,\r
+ IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
+ IN EFI_HII_HANDLE Handle,\r
+ IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_CONTEXT * ThunkContext;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
+ ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
+\r
+ if (mInFrameworkHiiRemovePack || mInFrameworkUpdatePakcage) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ Private = mHiiThunkPrivateData;\r
+\r
+ ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
+\r
+ if (ThunkContext->FwHiiHandle > Private->StaticHiiHandle) {\r
+ if (IsRemovingLastStringPack (Handle)) {\r
+ //\r
+ // If the string package will be removed is the last string package\r
+ // in the package list, we will remove the HII Thunk entry from the\r
+ // database.\r
+ //\r
+ Status = DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
+ }\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+\r
--- /dev/null
+/**@file\r
+Framework to UEFI 2.1 Setup Browser Thunk. The file consume EFI_FORM_BROWSER2_PROTOCOL\r
+to produce a EFI_FORM_BROWSER_PROTOCOL.\r
+\r
+Copyright (c) 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_STATUS\r
+EFIAPI \r
+ThunkSendForm (\r
+ IN EFI_FORM_BROWSER_PROTOCOL *This,\r
+ IN BOOLEAN UseDatabase,\r
+ IN FRAMEWORK_EFI_HII_HANDLE *Handle,\r
+ IN UINTN HandleCount,\r
+ IN FRAMEWORK_EFI_IFR_PACKET *Packet, OPTIONAL\r
+ IN EFI_HANDLE CallbackHandle, OPTIONAL\r
+ IN UINT8 *NvMapOverride, OPTIONAL\r
+ IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL\r
+ OUT BOOLEAN *ResetRequired OPTIONAL\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ EFI_FORMBROWSER_THUNK_PRIVATE_DATA *BrowserPrivate;\r
+\r
+ if (!UseDatabase) {\r
+ //\r
+ // Packet, CallbackHandle.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (HandleCount != 1 ) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ BrowserPrivate = EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS (This);\r
+ Private = BrowserPrivate->ThunkPrivate;\r
+\r
+ ThunkContext = FwHiiHandleToThunkContext (Private, *Handle);\r
+ if (ThunkContext == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (NvMapOverride != NULL) {\r
+ ThunkContext->NvMapOverride = NvMapOverride;\r
+ }\r
+\r
+ Status = mFormBrowser2Protocol->SendForm (\r
+ mFormBrowser2Protocol,\r
+ &ThunkContext->UefiHiiHandle,\r
+ 1,\r
+ NULL,\r
+ 0,\r
+ (EFI_SCREEN_DESCRIPTOR *) ScreenDimensions,\r
+ &ActionRequest\r
+ );\r
+\r
+ if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
+ *ResetRequired = TRUE;\r
+ }\r
+ \r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI \r
+ThunkCreatePopUp (\r
+ IN UINTN NumberOfLines,\r
+ IN BOOLEAN HotKey,\r
+ IN UINTN MaximumStringSize,\r
+ OUT CHAR16 *StringBuffer,\r
+ OUT EFI_INPUT_KEY *KeyValue,\r
+ IN CHAR16 *String,\r
+ ...\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VA_LIST Marker;\r
+\r
+ if (HotKey != TRUE) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ VA_START (Marker, KeyValue);\r
+ \r
+ Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, Marker);\r
+\r
+ VA_END (Marker);\r
+ \r
+ return Status;\r
+}\r
+\r
/**@file\r
-\r
- This file contains the keyboard processing code to the HII database.\r
-\r
+ This file implements the protocol functions related to string package.\r
+ \r
Copyright (c) 2006 - 2008, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
}\r
\r
EFI_STATUS\r
-GetTagGuidByFrameworkHiiHandle (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle,\r
+GetTagGuidByFwHiiHandle (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle,\r
OUT EFI_GUID *TagGuid\r
)\r
{\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
\r
ASSERT (TagGuid != NULL);\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
- CopyGuid (TagGuid, &HandleMapEntry->TagGuid);\r
+ if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
+ CopyGuid (TagGuid, &ThunkContext->TagGuid);\r
return EFI_SUCCESS;\r
}\r
+\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
- \r
+\r
return EFI_NOT_FOUND;\r
}\r
\r
+\r
+\r
EFI_STATUS\r
-HiiThunkNewStringForAllStringPackages (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- OUT CONST EFI_GUID *TagGuid,\r
- IN CHAR16 *Language,\r
- IN OUT STRING_REF *Reference,\r
- IN CHAR16 *NewString\r
+EFIAPI\r
+HiiNewString (\r
+ IN EFI_HII_PROTOCOL *This,\r
+ IN CHAR16 *Language,\r
+ IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
+ IN OUT STRING_REF *Reference,\r
+ IN CHAR16 *NewString\r
)\r
+/*++\r
+\r
+Routine Description:\r
+ This function allows a new String to be added to an already existing String Package.\r
+ We will make a buffer the size of the package + StrSize of the new string. We will\r
+ copy the string package that first gets changed and the following language packages until\r
+ we encounter the NULL string package. All this time we will ensure that the offsets have\r
+ been adjusted.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
{\r
EFI_STATUS Status;\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
- EFI_STRING_ID StringId1;\r
- EFI_STRING_ID StringId2;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+ EFI_GUID TagGuid;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ EFI_STRING_ID StringId;\r
+ EFI_STRING_ID LastStringId;\r
CHAR8 *AsciiLanguage;\r
BOOLEAN Found;\r
\r
- ASSERT (TagGuid != NULL);\r
+ //\r
+ // BugBug: Conver the language to 3066.\r
+ //\r
\r
- StringId1 = (EFI_STRING_ID) 0;\r
- StringId2 = (EFI_STRING_ID) 0;\r
- Found = FALSE;\r
+ LastStringId = (EFI_STRING_ID) 0;\r
+ StringId = (EFI_STRING_ID) 0;\r
+ Found = FALSE;\r
+ AsciiLanguage = NULL;\r
\r
- if (Language == NULL) {\r
- AsciiLanguage = NULL;\r
- } else {\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+ Status = GetTagGuidByFwHiiHandle (Private, Handle, &TagGuid);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ if (Language != NULL) {\r
AsciiLanguage = AllocateZeroPool (StrLen (Language) + 1);\r
UnicodeStrToAsciiStr (Language, AsciiLanguage);\r
}\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
-\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (CompareGuid (TagGuid, &HandleMapEntry->TagGuid)) {\r
+ if (CompareGuid (&TagGuid, &ThunkContext->TagGuid)) {\r
Found = TRUE;\r
if (*Reference == 0) {\r
+ //\r
+ // Create a new string token.\r
+ //\r
if (AsciiLanguage == NULL) {\r
- Status = HiiLibNewString (HandleMapEntry->UefiHiiHandle, &StringId2, NewString);\r
+ //\r
+ // For all languages in the package list.\r
+ //\r
+ Status = HiiLibNewString (ThunkContext->UefiHiiHandle, &StringId, NewString);\r
} else {\r
+ //\r
+ // For specified language.\r
+ //\r
Status = mHiiStringProtocol->NewString (\r
mHiiStringProtocol,\r
- HandleMapEntry->UefiHiiHandle,\r
- &StringId2,\r
+ ThunkContext->UefiHiiHandle,\r
+ &StringId,\r
AsciiLanguage,\r
NULL,\r
NewString,\r
);\r
}\r
} else {\r
+ //\r
+ // Update the existing string token.\r
+ //\r
if (AsciiLanguage == NULL) {\r
- Status = HiiLibSetString (HandleMapEntry->UefiHiiHandle, *Reference, NewString);\r
+ //\r
+ // For all languages in the package list.\r
+ //\r
+ Status = HiiLibSetString (ThunkContext->UefiHiiHandle, *Reference, NewString);\r
} else {\r
+ //\r
+ // For specified language.\r
+ //\r
Status = mHiiStringProtocol->SetString (\r
mHiiStringProtocol,\r
- HandleMapEntry->UefiHiiHandle,\r
+ ThunkContext->UefiHiiHandle,\r
*Reference,\r
AsciiLanguage,\r
NewString,\r
}\r
}\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ //\r
+ // Only EFI_INVALID_PARAMETER is defined in HII 0.92 specification.\r
+ //\r
+ return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (*Reference == 0) {\r
- if (StringId1 == (EFI_STRING_ID) 0) {\r
- StringId1 = StringId2;\r
+ //\r
+ // When creating new string token, make sure all created token is the same\r
+ // for all string packages registered using FW HII interface.\r
+ //\r
+ if (LastStringId == (EFI_STRING_ID) 0) {\r
+ LastStringId = StringId;\r
} else {\r
- if (StringId1 != StringId2) {\r
+ if (LastStringId != StringId) {\r
ASSERT(FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
}\r
}\r
+\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
if (Found) {\r
- *Reference = StringId1;\r
+ if (*Reference == 0) {\r
+ *Reference = StringId;\r
+ }\r
Status = EFI_SUCCESS;\r
} else {\r
+ DEBUG((EFI_D_ERROR, "Thunk HiiNewString fails to find the String Packages to update\n"));\r
+ //\r
+ // BUGBUG: Remove ths ASSERT when development is done.\r
+ //\r
ASSERT (FALSE);\r
Status = EFI_NOT_FOUND;\r
}\r
\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiNewString (\r
- IN EFI_HII_PROTOCOL *This,\r
- IN CHAR16 *Language,\r
- IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
- IN OUT STRING_REF *Reference,\r
- IN CHAR16 *NewString\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- This function allows a new String to be added to an already existing String Package.\r
- We will make a buffer the size of the package + StrSize of the new string. We will\r
- copy the string package that first gets changed and the following language packages until\r
- we encounter the NULL string package. All this time we will ensure that the offsets have\r
- been adjusted.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
- EFI_GUID TagGuid;\r
-\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
-\r
- Status = GetTagGuidByFrameworkHiiHandle (Private, Handle, &TagGuid);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = HiiThunkNewStringForAllStringPackages (Private, &TagGuid, Language, Reference, NewString);\r
//\r
// For UNI file, some String may not be defined for a language. This has been true for a lot of platform code.\r
// For this case, EFI_NOT_FOUND will be returned. To allow the old code to be run without porting, we don't assert \r
\r
--*/\r
{\r
- ASSERT (FALSE);\r
- return EFI_UNSUPPORTED;\r
+ return EFI_SUCCESS;\r
}\r
\r
typedef struct {\r
\r
--*/\r
{\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
CHAR8 *AsciiLanguage;\r
- EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
CHAR8 *Rfc3066AsciiLanguage;\r
\r
- Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
if (LanguageString == NULL) {\r
AsciiLanguage = NULL;\r
\r
}\r
\r
- for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
- ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
- ListEntry = ListEntry->ForwardLink\r
- ) {\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
\r
- HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (Handle == HandleMapEntry->FrameworkHiiHandle) {\r
+ if (Handle == ThunkContext->FwHiiHandle) {\r
if (AsciiLanguage == NULL) {\r
- return HiiLibGetString (HandleMapEntry->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
+ return HiiLibGetString (ThunkContext->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
} else {\r
return mHiiStringProtocol->GetString (\r
mHiiStringProtocol,\r
AsciiLanguage,\r
- HandleMapEntry->UefiHiiHandle,\r
+ ThunkContext->UefiHiiHandle,\r
Token,\r
StringBuffer,\r
BufferLengthTemp,\r
);\r
}\r
}\r
+ \r
+ \r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
return EFI_NOT_FOUND;\r
// Extern Variables\r
//\r
extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
-extern CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
Link = GetFirstNode (&Form->StatementListHead);\r
while (!IsNull (&Form->StatementListHead, Link)) {\r
Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
- Link = GetNextNode (&Form->StatementListHead, Link);\r
-\r
//\r
// Reset Question to its default value\r
//\r
continue;\r
}\r
\r
+ Link = GetNextNode (&Form->StatementListHead, Link);\r
}\r
return EFI_SUCCESS;\r
}\r
OUT LIST_ENTRY *UefiDefaultsListHead\r
)\r
{\r
- LIST_ENTRY *StorageListEntry;\r
+ LIST_ENTRY *StorageLink;\r
FORMSET_STORAGE *Storage;\r
EFI_STATUS Status;\r
\r
- StorageListEntry = GetFirstNode (&FormSet->StorageListHead);\r
+ StorageLink = GetFirstNode (&FormSet->StorageListHead);\r
\r
- while (!IsNull (&FormSet->StorageListHead, StorageListEntry)) {\r
- Storage = FORMSET_STORAGE_FROM_LINK(StorageListEntry);\r
+ while (!IsNull (&FormSet->StorageListHead, StorageLink)) {\r
+ Storage = FORMSET_STORAGE_FROM_LINK(StorageLink);\r
\r
if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
Status = GetBufferTypeDefaultIdAndStorageId (DefaultStore, Storage, FormSet, UefiDefaultsListHead);\r
}\r
\r
- StorageListEntry = GetNextNode (&FormSet->StorageListHead, StorageListEntry);\r
+ StorageLink = GetNextNode (&FormSet->StorageListHead, StorageLink);\r
}\r
\r
return EFI_SUCCESS;\r
{\r
FORM_BROWSER_FORMSET *FormSet;\r
EFI_GUID FormSetGuid;\r
- LIST_ENTRY *DefaultListEntry;\r
+ LIST_ENTRY *DefaultLink;\r
FORMSET_DEFAULTSTORE *DefaultStore;\r
EFI_STATUS Status;\r
\r
ASSERT (UefiDefaults != NULL);\r
InitializeListHead (*UefiDefaults);\r
\r
- DefaultListEntry = GetFirstNode (&FormSet->DefaultStoreListHead);\r
- while (!IsNull (&FormSet->DefaultStoreListHead, DefaultListEntry)) {\r
- DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultListEntry);\r
+ DefaultLink = GetFirstNode (&FormSet->DefaultStoreListHead);\r
+ while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) {\r
+ DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
\r
Status = GetBufferTypeDefaultId (DefaultStore, FormSet, *UefiDefaults);\r
ASSERT_EFI_ERROR (Status);\r
\r
- DefaultListEntry = GetNextNode (&FormSet->DefaultStoreListHead, DefaultListEntry); \r
+ DefaultLink = GetNextNode (&FormSet->DefaultStoreListHead, DefaultLink); \r
}\r
\r
DestroyFormSet (FormSet);\r
FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.\r
**/\r
EFI_STATUS\r
-UefiDefaultsToFrameworkDefaults (\r
+UefiDefaultsToFwDefaults (\r
IN LIST_ENTRY *ListHead,\r
IN UINTN DefaultMask,\r
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
IN LIST_ENTRY *ListHead\r
)\r
{\r
- LIST_ENTRY *Node;\r
+ LIST_ENTRY *Link;\r
UEFI_IFR_BUFFER_STORAGE_NODE *Default;\r
\r
- Node = GetFirstNode (ListHead);\r
+ Link = GetFirstNode (ListHead);\r
\r
- while (!IsNull (ListHead, Node)) {\r
- Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Node);\r
+ while (!IsNull (ListHead, Link)) {\r
+ Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link);\r
\r
- RemoveEntryList (Node);\r
+ RemoveEntryList (Link);\r
\r
DestroyDefaultNode (Default);\r
\r
- Node = GetFirstNode (ListHead);\r
+ Link = GetNextNode (ListHead, Link);\r
}\r
\r
FreePool (ListHead);\r
//\r
// VARSTORE ID of 0 for Buffer Storage Type Storage is reserved in UEFI IFR form. But VARSTORE ID\r
// 0 in Framework IFR is the default VarStore ID for storage without explicit declaration. So we have\r
-// to reseved 0xFFEE in UEFI VARSTORE ID to represetn default storage id in Framework IFR.\r
+// to reseved 0x0001 in UEFI VARSTORE ID to represetn default storage id in Framework IFR.\r
// Framework VFR has to be ported or pre-processed to change the default VARSTORE to a VARSTORE\r
-// with ID equal to 0xFFEE.\r
+// with ID equal to 0x0001.\r
//\r
-#define RESERVED_VARSTORE_ID 0xFFEE\r
+#define RESERVED_VARSTORE_ID 0x0001\r
+#define RESERVED_QUESTION_ID 0xf000\r
\r
#define UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(a) CR(a, UEFI_IFR_BUFFER_STORAGE_NODE, List, UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE)\r
#define UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE EFI_SIGNATURE_32 ('I', 'b', 'S', 'n')\r
**/\r
\r
EFI_STATUS\r
-UefiDefaultsToFrameworkDefaults (\r
+UefiDefaultsToFwDefaults (\r
IN LIST_ENTRY *UefiIfrDefaults,\r
IN UINTN DefaultMask,\r
OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
FORM_EXPRESSION *mGrayOutExpression;\r
\r
EFI_GUID gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
-EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
\r
/**\r
Initialize Statement header members.\r
#include <PiDxe.h>\r
\r
#include <Protocol/Print.h>\r
-//#include <Protocol/SimpleTextOut.h>\r
-//#include <Protocol/SimpleTextIn.h>\r
-//#include <Protocol/FormBrowser2.h>\r
-//#include <Protocol/DevicePath.h>\r
#include <Protocol/HiiConfigAccess.h>\r
#include <Protocol/HiiConfigRouting.h>\r
#include <Protocol/HiiDatabase.h>\r
#define FORM_INCONSISTENT_VALIDATION 0\r
#define FORM_NO_SUBMIT_VALIDATION 1\r
\r
+extern EFI_GUID gTianoHiiIfrGuid;\r
+\r
\r
typedef struct {\r
UINT8 Type;\r
// Extern Variables\r
//\r
extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
-extern CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
\r
#include "HiiDatabase.h"\r
\r
+EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
+EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
+\r
+\r
EFI_GUID *\r
GetGuidOfFirstFormset (\r
CONST EFI_HII_FORM_PACKAGE * FormPackage\r
) \r
{\r
- UINT8 *StartOfNextPackage;\r
- EFI_IFR_OP_HEADER *OpCodeData;\r
+ UINT8 *StartOfNextPackage;\r
+ EFI_IFR_OP_HEADER *OpCodeData;\r
\r
StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length;\r
OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1);\r
}\r
\r
EFI_HII_HANDLE\r
-FrameworkHiiHandleToUefiHiiHandle (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle\r
+FwHiiHandleToUefiHiiHandle (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
)\r
{\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
\r
- ASSERT (FrameworkHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
+ ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
ASSERT (Private != NULL);\r
\r
- HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, FrameworkHiiHandle);\r
+ ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);\r
\r
- if (HandleMapEntry != NULL) {\r
- return HandleMapEntry->UefiHiiHandle;\r
+ if (ThunkContext != NULL) {\r
+ return ThunkContext->UefiHiiHandle;\r
}\r
\r
return (EFI_HII_HANDLE) NULL;\r
}\r
\r
\r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-FrameworkHiiHandleToMapDatabaseEntry (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle\r
+HII_THUNK_CONTEXT *\r
+FwHiiHandleToThunkContext (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
)\r
{\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\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
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
\r
- if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
- return HandleMapEntry;\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+ if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
+ return ThunkContext;\r
}\r
+\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
- return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
+ return NULL;\r
}\r
\r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-UefiHiiHandleToMapDatabaseEntry (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+HII_THUNK_CONTEXT *\r
+UefiHiiHandleToThunkContext (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
)\r
{\r
- LIST_ENTRY *ListEntry;\r
- HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\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
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
\r
- if (UefiHiiHandle == HandleMapEntry->UefiHiiHandle) {\r
- return HandleMapEntry;\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+ if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {\r
+ return ThunkContext;\r
}\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
- return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
+ return NULL;\r
}\r
\r
EFI_HII_HANDLE *\r
-TagGuidToUefiIfrHiiHandle (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+TagGuidToUefiHiiHandle (\r
+ IN CONST 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
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\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
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
\r
- if (CompareGuid (Guid, &HandleMapEntry->TagGuid) && HandleMapEntry->DoesPackageListImportStringPackages) {\r
- return HandleMapEntry->UefiHiiHandle;\r
+ if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
+ return ThunkContext->UefiHiiHandle;\r
}\r
+\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
}\r
\r
- return (EFI_HII_HANDLE *) NULL;\r
+ return NULL;\r
\r
}\r
\r
BOOLEAN\r
IsFrameworkHiiDatabaseHandleDepleted (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private\r
)\r
{\r
return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
}\r
\r
EFI_STATUS\r
-\r
-AssignHiiHandle (\r
- IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+AssignFrameworkHiiHandle (\r
+ IN OUT HII_THUNK_PRIVATE_DATA *Private,\r
+ IN BOOLEAN FromFwHiiNewPack,\r
OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
)\r
{\r
ASSERT (Handle != NULL);\r
\r
- *Handle = Private->StaticHiiHandle;\r
- Private->StaticHiiHandle += 1;\r
+ if (FromFwHiiNewPack) {\r
+\r
+ *Handle = Private->StaticHiiHandle;\r
+ Private->StaticHiiHandle += 1;\r
+\r
+ if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ } else {\r
+\r
+ *Handle = Private->StaticPureUefiHiiHandle;\r
+ Private->StaticPureUefiHiiHandle -= 1;\r
+ \r
+ if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
\r
- if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
- return EFI_OUT_OF_RESOURCES;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
EFI_STATUS\r
-AssignPureUefiHiiHandle (\r
- IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
+DestroyThunkContextForUefiHiiHandle (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN EFI_HII_HANDLE UefiHiiHandle\r
+ )\r
+{\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
+ ASSERT (ThunkContext != NULL);\r
+\r
+ ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));\r
+ ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));\r
+ \r
+ RemoveEntryList (&ThunkContext->Link);\r
+\r
+ FreePool (ThunkContext);\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+ This function create a HII_THUNK_CONTEXT for a package list registered\r
+ by a module calling EFI_HII_DATABASE_PROTOCOL.NewPackageList. It records\r
+ the PackageListGuid in EFI_HII_PACKAGE_LIST_HEADER in the TagGuid in \r
+ HII_THUNK_CONTEXT created. This TagGuid will be used as a key to s\r
+\r
+**/\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContextForUefiHiiHandle (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN EFI_HII_HANDLE UefiHiiHandle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_GUID PackageGuid;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+ ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));\r
+ ASSERT (ThunkContext != NULL);\r
+ \r
+ ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+\r
+ Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+ \r
+ ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
+ \r
+ Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r
+\r
+ InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+ InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+ \r
+ InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
+\r
+ return ThunkContext;\r
+}\r
+\r
+\r
+UINTN\r
+GetPackageCountByType (\r
+ IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,\r
+ IN UINT8 PackageType\r
)\r
{\r
- ASSERT (Handle != NULL);\r
+ UINTN Count;\r
+ EFI_HII_PACKAGE_HEADER *PackageHeader;\r
+\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
+ Count = 0;\r
+ \r
+ while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
+ if (PackageHeader->Type == PackageType ) {\r
+ Count++;\r
+ }\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
+ }\r
+ \r
+ \r
+ return Count;\r
+}\r
+\r
+LIST_ENTRY *\r
+GetOneOfOptionMapEntryListHead (\r
+ IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 QuestionId\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ ONE_OF_OPTION_MAP *Map;\r
+\r
+ Link = GetFirstNode (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+ while (!IsNull (&ThunkContext->OneOfOptionMapListHead, Link)) {\r
+ Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+ if (QuestionId == Map->QuestionId) {\r
+ return &Map->OneOfOptionMapEntryListHead;\r
+ }\r
+ Link = GetNextNode (&ThunkContext->OneOfOptionMapListHead, Link);\r
+ }\r
+ \r
+ return NULL;\r
+}\r
\r
- *Handle = Private->StaticPureUefiHiiHandle;\r
- Private->StaticPureUefiHiiHandle -= 1;\r
\r
- if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
- return EFI_OUT_OF_RESOURCES;\r
+EFI_STATUS\r
+CreateQuestionIdMap (\r
+ IN OUT HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_PACKAGE_LIST_HEADER *List;\r
+ EFI_HII_PACKAGE_HEADER *Package;\r
+ UINTN Size;\r
+ EFI_IFR_OP_HEADER *OpCode;\r
+ UINTN Offset;\r
+ QUESTION_ID_MAP *IdMap;\r
+ EFI_IFR_VARSTORE *VarStore;\r
+ EFI_IFR_FORM_SET *FormSet;\r
+ EFI_IFR_QUESTION_HEADER *Question;\r
+ LIST_ENTRY *QuestionIdMapEntryListHead;\r
+ LIST_ENTRY *OneOfOptinMapEntryListHead;\r
+ QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
+ EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
+ ONE_OF_OPTION_MAP *OneOfOptionMap;\r
+ ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
+ EFI_IFR_GUID_CLASS *Class;\r
+ \r
+\r
+ Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
\r
+ //\r
+ // Get all VarStoreId and build the the QuestionId map.\r
+ // EFI_IFR_QUESTION_HEADER.VarStoreInfo.VarOffset -> Framework Question ID\r
+ // EFI_IFR_QUESTION_HEADER.QuestionId -> UEFI Question ID\r
+ //\r
+\r
+ //\r
+ // Skip the package list header.\r
+ //\r
+ Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
+\r
+ while (Package->Type != EFI_HII_PACKAGE_END) {\r
+\r
+ if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
+\r
+ //\r
+ // Skip the package header\r
+ //\r
+ Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ while (Offset < Package->Length) {\r
+ OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+ switch (OpCode->OpCode) {\r
+ case EFI_IFR_FORM_SET_OP:\r
+ FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+ ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
+ ThunkContext->FormSetHelp = FormSet->Help;\r
+ break;\r
+ \r
+ case EFI_IFR_VARSTORE_OP:\r
+ //\r
+ // IFR built from Framework VFR only has UEFI Buffer Type Storage\r
+ //\r
+ VarStore = (EFI_IFR_VARSTORE *) OpCode;\r
+ IdMap = AllocateZeroPool (sizeof (QUESTION_ID_MAP));\r
+ ASSERT (IdMap != NULL);\r
+ \r
+ IdMap->Signature = QUESTION_ID_MAP_SIGNATURE;\r
+ IdMap->VarStoreId = VarStore->VarStoreId;\r
+ IdMap->VarSize = VarStore->Size;\r
+ InitializeListHead (&IdMap->MapEntryListHead);\r
+ InsertTailList (&ThunkContext->QuestionIdMapListHead, &IdMap->Link);\r
+ break;\r
+\r
+ case EFI_IFR_NUMERIC_OP:\r
+ case EFI_IFR_CHECKBOX_OP:\r
+ case EFI_IFR_ONE_OF_OP:\r
+ case EFI_IFR_ORDERED_LIST_OP:\r
+ case EFI_IFR_STRING_OP:\r
+ //case EFI_IFR_PASSWORD_OP:\r
+ Question = (EFI_IFR_QUESTION_HEADER *)(OpCode + 1);\r
+ QuestionIdMapEntryListHead = GetMapEntryListHead (ThunkContext, Question->VarStoreId);\r
+\r
+ if (QuestionIdMapEntryListHead != NULL) {\r
+ //\r
+ // If the Question is using Buffer (EFI_IFR_VARSTORE_OP) type VarStore.\r
+ //\r
+ IdMapEntry = AllocateZeroPool (sizeof (QUESTION_ID_MAP_ENTRY));\r
+ ASSERT (IdMapEntry != NULL);\r
+\r
+ IdMapEntry->FwQId = Question->VarStoreInfo.VarOffset;\r
+ IdMapEntry->UefiQid = Question->QuestionId;\r
+ IdMapEntry->Signature = QUESTION_ID_MAP_ENTRY_SIGNATURE;\r
+\r
+ InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
+ }\r
+\r
+ break;\r
+ \r
+ case EFI_IFR_GUID_OP:\r
+ OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
+ if (CompareGuid (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid)) {\r
+ if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
+ OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
+ if (OneOfOptinMapEntryListHead == NULL) {\r
+ OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+ ASSERT (OneOfOptionMap != NULL);\r
+\r
+ OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+ OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
+ OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+ OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
+ InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+ }\r
+ OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+ ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+ OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+ OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
+ CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
+ \r
+ InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+ }\r
+ }else if (CompareGuid (&OptionMap->Guid, &gTianoHiiIfrGuid)) {\r
+ Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
+\r
+ switch (Class->ExtendOpCode) {\r
+ case EFI_IFR_EXTEND_OP_CLASS:\r
+ ThunkContext->FormSetClass = Class->Class;\r
+ break;\r
+ case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+ ThunkContext->FormSetSubClass = ((EFI_IFR_GUID_SUBCLASS *) Class)->SubClass;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ \r
+ }\r
+\r
+ Offset += OpCode->Length;\r
+ }\r
+ //\r
+ // Only Form Package is in a Package List.\r
+ //\r
+ break;\r
+ }\r
+\r
+ Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
+ }\r
+\r
+ FreePool (List);\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+LIST_ENTRY *\r
+GetMapEntryListHead (\r
+ IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ QUESTION_ID_MAP *Map;\r
+\r
+ Link = GetFirstNode (&ThunkContext->QuestionIdMapListHead);\r
+\r
+ while (!IsNull (&ThunkContext->QuestionIdMapListHead, Link)) {\r
+ Map = QUESTION_ID_MAP_FROM_LINK (Link);\r
+ if (VarStoreId == Map->VarStoreId) {\r
+ return &Map->MapEntryListHead;\r
+ }\r
+ Link = GetNextNode (&ThunkContext->QuestionIdMapListHead, Link);\r
+ }\r
+ return NULL;\r
+}\r
+\r
+\r
the HII Thunk to Framework HII code.\r
\r
@param Private The pointer to the private data of Hii Thunk.\r
- @param FrameworkHiiHandle Framework HII Handle returned by the HII Thunk to Framework HII code.\r
+ @param FwHiiHandle Framework HII Handle returned by the HII Thunk to Framework HII code.\r
\r
@retval NULL If Framework HII Handle passed in does not have matching UEFI HII handle.\r
@retval !NULL If the match is found.\r
\r
**/\r
EFI_HII_HANDLE\r
-FrameworkHiiHandleToUefiHiiHandle (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle\r
+FwHiiHandleToUefiHiiHandle (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
)\r
;\r
\r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-FrameworkHiiHandleToMapDatabaseEntry (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle\r
+HII_THUNK_CONTEXT *\r
+FwHiiHandleToThunkContext (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+ IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
)\r
;\r
\r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-UefiHiiHandleToMapDatabaseEntry (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+HII_THUNK_CONTEXT *\r
+UefiHiiHandleToThunkContext (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
IN EFI_HII_HANDLE UefiHiiHandle\r
)\r
;\r
\r
EFI_HII_HANDLE *\r
-TagGuidToUefiIfrHiiHandle (\r
- IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+TagGuidToUefiHiiHandle (\r
+ IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
IN CONST EFI_GUID *Guid\r
)\r
;\r
\r
EFI_STATUS\r
-AssignHiiHandle (\r
- IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+AssignFrameworkHiiHandle (\r
+ IN OUT HII_THUNK_PRIVATE_DATA *Private,\r
+ IN BOOLEAN FromFwHiiNewPack,\r
OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
)\r
;\r
\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContextForUefiHiiHandle (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN EFI_HII_HANDLE UefiHiiHandle\r
+ )\r
+;\r
+\r
EFI_STATUS\r
-AssignPureUefiHiiHandle (\r
- IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
- OUT FRAMEWORK_EFI_HII_HANDLE *Handle\r
+DestroyThunkContextForUefiHiiHandle (\r
+ IN HII_THUNK_PRIVATE_DATA *Private,\r
+ IN EFI_HII_HANDLE UefiHiiHandle\r
+ )\r
+;\r
+\r
+UINTN\r
+GetPackageCountByType (\r
+ IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,\r
+ IN UINT8 PackageType\r
)\r
;\r
+\r
+EFI_STATUS\r
+CreateQuestionIdMap (\r
+ IN OUT HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+;\r
+\r
+LIST_ENTRY *\r
+GetMapEntryListHead (\r
+ IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
+ IN UINT16 VarStoreId\r
+ )\r
+;\r
+\r
#endif\r