]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
1. Support inconsistent if opcode used in string/password opcode.
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
index ff9e4b21799ad864f3f5b01f0a17956f993feb1c..9b664b4958c50912d98dfe3e2cd2d4f29caa0964 100644 (file)
@@ -842,61 +842,67 @@ DriverCallback (
   UINTN                           MyVarSize;\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
-    //\r
-    // On FORM_OPEN event, update the form on-the-fly\r
-    //\r
-    PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\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
-    StartLabel->Number       = LABEL_UPDATE2;\r
+    if (QuestionId == 0x1234) {\r
+      //\r
+      // Sample CallBack for UEFI FORM_OPEN action:\r
+      //   Add Save action into Form 3 when Form 1 is opened.\r
+      //   This will be done only in FORM_OPEN CallBack of question with ID 0x1234 from Form 1.\r
+      //\r
+      PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
 \r
-    HiiCreateActionOpCode (\r
-      StartOpCodeHandle,                // Container for dynamic created opcodes\r
-      0x1238,                           // Question ID\r
-      STRING_TOKEN(STR_SAVE_TEXT),      // Prompt text\r
-      STRING_TOKEN(STR_SAVE_TEXT),      // Help text\r
-      EFI_IFR_FLAG_CALLBACK,            // Question flag\r
-      0                                 // Action String ID\r
-    );\r
+      //\r
+      // Initialize the container for dynamic opcodes\r
+      //\r
+      StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+      ASSERT (StartOpCodeHandle != NULL);\r
 \r
-    HiiUpdateForm (\r
-      PrivateData->HiiHandle[0],  // HII handle\r
-      &mFormSetGuid,              // Formset GUID\r
-      0x3,                        // Form ID\r
-      StartOpCodeHandle,          // Label for where to insert opcodes\r
-      NULL                        // Insert data\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
+      StartLabel->Number       = LABEL_UPDATE2;\r
+\r
+      HiiCreateActionOpCode (\r
+        StartOpCodeHandle,                // Container for dynamic created opcodes\r
+        0x1238,                           // Question ID\r
+        STRING_TOKEN(STR_SAVE_TEXT),      // Prompt text\r
+        STRING_TOKEN(STR_SAVE_TEXT),      // Help text\r
+        EFI_IFR_FLAG_CALLBACK,            // Question flag\r
+        0                                 // Action String ID\r
       );\r
 \r
-    HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+      HiiUpdateForm (\r
+        PrivateData->HiiHandle[0],  // HII handle\r
+        &mFormSetGuid,              // Formset GUID\r
+        0x3,                        // Form ID\r
+        StartOpCodeHandle,          // Label for where to insert opcodes\r
+        NULL                        // Insert data\r
+        );\r
+\r
+      HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+    }\r
     return EFI_SUCCESS;\r
   }\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {\r
-    //\r
-    // On FORM_CLOSE event, show up a pop-up\r
-    //\r
-    do {\r
-      CreatePopUp (\r
-        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-        &Key,\r
-        L"",\r
-        L"You are going to leave the Form!",\r
-        L"Press ESC or ENTER to continue ...",\r
-        L"",\r
-        NULL\r
-        );\r
-    } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
-\r
+    if (QuestionId == 0x5678) {\r
+      //\r
+      // Sample CallBack for UEFI FORM_CLOSE action:\r
+      //   Show up a pop-up to specify Form 3 will be closed when exit Form 3.\r
+      //\r
+      do {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"",\r
+          L"You are going to leave third Form!",\r
+          L"Press ESC or ENTER to continue ...",\r
+          L"",\r
+          NULL\r
+          );\r
+      } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
+    }\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -904,9 +910,6 @@ DriverCallback (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
 \r
   Status = EFI_SUCCESS;\r
   PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
@@ -1028,6 +1031,37 @@ DriverCallback (
       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
@@ -1129,6 +1163,15 @@ DriverCallback (
     break;\r
 \r
   case 0x2000:\r
+    //\r
+    // Only used to update the state.\r
+    //\r
+    if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0) && \r
+      (PrivateData->PasswordState == BROWSER_STATE_SET_PASSWORD)) {\r
+      PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
     //\r
     // When try to set a new password, user will be chanlleged with old password.\r
     // The Callback is responsible for validating old password input by user,\r
@@ -1433,6 +1476,9 @@ DriverSampleUnload (
   )\r
 {\r
   UINTN Index;\r
+\r
+  ASSERT (PrivateData != NULL);\r
+\r
   if (DriverHandle[0] != NULL) {\r
     gBS->UninstallMultipleProtocolInterfaces (\r
             DriverHandle[0],\r
@@ -1463,15 +1509,13 @@ DriverSampleUnload (
     HiiRemovePackages (PrivateData->HiiHandle[1]);\r
   }\r
 \r
-  if (PrivateData != NULL) {\r
-    for (Index = 0; Index < NAME_VALUE_NAME_NUMBER; Index++) {\r
-      if (PrivateData->NameValueName[Index] != NULL) {\r
-        FreePool (PrivateData->NameValueName[Index]);\r
-      }\r
+  for (Index = 0; Index < NAME_VALUE_NAME_NUMBER; Index++) {\r
+    if (PrivateData->NameValueName[Index] != NULL) {\r
+      FreePool (PrivateData->NameValueName[Index]);\r
     }\r
-    FreePool (PrivateData);\r
-    PrivateData = NULL;\r
   }\r
+  FreePool (PrivateData);\r
+  PrivateData = NULL;\r
 \r
   return EFI_SUCCESS;\r
 }\r