return FALSE;\r
}\r
\r
+/**\r
+ Get form package data from data base.\r
+\r
+ @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.\r
+ @param HiiFormPackage The buffer saves the package data.\r
+ @param PackageSize The buffer size of the package data.\r
+\r
+**/\r
+EFI_STATUS\r
+GetFormPackageData (\r
+ IN HII_DATABASE_RECORD *DataBaseRecord,\r
+ IN OUT UINT8 **HiiFormPackage,\r
+ OUT UINTN *PackageSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Size;\r
+ UINTN ResultSize;\r
+\r
+ if (DataBaseRecord == NULL || HiiFormPackage == NULL || PackageSize == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Size = 0;\r
+ ResultSize = 0;\r
+ //\r
+ // 0. Get Hii Form Package by HiiHandle\r
+ //\r
+ Status = ExportFormPackages (\r
+ &mPrivate, \r
+ DataBaseRecord->Handle, \r
+ DataBaseRecord->PackageList, \r
+ 0, \r
+ Size, \r
+ HiiFormPackage,\r
+ &ResultSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ \r
+ (*HiiFormPackage) = AllocatePool (ResultSize);\r
+ if (*HiiFormPackage == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Get HiiFormPackage by HiiHandle\r
+ //\r
+ Size = ResultSize;\r
+ ResultSize = 0;\r
+ Status = ExportFormPackages (\r
+ &mPrivate, \r
+ DataBaseRecord->Handle, \r
+ DataBaseRecord->PackageList, \r
+ 0,\r
+ Size, \r
+ *HiiFormPackage,\r
+ &ResultSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (*HiiFormPackage);\r
+ }\r
+ \r
+ *PackageSize = Size;\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ This function parses Form Package to get the efi varstore info according to the request ConfigHdr.\r
+\r
+ @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.\r
+ @param ConfigHdr Request string ConfigHdr. If it is NULL,\r
+ the first found varstore will be as ConfigHdr.\r
+ @param IsEfiVarstore Whether the request storage type is efi varstore type.\r
+ @param EfiVarStore The efi varstore info which will return.\r
+**/ \r
+EFI_STATUS\r
+GetVarStoreType (\r
+ IN HII_DATABASE_RECORD *DataBaseRecord,\r
+ IN EFI_STRING ConfigHdr,\r
+ OUT BOOLEAN *IsEfiVarstore,\r
+ OUT EFI_IFR_VARSTORE_EFI **EfiVarStore\r
+ \r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN IfrOffset;\r
+ EFI_IFR_OP_HEADER *IfrOpHdr;\r
+ CHAR16 *VarStoreName;\r
+ EFI_STRING GuidStr;\r
+ EFI_STRING NameStr;\r
+ EFI_STRING TempStr;\r
+ UINTN LengthString; \r
+ UINT8 *HiiFormPackage;\r
+ UINTN PackageSize;\r
+ EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
+ \r
+ HiiFormPackage = NULL;\r
+ LengthString = 0;\r
+ Status = EFI_SUCCESS;\r
+ GuidStr = NULL;\r
+ NameStr = NULL;\r
+ TempStr = NULL;\r
+\r
+ Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ while (IfrOffset < PackageSize) {\r
+ IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset); \r
+ IfrOffset += IfrOpHdr->Length;\r
+\r
+ if (IfrOpHdr->OpCode == EFI_IFR_VARSTORE_EFI_OP ) {\r
+ IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
+ //\r
+ // If the length is small than the structure, this is from old efi \r
+ // varstore definition. Old efi varstore get config directly from \r
+ // GetVariable function.\r
+ //\r
+ if (IfrOpHdr->Length < sizeof (EFI_IFR_VARSTORE_EFI)) {\r
+ continue;\r
+ }\r
+\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *) IfrEfiVarStore->Name, VarStoreName);\r
+\r
+ GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) &IfrEfiVarStore->Guid, 1, &GuidStr);\r
+ GenerateSubStr (L"NAME=", StrLen (VarStoreName) * sizeof (CHAR16), (VOID *) VarStoreName, 2, &NameStr);\r
+ LengthString = StrLen (GuidStr);\r
+ LengthString = LengthString + StrLen (NameStr) + 1;\r
+ TempStr = AllocateZeroPool (LengthString * sizeof (CHAR16));\r
+ if (TempStr == NULL) {\r
+ FreePool (GuidStr);\r
+ FreePool (NameStr);\r
+ FreePool (VarStoreName);\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ StrCpy (TempStr, GuidStr);\r
+ StrCat (TempStr, NameStr);\r
+ if (ConfigHdr == NULL || StrnCmp (ConfigHdr, TempStr, StrLen (TempStr)) == 0) {\r
+ *EfiVarStore = (EFI_IFR_VARSTORE_EFI *) AllocateZeroPool (IfrOpHdr->Length);\r
+ if (*EfiVarStore == NULL) {\r
+ FreePool (VarStoreName);\r
+ FreePool (GuidStr);\r
+ FreePool (NameStr);\r
+ FreePool (TempStr);\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ *IsEfiVarstore = TRUE;\r
+ CopyMem (*EfiVarStore, IfrEfiVarStore, IfrOpHdr->Length);\r
+ } \r
+ \r
+ //\r
+ // Free alllocated temp string.\r
+ //\r
+ FreePool (VarStoreName);\r
+ FreePool (GuidStr);\r
+ FreePool (NameStr);\r
+ FreePool (TempStr);\r
+ }\r
+ }\r
+Done:\r
+ if (HiiFormPackage != NULL) {\r
+ FreePool (HiiFormPackage);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
This function parses Form Package to get the block array and the default\r
value array according to the request ConfigHdr.\r
EFI_STATUS Status;\r
UINTN IfrOffset;\r
EFI_IFR_VARSTORE *IfrVarStore;\r
+ EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
EFI_IFR_OP_HEADER *IfrOpHdr;\r
EFI_IFR_ONE_OF *IfrOneOf;\r
EFI_IFR_ONE_OF_OPTION *IfrOneOfOption;\r
LengthString = StrLen (GuidStr);\r
LengthString = LengthString + StrLen (NameStr) + 1;\r
TempStr = AllocateZeroPool (LengthString * sizeof (CHAR16));\r
- if (TempStr == NULL) {\r
+ if (TempStr == NULL) {\r
FreePool (GuidStr);\r
FreePool (NameStr);\r
FreePool (VarStoreName);\r
FreePool (TempStr);\r
break;\r
\r
+ case EFI_IFR_VARSTORE_EFI_OP:\r
+ //\r
+ // VarStore is found. Don't need to search any more.\r
+ //\r
+ if (VarStorageData->Size != 0) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Get the requied varstore information\r
+ // Add varstore by Guid and Name in ConfigHdr\r
+ // Make sure Offset is in varstore size and varstoreid\r
+ //\r
+ IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
+\r
+ //\r
+ // If the length is small than the structure, this is from old efi \r
+ // varstore definition. Old efi varstore get config directly from \r
+ // GetVariable function.\r
+ // \r
+ if (IfrOpHdr->Length < sizeof (EFI_IFR_VARSTORE_EFI)) {\r
+ break;\r
+ }\r
+\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *) IfrEfiVarStore->Name, VarStoreName);\r
+\r
+ GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) &IfrEfiVarStore->Guid, 1, &GuidStr);\r
+ GenerateSubStr (L"NAME=", StrLen (VarStoreName) * sizeof (CHAR16), (VOID *) VarStoreName, 2, &NameStr);\r
+ LengthString = StrLen (GuidStr);\r
+ LengthString = LengthString + StrLen (NameStr) + 1;\r
+ TempStr = AllocateZeroPool (LengthString * sizeof (CHAR16));\r
+ if (TempStr == NULL) {\r
+ FreePool (GuidStr);\r
+ FreePool (NameStr);\r
+ FreePool (VarStoreName);\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ StrCpy (TempStr, GuidStr);\r
+ StrCat (TempStr, NameStr);\r
+ if (ConfigHdr == NULL || StrnCmp (ConfigHdr, TempStr, StrLen (TempStr)) == 0) {\r
+ //\r
+ // Find the matched VarStore\r
+ //\r
+ CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrEfiVarStore->Guid);\r
+ VarStorageData->VarStoreId = IfrEfiVarStore->VarStoreId;\r
+ VarStorageData->Size = IfrEfiVarStore->Size;\r
+ VarStorageData->Name = VarStoreName;\r
+ } else {\r
+ //\r
+ // No found, free the allocated memory \r
+ //\r
+ FreePool (VarStoreName);\r
+ }\r
+ //\r
+ // Free alllocated temp string.\r
+ //\r
+ FreePool (GuidStr);\r
+ FreePool (NameStr);\r
+ FreePool (TempStr);\r
+ break;\r
+\r
case EFI_IFR_DEFAULTSTORE_OP:\r
//\r
// Add new the map between default id and default name.\r
PackageSize = 0;\r
DataExist = FALSE;\r
Progress = *Request;\r
- \r
- //\r
- // 0. Get Hii Form Package by HiiHandle\r
- //\r
- Status = ExportFormPackages (\r
- &mPrivate, \r
- DataBaseRecord->Handle, \r
- DataBaseRecord->PackageList, \r
- 0, \r
- PackageSize, \r
- HiiFormPackage,\r
- &ResultSize\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- \r
- HiiFormPackage = AllocatePool (ResultSize);\r
- if (HiiFormPackage == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
\r
- //\r
- // Get HiiFormPackage by HiiHandle\r
- //\r
- PackageSize = ResultSize;\r
- ResultSize = 0;\r
- Status = ExportFormPackages (\r
- &mPrivate, \r
- DataBaseRecord->Handle, \r
- DataBaseRecord->PackageList, \r
- 0,\r
- PackageSize, \r
- HiiFormPackage,\r
- &ResultSize\r
- );\r
+ Status = GetFormPackageData (DataBaseRecord, &HiiFormPackage, &PackageSize);\r
if (EFI_ERROR (Status)) {\r
- goto Done;\r
+ return Status;\r
}\r
\r
//\r
return Status;\r
}\r
\r
+/**\r
+ This function gets the full request resp string by \r
+ parsing IFR data in HII form packages.\r
+\r
+ @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+ instance.\r
+ @param EfiVarStoreInfo The efi varstore info which is save in the EFI \r
+ varstore data structure. \r
+ @param Request Pointer to a null-terminated Unicode string in\r
+ <ConfigRequest> format.\r
+ @param RequestResp Pointer to a null-terminated Unicode string in\r
+ <ConfigResp> format.\r
+ @param AccessProgress On return, points to a character in the Request\r
+ string. Points to the string's null terminator if\r
+ request was successful. Points to the most recent\r
+ & before the first failing name / value pair (or\r
+ the beginning of the string if the failure is in\r
+ the first name / value pair) if the request was\r
+ not successful.\r
+\r
+ @retval EFI_SUCCESS The Results string is set to the full request string.\r
+ And AltCfgResp contains all default value string.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory for the return string.\r
+ @retval EFI_INVALID_PARAMETER Request points to NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+GetConfigRespFromEfiVarStore (\r
+ IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,\r
+ IN EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo, \r
+ IN EFI_STRING Request,\r
+ OUT EFI_STRING *RequestResp,\r
+ OUT EFI_STRING *AccessProgress\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_STRING VarStoreName;\r
+ UINT8 *VarStore;\r
+ UINTN BufferSize;\r
+\r
+ Status = EFI_SUCCESS;\r
+ BufferSize = 0;\r
+ VarStore = NULL;\r
+ VarStoreName = NULL;\r
+ \r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *) EfiVarStoreInfo->Name, VarStoreName);\r
+ \r
+ \r
+ Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, NULL);\r
+ if (Status != EFI_BUFFER_TOO_SMALL) {\r
+ goto Done;\r
+ }\r
+\r
+ VarStore = AllocateZeroPool (BufferSize);\r
+ ASSERT (VarStore != NULL);\r
+ Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, VarStore);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = HiiBlockToConfig(This, Request, VarStore, BufferSize, RequestResp, AccessProgress);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+Done:\r
+ if (VarStoreName != NULL) {\r
+ FreePool (VarStoreName);\r
+ }\r
+\r
+ if (VarStore != NULL) {\r
+ FreePool (VarStore);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ This function route the full request resp string for efi varstore. \r
+\r
+ @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+ instance.\r
+ @param EfiVarStoreInfo The efi varstore info which is save in the EFI \r
+ varstore data structure. \r
+ @param RequestResp Pointer to a null-terminated Unicode string in\r
+ <ConfigResp> format.\r
+ @param Result Pointer to a null-terminated Unicode string in\r
+ <ConfigResp> format.\r
+ \r
+ @retval EFI_SUCCESS The Results string is set to the full request string.\r
+ And AltCfgResp contains all default value string.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory for the return string.\r
+ @retval EFI_INVALID_PARAMETER Request points to NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+RouteConfigRespForEfiVarStore (\r
+ IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,\r
+ IN EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo, \r
+ IN EFI_STRING RequestResp,\r
+ OUT EFI_STRING *Result\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_STRING VarStoreName;\r
+ CHAR8 *VarStore;\r
+ UINTN BufferSize;\r
+ UINTN BlockSize;\r
+\r
+ Status = EFI_SUCCESS;\r
+ BufferSize = 0;\r
+ VarStore = NULL;\r
+ VarStoreName = NULL;\r
+\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *) EfiVarStoreInfo->Name, VarStoreName);\r
+ \r
+ Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, NULL);\r
+ if (Status != EFI_BUFFER_TOO_SMALL) {\r
+ goto Done;\r
+ }\r
+\r
+ BlockSize = BufferSize;\r
+ VarStore = AllocateZeroPool (BufferSize);\r
+ ASSERT (VarStore != NULL);\r
+ Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, VarStore);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = HiiConfigToBlock(This, RequestResp, VarStore, &BlockSize, Result);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = gRT->SetVariable (VarStoreName, &EfiVarStoreInfo->Guid, EfiVarStoreInfo->Attributes, BufferSize, VarStore);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+Done:\r
+ if (VarStoreName != NULL) {\r
+ FreePool (VarStoreName);\r
+ }\r
+\r
+ if (VarStore != NULL) {\r
+ FreePool (VarStore);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
This function allows a caller to extract the current configuration\r
for one or more named elements from one or more drivers.\r
EFI_STRING DefaultResults;\r
BOOLEAN FirstElement;\r
BOOLEAN IfrDataParsedFlag;\r
+ BOOLEAN IsEfiVarStore;\r
+ EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo; \r
\r
if (This == NULL || Progress == NULL || Results == NULL) {\r
return EFI_INVALID_PARAMETER;\r
ConfigRequest = NULL;\r
Status = EFI_SUCCESS;\r
AccessResults = NULL;\r
+ AccessProgress = NULL;\r
DevicePath = NULL;\r
IfrDataParsedFlag = FALSE;\r
+ IsEfiVarStore = FALSE;\r
+ EfiVarStoreInfo = NULL;\r
\r
//\r
// The first element of <MultiConfigRequest> should be\r
}\r
\r
//\r
- // Call corresponding ConfigAccess protocol to extract settings\r
+ // Check whether this ConfigRequest is search from Efi varstore type storage.\r
//\r
- Status = gBS->HandleProtocol (\r
- DriverHandle,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- (VOID **) &ConfigAccess\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ Status = GetVarStoreType(Database, ConfigRequest, &IsEfiVarStore, &EfiVarStoreInfo);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ \r
+ if (IsEfiVarStore) {\r
+ //\r
+ // Call the GetVariable function to extract settings.\r
+ //\r
+ Status = GetConfigRespFromEfiVarStore(This, EfiVarStoreInfo, ConfigRequest, &AccessResults, &AccessProgress);\r
+ FreePool (EfiVarStoreInfo); \r
+ } else {\r
+ //\r
+ // Call corresponding ConfigAccess protocol to extract settings\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ DriverHandle,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ (VOID **) &ConfigAccess\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- Status = ConfigAccess->ExtractConfig (\r
- ConfigAccess,\r
- ConfigRequest,\r
- &AccessProgress,\r
- &AccessResults\r
- );\r
+ Status = ConfigAccess->ExtractConfig (\r
+ ConfigAccess,\r
+ ConfigRequest,\r
+ &AccessProgress,\r
+ &AccessResults\r
+ );\r
+ }\r
if (EFI_ERROR (Status)) {\r
//\r
// AccessProgress indicates the parsing progress on <ConfigRequest>.\r
EFI_HANDLE DriverHandle;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
EFI_STRING AccessProgress;\r
+ EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;\r
+ BOOLEAN IsEfiVarstore;\r
\r
if (This == NULL || Progress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
Private = CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
StringPtr = Configuration;\r
*Progress = StringPtr;\r
+ Database = NULL;\r
+ AccessProgress = NULL;\r
+ EfiVarStoreInfo= NULL;\r
+ IsEfiVarstore = FALSE;\r
\r
//\r
// The first element of <MultiConfigResp> should be\r
FreePool (DevicePath);\r
\r
//\r
- // Call corresponding ConfigAccess protocol to route settings\r
+ // Check whether this ConfigRequest is search from Efi varstore type storage.\r
//\r
- Status = gBS->HandleProtocol (\r
- DriverHandle,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- (VOID **) &ConfigAccess\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ Status = GetVarStoreType(Database, ConfigResp, &IsEfiVarstore, &EfiVarStoreInfo);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
\r
- Status = ConfigAccess->RouteConfig (\r
- ConfigAccess,\r
- ConfigResp,\r
- &AccessProgress\r
- );\r
+ if (IsEfiVarstore) {\r
+ //\r
+ // Call the SetVariable function to route settings.\r
+ // \r
+ Status = RouteConfigRespForEfiVarStore(This, EfiVarStoreInfo, ConfigResp, &AccessProgress);\r
+ FreePool (EfiVarStoreInfo);\r
+ } else {\r
+ //\r
+ // Call corresponding ConfigAccess protocol to route settings\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ DriverHandle,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ (VOID **) &ConfigAccess\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
\r
+ Status = ConfigAccess->RouteConfig (\r
+ ConfigAccess,\r
+ ConfigResp,\r
+ &AccessProgress\r
+ );\r
+ }\r
if (EFI_ERROR (Status)) {\r
//\r
// AccessProgress indicates the parsing progress on <ConfigResp>.\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
if (CompareGuid (&Storage->Guid, (EFI_GUID *) VariableGuid)) {\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||\r
+ Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
//\r
// Buffer storage require both GUID and Name\r
//\r
\r
\r
/**\r
- Synchronize Storage's Edit copy to Shadow copy.\r
+ Synchronize or restore Storage's Edit copy and Shadow copy.\r
\r
- @param Storage The Storage to be synchronized.\r
+ @param Storage The Storage to be synchronized.\r
+ @param SyncOrRestore Sync the buffer to editbuffer or Restore the \r
+ editbuffer to buffer\r
+ if TRUE, copy the editbuffer to the buffer.\r
+ if FALSE, copy the buffer to the editbuffer.\r
\r
**/\r
VOID\r
SynchronizeStorage (\r
- IN FORMSET_STORAGE *Storage\r
+ IN FORMSET_STORAGE *Storage,\r
+ IN BOOLEAN SyncOrRestore\r
)\r
{\r
LIST_ENTRY *Link;\r
\r
switch (Storage->Type) {\r
case EFI_HII_VARSTORE_BUFFER:\r
- CopyMem (Storage->Buffer, Storage->EditBuffer, Storage->Size);\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
+ if (SyncOrRestore) {\r
+ CopyMem (Storage->Buffer, Storage->EditBuffer, Storage->Size);\r
+ } else {\r
+ CopyMem (Storage->EditBuffer, Storage->Buffer, Storage->Size);\r
+ }\r
break;\r
\r
case EFI_HII_VARSTORE_NAME_VALUE:\r
while (!IsNull (&Storage->NameValueListHead, Link)) {\r
Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
\r
- NewStringCpy (&Node->Value, Node->EditValue);\r
+ if (SyncOrRestore) {\r
+ NewStringCpy (&Node->Value, Node->EditValue);\r
+ } else {\r
+ NewStringCpy (&Node->EditValue, Node->Value);\r
+ }\r
\r
Link = GetNextNode (&Storage->NameValueListHead, Link);\r
}\r
\r
switch (Storage->Type) {\r
case EFI_HII_VARSTORE_BUFFER:\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
Status = mHiiConfigRouting->BlockToConfig (\r
mHiiConfigRouting,\r
ConfigRequest,\r
\r
switch (Storage->Type) {\r
case EFI_HII_VARSTORE_BUFFER:\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
BufferSize = Storage->Size;\r
Status = mHiiConfigRouting->ConfigToBlock (\r
mHiiConfigRouting,\r
BOOLEAN IsString;\r
CHAR16 TemStr[5];\r
UINT8 DigitUint8;\r
+ UINT8 *TemBuffer;\r
\r
Status = EFI_SUCCESS;\r
+ Value = NULL;\r
\r
//\r
// Statement don't have storage, skip them\r
Dst = (UINT8 *) &Question->HiiValue.Value;\r
}\r
\r
- IsBufferStorage = (BOOLEAN) ((Storage->Type == EFI_HII_VARSTORE_BUFFER) ? TRUE : FALSE);\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ IsBufferStorage = TRUE;\r
+ } else {\r
+ IsBufferStorage = FALSE;\r
+ }\r
IsString = (BOOLEAN) ((Question->HiiValue.Type == EFI_IFR_TYPE_STRING) ? TRUE : FALSE);\r
if (Cached) {\r
if (IsBufferStorage) {\r
FreePool (Value);\r
}\r
} else {\r
- //\r
- // Request current settings from Configuration Driver\r
- //\r
- if (FormSet->ConfigAccess == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ //\r
+ // Request current settings from Configuration Driver\r
+ //\r
+ if (FormSet->ConfigAccess == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
\r
- //\r
- // <ConfigRequest> ::= <ConfigHdr> + <BlockName> ||\r
- // <ConfigHdr> + "&" + <VariableName>\r
- //\r
- if (IsBufferStorage) {\r
- Length = StrLen (Storage->ConfigHdr);\r
- Length += StrLen (Question->BlockName);\r
- } else {\r
- Length = StrLen (Storage->ConfigHdr);\r
- Length += StrLen (Question->VariableName) + 1;\r
- }\r
- ConfigRequest = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));\r
- ASSERT (ConfigRequest != NULL);\r
+ //\r
+ // <ConfigRequest> ::= <ConfigHdr> + <BlockName> ||\r
+ // <ConfigHdr> + "&" + <VariableName>\r
+ //\r
+ if (IsBufferStorage) {\r
+ Length = StrLen (Storage->ConfigHdr);\r
+ Length += StrLen (Question->BlockName);\r
+ } else {\r
+ Length = StrLen (Storage->ConfigHdr);\r
+ Length += StrLen (Question->VariableName) + 1;\r
+ }\r
+ ConfigRequest = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));\r
+ ASSERT (ConfigRequest != NULL);\r
\r
- StrCpy (ConfigRequest, Storage->ConfigHdr);\r
- if (IsBufferStorage) {\r
- StrCat (ConfigRequest, Question->BlockName);\r
- } else {\r
- StrCat (ConfigRequest, L"&");\r
- StrCat (ConfigRequest, Question->VariableName);\r
- }\r
+ StrCpy (ConfigRequest, Storage->ConfigHdr);\r
+ if (IsBufferStorage) {\r
+ StrCat (ConfigRequest, Question->BlockName);\r
+ } else {\r
+ StrCat (ConfigRequest, L"&");\r
+ StrCat (ConfigRequest, Question->VariableName);\r
+ }\r
\r
- Status = FormSet->ConfigAccess->ExtractConfig (\r
- FormSet->ConfigAccess,\r
- ConfigRequest,\r
- &Progress,\r
- &Result\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ Status = FormSet->ConfigAccess->ExtractConfig (\r
+ FormSet->ConfigAccess,\r
+ ConfigRequest,\r
+ &Progress,\r
+ &Result\r
+ );\r
+ FreePool (ConfigRequest);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
\r
- //\r
- // Skip <ConfigRequest>\r
- //\r
- Value = Result + Length;\r
- if (IsBufferStorage) {\r
//\r
- // Skip "&VALUE"\r
+ // Skip <ConfigRequest>\r
//\r
- Value = Value + 6;\r
- }\r
- if (*Value != '=') {\r
- FreePool (Result);\r
- return EFI_NOT_FOUND;\r
- }\r
- //\r
- // Skip '=', point to value\r
- //\r
- Value = Value + 1;\r
-\r
- //\r
- // Suppress <AltResp> if any\r
- //\r
- StringPtr = Value;\r
- while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
- StringPtr++;\r
- }\r
- *StringPtr = L'\0';\r
+ Value = Result + Length;\r
+ if (IsBufferStorage) {\r
+ //\r
+ // Skip "&VALUE"\r
+ //\r
+ Value = Value + 6;\r
+ }\r
+ if (*Value != '=') {\r
+ FreePool (Result);\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ //\r
+ // Skip '=', point to value\r
+ //\r
+ Value = Value + 1;\r
\r
- LengthStr = StrLen (Value);\r
- Status = EFI_SUCCESS;\r
- if (!IsBufferStorage && IsString) {\r
//\r
- // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
- // Add string tail char L'\0' into Length\r
+ // Suppress <AltResp> if any\r
//\r
- Length = StorageWidth + sizeof (CHAR16);\r
- if (Length < ((LengthStr / 4 + 1) * 2)) {\r
- Status = EFI_BUFFER_TOO_SMALL;\r
- } else {\r
- StringPtr = (CHAR16 *) Dst;\r
- ZeroMem (TemStr, sizeof (TemStr));\r
- for (Index = 0; Index < LengthStr; Index += 4) {\r
- StrnCpy (TemStr, Value + Index, 4);\r
- StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
- }\r
+ StringPtr = Value;\r
+ while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
+ StringPtr++;\r
+ }\r
+ *StringPtr = L'\0';\r
+\r
+ LengthStr = StrLen (Value);\r
+ Status = EFI_SUCCESS;\r
+ if (!IsBufferStorage && IsString) {\r
//\r
- // Add tailing L'\0' character\r
+ // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
+ // Add string tail char L'\0' into Length\r
//\r
- StringPtr[Index/4] = L'\0';\r
- }\r
- } else {\r
- if (StorageWidth < ((LengthStr + 1) / 2)) {\r
- Status = EFI_BUFFER_TOO_SMALL;\r
+ Length = StorageWidth + sizeof (CHAR16);\r
+ if (Length < ((LengthStr / 4 + 1) * 2)) {\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ StringPtr = (CHAR16 *) Dst;\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < LengthStr; Index += 4) {\r
+ StrnCpy (TemStr, Value + Index, 4);\r
+ StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
+ }\r
+ //\r
+ // Add tailing L'\0' character\r
+ //\r
+ StringPtr[Index/4] = L'\0';\r
+ }\r
} else {\r
- ZeroMem (TemStr, sizeof (TemStr));\r
- for (Index = 0; Index < LengthStr; Index ++) {\r
- TemStr[0] = Value[LengthStr - Index - 1];\r
- DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
- if ((Index & 1) == 0) {\r
- Dst [Index/2] = DigitUint8;\r
- } else {\r
- Dst [Index/2] = (UINT8) ((DigitUint8 << 4) + Dst [Index/2]);\r
+ if (StorageWidth < ((LengthStr + 1) / 2)) {\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < LengthStr; Index ++) {\r
+ TemStr[0] = Value[LengthStr - Index - 1];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+ if ((Index & 1) == 0) {\r
+ Dst [Index/2] = DigitUint8;\r
+ } else {\r
+ Dst [Index/2] = (UINT8) ((DigitUint8 << 4) + Dst [Index/2]);\r
+ }\r
}\r
}\r
}\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
FreePool (Result);\r
- return Status;\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ TemBuffer = NULL;\r
+ TemBuffer = AllocateZeroPool (Storage->Size);\r
+ if (TemBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ return Status;\r
+ }\r
+ Length = Storage->Size;\r
+ Status = gRT->GetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ NULL,\r
+ &Length,\r
+ TemBuffer\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (TemBuffer);\r
+ return Status;\r
+ }\r
+\r
+ CopyMem (Dst, TemBuffer + Question->VarStoreInfo.VarOffset, StorageWidth);\r
+\r
+ FreePool (TemBuffer);\r
}\r
\r
//\r
} else {\r
SetValueByName (Storage, Question->VariableName, Value, TRUE);\r
}\r
-\r
- FreePool (Result);\r
}\r
\r
return Status;\r
Src = (UINT8 *) &Question->HiiValue.Value;\r
}\r
\r
- IsBufferStorage = (BOOLEAN) ((Storage->Type == EFI_HII_VARSTORE_BUFFER) ? TRUE : FALSE);\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ IsBufferStorage = TRUE;\r
+ } else {\r
+ IsBufferStorage = FALSE;\r
+ }\r
IsString = (BOOLEAN) ((Question->HiiValue.Type == EFI_IFR_TYPE_STRING) ? TRUE : FALSE);\r
if (IsBufferStorage) {\r
//\r
}\r
\r
if (!Cached) {\r
- //\r
- // <ConfigResp> ::= <ConfigHdr> + <BlockName> + "&VALUE=" + "<HexCh>StorageWidth * 2" ||\r
- // <ConfigHdr> + "&" + <VariableName> + "=" + "<string>"\r
- //\r
- if (IsBufferStorage) {\r
- Length = StrLen (Question->BlockName) + 7;\r
- } else {\r
- Length = StrLen (Question->VariableName) + 2;\r
- }\r
- if (!IsBufferStorage && IsString) {\r
- Length += (StrLen ((CHAR16 *) Src) * 4);\r
- } else {\r
- Length += (StorageWidth * 2);\r
- }\r
- ConfigResp = AllocateZeroPool ((StrLen (Storage->ConfigHdr) + Length + 1) * sizeof (CHAR16));\r
- ASSERT (ConfigResp != NULL);\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ //\r
+ // <ConfigResp> ::= <ConfigHdr> + <BlockName> + "&VALUE=" + "<HexCh>StorageWidth * 2" ||\r
+ // <ConfigHdr> + "&" + <VariableName> + "=" + "<string>"\r
+ //\r
+ if (IsBufferStorage) {\r
+ Length = StrLen (Question->BlockName) + 7;\r
+ } else {\r
+ Length = StrLen (Question->VariableName) + 2;\r
+ }\r
+ if (!IsBufferStorage && IsString) {\r
+ Length += (StrLen ((CHAR16 *) Src) * 4);\r
+ } else {\r
+ Length += (StorageWidth * 2);\r
+ }\r
+ ConfigResp = AllocateZeroPool ((StrLen (Storage->ConfigHdr) + Length + 1) * sizeof (CHAR16));\r
+ ASSERT (ConfigResp != NULL);\r
\r
- StrCpy (ConfigResp, Storage->ConfigHdr);\r
- if (IsBufferStorage) {\r
- StrCat (ConfigResp, Question->BlockName);\r
- StrCat (ConfigResp, L"&VALUE=");\r
- } else {\r
- StrCat (ConfigResp, L"&");\r
- StrCat (ConfigResp, Question->VariableName);\r
- StrCat (ConfigResp, L"=");\r
- }\r
+ StrCpy (ConfigResp, Storage->ConfigHdr);\r
+ if (IsBufferStorage) {\r
+ StrCat (ConfigResp, Question->BlockName);\r
+ StrCat (ConfigResp, L"&VALUE=");\r
+ } else {\r
+ StrCat (ConfigResp, L"&");\r
+ StrCat (ConfigResp, Question->VariableName);\r
+ StrCat (ConfigResp, L"=");\r
+ }\r
+\r
+ Value = ConfigResp + StrLen (ConfigResp);\r
\r
- Value = ConfigResp + StrLen (ConfigResp);\r
+ if (!IsBufferStorage && IsString) {\r
+ //\r
+ // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+ //\r
+ TemName = (CHAR16 *) Src;\r
+ TemString = Value;\r
+ for (; *TemName != L'\0'; TemName++) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+ }\r
+ } else {\r
+ //\r
+ // Convert Buffer to Hex String\r
+ //\r
+ TemBuffer = Src + StorageWidth - 1;\r
+ TemString = Value;\r
+ for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ }\r
+ }\r
\r
- if (!IsBufferStorage && IsString) {\r
//\r
- // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+ // Convert to lower char.\r
//\r
- TemName = (CHAR16 *) Src;\r
- TemString = Value;\r
- for (; *TemName != L'\0'; TemName++) {\r
- TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+ for (TemString = Value; *Value != L'\0'; Value++) {\r
+ if (*Value >= L'A' && *Value <= L'Z') {\r
+ *Value = (CHAR16) (*Value - L'A' + L'a');\r
+ }\r
}\r
- } else {\r
+\r
//\r
- // Convert Buffer to Hex String\r
+ // Submit Question Value to Configuration Driver\r
//\r
- TemBuffer = Src + StorageWidth - 1;\r
- TemString = Value;\r
- for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
- TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ if (FormSet->ConfigAccess != NULL) {\r
+ Status = FormSet->ConfigAccess->RouteConfig (\r
+ FormSet->ConfigAccess,\r
+ ConfigResp,\r
+ &Progress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (ConfigResp);\r
+ return Status;\r
+ }\r
}\r
- }\r
-\r
- //\r
- // Convert to lower char.\r
- //\r
- for (TemString = Value; *Value != L'\0'; Value++) {\r
- if (*Value >= L'A' && *Value <= L'Z') {\r
- *Value = (CHAR16) (*Value - L'A' + L'a');\r
+ FreePool (ConfigResp);\r
+ \r
+ } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ TemBuffer = NULL;\r
+ TemBuffer = AllocateZeroPool(Storage->Size);\r
+ if (TemBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ return Status;\r
}\r
- }\r
+ Length = Storage->Size;\r
+ Status = gRT->GetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ NULL,\r
+ &Length,\r
+ TemBuffer\r
+ );\r
\r
- //\r
- // Submit Question Value to Configuration Driver\r
- //\r
- if (FormSet->ConfigAccess != NULL) {\r
- Status = FormSet->ConfigAccess->RouteConfig (\r
- FormSet->ConfigAccess,\r
- ConfigResp,\r
- &Progress\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreePool (ConfigResp);\r
+ CopyMem (TemBuffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
+ \r
+ Status = gRT->SetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ Storage->Attributes,\r
+ Storage->Size,\r
+ TemBuffer\r
+ );\r
+ FreePool (TemBuffer);\r
+ if (EFI_ERROR (Status)){\r
return Status;\r
}\r
}\r
- FreePool (ConfigResp);\r
-\r
//\r
- // Synchronize shadow Buffer\r
+ // Sync storage, from editbuffer to buffer.\r
//\r
- SynchronizeStorage (Storage);\r
+ CopyMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
}\r
\r
return Status;\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Restore Storage's Edit copy to Shadow copy.\r
-\r
- @param Storage The Storage to be synchronized.\r
-\r
-**/\r
-VOID\r
-RestoreStorage (\r
- IN FORMSET_STORAGE *Storage\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- NAME_VALUE_NODE *Node;\r
-\r
- switch (Storage->Type) {\r
- case EFI_HII_VARSTORE_BUFFER:\r
- CopyMem (Storage->EditBuffer, Storage->Buffer, Storage->Size);\r
- break;\r
-\r
- case EFI_HII_VARSTORE_NAME_VALUE:\r
- Link = GetFirstNode (&Storage->NameValueListHead);\r
- while (!IsNull (&Storage->NameValueListHead, Link)) {\r
- Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
-\r
- if (Node->EditValue != NULL) {\r
- FreePool (Node->EditValue);\r
- }\r
- Node->EditValue = AllocateCopyPool (StrSize (Node->Value), Node->Value);\r
- ASSERT (Node->EditValue != NULL);\r
- Link = GetNextNode (&Storage->NameValueListHead, Link);\r
- }\r
- break;\r
-\r
- case EFI_HII_VARSTORE_EFI_VARIABLE:\r
- default:\r
- break;\r
- }\r
-}\r
-\r
/**\r
Fill storage's edit copy with settings requested from Configuration Driver.\r
\r
@param FormSet FormSet data structure.\r
@param ConfigInfo The config info related to this form.\r
+ @param SyncOrRestore Sync the buffer to editbuffer or Restore the \r
+ editbuffer to buffer\r
+ if TRUE, copy the editbuffer to the buffer.\r
+ if FALSE, copy the buffer to the editbuffer.\r
\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
**/\r
EFI_STATUS\r
-FormRestoreStorage (\r
+SynchronizeStorageForForm (\r
IN FORM_BROWSER_FORMSET *FormSet,\r
- IN FORM_BROWSER_CONFIG_REQUEST *ConfigInfo\r
+ IN FORM_BROWSER_CONFIG_REQUEST *ConfigInfo,\r
+ IN BOOLEAN SyncOrRestore\r
)\r
{\r
EFI_STATUS Status;\r
UINTN BufferSize;\r
LIST_ENTRY *Link;\r
NAME_VALUE_NODE *Node;\r
+ UINT8 *Src;\r
+ UINT8 *Dst;\r
\r
Status = EFI_SUCCESS;\r
Result = NULL;\r
- if (FormSet->ConfigAccess == NULL) {\r
+ if (FormSet->ConfigAccess == NULL && ConfigInfo->Storage->Type != EFI_HII_VARSTORE_NAME_VALUE) {\r
return EFI_NOT_FOUND;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
- if (ConfigInfo->Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ if (ConfigInfo->Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ (ConfigInfo->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
BufferSize = ConfigInfo->Storage->Size;\r
+\r
+ if (SyncOrRestore) {\r
+ Src = ConfigInfo->Storage->EditBuffer;\r
+ Dst = ConfigInfo->Storage->Buffer;\r
+ } else {\r
+ Src = ConfigInfo->Storage->Buffer;\r
+ Dst = ConfigInfo->Storage->EditBuffer;\r
+ }\r
+\r
Status = mHiiConfigRouting->BlockToConfig(\r
mHiiConfigRouting,\r
ConfigInfo->ConfigRequest,\r
- ConfigInfo->Storage->Buffer,\r
+ Src,\r
BufferSize,\r
&Result,\r
&Progress\r
Status = mHiiConfigRouting->ConfigToBlock (\r
mHiiConfigRouting,\r
Result,\r
- ConfigInfo->Storage->EditBuffer,\r
+ Dst,\r
&BufferSize,\r
&Progress\r
);\r
if (Result != NULL) {\r
FreePool (Result);\r
}\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
} else if (ConfigInfo->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
Link = GetFirstNode (&ConfigInfo->Storage->NameValueListHead);\r
while (!IsNull (&ConfigInfo->Storage->NameValueListHead, Link)) {\r
Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
\r
if (StrStr (ConfigInfo->ConfigRequest, Node->Name) != NULL) {\r
- if (Node->EditValue != NULL) {\r
- FreePool (Node->EditValue);\r
+ if (SyncOrRestore) {\r
+ NewStringCpy (&Node->Value, Node->EditValue);\r
+ } else {\r
+ NewStringCpy (&Node->EditValue, Node->Value);\r
}\r
- Node->EditValue = AllocateCopyPool (StrSize (Node->Value), Node->Value);\r
- ASSERT (Node->EditValue != NULL);\r
}\r
\r
Link = GetNextNode (&ConfigInfo->Storage->NameValueListHead, Link);\r
//\r
// Prepare <ConfigResp>\r
//\r
- FormRestoreStorage(FormSet, ConfigInfo);\r
+ SynchronizeStorageForForm(FormSet, ConfigInfo, FALSE);\r
}\r
\r
Form->NvUpdateRequired = FALSE;\r
continue;\r
}\r
\r
- RestoreStorage(Storage);\r
+ SynchronizeStorage(Storage, FALSE);\r
}\r
\r
UpdateNvInfoInForm(FormSet, FALSE); \r
EFI_STRING ConfigResp;\r
EFI_STRING Progress;\r
FORMSET_STORAGE *Storage;\r
+ UINTN BufferSize;\r
+ UINT8 *TmpBuf;\r
FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
\r
//\r
ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
Link = GetNextNode (&Form->ConfigRequestHead, Link);\r
\r
- if (ConfigInfo->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
+ Storage = ConfigInfo->Storage;\r
+ if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
continue;\r
}\r
\r
}\r
\r
//\r
- // Prepare <ConfigResp>\r
+ // 1. Prepare <ConfigResp>\r
//\r
Status = StorageToConfigResp (ConfigInfo, &ConfigResp, TRUE);\r
if (EFI_ERROR (Status)) {\r
}\r
\r
//\r
- // Send <ConfigResp> to Configuration Driver\r
+ // 2. Set value to hii driver or efi variable.\r
//\r
- if (FormSet->ConfigAccess != NULL) {\r
- Status = FormSet->ConfigAccess->RouteConfig (\r
- FormSet->ConfigAccess,\r
- ConfigResp,\r
- &Progress\r
- );\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ //\r
+ // Send <ConfigResp> to Configuration Driver\r
+ //\r
+ if (FormSet->ConfigAccess != NULL) {\r
+ Status = FormSet->ConfigAccess->RouteConfig (\r
+ FormSet->ConfigAccess,\r
+ ConfigResp,\r
+ &Progress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (ConfigResp);\r
+ return Status;\r
+ }\r
+ }\r
+ } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ TmpBuf = NULL;\r
+ TmpBuf = AllocateZeroPool(Storage->Size);\r
+ if (TmpBuf == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ return Status;\r
+ }\r
+\r
+ BufferSize = Storage->Size;\r
+ Status = gRT->GetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ NULL,\r
+ &BufferSize,\r
+ TmpBuf\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (TmpBuf);\r
+ FreePool (ConfigResp);\r
+ return Status;\r
+ }\r
+ ASSERT (BufferSize == Storage->Size); \r
+ Status = mHiiConfigRouting->ConfigToBlock (\r
+ mHiiConfigRouting,\r
+ ConfigResp,\r
+ TmpBuf,\r
+ &BufferSize,\r
+ &Progress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (TmpBuf);\r
+ FreePool (ConfigResp);\r
+ return Status;\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ Storage->Attributes,\r
+ Storage->Size,\r
+ TmpBuf\r
+ );\r
+ FreePool (TmpBuf);\r
if (EFI_ERROR (Status)) {\r
FreePool (ConfigResp);\r
return Status;\r
}\r
}\r
FreePool (ConfigResp);\r
-\r
//\r
- // Config success, update storage shadow Buffer\r
+ // 3. Config success, update storage shadow Buffer, only update the data belong to this form.\r
//\r
- SynchronizeStorage (ConfigInfo->Storage);\r
+ SynchronizeStorageForForm(FormSet, ConfigInfo, TRUE);\r
}\r
\r
+ //\r
+ // 4. Update the NV flag.\r
+ // \r
Form->NvUpdateRequired = FALSE;\r
} else {\r
//\r
}\r
\r
//\r
- // Prepare <ConfigResp>\r
+ // 1. Prepare <ConfigResp>\r
//\r
Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- //\r
- // Send <ConfigResp> to Configuration Driver\r
- //\r
- if (FormSet->ConfigAccess != NULL) {\r
- Status = FormSet->ConfigAccess->RouteConfig (\r
- FormSet->ConfigAccess,\r
- ConfigResp,\r
- &Progress\r
- );\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+\r
+ //\r
+ // 2. Send <ConfigResp> to Configuration Driver\r
+ //\r
+ if (FormSet->ConfigAccess != NULL) {\r
+ Status = FormSet->ConfigAccess->RouteConfig (\r
+ FormSet->ConfigAccess,\r
+ ConfigResp,\r
+ &Progress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (ConfigResp);\r
+ return Status;\r
+ }\r
+ }\r
+ } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ //\r
+ // 1&2. Set the edit data to the variable.\r
+ //\r
+ TmpBuf = NULL;\r
+ TmpBuf = AllocateZeroPool (Storage->Size);\r
+ if (TmpBuf == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ return Status;\r
+ } \r
+ BufferSize = Storage->Size;\r
+ Status = gRT->GetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ NULL,\r
+ &BufferSize,\r
+ TmpBuf\r
+ );\r
+ ASSERT (BufferSize == Storage->Size); \r
+ Status = mHiiConfigRouting->ConfigToBlock (\r
+ mHiiConfigRouting,\r
+ ConfigResp,\r
+ TmpBuf,\r
+ &BufferSize,\r
+ &Progress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (TmpBuf);\r
+ FreePool (ConfigResp);\r
+ return Status;\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ Storage->Attributes,\r
+ Storage->Size,\r
+ TmpBuf\r
+ );\r
if (EFI_ERROR (Status)) {\r
+ FreePool (TmpBuf);\r
FreePool (ConfigResp);\r
return Status;\r
}\r
+ FreePool (TmpBuf);\r
}\r
FreePool (ConfigResp);\r
-\r
//\r
- // Config success, update storage shadow Buffer\r
+ // 3. Config success, update storage shadow Buffer\r
//\r
- SynchronizeStorage (Storage);\r
+ SynchronizeStorage (Storage, TRUE);\r
}\r
\r
+ //\r
+ // 4. Update the NV flag.\r
+ // \r
UpdateNvInfoInForm(FormSet, FALSE);\r
}\r
\r
Value = NULL;\r
Storage = Question->Storage;\r
\r
- if ((Storage == NULL) || (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
+ if ((Storage == NULL) || \r
+ (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) || \r
+ (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
return Status;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
+ if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ Status = gRT->GetVariable (\r
+ Storage->Name,\r
+ &Storage->Guid,\r
+ NULL,\r
+ (UINTN*)&Storage->Size,\r
+ Storage->EditBuffer\r
+ );\r
+ return Status;\r
+ }\r
+\r
if (FormSet->ConfigAccess == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
\r
switch (Src->Type) {\r
case EFI_HII_VARSTORE_BUFFER:\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
CopyMem (Dst->EditBuffer, Src->EditBuffer, Src->Size);\r
CopyMem (Dst->Buffer, Src->Buffer, Src->Size);\r
break;\r
// settings(higher priority), sychronize it to shadow Buffer\r
//\r
if (!EFI_ERROR (Status)) {\r
- SynchronizeStorage (Storage);\r
+ SynchronizeStorage (Storage, TRUE);\r
}\r
} else {\r
//\r