Update HiiConfigAccess.ExtractConfig interface to support NULL request string and ConfigHdr request string.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10180 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -147,6 +147,10 @@ GetStorageFromConfigString (
|
||||
FORMSET_STORAGE *Storage;
|
||||
CHAR16 *Name;
|
||||
|
||||
if (ConfigString == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
StorageList = GetFirstNode (&FormSet->StorageListHead);
|
||||
|
||||
while (!IsNull (&FormSet->StorageListHead, StorageList)) {
|
||||
@@ -165,7 +169,7 @@ GetStorageFromConfigString (
|
||||
StorageList = GetNextNode (&FormSet->StorageListHead, StorageList);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -419,73 +423,194 @@ ThunkExtractConfig (
|
||||
OUT EFI_STRING *Results
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CONFIG_ACCESS_PRIVATE *ConfigAccess;
|
||||
FORMSET_STORAGE *BufferStorage;
|
||||
VOID *Data;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
CONFIG_ACCESS_PRIVATE *ConfigAccess;
|
||||
FORMSET_STORAGE *BufferStorage;
|
||||
VOID *Data;
|
||||
UINTN DataSize;
|
||||
FORM_BROWSER_FORMSET *FormSetContext;
|
||||
CHAR16 *VarStoreName;
|
||||
EFI_STRING ConfigRequestHdr;
|
||||
EFI_STRING ConfigRequest;
|
||||
UINTN Size;
|
||||
BOOLEAN AllocatedRequest;
|
||||
LIST_ENTRY *StorageList;
|
||||
EFI_STRING SingleResult;
|
||||
EFI_STRING FinalResults;
|
||||
EFI_STRING StrPointer;
|
||||
|
||||
if (Request == NULL) {
|
||||
if (Progress == NULL || Results == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
*Progress = Request;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Data = NULL;
|
||||
StrPointer = NULL;
|
||||
SingleResult = NULL;
|
||||
FinalResults = NULL;
|
||||
ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);
|
||||
FormSetContext = ConfigAccess->ThunkContext->FormSet;
|
||||
if (IsListEmpty (&FormSetContext->StorageListHead)) {
|
||||
//
|
||||
// No VarStorage does exist in this form.
|
||||
//
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
StorageList = GetFirstNode (&FormSetContext->StorageListHead);
|
||||
|
||||
Data = NULL;
|
||||
ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);
|
||||
|
||||
BufferStorage = GetStorageFromConfigString (ConfigAccess->ThunkContext->FormSet, Request);
|
||||
|
||||
if (BufferStorage == NULL) {
|
||||
*Progress = (EFI_STRING) Request;
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {
|
||||
//
|
||||
// NvMapOverride is not used. Get the Storage data from EFI Variable or Framework Form Callback.
|
||||
//
|
||||
if (ConfigAccess->FormCallbackProtocol == NULL ||
|
||||
ConfigAccess->FormCallbackProtocol->NvRead == NULL) {
|
||||
Status = GetUefiVariable (
|
||||
BufferStorage,
|
||||
&Data,
|
||||
&DataSize
|
||||
);
|
||||
do {
|
||||
if (Request != NULL) {
|
||||
BufferStorage = GetStorageFromConfigString (ConfigAccess->ThunkContext->FormSet, Request);
|
||||
if (BufferStorage == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
} else {
|
||||
Status = CallFormCallBack (
|
||||
BufferStorage,
|
||||
ConfigAccess->FormCallbackProtocol,
|
||||
&Data,
|
||||
&DataSize
|
||||
);
|
||||
if (IsNull (&FormSetContext->StorageListHead, StorageList)) {
|
||||
//
|
||||
// No Storage to be extracted into the results.
|
||||
//
|
||||
break;
|
||||
}
|
||||
BufferStorage = FORMSET_STORAGE_FROM_LINK (StorageList);
|
||||
StorageList = GetNextNode (&FormSetContext->StorageListHead, StorageList);
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// Use the NvMapOverride.
|
||||
//
|
||||
DataSize = BufferStorage->Size;
|
||||
Data = AllocateCopyPool (DataSize, ConfigAccess->ThunkContext->NvMapOverride);
|
||||
|
||||
if (Data != NULL) {
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
}
|
||||
|
||||
VarStoreName = NULL;
|
||||
ConfigRequestHdr = NULL;
|
||||
ConfigRequest = NULL;
|
||||
Size = 0;
|
||||
AllocatedRequest = FALSE;
|
||||
|
||||
if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {
|
||||
//
|
||||
// NvMapOverride is not used. Get the Storage data from EFI Variable or Framework Form Callback.
|
||||
//
|
||||
if (ConfigAccess->FormCallbackProtocol == NULL ||
|
||||
ConfigAccess->FormCallbackProtocol->NvRead == NULL) {
|
||||
Status = GetUefiVariable (
|
||||
BufferStorage,
|
||||
&Data,
|
||||
&DataSize
|
||||
);
|
||||
} else {
|
||||
Status = CallFormCallBack (
|
||||
BufferStorage,
|
||||
ConfigAccess->FormCallbackProtocol,
|
||||
&Data,
|
||||
&DataSize
|
||||
);
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// Use the NvMapOverride.
|
||||
//
|
||||
DataSize = BufferStorage->Size;
|
||||
Data = AllocateCopyPool (DataSize, ConfigAccess->ThunkContext->NvMapOverride);
|
||||
|
||||
if (Data != NULL) {
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ConfigRequest = Request;
|
||||
if (Request == NULL || (StrStr (Request, L"OFFSET") == NULL)) {
|
||||
//
|
||||
// Request is without any request element, construct full request string.
|
||||
//
|
||||
|
||||
if ((BufferStorage->VarStoreId == FormSetContext->DefaultVarStoreId) && (FormSetContext->OriginalDefaultVarStoreName != NULL)) {
|
||||
VarStoreName = FormSetContext->OriginalDefaultVarStoreName;
|
||||
} else {
|
||||
VarStoreName = BufferStorage->Name;
|
||||
}
|
||||
|
||||
//
|
||||
// First Set ConfigRequestHdr string.
|
||||
//
|
||||
ConfigRequestHdr = HiiConstructConfigHdr (&BufferStorage->Guid, VarStoreName, ConfigAccess->ThunkContext->UefiHiiDriverHandle);
|
||||
ASSERT (ConfigRequestHdr != NULL);
|
||||
|
||||
//
|
||||
// Allocate and fill a buffer large enough to hold the <ConfigHdr> template
|
||||
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
|
||||
//
|
||||
Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
|
||||
ConfigRequest = AllocateZeroPool (Size);
|
||||
ASSERT (ConfigRequest != NULL);
|
||||
AllocatedRequest = TRUE;
|
||||
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)DataSize);
|
||||
FreePool (ConfigRequestHdr);
|
||||
}
|
||||
Status = mHiiConfigRoutingProtocol->BlockToConfig (
|
||||
mHiiConfigRoutingProtocol,
|
||||
ConfigRequest,
|
||||
Data,
|
||||
DataSize,
|
||||
&SingleResult,
|
||||
Progress
|
||||
);
|
||||
//
|
||||
// Free the allocated config request string.
|
||||
//
|
||||
if (AllocatedRequest) {
|
||||
FreePool (ConfigRequest);
|
||||
ConfigRequest = NULL;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Free the allocated Data
|
||||
//
|
||||
if (Data != NULL) {
|
||||
FreePool (Data);
|
||||
}
|
||||
//
|
||||
// Directly return when meet with error
|
||||
//
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
//
|
||||
// Merge result into the final results.
|
||||
//
|
||||
if (FinalResults == NULL) {
|
||||
FinalResults = SingleResult;
|
||||
SingleResult = NULL;
|
||||
} else {
|
||||
Size = StrLen (FinalResults);
|
||||
Size = Size + 1;
|
||||
Size = Size + StrLen (SingleResult) + 1;
|
||||
StrPointer = AllocateZeroPool (Size * sizeof (CHAR16));
|
||||
ASSERT (StrPointer != NULL);
|
||||
StrCpy (StrPointer, FinalResults);
|
||||
FreePool (FinalResults);
|
||||
FinalResults = StrPointer;
|
||||
StrPointer = StrPointer + StrLen (StrPointer);
|
||||
*StrPointer = L'&';
|
||||
StrCpy (StrPointer + 1, SingleResult);
|
||||
FreePool (SingleResult);
|
||||
}
|
||||
} while (Request == NULL);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = mHiiConfigRoutingProtocol->BlockToConfig (
|
||||
mHiiConfigRoutingProtocol,
|
||||
Request,
|
||||
Data,
|
||||
DataSize,
|
||||
Results,
|
||||
Progress
|
||||
);
|
||||
*Results = FinalResults;
|
||||
} else {
|
||||
if (FinalResults != NULL) {
|
||||
FreePool (FinalResults);
|
||||
}
|
||||
}
|
||||
//
|
||||
// Set Progress string to the original request string.
|
||||
//
|
||||
if (Request == NULL) {
|
||||
*Progress = NULL;
|
||||
} else if (StrStr (Request, L"OFFSET") == NULL) {
|
||||
*Progress = Request + StrLen (Request);
|
||||
}
|
||||
|
||||
if (Data != NULL) {
|
||||
FreePool (Data);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@@ -80,6 +80,7 @@
|
||||
UefiLib
|
||||
PcdLib
|
||||
LanguageLib
|
||||
PrintLib
|
||||
|
||||
[Guids]
|
||||
gEfiIfrTianoGuid
|
||||
|
@@ -48,6 +48,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/LanguageLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
|
||||
#include <Guid/MdeModuleHii.h>
|
||||
|
||||
|
Reference in New Issue
Block a user