VOID RebuildOrderList()

in OemPkg/BootMenu/BootMenu.c [267:391]


VOID RebuildOrderList (VOID) {
    EFI_STATUS                    Status;
    VOID                         *StartOpCodeHandle;
    VOID                         *EndOpCodeHandle;
    VOID                         *OptionsOpCodeHandle;
    EFI_IFR_GUID_LABEL           *StartLabel;
    EFI_IFR_GUID_LABEL           *EndLabel;
    EFI_STRING_ID                 Prompt;
    UINTN                         Index;
    UINT32                        OptionValue;
    UINT8                        *OpcodeBuffer;

    if (mBootOptions != NULL) {
        EfiBootManagerFreeLoadOptions (mBootOptions, mBootOptionCount);
        mBootOptions = NULL;
    }

    ZeroMem (&mOrderConfiguration.OrderOptions, sizeof(mOrderConfiguration.OrderOptions));

    //
    // Init OpCode Handle and Allocate space for creation of UpdateData Buffer
    //
    StartOpCodeHandle = HiiAllocateOpCodeHandle ();
    ASSERT(StartOpCodeHandle != NULL);

    EndOpCodeHandle = HiiAllocateOpCodeHandle ();
    ASSERT(EndOpCodeHandle != NULL);

    OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
    ASSERT(OptionsOpCodeHandle != NULL);

    //
    // Create Hii Extend Label OpCode as the start opcode
    //
    StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof(EFI_IFR_GUID_LABEL));
    StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;

    //
    // Create Hii Extend Label OpCode as the end opcode
    //
    EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof(EFI_IFR_GUID_LABEL));
    EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;

    StartLabel->Number     = LABEL_ORDER_OPTIONS;
    EndLabel->Number       = LABEL_ORDER_END;

    mBootOptions = EfiBootManagerGetLoadOptions (&mBootOptionCount, LoadOptionTypeBoot);

    for (Index = 0; Index < mBootOptionLimit; Index++) {
        //
        // Don't display the hidden/inactive boot options.
        //
        if (((mBootOptions[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) ||
            ((mBootOptions[Index].Attributes & LOAD_OPTION_CATEGORY_APP) != 0)) {
            continue;
        }

        ASSERT(mBootOptions[Index].Description != NULL);

        Prompt = HiiSetString (
            mBootMenuPrivate.HiiHandle,
            0,
            mBootOptions[Index].Description,
            NULL
            );

        DEBUG((DEBUG_INFO,"%a Indx=%d, Hash=%x, Attr=%x, %s\n",__FUNCTION__, Index, mBootOptions[Index].OptionNumber, mBootOptions[Index].Attributes, mBootOptions[Index].Description));

        OptionValue = (UINT32)(mBootOptions[Index].OptionNumber + 1);
        if ((mBootOptions[Index].Attributes & LOAD_OPTION_ACTIVE) == LOAD_OPTION_ACTIVE) {
            OptionValue |= ORDERED_LIST_CHECKBOX_VALUE_32;
        }

        if (!IsDefaultBootOption(&mBootOptions[Index])) {
            OptionValue |= ORDERED_LIST_ALLOW_DELETE_VALUE_32;
        }

        OpcodeBuffer = HiiCreateOneOfOptionOpCode (
            OptionsOpCodeHandle,
            Prompt,
            EFI_IFR_FLAG_CALLBACK,
            EFI_IFR_TYPE_NUM_SIZE_32,
            OptionValue
            );
        ASSERT (OpcodeBuffer != NULL);
        mOrderConfiguration.OrderOptions[Index] = OptionValue;;
    }

    OpcodeBuffer = HiiCreateOrderedListOpCode (
                     StartOpCodeHandle,
                     (EFI_QUESTION_ID)(MS_BOOT_ORDER_QUESTION_ID),
                     MS_BOOT_ORDER_VARID,
                     OFFSET_OF(ORDER_MENU_CONFIGURATION, OrderOptions),
                     STRING_TOKEN(STR_BOOT_ORDER_LIST),
                     0,
                     EFI_IFR_FLAG_CALLBACK,      // OPTIONS_ONLY is unused - means combo ListBox
                     EFI_IFR_UNIQUE_SET | EMBEDDED_CHECKBOX | EMBEDDED_DELETE,
                     EFI_IFR_NUMERIC_SIZE_4,
                     mBootOptionLimit,
                     OptionsOpCodeHandle,
                     NULL                      // Default Op Code is NULL
                     );
    ASSERT (OpcodeBuffer != NULL);

    Status = HiiUpdateForm(
        mBootMenuPrivate.HiiHandle,
        &gMsBootMenuFormsetGuid,
        MS_BOOT_ORDER_FORM_ID,
        StartOpCodeHandle,
        EndOpCodeHandle
        );

    if (EFI_ERROR(Status)) {
        DEBUG((DEBUG_ERROR, "%a Error in HiiUpdateform.  Code=%r\n", __FUNCTION__, Status));
    }
    if (StartOpCodeHandle != NULL) {
        HiiFreeOpCodeHandle(StartOpCodeHandle);
    }
    if (StartOpCodeHandle != NULL) {
        HiiFreeOpCodeHandle(EndOpCodeHandle);
    }
    if (OptionsOpCodeHandle != NULL) {
        HiiFreeOpCodeHandle(OptionsOpCodeHandle);
    }
}