+ //\r
+ // Create Option OpCode\r
+ //\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ STRING_TOKEN (STR_BOOT_OPTION1),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ 1\r
+ );\r
+\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ STRING_TOKEN (STR_BOOT_OPTION2),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Prepare initial value for the dynamic created oneof Question\r
+ //\r
+ PrivateData->Configuration.DynamicOneof = 2;\r
+ Status = gRT->SetVariable(\r
+ VariableName,\r
+ &gDriverSampleFormSetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+ &PrivateData->Configuration\r
+ );\r
+\r
+ //\r
+ // Set initial vlaue of dynamic created oneof Question in Form Browser\r
+ //\r
+ Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
+ ASSERT (Configuration != NULL);\r
+ if (HiiGetBrowserData (&gDriverSampleFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION), (UINT8 *) Configuration)) {\r
+ Configuration->DynamicOneof = 2;\r
+\r
+ //\r
+ // Update uncommitted data of Browser\r
+ //\r
+ HiiSetBrowserData (\r
+ &gDriverSampleFormSetGuid,\r
+ VariableName,\r
+ sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+ (UINT8 *) Configuration,\r
+ NULL\r
+ );\r
+ }\r
+ FreePool (Configuration);\r
+\r
+ HiiCreateOneOfOpCode (\r
+ StartOpCodeHandle, // Container for dynamic created opcodes\r
+ 0x8001, // Question ID (or call it "key")\r
+ CONFIGURATION_VARSTORE_ID, // VarStore ID\r
+ (UINT16) DYNAMIC_ONE_OF_VAR_OFFSET, // Offset in Buffer Storage\r
+ STRING_TOKEN (STR_ONE_OF_PROMPT), // Question prompt text\r
+ STRING_TOKEN (STR_ONE_OF_HELP), // Question help text\r
+ EFI_IFR_FLAG_CALLBACK, // Question flag\r
+ EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value\r
+ OptionsOpCodeHandle, // Option Opcode list\r
+ NULL // Default Opcode is NULl\r
+ );\r
+\r
+ HiiCreateOrderedListOpCode (\r
+ StartOpCodeHandle, // Container for dynamic created opcodes\r
+ 0x8002, // Question ID\r
+ CONFIGURATION_VARSTORE_ID, // VarStore ID\r
+ (UINT16) DYNAMIC_ORDERED_LIST_VAR_OFFSET, // Offset in Buffer Storage\r
+ STRING_TOKEN (STR_BOOT_OPTIONS), // Question prompt text\r
+ STRING_TOKEN (STR_BOOT_OPTIONS), // Question help text\r
+ EFI_IFR_FLAG_RESET_REQUIRED, // Question flag\r
+ 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
+ EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value\r
+ 5, // Maximum container\r
+ OptionsOpCodeHandle, // Option Opcode list\r
+ NULL // Default Opcode is NULl\r
+ );\r
+\r
+ HiiCreateTextOpCode (\r
+ StartOpCodeHandle,\r
+ STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
+ STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
+ STRING_TOKEN(STR_TEXT_SAMPLE_STRING)\r
+ );\r
+\r
+ HiiCreateDateOpCode (\r
+ StartOpCodeHandle,\r
+ 0x8004,\r
+ 0x0,\r
+ 0x0,\r
+ STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
+ STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
+ 0,\r
+ QF_DATE_STORAGE_TIME,\r
+ NULL\r
+ );\r
+\r
+ HiiCreateTimeOpCode (\r
+ StartOpCodeHandle,\r
+ 0x8005,\r
+ 0x0,\r
+ 0x0,\r
+ STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
+ STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
+ 0,\r
+ QF_TIME_STORAGE_TIME,\r
+ NULL\r
+ );\r
+\r
+ HiiCreateGotoOpCode (\r
+ StartOpCodeHandle, // Container for dynamic created opcodes\r
+ 1, // Target Form ID\r
+ STRING_TOKEN (STR_GOTO_FORM1), // Prompt text\r
+ STRING_TOKEN (STR_GOTO_HELP), // Help text\r
+ 0, // Question flag\r
+ 0x8003 // Question ID\r
+ );\r
+\r
+ HiiUpdateForm (\r
+ PrivateData->HiiHandle[0], // HII handle\r
+ &gDriverSampleFormSetGuid, // Formset GUID\r
+ 0x1234, // Form ID\r
+ StartOpCodeHandle, // Label for where to insert opcodes\r
+ EndOpCodeHandle // Replace data\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+ break;\r
+\r
+ case 0x5678:\r
+ case 0x1247:\r
+ //\r
+ // We will reach here once the Question is refreshed\r
+ //\r
+\r
+ //\r
+ // Initialize the container for dynamic opcodes\r
+ //\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (StartOpCodeHandle != NULL);\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode as the start opcode\r
+ //\r
+ StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ if (QuestionId == 0x5678) {\r
+ StartLabel->Number = LABEL_UPDATE2;\r
+ FormId = 0x03;\r
+ PrivateData->Configuration.DynamicRefresh++;\r
+ } else if (QuestionId == 0x1247 ) {\r
+ StartLabel->Number = LABEL_UPDATE3;\r
+ FormId = 0x06;\r
+ PrivateData->Configuration.RefreshGuidCount++;\r
+ }\r
+\r
+ HiiCreateActionOpCode (\r
+ StartOpCodeHandle, // Container for dynamic created opcodes\r
+ 0x1237, // Question ID\r
+ STRING_TOKEN(STR_EXIT_TEXT), // Prompt text\r
+ STRING_TOKEN(STR_EXIT_TEXT), // Help text\r
+ EFI_IFR_FLAG_CALLBACK, // Question flag\r
+ 0 // Action String ID\r
+ );\r
+\r
+ HiiUpdateForm (\r
+ PrivateData->HiiHandle[0], // HII handle\r
+ &gDriverSampleFormSetGuid, // Formset GUID\r
+ FormId, // Form ID\r
+ StartOpCodeHandle, // Label for where to insert opcodes\r
+ NULL // Insert data\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+\r
+ //\r
+ // Refresh the Question value\r
+ //\r
+ Status = gRT->SetVariable(\r
+ VariableName,\r
+ &gDriverSampleFormSetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+ &PrivateData->Configuration\r
+ );\r
+\r
+ if (QuestionId == 0x5678) {\r
+ //\r
+ // Update uncommitted data of Browser\r
+ //\r
+ EfiData = AllocateZeroPool (sizeof (MY_EFI_VARSTORE_DATA));\r
+ ASSERT (EfiData != NULL);\r
+ if (HiiGetBrowserData (&gDriverSampleFormSetGuid, MyEfiVar, sizeof (MY_EFI_VARSTORE_DATA), (UINT8 *) EfiData)) {\r
+ EfiData->Field8 = 111;\r
+ HiiSetBrowserData (\r
+ &gDriverSampleFormSetGuid,\r
+ MyEfiVar,\r
+ sizeof (MY_EFI_VARSTORE_DATA),\r
+ (UINT8 *) EfiData,\r
+ NULL\r
+ );\r
+ }\r
+ FreePool (EfiData);\r