/** Create a Hii Update data Handle used to call IfrLibUpdateForm. @param ThunkContext The HII Thunk Context. @param FwUpdateData The Framework Update Data. @param UefiOpCodeHandle The UEFI opcode handle. @retval EFI_SUCCESS The UEFI Update Data is created successfully. @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData. @retval EFI_OUT_OF_RESOURCES There is not enough resource. **/ EFI_STATUS FwUpdateDataToUefiUpdateData ( IN HII_THUNK_CONTEXT *ThunkContext, IN CONST EFI_HII_UPDATE_DATA *FwUpdateData, IN VOID *UefiOpCodeHandle ) { FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode; FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode; UINTN Index; UINTN DataCount; UINT8 *OpCodeBuffer; LIST_ENTRY *StorageList; FORMSET_STORAGE *Storage; FORM_BROWSER_FORMSET *FormSet; CHAR16 *DefaultVarStoreName; UINT16 DefaultVarStoreId; EFI_IFR_VARSTORE_SELECT *SelectVarOp; FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data; FormSet = ThunkContext->FormSet; DefaultVarStoreId = FormSet->DefaultVarStoreId; DefaultVarStoreName = FormSet->OriginalDefaultVarStoreName; for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) { switch (FwOpCode->OpCode) { case FRAMEWORK_EFI_IFR_SUBTITLE_OP: OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode)->SubTitle, 0, 0, 0); DataCount = 1; break; case FRAMEWORK_EFI_IFR_TEXT_OP: OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_REF_OP: OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_ONE_OF_OP: OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP: OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_CHECKBOX_OP: OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_STRING_OP: OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode); DataCount = 1; break; case EFI_IFR_BANNER_OP: OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (EFI_IFR_BANNER *) FwOpCode); DataCount = 1; break; case EFI_IFR_END_ONE_OF_OP: OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle); DataCount = 1; break; case FRAMEWORK_EFI_IFR_NUMERIC_OP: OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode); DataCount = 1; break; case EFI_IFR_VARSTORE_SELECT_OP: OpCodeBuffer = (UINT8 *) FwOpCode; SelectVarOp = (EFI_IFR_VARSTORE_SELECT *) FwOpCode; // // Check whether the selected VarId is in StorageList. // StorageList = GetFirstNode (&FormSet->StorageListHead); while (!IsNull (&FormSet->StorageListHead, StorageList)) { Storage = FORMSET_STORAGE_FROM_LINK (StorageList); if (Storage->VarStoreId == SelectVarOp->VarId) { break; } StorageList = GetNextNode (&FormSet->StorageListHead, StorageList); } ASSERT (!IsNull (&FormSet->StorageListHead, StorageList)); // // Change VarStoreId to the selected VarId. // FormSet->DefaultVarStoreId = SelectVarOp->VarId; if (SelectVarOp->VarId == DefaultVarStoreId) { FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName; } DataCount = 1; break; default: ASSERT (FALSE); return EFI_UNSUPPORTED; } if (OpCodeBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length); } // // Revert FromSet default varstore ID. // FormSet->DefaultVarStoreId = DefaultVarStoreId; FormSet->OriginalDefaultVarStoreName = DefaultVarStoreName; return EFI_SUCCESS; }
/** Create a Hii Update data Handle used to call IfrLibUpdateForm. @param ThunkContext The HII Thunk Context. @param FwUpdateData The Framework Update Data. @param UefiOpCodeHandle The UEFI opcode hanlde. @retval EFI_SUCCESS The UEFI Update Data is created successfully. @retval EFI_UNSUPPORTED There is unsupported opcode in FwUpdateData. @retval EFI_OUT_OF_RESOURCES There is not enough resource. **/ EFI_STATUS FwUpdateDataToUefiUpdateData ( IN HII_THUNK_CONTEXT *ThunkContext, IN CONST EFI_HII_UPDATE_DATA *FwUpdateData, IN VOID *UefiOpCodeHandle ) { FRAMEWORK_EFI_IFR_OP_HEADER *FwOpCode; FRAMEWORK_EFI_IFR_OP_HEADER *NextFwOpCode; UINTN Index; UINTN DataCount; UINT8 *OpCodeBuffer; FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data; for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) { switch (FwOpCode->OpCode) { case FRAMEWORK_EFI_IFR_SUBTITLE_OP: OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE *) FwOpCode)->SubTitle, 0, 0, 0); DataCount = 1; break; case FRAMEWORK_EFI_IFR_TEXT_OP: OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_REF_OP: OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_ONE_OF_OP: OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP: OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount); if (OpCodeBuffer != NULL) { FwOpCode = NextFwOpCode; // // FwOpCode is already updated to point to the next opcode. // continue; } break; case FRAMEWORK_EFI_IFR_CHECKBOX_OP: OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode); DataCount = 1; break; case FRAMEWORK_EFI_IFR_STRING_OP: OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode); DataCount = 1; break; case EFI_IFR_BANNER_OP: OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (EFI_IFR_BANNER *) FwOpCode); DataCount = 1; break; case EFI_IFR_END_ONE_OF_OP: OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle); DataCount = 1; break; case FRAMEWORK_EFI_IFR_NUMERIC_OP: OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode); DataCount = 1; break; default: ASSERT (FALSE); return EFI_UNSUPPORTED; } if (OpCodeBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length); } return EFI_SUCCESS; }